protected void build() throws Exception {

		monitor.setMessage("Completing Mach-O header parsing...");
		monitor.setCancelEnabled(false);
		machoHeader = new MachHeader(provider);
		machoHeader.parse();
		monitor.setCancelEnabled(true);

		// Setup memory
		setProgramImageBase();
		processMemoryBlocks(machoHeader, provider.getName(), true, true);

		// Process load commands
		processEntryPoint(provider.getName());
		boolean exportsFound = processExports(machoHeader);
		processSymbolTables(machoHeader, !exportsFound);
		processStubs();
		processUndefinedSymbols();
		processAbsoluteSymbols();
		List<String> libraryPaths = processLibraries();
		List<Address> chainedFixups = processChainedFixups(libraryPaths);
		processDyldInfo(false, libraryPaths);
		processSectionRelocations();
		processExternalRelocations();
		processLocalRelocations();
		processEncryption();
		processUnsupportedLoadCommands();
		processCorruptLoadCommands();

		// Markup structures
		markupHeaders(machoHeader, setupHeaderAddr(machoHeader.getAllSegments()));
		markupSections();
		markupLoadCommandData(machoHeader, provider.getName());
		markupChainedFixups(machoHeader, chainedFixups);
		markupProgramVars();

		// Set program info
		setRelocatableProperty();
		setProgramDescription();
		if (GoRttiMapper.isGolangProgram(program)) {
			markupAndSetGolangInitialProgramProperties();
		}

		// Perform additional actions
		renameObjMsgSendRtpSymbol();
		fixupProgramTree(null); // should be done last to account for new memory blocks
		setCompiler();
	}
Builds up a Mach-O {@link Program}.

@param program The {@link Program} to build up.
@param provider The {@link ByteProvider} that contains the Mach-O's bytes.
@param fileBytes Where the Mach-O's bytes came from.
@param log The log.
@param monitor A cancelable task monitor.
@throws Exception if a problem occurs.
Ghidra/Features/Base/src/main/java/ghidra/app/util/opinion/MachoProgramBuilder.java