private static int getSymbolValueIndirect(RISCV_ElfRelocationContext elfRelocationContext,
			ElfSymbol hi20Symbol, long relocAddrOffsetAdj) {

		ElfRelocation hi20Reloc = elfRelocationContext.getHi20Relocation(hi20Symbol);
		if (hi20Reloc == null) {
			return 0;
		}

		int symIndex = hi20Reloc.getSymbolIndex();
		ElfSymbol sym = elfRelocationContext.getSymbol(symIndex);
		long symOffset = elfRelocationContext.getSymbolValue(sym);

		// must apply HI20 addend to symbol offset
		long targetOffset = symOffset + hi20Reloc.getAddend();

		// must adjust to account for image-base
		long hi20RelocOffset = hi20Reloc.getOffset() + relocAddrOffsetAdj;

		// TODO: should we perform range check for 64-bit case?
		return (int) (targetOffset - hi20RelocOffset);
	}
PC relative relocations like R_RISCV_PCREL_LO12_I find their target indirectly,
using their symbolValue to locate the address of the matching R_RISCV_PCREL_HI20
or R_RISCV_GOT_HI20.  The HI20 relocation's symbol identifies the actual target.
@param elfRelocationContext ELF relocation context for RISCV
@param hi20Symbol symbol which identifies a HI20 relocation offset
@param relocAddrOffsetAdj relocation offset adjustment to be used when computing
actual address offet within the target program.
@return the 32-bit HI20 relative offset value or 0 if HI20 relocation not found
Ghidra/Processors/RISCV/src/main/java/ghidra/app/util/bin/format/elf/relocation/RISCV_ElfRelocationHandler.java