private void fixupGot(ElfLoadHelper elfLoadHelper, TaskMonitor monitor)
			throws CancelledException {

		// see Wiki at  https://dmz-portal.mips.com/wiki/MIPS_Multi_GOT
		// see related doc at https://www.cr0.org/paper/mips.elf.external.resolution.txt

		ElfHeader elfHeader = elfLoadHelper.getElfHeader();
		ElfDynamicTable dynamicTable = elfHeader.getDynamicTable();
		ElfSymbolTable dynamicSymbolTable = elfHeader.getDynamicSymbolTable();
		if (dynamicTable == null || dynamicSymbolTable == null) {
			return;
		}

		// Ensure that we can get the required dynamic entries to avoid NotFoundException
		if (!dynamicTable.containsDynamicValue(DT_MIPS_LOCAL_GOTNO) ||
			!dynamicTable.containsDynamicValue(DT_MIPS_GOTSYM)) {
			return;
		}
		Program program = elfLoadHelper.getProgram();
		Long gotBaseOffset = elfLoadHelper.getGOTValue();
		if (gotBaseOffset == null) {
			return;
		}

		Address gotBaseAddress =
			program.getAddressFactory().getDefaultAddressSpace().getAddress(gotBaseOffset);

		try {

			ElfSymbol[] elfSymbols = dynamicSymbolTable.getSymbols();

			int gotLocalEntryCount = (int) dynamicTable.getDynamicValue(DT_MIPS_LOCAL_GOTNO);
			int gotSymbolIndex = (int) dynamicTable.getDynamicValue(DT_MIPS_GOTSYM);

			long imageShift = elfLoadHelper.getImageBaseWordAdjustmentOffset();

			// process local symbol got entries
			for (int i = 0; i < gotLocalEntryCount; i++) {
				monitor.checkCancelled();
				Address gotEntryAddr =
					adjustTableEntryIfNonZero(gotBaseAddress, i, imageShift, elfLoadHelper);
				Data pointerData = elfLoadHelper.createData(gotEntryAddr, PointerDataType.dataType);
				if (ElfDefaultGotPltMarkup.isValidPointer(pointerData)) {
					ElfDefaultGotPltMarkup.setConstant(pointerData);
				}
			}

			// process global/external symbol got entries
			int gotIndex = gotLocalEntryCount;
			for (int i = gotSymbolIndex; i < elfSymbols.length; i++) {
				monitor.checkCancelled();
				Address gotEntryAddr = adjustTableEntryIfNonZero(gotBaseAddress, gotIndex++,
					imageShift, elfLoadHelper);
				Data pointerData = elfLoadHelper.createData(gotEntryAddr, PointerDataType.dataType);
				ElfDefaultGotPltMarkup.setConstant(pointerData);
				if (elfSymbols[i].isFunction() && elfSymbols[i].getSectionHeaderIndex() == 0) {
					// ensure that external function/thunk are created in absence of sections
					String symName = elfSymbols[i].getNameAsString();
					if (!StringUtils.isBlank(symName)) {
						Address refAddr = (Address) pointerData.getValue();
						elfLoadHelper.createExternalFunctionLinkage(symName, refAddr, gotEntryAddr);
					}
				}
			}
		}
		catch (NotFoundException e) {
			throw new AssertException("unexpected", e);
		}
		catch (MemoryAccessException e) {
			elfLoadHelper.log("Failed to adjust GOT: " + e.getMessage());
		}
	}
Attempt to update external dynamic .got entries for non-relocatable binaries.
@param elfLoadHelper ELF load helper
@param elfSymbol ELF symbol being processed
@param address dynamic symbol address
Ghidra/Processors/MIPS/src/main/java/ghidra/app/util/bin/format/elf/extend/MIPS_ElfExtension.java