private void processGOT(Address gotStart, Address gotEnd, TaskMonitor monitor)
			throws CancelledException {

		// Bail if GOT was previously marked-up or not within initialized memory
		MemoryBlock block = memory.getBlock(gotStart);
		if (block == null || !block.isInitialized()) {
			return; // unsupported memory region - skip GOT processing
		}
		Data data = program.getListing().getDataAt(gotStart);
		if (data == null || !Undefined.isUndefined(data.getDataType())) {
			return; // evidence of prior markup - skip GOT processing
		}

		// Fixup first GOT entry which frequently refers to _DYNAMIC but generally lacks relocation (e.g. .got.plt)
		ElfDynamicTable dynamicTable = elf.getDynamicTable();
		long imageBaseAdj = elfLoadHelper.getImageBaseWordAdjustmentOffset();
		if (dynamicTable != null && imageBaseAdj != 0) {
			try {
				long entry1Value = elfLoadHelper.getOriginalValue(gotStart, false);
				if (entry1Value == dynamicTable.getAddressOffset()) {
					// TODO: record artificial relative relocation for reversion/export concerns
					entry1Value += imageBaseAdj; // adjust first entry value
					if (elf.is64Bit()) {
						elfLoadHelper.addArtificialRelocTableEntry(gotStart, 8);
						memory.setLong(gotStart, entry1Value);
					}
					else {
						elfLoadHelper.addArtificialRelocTableEntry(gotStart, 4);
						memory.setInt(gotStart, (int) entry1Value);
					}
				}
			}
			catch (Exception e) {
				String msg =
					"Failed to process first GOT entry at " + gotStart + ": " + e.getMessage();
				log(msg);
				Msg.error(this, msg, e);
			}
		}

		boolean imageBaseAlreadySet = elf.isPreLinked();

		try {
			int pointerSize = program.getDataTypeManager().getDataOrganization().getPointerSize();
			Address newImageBase = null;
			Address nextGotAddr = gotStart;
			while (gotEnd.subtract(nextGotAddr) >= pointerSize) {

				data = createPointer(nextGotAddr, true);
				if (data == null) {
					break;
				}

				try {
					nextGotAddr = data.getMaxAddress().add(1);
				}
				catch (AddressOutOfBoundsException e) {
					break; // no more room
				}
				newImageBase = UglyImageBaseCheck(data, newImageBase);
			}
			if (newImageBase != null) {
				log("Invalid Address found in .got table.  Suspect Prelinked shared object file");
				if (imageBaseAlreadySet) {
					log("ERROR: Unable to adjust image base for pre-link - retaining existing image base of " +
						program.getImageBase());
				}
				else {
					program.setImageBase(newImageBase, true);
					log("Setting Image base to: " + newImageBase);
					imageBaseAlreadySet = true;
				}
			}
		}
		catch (Exception e) {
			String msg = "Failed to process GOT at " + gotStart + ": " + e.getMessage();
			log(msg);
			Msg.error(this, msg, e);
		}
	}
Mark-up all GOT entries as pointers within the memory range gotStart to
gotEnd.
@param gotStart address for start of GOT
@param gotEnd address for end of GOT
@param monitor task monitor
@throws CancelledException thrown if task cancelled
Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/elf/ElfDefaultGotPltMarkup.java