protected void processUndefinedSymbols() throws Exception {
		List<NList> undefinedSymbols = new ArrayList<>();
		List<LoadCommand> commands = machoHeader.getLoadCommands();
		for (LoadCommand command : commands) {
			if (monitor.isCancelled()) {
				return;
			}
			if (!(command instanceof SymbolTableCommand)) {
				continue;
			}
			SymbolTableCommand symbolTableCommand = (SymbolTableCommand) command;
			List<NList> symbols = symbolTableCommand.getSymbols();
			monitor.initialize(symbols.size(), "Collectiing undefined symbols...");
			for (NList symbol : symbols) {
				monitor.increment();
				if (symbol.isSymbolicDebugging()) {
					continue;
				}
				if (symbol.isTypeUndefined()) {
					List<Symbol> globalSymbols = program.getSymbolTable()
							.getLabelOrFunctionSymbols(symbol.getString(), null);
					if (globalSymbols.isEmpty()) {//IF IT DOES NOT ALREADY EXIST...
						undefinedSymbols.add(symbol);
					}
				}
			}
		}
		if (undefinedSymbols.size() == 0) {
			return;
		}
		try {
			Address addr = MachoProgramUtils.addExternalBlock(program,
				undefinedSymbols.size() * machoHeader.getAddressSize(), log);
			monitor.initialize(undefinedSymbols.size(), "Processing undefined symbols...");
			for (NList symbol : undefinedSymbols) {
				monitor.increment();
				try {
					String name = SymbolUtilities.replaceInvalidChars(symbol.getString(), true);
					if (name != null && name.length() > 0) {
						program.getSymbolTable().createLabel(addr, name, SourceType.IMPORTED);
						program.getExternalManager()
								.addExtLocation(Library.UNKNOWN, name, null, SourceType.IMPORTED);
					}
				}
				catch (Exception e) {
					log.appendMsg("Unable to create undefined symbol: " + e.getMessage());
				}
				addr = addr.add(machoHeader.getAddressSize());
			}
		}
		catch (Exception e) {
			log.appendMsg("Unable to create undefined memory block: " + e.getMessage());
		}
	}
Attempts to discover and set the entry point.
<p>
A program may declare multiple entry points to, for example, confuse static analysis tools.
We will sort the discovered entry points by priorities assigned to each type of load
command, and only use the one with the highest priority.

@param source A name that represents where the memory blocks came from.
@throws Exception If there was a problem discovering or setting the entry point.
Ghidra/Features/Base/src/main/java/ghidra/app/util/opinion/MachoProgramBuilder.java