mirror of
https://github.com/NationalSecurityAgency/ghidra.git
synced 2025-10-03 17:59:46 +02:00
GP-4968 - PDB U source lines
This commit is contained in:
parent
141e71600d
commit
a19571e718
2 changed files with 63 additions and 36 deletions
|
@ -43,11 +43,11 @@ public class PdbApplicatorOptions {
|
||||||
|
|
||||||
// Apply Source Line Numbers.
|
// Apply Source Line Numbers.
|
||||||
private static final String OPTION_NAME_APPLY_SOURCE_LINE_NUMBERS =
|
private static final String OPTION_NAME_APPLY_SOURCE_LINE_NUMBERS =
|
||||||
"Apply Source Line Numbers"; // DWARF says "Output Source Line Info", but we use "Apply"
|
"Import Source Line Info";
|
||||||
private static final String OPTION_DESCRIPTION_APPLY_SOURCE_LINE_NUMBERS =
|
private static final String OPTION_DESCRIPTION_APPLY_SOURCE_LINE_NUMBERS =
|
||||||
"Create source map entries containing the source code filename, line number, address, and" +
|
"Create source map entries containing the source code filename, line number, address, and" +
|
||||||
" length at each location provided in the PDB data.";
|
" length at each location provided in the PDB data.";
|
||||||
private static final boolean DEFAULT_APPLY_SOURCE_LINE_NUMBERS = false;
|
private static final boolean DEFAULT_APPLY_SOURCE_LINE_NUMBERS = true;
|
||||||
private boolean applySourceLineNumbers;
|
private boolean applySourceLineNumbers;
|
||||||
|
|
||||||
// Apply Code Block Comments.
|
// Apply Code Block Comments.
|
||||||
|
@ -190,10 +190,9 @@ public class PdbApplicatorOptions {
|
||||||
private void registerOptions(Options options, boolean enableControl) {
|
private void registerOptions(Options options, boolean enableControl) {
|
||||||
HelpLocation help = null;
|
HelpLocation help = null;
|
||||||
|
|
||||||
//TODO: Uncomment the following for GP-3883
|
options.registerOption(OPTION_NAME_APPLY_SOURCE_LINE_NUMBERS,
|
||||||
// options.registerOption(OPTION_NAME_APPLY_SOURCE_LINE_NUMBERS,
|
applySourceLineNumbers, help,
|
||||||
// applySourceLineNumbers, help,
|
OPTION_DESCRIPTION_APPLY_SOURCE_LINE_NUMBERS);
|
||||||
// OPTION_DESCRIPTION_APPLY_SOURCE_LINE_NUMBERS);
|
|
||||||
|
|
||||||
if (DEVELOPER_MODE || enableControl) {
|
if (DEVELOPER_MODE || enableControl) {
|
||||||
options.registerOption(OPTION_NAME_PROCESSING_CONTROL, PdbApplicatorControl.ALL, help,
|
options.registerOption(OPTION_NAME_PROCESSING_CONTROL, PdbApplicatorControl.ALL, help,
|
||||||
|
@ -203,11 +202,6 @@ public class PdbApplicatorOptions {
|
||||||
// PdbApplicatorOptions
|
// PdbApplicatorOptions
|
||||||
if (DEVELOPER_MODE) {
|
if (DEVELOPER_MODE) {
|
||||||
|
|
||||||
//TODO: Remove the following line for GP-3883
|
|
||||||
options.registerOption(OPTION_NAME_APPLY_SOURCE_LINE_NUMBERS,
|
|
||||||
applySourceLineNumbers, help,
|
|
||||||
OPTION_DESCRIPTION_APPLY_SOURCE_LINE_NUMBERS);
|
|
||||||
|
|
||||||
options.registerOption(OPTION_NAME_APPLY_CODE_SCOPE_BLOCK_COMMENTS,
|
options.registerOption(OPTION_NAME_APPLY_CODE_SCOPE_BLOCK_COMMENTS,
|
||||||
applyCodeScopeBlockComments, help,
|
applyCodeScopeBlockComments, help,
|
||||||
OPTION_DESCRIPTION_APPLY_CODE_SCOPE_BLOCK_COMMENTS);
|
OPTION_DESCRIPTION_APPLY_CODE_SCOPE_BLOCK_COMMENTS);
|
||||||
|
@ -251,9 +245,8 @@ public class PdbApplicatorOptions {
|
||||||
|
|
||||||
private void loadOptions(Options options, boolean enableControl) {
|
private void loadOptions(Options options, boolean enableControl) {
|
||||||
|
|
||||||
//TODO: Uncomment the following for GP-3883
|
applySourceLineNumbers = options.getBoolean(
|
||||||
// applySourceLineNumbers = options.getBoolean(
|
OPTION_NAME_APPLY_SOURCE_LINE_NUMBERS, applySourceLineNumbers);
|
||||||
// OPTION_NAME_APPLY_SOURCE_LINE_NUMBERS, applySourceLineNumbers);
|
|
||||||
|
|
||||||
if (DEVELOPER_MODE || enableControl) {
|
if (DEVELOPER_MODE || enableControl) {
|
||||||
control = options.getEnum(OPTION_NAME_PROCESSING_CONTROL, PdbApplicatorControl.ALL);
|
control = options.getEnum(OPTION_NAME_PROCESSING_CONTROL, PdbApplicatorControl.ALL);
|
||||||
|
@ -262,10 +255,6 @@ public class PdbApplicatorOptions {
|
||||||
// PdbApplicatorOptions
|
// PdbApplicatorOptions
|
||||||
if (DEVELOPER_MODE) {
|
if (DEVELOPER_MODE) {
|
||||||
|
|
||||||
//TODO: Remove the following line for GP-3883
|
|
||||||
applySourceLineNumbers = options.getBoolean(
|
|
||||||
OPTION_NAME_APPLY_SOURCE_LINE_NUMBERS, applySourceLineNumbers);
|
|
||||||
|
|
||||||
applyCodeScopeBlockComments = options.getBoolean(
|
applyCodeScopeBlockComments = options.getBoolean(
|
||||||
OPTION_NAME_APPLY_CODE_SCOPE_BLOCK_COMMENTS, applyCodeScopeBlockComments);
|
OPTION_NAME_APPLY_CODE_SCOPE_BLOCK_COMMENTS, applyCodeScopeBlockComments);
|
||||||
|
|
||||||
|
|
|
@ -21,9 +21,16 @@ import ghidra.app.util.bin.format.pdb2.pdbreader.*;
|
||||||
import ghidra.app.util.bin.format.pdb2.pdbreader.Module;
|
import ghidra.app.util.bin.format.pdb2.pdbreader.Module;
|
||||||
import ghidra.app.util.bin.format.pdb2.pdbreader.type.*;
|
import ghidra.app.util.bin.format.pdb2.pdbreader.type.*;
|
||||||
import ghidra.app.util.importer.MessageLog;
|
import ghidra.app.util.importer.MessageLog;
|
||||||
|
import ghidra.framework.store.LockException;
|
||||||
|
import ghidra.program.database.sourcemap.SourceFile;
|
||||||
|
import ghidra.program.database.sourcemap.SourceFileIdType;
|
||||||
import ghidra.program.model.address.Address;
|
import ghidra.program.model.address.Address;
|
||||||
|
import ghidra.program.model.address.AddressOverflowException;
|
||||||
import ghidra.program.model.listing.*;
|
import ghidra.program.model.listing.*;
|
||||||
|
import ghidra.program.model.sourcemap.SourceFileManager;
|
||||||
import ghidra.util.Msg;
|
import ghidra.util.Msg;
|
||||||
|
import ghidra.util.SourceFileUtils;
|
||||||
|
import ghidra.util.exception.AssertException;
|
||||||
import ghidra.util.exception.CancelledException;
|
import ghidra.util.exception.CancelledException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -38,7 +45,7 @@ public class PdbSourceLinesApplicator {
|
||||||
|
|
||||||
private Map<Address, Integer> functionLengthByAddress;
|
private Map<Address, Integer> functionLengthByAddress;
|
||||||
|
|
||||||
// private SourceFileManager manager;
|
private SourceFileManager manager;
|
||||||
|
|
||||||
//==============================================================================================
|
//==============================================================================================
|
||||||
/**
|
/**
|
||||||
|
@ -56,7 +63,7 @@ public class PdbSourceLinesApplicator {
|
||||||
|
|
||||||
functionLengthByAddress = new HashMap<>();
|
functionLengthByAddress = new HashMap<>();
|
||||||
|
|
||||||
//manager = program.getSourceFileManager();
|
manager = program.getSourceFileManager();
|
||||||
}
|
}
|
||||||
|
|
||||||
//==============================================================================================
|
//==============================================================================================
|
||||||
|
@ -338,13 +345,39 @@ public class PdbSourceLinesApplicator {
|
||||||
}
|
}
|
||||||
|
|
||||||
//==============================================================================================
|
//==============================================================================================
|
||||||
// Temporary mock class
|
// Processing in the section is geared toward C13 records processing. Have not evaluated its
|
||||||
private static class SourceFile {
|
// usefulness for C11 records
|
||||||
// Empty
|
/**
|
||||||
}
|
* Finds or creates a SourceFile for our checksum and file ID for C13 processing
|
||||||
|
* @param fileChecksums the set of FileChecksumC13Sections for this module
|
||||||
|
* @param fileId the file ID found in the source line records
|
||||||
|
* @return the source file
|
||||||
|
*/
|
||||||
private SourceFile getSourceFile(FileChecksumsC13Section fileChecksums, int fileId) {
|
private SourceFile getSourceFile(FileChecksumsC13Section fileChecksums, int fileId) {
|
||||||
return new SourceFile();
|
|
||||||
|
// Note: fileId is an offset into the checksum table, so we have them stored in a map.
|
||||||
|
C13FileChecksum checksumInfo = fileChecksums.getFileChecksumByOffset(fileId);
|
||||||
|
|
||||||
|
Long offsetFilename = checksumInfo.getOffsetFilename();
|
||||||
|
String filename = pdb.getNameStringFromOffset(offsetFilename.intValue());
|
||||||
|
SourceFileIdType idType = switch (checksumInfo.getChecksumTypeValue()) {
|
||||||
|
case 0 -> SourceFileIdType.NONE;
|
||||||
|
case 1 -> SourceFileIdType.MD5;
|
||||||
|
case 2 -> SourceFileIdType.SHA1;
|
||||||
|
case 3 -> SourceFileIdType.SHA256;
|
||||||
|
default -> SourceFileIdType.UNKNOWN;
|
||||||
|
};
|
||||||
|
byte[] identifier = checksumInfo.getChecksumBytes();
|
||||||
|
|
||||||
|
SourceFile sourceFile =
|
||||||
|
SourceFileUtils.getSourceFileFromPathString(filename, idType, identifier);
|
||||||
|
try {
|
||||||
|
manager.addSourceFile(sourceFile);
|
||||||
|
}
|
||||||
|
catch (LockException e) {
|
||||||
|
throw new AssertionError("LockException after exclusive access verified!");
|
||||||
|
}
|
||||||
|
return sourceFile;
|
||||||
}
|
}
|
||||||
|
|
||||||
//==============================================================================================
|
//==============================================================================================
|
||||||
|
@ -363,16 +396,21 @@ public class PdbSourceLinesApplicator {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// try {
|
try {
|
||||||
// manager.addSourceMapEntry(sourceFile, start, address, length);
|
manager.addSourceMapEntry(sourceFile, start, address, length);
|
||||||
// }
|
}
|
||||||
// catch (LockException e) {
|
catch (LockException e) {
|
||||||
// throw new AssertException("LockException after exclusive access verified!");
|
throw new AssertException("LockException after exclusive access verified!");
|
||||||
// }
|
}
|
||||||
// catch (AddressOverflowException e) {
|
catch (AddressOverflowException e) {
|
||||||
// log.appendMsg("PDB", "AddressOverflow for source map info: %s, %d, %s, %d"
|
log.appendMsg("PDB", "AddressOverflow for source map info: %s, %d, %s, %d"
|
||||||
// .formatted(sourceFile.getPath(), start, address.toString(), length));
|
.formatted(sourceFile.getPath(), start, address.toString(), length));
|
||||||
// }
|
}
|
||||||
|
catch (IllegalArgumentException e) {
|
||||||
|
// thrown by SourceFileManager.addSourceMapEntry if the new entry conflicts
|
||||||
|
// with an existing entry or if sourceFile is not associated with manager
|
||||||
|
log.appendMsg("PDB", e.getMessage());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue