@Override
	public void load(ByteProvider provider, LoadSpec loadSpec, List<Option> options, Program prog,
			TaskMonitor monitor, MessageLog log) throws IOException, CancelledException {

		if (!prog.getExecutableFormat().equals(PeLoader.PE_NAME)) {
			throw new IOException("Program must be a " + PeLoader.PE_NAME);
		}

		SymbolTable symtab = prog.getSymbolTable();
		AddressSpace space = prog.getAddressFactory().getDefaultAddressSpace();
		int successCount = 0;

		List<MapSymbol> symbols = parseMapFile(provider, monitor, log);
		monitor.initialize(symbols.size(), "Creating symbols...");
		for (MapSymbol symbol : symbols) {
			monitor.increment();
			try {
				Address addr = space.getAddress(symbol.addr);
				symtab.createLabel(addr, symbol.name, SourceType.IMPORTED).setPrimary();
				successCount++;
			}
			catch (InvalidInputException e) {
				log.appendMsg(
					"Error creating symbol '%s': %s".formatted(symbol.name, e.getMessage()));
			}
		}

		log.appendMsg("Added " + successCount + " symbols.");
	}
A {@link Loader} for processing Microsoft MAP files.
<p>
Sample .map file section we parse to extract symbol information:
<pre>{@code
  ...
  ...
  ...

  Address         Publics by Value              Rva+Base               Lib:Object
  
 0000:00000000       ___safe_se_handler_table   0000000000000000     <absolute>
 0000:00000000       ___safe_se_handler_count   0000000000000000     <absolute>
 0000:00000000       __ImageBase                0000000140000000     <linker-defined>
 0001:00000040       foo                        0000000140001040 f   foo.obj
 0001:000000c0       bar                        00000001400010c0 f   foo.obj
 
 ...
 ...

 Static symbols

 0000:00000020       blah                       0000000140000010     foo.dll
 0001:00000020       stuff                      0000000140000020     bar.dll

 ...
 ...
 ...

 }</pre>
Ghidra/Features/Base/src/main/java/ghidra/app/util/opinion/MapLoader.java