private void log(Consumer<String> logger, boolean shortSummary) {
			boolean changed = unresolvedExternalFunctionIds.size() != externalSymbolCount;
			if (extLibs.isEmpty() && externalSymbolCount == 0) {
				return;
			}
			else if (!changed && !hasSomeLibrariesConfigured()) {
				logger.accept(
					"Resolving External Symbols of [%s] - %d unresolved symbols, no external libraries configured - skipping"
							.formatted(programPath, externalSymbolCount));
				return;
			}

			logger.accept("Resolving External Symbols of [%s]%s".formatted(programPath,
				shortSummary ? " - Summary" : ""));
			logger.accept("\t%d external symbols resolved, %d remain unresolved"
					.formatted(getResolvedSymbolCount(), unresolvedExternalFunctionIds.size()));
			for (ExtLibInfo extLib : extLibs) {
				if (extLib.problem != null) {
					logger.accept("\t[%s] -> %s, %s".formatted(extLib.name, extLib.getLibPath(),
						extLib.getProblemMessage()));
				}
				else if (extLib.programPath != null) {
					logger.accept("\t[%s] -> %s, %d new symbols resolved".formatted(extLib.name,
						extLib.getLibPath(), extLib.resolvedSymbols.size()));
				}
				else {
					logger.accept("\t[%s] -> %s".formatted(extLib.name, extLib.getLibPath()));
				}
				if (!shortSummary) {
					for (String symbolName : extLib.resolvedSymbols) {
						logger.accept("\t\t[%s]".formatted(symbolName));
					}
				}
			}
			if (!shortSummary && changed) {
				if (!unresolvedExternalFunctionIds.isEmpty()) {
					logger.accept("\tUnresolved remaining %d:"
							.formatted(unresolvedExternalFunctionIds.size()));
					SymbolTable symbolTable = program.getSymbolTable();
					for (Long symId : unresolvedExternalFunctionIds) {
						Symbol s = symbolTable.getSymbol(symId);
						logger.accept("\t\t[%s]".formatted(s.getName()));
					}
				}
			}
		}
Represents a program that needs its external symbols to be fixed.
Ghidra/Features/Base/src/main/java/ghidra/program/util/ExternalSymbolResolver.java