boolean addReference(Program program, Instruction instr, int opIndex, AddressSpace space,
			Scalar scalar) {
		Address addr = null;
		if (space.isOverlaySpace()) {   // don't do this into overlay spaces.
			return false;
		}
		try {
			addr = space.getAddress(scalar.getUnsignedValue(), true);
		}
		catch (AddressOutOfBoundsException e) {
			return false;
		}

		// if the reference is not in memory or to a well known location, then don't create it
		// because we are not sure it is correct
		if (!program.getMemory().contains(addr)) {
			Symbol symbol = program.getSymbolTable().getPrimarySymbol(addr);
			if (symbol == null || symbol.getSource() == SourceType.DEFAULT) {
				return false;
			}
		}

		//check that the target does not fall inside a defined function
		if (checkOffcutFuncRef(program, addr)) {
			Object objs[] = instr.getOpObjects(opIndex);
			checkForJumpTable(program, instr, opIndex, objs, addr);
			return false;
		}

		// if the operand already has a reference, don't make a new one!  Someone less speculative
		//   probably knew better!
		if (instr.getOperandReferences(opIndex).length != 0) {
			return false;
		}

		//program.getReferenceManager().addMemReference(instr.getMinAddress(), addr, RefType.DATA, false, opIndex);
		instr.addOperandReference(opIndex, addr,
			RefTypeFactory.getDefaultMemoryRefType(instr, opIndex, addr, false),
			SourceType.ANALYSIS);

		return true;
	}
Check if the address is in the Relocation table.
This only counts for relocatable programs.  Every address should be in the relocation table.
@param target location to check
@return
Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/analysis/ScalarOperandAnalyzer.java