protected void markupSections() throws Exception {
		if (machoHeader.getFileType() == MachHeaderFileTypes.MH_DYLIB_STUB) {
			return;
		}

		for (SegmentCommand segment : machoHeader.getAllSegments()) {
			monitor.checkCancelled();

			// do not markup sections that are encrypted
			if (segment.isAppleProtected()) {
				String msg = "Warning:  " + program.getName() + " contains encrypted segment: " +
					segment.getSegmentName();
				log.appendMsg(msg);
				Msg.showWarn(this, null, "Encrypted Binary", msg);
				continue;
			}

			List<Section> sections = segment.getSections();
			monitor.initialize(sections.size(), "Marking up sections...");
			for (Section section : sections) {
				monitor.increment();

				if (section.getSize() == 0) {
					continue;
				}

				MemoryBlock block = getMemoryBlock(section);

				if (block == null) {
					continue;
				}

				if (section.getSectionName().equals(SectionNames.CHAIN_STARTS)) {
					reader.setPointerIndex(section.getOffset());
					DyldChainedStartsOffsets chainedStartsOffsets =
						new DyldChainedStartsOffsets(reader);
					DataUtilities.createData(program, block.getStart(),
						chainedStartsOffsets.toDataType(), -1,
						DataUtilities.ClearDataMode.CHECK_FOR_SPACE);
				}
				else if (section.getType() == SectionTypes.S_CSTRING_LITERALS) {
					markupBlock(block, new TerminatedStringDataType());
				}
				else if (section.getType() == SectionTypes.S_4BYTE_LITERALS) {
					markupBlock(block, new FloatDataType());
				}
				else if (section.getType() == SectionTypes.S_8BYTE_LITERALS) {
					markupBlock(block, new DoubleDataType());
				}
				else if (section.getType() == SectionTypes.S_LITERAL_POINTERS) {
					markupBlock(block, new PointerDataType());
				}
				else if (section.getType() == SectionTypes.S_NON_LAZY_SYMBOL_POINTERS ||
					section.getType() == SectionTypes.S_LAZY_SYMBOL_POINTERS) {
					markupBlock(block, new PointerDataType());
				}
				else if (section.getType() == SectionTypes.S_SYMBOL_STUBS && section.isExecute()) {
					// TODO should we disassemble?? see iMovieHD.80386
					// disassemble(program, block, monitor);
				}

				if (section.getType() == SectionTypes.S_LAZY_SYMBOL_POINTERS) {
					AddressSetView set = new AddressSet(block.getStart(), block.getEnd());
					processLazyPointerSection(set);
				}
			}
		}
	}
Sets up the {@link MachHeader} in memory and returns its address.  If the header was not 
intended to reside in memory (like for Mach-O object files), then this method will create an
area in the "OTHER" address space for the header to live in.

@param segments A {@link Collection} of {@link SegmentCommand Mach-O segments}
@return The {@link Address} of {@link MachHeader} in memory
@throws AddressOverflowException if the address lies outside the address space
Ghidra/Features/Base/src/main/java/ghidra/app/util/opinion/MachoProgramBuilder.java