private List<MachoInfo> processPrelinkXml() throws Exception {
		List<MachoInfo> machoInfoList = new ArrayList<>();
		List<Long> machoHeaderOffsets =
			MachoPrelinkUtils.findPrelinkMachoHeaderOffsets(provider, monitor);
		if (machoHeaderOffsets.isEmpty()) {
			return machoInfoList;
		}

		List<MachoPrelinkMap> prelinkList = MachoPrelinkUtils.parsePrelinkXml(provider, monitor);

		// Match PRELINK information to the Mach-O's we've found
		BidiMap<MachoPrelinkMap, Long> map = MachoPrelinkUtils.matchPrelinkToMachoHeaderOffsets(
			provider, prelinkList, machoHeaderOffsets, monitor);

		// Determine the starting address of the PRELINK Mach-O's
		long prelinkStart = MachoPrelinkUtils.getPrelinkStartAddr(machoHeader);
		Address prelinkStartAddr = null;
		if (prelinkStart == 0) {
			// Probably iOS 12, which doesn't define a proper __PRELINK_TEXT segment.
			// Assume the file offset is the same as the offset from image base.
			prelinkStartAddr = program.getImageBase().add(machoHeaderOffsets.get(0));
		}
		else {
			prelinkStartAddr = space.getAddress(prelinkStart);
		}

		// Create an "info" object for each PRELINK Mach-O, which will make processing them easier
		for (Long machoHeaderOffset : machoHeaderOffsets) {
			String name = "";
			MachoPrelinkMap prelink = map.getKey(machoHeaderOffset);
			if (prelink != null) {
				String path = prelink.getPrelinkBundlePath();
				if (path != null) {
					name = new File(path).getName();
				}
			}
			machoInfoList.add(new MachoInfo(provider, machoHeaderOffset,
				prelinkStartAddr.add(machoHeaderOffset - machoHeaderOffsets.get(0)), name));
		}

		return machoInfoList;
	}
Processes the PRELINK XML to generate a {@link List} of discovered Mach-O's

@return A {@link List} of discovered Mach-O's
@throws Exception if a problem occurs
Ghidra/Features/Base/src/main/java/ghidra/app/util/opinion/MachoPrelinkProgramBuilder.java