protected Address getAddress(String vertexIdString) {
		Address address = program.getAddressFactory().getAddress(vertexIdString);
		if (address != null) {
			return address;
		}

		// the vertex id was not an address, see if it is an external symbol name
		int index = vertexIdString.indexOf(Namespace.DELIMITER);
		if (index <= 0) {
			return null;
		}
		String namespaceName = vertexIdString.substring(0, index);
		String symbolName = vertexIdString.substring(index + 2);
		Namespace namespace = symbolTable.getNamespace(namespaceName, null);
		if (namespace == null) {
			return null;
		}

		List<Symbol> symbols = symbolTable.getSymbols(symbolName, namespace);
		if (symbols.isEmpty()) {
			return null;
		}

		// There should only be one external symbol with the same name.
		// Since externals are not shown in the listing, we are going to do a hack and try
		// and navigate to a "fake" function if one exists. A "fake" function in Ghidra is just
		// an indirect pointer to the external function. If such a pointer exists, Ghidra marks
		// up the location with the function signature.
		Address symbolAddress = symbols.get(0).getAddress();
		if (symbolAddress.isExternalAddress()) {
			Address[] externalLinkageAddresses =
				NavigationUtils.getExternalLinkageAddresses(program, symbolAddress);
			// If this is a "fake" function situation, then there should only be one address
			if (externalLinkageAddresses.length == 1) {
				symbolAddress = externalLinkageAddresses[0];
			}
		}
		return symbolAddress;
	}
Base class for GraphDisplay listeners whose nodes represent addresses.
Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/graph/AddressBasedGraphDisplayListener.java