private int computeRequiredGotSize() {
		// NOTE: GOT allocation calculation assumes all GOT entries correspond to a specific
		// symbol and not a computed offset.  This assumption may need to be revised based upon 
		// uses of getGotEntryAddress method
		Set<Long> uniqueSymbolValues = new HashSet<>();
		for (ElfRelocationTable rt : getElfHeader().getRelocationTables()) {
			ElfSymbolTable st = rt.getAssociatedSymbolTable();
			if (st == null) {
				continue;
			}
			for (ElfRelocation r : rt.getRelocations()) {
				int symbolIndex = r.getSymbolIndex();
				if (!requiresGotEntry(r) || symbolIndex == 0) {
					continue;
				}
				ElfSymbol elfSymbol = st.getSymbol(symbolIndex);
				if (elfSymbol == null) {
					continue;
				}
				long symbolValue = getSymbolValue(elfSymbol);
				if (!uniqueSymbolValues.add(symbolValue)) {
					System.out.println("Duplicate sym value 0x" + Long.toHexString(symbolValue) +
						" for " + elfSymbol.getNameAsString());
				}
			}
		}
		return Math.max(8, uniqueSymbolValues.size() * 8);
	}
<code>X86_64_ElfRelocationContext</code> provides ability to generate a
Global Offset Table (GOT) to facilitate GOT related relocations encountered within 
object modules.
Ghidra/Processors/x86/src/main/java/ghidra/app/util/bin/format/elf/relocation/X86_64_ElfRelocationContext.java