ExternalIATSymbol allocateIATEntry(Address iatEntryAddr, RelocationTable relocationTable)
				throws MemoryAccessException, CodeUnitInsertionException {
			/** 
			 * symbolAddr (0x41a724) - corresponds to IAT location which refers to 
			 *    __imp__ZTIPi -> _ZTIPi
			 *    following original IBO32 value points at IMAGE_IMPORT_BY_NAME:
			 *       dword index (0x135c)
			 *       ds name ("_ZTIPi")
			 *    The above was used to formulate external location and reference
			 *    
			 * targetAddr (0x410ea0) - location to be fixed-up (relocation applied)
			 * data at relocation target:
			 *   -original bytes: address of IAT entry (i.e., symbolAddr) - may vary by bitLength!
			 *   -post fixup: adjusted by offset from symbolAddr to real external 
			 *               symbol address (*symbolAddr - symbolAddr)
			 */

			ExternalIATSymbol existingEntry = get(iatEntryAddr);
			if (existingEntry != null) {
				return existingEntry;
			}

			Reference ref = program.getReferenceManager().getPrimaryReferenceFrom(iatEntryAddr, 0);
			if (!ref.isExternalReference()) {
				return null;
			}

			Symbol extSym = program.getSymbolTable().getSymbol(ref);
			if (extSym == null) {
				return null;
			}

			ExternalLocation extLoc = program.getExternalManager().getExternalLocation(extSym);
			if (extLoc == null) {
				return null;
			}

			// Update IAT value - reference to EXTERNAL block
			Listing listing = program.getListing();
			listing.clearCodeUnits(iatEntryAddr, iatEntryAddr, false);
			Memory memory = program.getMemory();
			if (pointerSize == 8) { // 64-bit
				memory.setLong(iatEntryAddr, nextExtAddr.getOffset());
			}
			else { // 32-bit
				memory.setInt(iatEntryAddr, (int) nextExtAddr.getOffset());
			}
			listing.createData(iatEntryAddr, PointerDataType.dataType);

			relocationTable.add(iatEntryAddr, Status.APPLIED_OTHER, 0, null, pointerSize,
				extSym.getName());

			try {
				if (extLoc.isFunction()) {
					Function func = listing.createFunction(null, nextExtAddr,
						new AddressSet(nextExtAddr, nextExtAddr), SourceType.DEFAULT);
					func.setThunkedFunction(extLoc.getFunction());
				}
				else {
					// TODO: Not sure how to preserve relationship to external symbol 
					// which refers to Library
					listing.setComment(nextExtAddr, CommentType.PLATE,
						"External Location: " + extSym.getName(true));
					String name = extLoc.getOriginalImportedName();
					boolean demangle = true;
					if (name == null) {
						name = extSym.getName();
						demangle = false;
					}

					createPrimaryLabel(nextExtAddr, name);

					if (demangle) {
						DemanglerCmd cmd = new DemanglerCmd(nextExtAddr, name);
						cmd.applyTo(program);
					}
				}
			}
			catch (Exception e) {
				Msg.error(this, "Failed to create EXTERNAL block symbol at " + nextExtAddr);
			}

			ExternalIATSymbol extIATSym = new ExternalIATSymbol(nextExtAddr, extLoc);
			put(iatEntryAddr, extIATSym);

			nextExtAddr = nextExtAddr.add(pointerSize);

			return extIATSym;
		}
Maps IAT addresses to EXTERNAL block allocation identified by {@link ExternalIATSymbol}
Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/analysis/MingwRelocationAnalyzer.java