private Address addDynamicMemoryReference(Data valueData, boolean definedMemoryOnly,
			String label) throws InvalidInputException {
		Scalar value = valueData.getScalar(0);
		if (value == null || value.getUnsignedValue() == 0) {
			return null;
		}
		Address refAddr = getDefaultAddress(elf.adjustAddressForPrelink(value.getValue()));
		if (!definedMemoryOnly || memory.getBlock(refAddr) != null) {
			program.getReferenceManager()
					.addMemoryReference(valueData.getAddress(), refAddr, RefType.DATA,
						SourceType.ANALYSIS, 0);
			if (!StringUtils.isBlank(label)) {
				// add label if no label exists of there is just a default label
				Symbol symbol = program.getSymbolTable().getPrimarySymbol(refAddr);
				if (symbol == null || symbol.getSource() == SourceType.DEFAULT) {
					createSymbol(refAddr, "_" + label, false, false, null);
				}
			}
		}
		return refAddr;
	}
Add memory reference to dynamic table scalar value and return the referenced address
specified by the value
@param valueData defined {@link Data} within the dynamic table whose operand value should 
		be treated as an address offset and to which a memory reference should be applied.
@param definedMemoryOnly if true derived reference to-address must exist within a defined
		memory block. 
@param label optional label to be applied at reference to-address (may be null)
@return referenced to-address specified by the value
@throws InvalidInputException if an invalid label name is specified
Ghidra/Features/Base/src/main/java/ghidra/app/util/opinion/ElfProgramBuilder.java