mirror of
https://github.com/NationalSecurityAgency/ghidra.git
synced 2026-06-02 19:48:18 +08:00
Merge remote-tracking branch 'origin/GP-3922_ryanmkurtz_libs'
This commit is contained in:
+33
-23
@@ -627,6 +627,15 @@ public abstract class AbstractLibrarySupportLoader extends AbstractProgramLoader
|
|||||||
TaskMonitor monitor) throws CancelledException, IOException {
|
TaskMonitor monitor) throws CancelledException, IOException {
|
||||||
|
|
||||||
Program library = null;
|
Program library = null;
|
||||||
|
if (libraryDestFolderPath != null) {
|
||||||
|
String libraryPath = FilenameUtils.getPath(libraryName);
|
||||||
|
if (libraryPath != null && !libraryPath.isEmpty()) {
|
||||||
|
if (!libraryDestFolderPath.endsWith("/")) {
|
||||||
|
libraryDestFolderPath += "/";
|
||||||
|
}
|
||||||
|
libraryDestFolderPath += libraryPath;
|
||||||
|
}
|
||||||
|
}
|
||||||
String simpleLibraryName = FilenameUtils.getName(libraryName);
|
String simpleLibraryName = FilenameUtils.getName(libraryName);
|
||||||
List<FSRL> candidateLibraryFsrls =
|
List<FSRL> candidateLibraryFsrls =
|
||||||
findLibrary(Path.of(libraryName), fsSearchPaths, log, monitor);
|
findLibrary(Path.of(libraryName), fsSearchPaths, log, monitor);
|
||||||
@@ -921,14 +930,9 @@ public abstract class AbstractLibrarySupportLoader extends AbstractProgramLoader
|
|||||||
List<DomainFolder> searchFolders, MessageLog messageLog, TaskMonitor monitor)
|
List<DomainFolder> searchFolders, MessageLog messageLog, TaskMonitor monitor)
|
||||||
throws CancelledException, IOException {
|
throws CancelledException, IOException {
|
||||||
|
|
||||||
Map<String, Loaded<Program>> loadedByName = loadedPrograms.stream()
|
monitor.initialize(loadedPrograms.size());
|
||||||
.collect(
|
for (Loaded<Program> loadedProgram : loadedPrograms) {
|
||||||
Collectors.toMap(loaded -> loaded.getName(), loaded -> loaded));
|
monitor.increment();
|
||||||
|
|
||||||
monitor.initialize(loadedByName.size());
|
|
||||||
for (Loaded<Program> loadedProgram : loadedByName.values()) {
|
|
||||||
monitor.incrementProgress(1);
|
|
||||||
monitor.checkCancelled();
|
|
||||||
|
|
||||||
Program program = loadedProgram.getDomainObject();
|
Program program = loadedProgram.getDomainObject();
|
||||||
ExternalManager extManager = program.getExternalManager();
|
ExternalManager extManager = program.getExternalManager();
|
||||||
@@ -941,7 +945,8 @@ public abstract class AbstractLibrarySupportLoader extends AbstractProgramLoader
|
|||||||
monitor.setMessage("Resolving..." + program.getName());
|
monitor.setMessage("Resolving..." + program.getName());
|
||||||
int id = program.startTransaction("Resolving external references");
|
int id = program.startTransaction("Resolving external references");
|
||||||
try {
|
try {
|
||||||
resolveExternalLibraries(program, loadedByName, searchFolders, monitor, messageLog);
|
resolveExternalLibraries(program, loadedPrograms, searchFolders, monitor,
|
||||||
|
messageLog);
|
||||||
}
|
}
|
||||||
finally {
|
finally {
|
||||||
program.endTransaction(id, true);
|
program.endTransaction(id, true);
|
||||||
@@ -957,9 +962,7 @@ public abstract class AbstractLibrarySupportLoader extends AbstractProgramLoader
|
|||||||
*
|
*
|
||||||
* @param program the program whose Library entries are to be resolved. An open
|
* @param program the program whose Library entries are to be resolved. An open
|
||||||
* transaction on program is required.
|
* transaction on program is required.
|
||||||
* @param loadedByName map of recently loaded things to be considered
|
* @param loadedPrograms the list of {@link Loaded} {@link Program}s
|
||||||
* first when resolving external Libraries. Programs not saved to the project
|
|
||||||
* will be ignored.
|
|
||||||
* @param searchFolders an order list of {@link DomainFolder}s which imported libraries will be
|
* @param searchFolders an order list of {@link DomainFolder}s which imported libraries will be
|
||||||
* searched. These folders will be searched if a library is not found within the list of
|
* searched. These folders will be searched if a library is not found within the list of
|
||||||
* programs supplied.
|
* programs supplied.
|
||||||
@@ -968,7 +971,7 @@ public abstract class AbstractLibrarySupportLoader extends AbstractProgramLoader
|
|||||||
* @throws CancelledException if the user cancelled the load.
|
* @throws CancelledException if the user cancelled the load.
|
||||||
*/
|
*/
|
||||||
private void resolveExternalLibraries(Program program,
|
private void resolveExternalLibraries(Program program,
|
||||||
Map<String, Loaded<Program>> loadedByName, List<DomainFolder> searchFolders,
|
List<Loaded<Program>> loadedPrograms, List<DomainFolder> searchFolders,
|
||||||
TaskMonitor monitor, MessageLog messageLog) throws CancelledException {
|
TaskMonitor monitor, MessageLog messageLog) throws CancelledException {
|
||||||
ExternalManager extManager = program.getExternalManager();
|
ExternalManager extManager = program.getExternalManager();
|
||||||
String[] extLibNames = extManager.getExternalLibraryNames();
|
String[] extLibNames = extManager.getExternalLibraryNames();
|
||||||
@@ -981,8 +984,7 @@ public abstract class AbstractLibrarySupportLoader extends AbstractProgramLoader
|
|||||||
}
|
}
|
||||||
monitor.checkCancelled();
|
monitor.checkCancelled();
|
||||||
try {
|
try {
|
||||||
String externalFileName = FilenameUtils.getName(externalLibName);
|
Loaded<Program> matchingExtProgram = findLibrary(loadedPrograms, externalLibName);
|
||||||
Loaded<Program> matchingExtProgram = findLibrary(loadedByName, externalFileName);
|
|
||||||
if (matchingExtProgram != null) {
|
if (matchingExtProgram != null) {
|
||||||
String path =
|
String path =
|
||||||
matchingExtProgram.getProjectFolderPath() + matchingExtProgram.getName();
|
matchingExtProgram.getProjectFolderPath() + matchingExtProgram.getName();
|
||||||
@@ -1011,6 +1013,7 @@ public abstract class AbstractLibrarySupportLoader extends AbstractProgramLoader
|
|||||||
Msg.error(this, "Bad library name: " + externalLibName, e);
|
Msg.error(this, "Bad library name: " + externalLibName, e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
messageLog.appendMsg("------------------------------------------------\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -1134,21 +1137,28 @@ public abstract class AbstractLibrarySupportLoader extends AbstractProgramLoader
|
|||||||
/**
|
/**
|
||||||
* Find the library within the given {@link Map} of {@link Program}s
|
* Find the library within the given {@link Map} of {@link Program}s
|
||||||
*
|
*
|
||||||
* @param loadedByName The map to search
|
* @param loadedPrograms the list of {@link Loaded} {@link Program}s
|
||||||
* @param libraryName The library name to lookup
|
* @param libraryName The library name to lookup. Depending on the type of library, this could
|
||||||
|
* be a simple filename or an absolute path.
|
||||||
* @return The found {@link Loaded} {@link Program} or null if not found
|
* @return The found {@link Loaded} {@link Program} or null if not found
|
||||||
*/
|
*/
|
||||||
private Loaded<Program> findLibrary(Map<String, Loaded<Program>> loadedByName,
|
private Loaded<Program> findLibrary(List<Loaded<Program>> loadedPrograms, String libraryName) {
|
||||||
String libraryName) {
|
|
||||||
Comparator<String> comparator = getLibraryNameComparator();
|
Comparator<String> comparator = getLibraryNameComparator();
|
||||||
boolean noExtension = FilenameUtils.getExtension(libraryName).equals("");
|
boolean noExtension = FilenameUtils.getExtension(libraryName).equals("");
|
||||||
for (String key : loadedByName.keySet()) {
|
boolean absolute = libraryName.startsWith("/");
|
||||||
String candidateName = key;
|
for (Loaded<Program> loadedProgram : loadedPrograms) {
|
||||||
|
String candidateName = loadedProgram.getName();
|
||||||
if (isOptionalLibraryFilenameExtensions() && noExtension) {
|
if (isOptionalLibraryFilenameExtensions() && noExtension) {
|
||||||
candidateName = FilenameUtils.getBaseName(candidateName);
|
candidateName = FilenameUtils.getBaseName(candidateName);
|
||||||
}
|
}
|
||||||
if (comparator.compare(candidateName, libraryName) == 0) {
|
if (absolute) {
|
||||||
return loadedByName.get(key);
|
String loadedProgramPath = loadedProgram.getProjectFolderPath() + candidateName;
|
||||||
|
if (loadedProgramPath.endsWith(libraryName)) {
|
||||||
|
return loadedProgram;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (comparator.compare(candidateName, libraryName) == 0) {
|
||||||
|
return loadedProgram;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
|
|||||||
Reference in New Issue
Block a user