@Override
	public boolean addArtificialRelocTableEntry(Address address, int length) {
		try {
			Address maxAddr = address.addNoWrap(length - 1);
			RelocationTable relocationTable = program.getRelocationTable();
			List<Relocation> relocations = relocationTable.getRelocations(address);
			boolean hasConflict = false;
			for (Relocation reloc : relocations) {
				if (reloc.getStatus() != Status.APPLIED_OTHER || reloc.getLength() != length) {
					hasConflict = true;
					break;
				}
			}
			if (!hasConflict) {
				Address nextRelocAddr = relocationTable.getRelocationAddressAfter(address);
				hasConflict = nextRelocAddr != null && nextRelocAddr.compareTo(maxAddr) <= 0;
			}
			if (hasConflict) {
				Msg.warn(this, "Artificial relocation for " + address +
					" conflicts with a previous relocation");
			}
			relocationTable.add(address, Status.APPLIED_OTHER, 0, null, length, null);
			return true;
		}
		catch (AddressOverflowException e) {
			Msg.error(this, "Failed to generate fake relocation data at " + address, e);
		}
		return false;
	}
Cases:
1. elf.isRelocatable()
	a) sectionToBeRelocated null (may be NULL section?)
 b) sectionToBeRelocated known - offset relative to section load address

2. !elf.isRelocatable()
 a) sectionToBeRelocated null (may be NULL section?)
 b) sectionToBeRelocated known - offset relative to image base
Ghidra/Features/Base/src/main/java/ghidra/app/util/opinion/ElfProgramBuilder.java