private void processMipsRegInfo(ElfLoadHelper elfLoadHelper, Address regInfoAddr) {

		// NOTES: assumes only one gp0 value

		AtomicBoolean multipleGp0 = new AtomicBoolean(false);
		Symbol gp0Sym = SymbolUtilities.getLabelOrFunctionSymbol(elfLoadHelper.getProgram(),
			MIPS_GP0_VALUE_SYMBOL, msg -> multipleGp0.set(true));
		Long otherGp0Value = gp0Sym != null ? gp0Sym.getAddress().getOffset() : null;

		AddressSpace defaultSpace =
			elfLoadHelper.getProgram().getAddressFactory().getDefaultAddressSpace();
		boolean is64bit = elfLoadHelper.getElfHeader().is64Bit();
		Structure regInfoStruct = buildRegInfoStructure(is64bit);

		Data data = elfLoadHelper.createData(regInfoAddr, regInfoStruct);
		Data gpValueComponent = data.getComponent(is64bit ? 3 : 2); // ri_gp_value value -> gp0
		if (gpValueComponent != null) {
			try {
				// Create gp0 symbol in default space which represents a constant value (pinned)
				Scalar gp0Value = gpValueComponent.getScalar(0);
				if (gp0Value == null) {
					// No memory defined - possible *.debug file
					return;
				}
				long gp0 = gp0Value.getUnsignedValue();
				if (multipleGp0.get() || otherGp0Value != null) {
					if (multipleGp0.get() || gp0 != otherGp0Value) {
						elfLoadHelper.log("Multiple gp0 values defined (not supported): 0x" +
							Long.toHexString(gp0));
					}
					return;
				}

				Address gpAddr = defaultSpace.getAddress(gp0);
				elfLoadHelper.createSymbol(gpAddr, MIPS_GP0_VALUE_SYMBOL, false, false, null)
						.setPinned(true);
				elfLoadHelper.log(MIPS_GP0_VALUE_SYMBOL + "=0x" + Long.toHexString(gp0));
			}
			catch (InvalidInputException e) {
				// ignore
			}
		}

	}
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