Skip to content

Commit de7cdae

Browse files
committed
FunctionID: Add option to disable namespace stripping
1 parent 2333ab6 commit de7cdae

File tree

5 files changed

+40
-11
lines changed

5 files changed

+40
-11
lines changed

Ghidra/Features/FunctionID/ghidra_scripts/CreateMultipleLibraries.java

+5-1
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ public class CreateMultipleLibraries extends GhidraScript {
5858
private File commonSymbolsFile = null;
5959
private List<String> commonSymbols = null;
6060
private LanguageID languageID = null;
61+
private boolean disableNamespaceStripping = false;
6162

6263
private MyFidPopulateResultReporter reporter = null;
6364

@@ -280,7 +281,7 @@ private void populateLibrary(DomainFolder folder) {
280281

281282
FidPopulateResult result = service.createNewLibraryFromPrograms(fidDb,
282283
currentLibraryName, currentLibraryVersion, currentLibraryVariant, programs, null,
283-
languageID, null, commonSymbols, TaskMonitor.DUMMY);
284+
languageID, null, commonSymbols, disableNamespaceStripping, TaskMonitor.DUMMY);
284285
reporter.report(result);
285286
}
286287
catch (CancelledException e) {
@@ -370,6 +371,9 @@ protected void run() throws Exception {
370371
String lang = askString("Enter LanguageID To Process", "Language ID: ");
371372
languageID = new LanguageID(lang);
372373

374+
disableNamespaceStripping =
375+
askYesNo("Disable namespace stripping", "Do you want to disable namespace stripping?");
376+
373377
parseSymbols();
374378
reporter = new MyFidPopulateResultReporter();
375379
fidDb = fidFile.getFidDB(true);

Ghidra/Features/FunctionID/src/main/java/ghidra/feature/fid/plugin/IngestTask.java

+5-1
Original file line numberDiff line numberDiff line change
@@ -45,10 +45,12 @@ public class IngestTask extends Task {
4545
private File commonSymbolsFile;
4646
private FidService fidService;
4747
private FidPopulateResultReporter reporter;
48+
private boolean disableNamespaceStripping;
4849

4950
public IngestTask(String title, FidFile fidFile, LibraryRecord libraryRecord,
5051
DomainFolder folder, String libraryFamilyName, String libraryVersion,
51-
String libraryVariant, String languageId, File commonSymbolsFile, FidService fidService,
52+
String libraryVariant, String languageId, File commonSymbolsFile,
53+
boolean disableNamespaceStripping, FidService fidService,
5254
FidPopulateResultReporter reporter) {
5355
super(title, true, false, false, false);
5456
this.fidFile = fidFile;
@@ -61,6 +63,7 @@ public IngestTask(String title, FidFile fidFile, LibraryRecord libraryRecord,
6163
this.fidService = fidService;
6264
this.reporter = reporter;
6365
this.languageId = new LanguageID(languageId);
66+
this.disableNamespaceStripping = disableNamespaceStripping;
6467
}
6568

6669
@Override
@@ -95,6 +98,7 @@ public void run(TaskMonitor monitor) {
9598
FidPopulateResult result = fidService.createNewLibraryFromPrograms(fidDb,
9699
libraryFamilyName, libraryVersion, libraryVariant, programs, null, languageId,
97100
libraryRecord == null ? null : Arrays.asList(libraryRecord), commonSymbols,
101+
disableNamespaceStripping,
98102
monitor);
99103
reporter.report(result);
100104
fidDb.saveDatabase("Saving", monitor);

Ghidra/Features/FunctionID/src/main/java/ghidra/feature/fid/plugin/PopulateFidDialog.java

+12-1
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ public class PopulateFidDialog extends DialogComponentProvider {
6363
private FidService fidService;
6464
private JTextField languageIdField;
6565
private JTextField symbolsFileTextField;
66+
private JCheckBox namespaceStrippingCheckBox;
6667

6768
protected PopulateFidDialog(PluginTool tool, FidService fidService) {
6869
super("Populate Fid Database");
@@ -87,14 +88,19 @@ protected void okCallback() {
8788
DomainFolder folder = getDomainFolder();
8889
String languageFilter = languageIdField.getText().trim();
8990
File commonSymbolsFile = getCommonSymbolsFile();
91+
boolean disableNamespaceStripping = getNamespaceOption();
9092

9193
Task task = new IngestTask("Populate Library Task", fidFile, libraryRecord, folder,
9294
libraryFamilyName, libraryVersion, libraryVariant, languageFilter, commonSymbolsFile,
93-
fidService, new DefaultFidPopulateResultReporter());
95+
disableNamespaceStripping, fidService, new DefaultFidPopulateResultReporter());
9496
close();
9597
tool.execute(task);
9698
}
9799

100+
private boolean getNamespaceOption() {
101+
return namespaceStrippingCheckBox.isSelected();
102+
}
103+
98104
private File getCommonSymbolsFile() {
99105
String symbolsFilePath = symbolsFileTextField.getText().trim();
100106
if (symbolsFilePath.isEmpty()) {
@@ -144,6 +150,11 @@ private JComponent buildMainPanel() {
144150
panel.add(new GLabel("Common Symbols File: ", SwingConstants.RIGHT));
145151
panel.add(buildSymbolsFileField(), jLabel);
146152

153+
panel.add(new GLabel("Disable namespace stripping (experimental)", SwingConstants.RIGHT));
154+
namespaceStrippingCheckBox = new JCheckBox();
155+
namespaceStrippingCheckBox.addActionListener(e -> updateOkEnablement());
156+
panel.add(namespaceStrippingCheckBox);
157+
147158
return panel;
148159
}
149160

Ghidra/Features/FunctionID/src/main/java/ghidra/feature/fid/service/FidService.java

+4-2
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,7 @@ public FidProgramSeeker getProgramSeeker(Program program, FidQueryService fidQue
182182
* @param linkLibraries libraries to search for (internally) unresolved symbols
183183
* @param commonSymbols is a list of symbols for which relationships are not generated
184184
* @param monitor a task monitor
185+
* @param disableNamespaceStripping boolean to disable namespace stripping
185186
* @throws MemoryAccessException if bytes are unavailable for a function body
186187
* @throws VersionException if any program cannot be opened without an upgrade
187188
* @throws CancelledException if the user cancels
@@ -191,12 +192,13 @@ public FidProgramSeeker getProgramSeeker(Program program, FidQueryService fidQue
191192
public FidPopulateResult createNewLibraryFromPrograms(FidDB fidDb, String libraryFamilyName,
192193
String libraryVersion, String libraryVariant, List<DomainFile> programDomainFiles,
193194
Predicate<Pair<Function, FidHashQuad>> functionFilter, LanguageID languageId,
194-
List<LibraryRecord> linkLibraries, List<String> commonSymbols, TaskMonitor monitor)
195+
List<LibraryRecord> linkLibraries, List<String> commonSymbols,
196+
boolean disableNamespaceStripping, TaskMonitor monitor)
195197
throws MemoryAccessException, VersionException, CancelledException,
196198
IllegalStateException, IOException {
197199
FidServiceLibraryIngest ingest = new FidServiceLibraryIngest(fidDb, this, libraryFamilyName,
198200
libraryVersion, libraryVariant, programDomainFiles, functionFilter, languageId,
199-
linkLibraries, monitor);
201+
linkLibraries, monitor, disableNamespaceStripping);
200202
ingest.markCommonChildReferences(commonSymbols);
201203
return ingest.create();
202204
}

Ghidra/Features/FunctionID/src/main/java/ghidra/feature/fid/service/FidServiceLibraryIngest.java

+14-6
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ class FidServiceLibraryIngest {
4949
private Predicate<Pair<Function, FidHashQuad>> functionFilter;
5050
private LanguageID languageId; // Language for everything in this library
5151
private List<LibraryRecord> linkLibraries;
52+
private boolean disableNamespaceStripping;
5253
private TaskMonitor monitor;
5354

5455
private LibraryRecord library = null; // Database record of the library we are creating
@@ -176,11 +177,13 @@ public int compareTo(ChildSymbol o) {
176177
* @param languageId the Ghidra language id to filter programs by
177178
* @param linkLibraries the list of libraries to use for unresolved symbols
178179
* @param monitor a task monitor
180+
* @param disableNamespaceStripping boolean to disable namespace stripping
179181
*/
180182
public FidServiceLibraryIngest(FidDB fidDb, FidService service, String libraryFamilyName,
181183
String libraryVersion, String libraryVariant, List<DomainFile> programFiles,
182184
Predicate<Pair<Function, FidHashQuad>> functionFilter, LanguageID languageId,
183-
List<LibraryRecord> linkLibraries, TaskMonitor monitor) {
185+
List<LibraryRecord> linkLibraries, TaskMonitor monitor,
186+
boolean disableNamespaceStripping) {
184187
this.fidDb = fidDb;
185188
this.service = service;
186189
this.libraryFamilyName = libraryFamilyName;
@@ -191,6 +194,7 @@ public FidServiceLibraryIngest(FidDB fidDb, FidService service, String libraryFa
191194
this.languageId = languageId;
192195
this.linkLibraries = linkLibraries;
193196
this.monitor = monitor;
197+
this.disableNamespaceStripping = disableNamespaceStripping;
194198
if (languageId == null) {
195199
throw new IllegalArgumentException("LanugageID can't be null"); // null used to be allowed, so add special check
196200
}
@@ -240,7 +244,7 @@ public FidPopulateResult create() throws CancelledException, VersionException, I
240244
result = new FidPopulateResult(library);
241245
}
242246

243-
populateLibraryFromProgram(program);
247+
populateLibraryFromProgram(program, disableNamespaceStripping);
244248
}
245249
finally {
246250
if (program != null) {
@@ -261,16 +265,18 @@ public FidPopulateResult create() throws CancelledException, VersionException, I
261265
* Processes a single program, adding it to the library.
262266
* @param result the populate result
263267
* @param program the program
268+
* @param disableNamespaceStripping boolean to disable namespace stripping
264269
* @throws CancelledException if the user cancels
265270
*/
266-
private void populateLibraryFromProgram(Program program) throws CancelledException {
271+
private void populateLibraryFromProgram(Program program, boolean disableNamespaceStripping)
272+
throws CancelledException {
267273

268274
FidHasher hasher = service.getHasher(program);
269275
ArrayList<Function> theFunctions = new ArrayList<>();
270276
Map<Function, FunctionRow> recordMap = new HashMap<>();
271277

272278
// 1) hash all the functions, create function rows for them
273-
hashAllTheFunctions(program, hasher, theFunctions, recordMap);
279+
hashAllTheFunctions(program, hasher, theFunctions, recordMap, disableNamespaceStripping);
274280

275281
// 3) add all the forward (child) call relatives
276282
for (Entry<Function, FunctionRow> entry : recordMap.entrySet()) {
@@ -328,10 +334,12 @@ else if (childRow.toRow.functionRecord == null) { // This child was removed loca
328334
* @param hasher the FID hasher
329335
* @param theFunctions the functions
330336
* @param recordMap the map of function to function records
337+
* @param disableNamespaceStripping boolean to disable namespace stripping
331338
* @throws CancelledException if the user cancels
332339
*/
333340
private void hashAllTheFunctions(Program program, FidHasher hasher,
334-
ArrayList<Function> theFunctions, Map<Function, FunctionRow> recordMap)
341+
ArrayList<Function> theFunctions, Map<Function, FunctionRow> recordMap,
342+
boolean disableNamespaceStripping)
335343
throws CancelledException {
336344
DomainFile domainFile = program.getDomainFile();
337345
FunctionManager functionManager = program.getFunctionManager();
@@ -351,7 +359,7 @@ private void hashAllTheFunctions(Program program, FidHasher hasher,
351359
exclude(domainFile, function, FidPopulateResult.Disposition.NO_DEFINED_SYMBOL);
352360
}
353361
else {
354-
name = function.getSymbol().getName();
362+
name = function.getSymbol().getName(disableNamespaceStripping);
355363
}
356364

357365
FidHashQuad hashQuad = null;

0 commit comments

Comments
 (0)