private long computeRelocationStartAddress(AddressSpace space, long baseOffset,
			TaskMonitor monitor) throws CancelledException {
		if (!elf.isRelocatable()) {
			return 0; // not applicable
		}
		long relocStartAddr = 0;
		AddressSpace defaultSpace = getDefaultAddressSpace();
		ElfSectionHeader[] sections = elf.getSections();
		for (ElfSectionHeader elfSectionToLoad : sections) {
			monitor.checkCancelled();
			long addr = elfSectionToLoad.getAddress();
			if (addr < 0) {
				relocStartAddr = 0;
				break;
			}
			if (elfSectionToLoad.isAlloc() && addr != 0) {
				AddressSpace loadSpace = getSectionAddressSpace(elfSectionToLoad);
				if (loadSpace.equals(space)) {
					long sectionByteLength = elf.getLoadAdapter().getAdjustedSize(elfSectionToLoad); // size in bytes
					long sectionLength = sectionByteLength / space.getAddressableUnitSize();
					relocStartAddr = Math.max(relocStartAddr, addr + sectionLength);
				}
			}
		}

		// if more than half the address space is skipped - fall back to default relocation base
		long testOffset = relocStartAddr << 1;
		if (testOffset != defaultSpace.getTruncatedAddress(testOffset, true).getOffset()) {
			relocStartAddr = 0;
		}
		return relocStartAddr + baseOffset;
	}
Identify start address of relocation area.  Skip any sections with a non-zero address.
When an image is relocatable generally all sections will have a zero address.  It is only
when special sections are present (e.g., __ksymtab) that we may encounter sections with
a non-zero address.
@param monitor task monitor
@return start of relocation area
@throws CancelledException task cancelled
Ghidra/Features/Base/src/main/java/ghidra/app/util/opinion/ElfProgramBuilder.java