mirror of
https://github.com/NationalSecurityAgency/ghidra.git
synced 2025-10-03 17:59:46 +02:00
Merge remote-tracking branch 'origin/GT-2741_ghidra1_ElfProgramProperties'
This commit is contained in:
commit
cf09b6443f
2 changed files with 66 additions and 92 deletions
|
@ -46,6 +46,10 @@ public class ElfLoader extends AbstractLibrarySupportLoader {
|
||||||
|
|
||||||
public final static String ELF_ENTRY_FUNCTION_NAME = "entry";
|
public final static String ELF_ENTRY_FUNCTION_NAME = "entry";
|
||||||
|
|
||||||
|
public final static String ELF_FILE_TYPE_PROPERTY = "ELF File Type";
|
||||||
|
public final static String ELF_ORIGINAL_IMAGE_BASE_PROPERTY = "ELF Original Image Base";
|
||||||
|
public final static String ELF_PRELINKED_PROPERTY = "ELF Prelinked";
|
||||||
|
|
||||||
public final static String ELF_REQUIRED_LIBRARY_PROPERTY_PREFIX = "ELF Required Library ["; // followed by "#]"
|
public final static String ELF_REQUIRED_LIBRARY_PROPERTY_PREFIX = "ELF Required Library ["; // followed by "#]"
|
||||||
public final static String ELF_SOURCE_FILE_PROPERTY_PREFIX = "ELF Source File ["; // followed by "#]"
|
public final static String ELF_SOURCE_FILE_PROPERTY_PREFIX = "ELF Source File ["; // followed by "#]"
|
||||||
|
|
||||||
|
@ -83,8 +87,7 @@ public class ElfLoader extends AbstractLibrarySupportLoader {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (baseOffsetStrLen < minNibbles) {
|
else if (baseOffsetStrLen < minNibbles) {
|
||||||
baseOffsetStr =
|
baseOffsetStr = StringUtilities.pad(baseOffsetStr, '0', minNibbles - baseOffsetStrLen);
|
||||||
StringUtilities.pad(baseOffsetStr, '0', minNibbles - baseOffsetStrLen);
|
|
||||||
}
|
}
|
||||||
return baseOffsetStr;
|
return baseOffsetStr;
|
||||||
}
|
}
|
||||||
|
@ -143,8 +146,7 @@ public class ElfLoader extends AbstractLibrarySupportLoader {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void load(ByteProvider provider, LoadSpec loadSpec, List<Option> options,
|
public void load(ByteProvider provider, LoadSpec loadSpec, List<Option> options,
|
||||||
Program program,
|
Program program, MemoryConflictHandler handler, TaskMonitor monitor, MessageLog log)
|
||||||
MemoryConflictHandler handler, TaskMonitor monitor, MessageLog log)
|
|
||||||
throws IOException {
|
throws IOException {
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
|
|
@ -117,6 +117,9 @@ class ElfProgramBuilder extends MemorySectionResolver implements ElfLoadHelper {
|
||||||
int id = program.startTransaction("loading program from ELF");
|
int id = program.startTransaction("loading program from ELF");
|
||||||
boolean success = false;
|
boolean success = false;
|
||||||
try {
|
try {
|
||||||
|
|
||||||
|
addProgramProperties(monitor);
|
||||||
|
|
||||||
setImageBase();
|
setImageBase();
|
||||||
program.setExecutableFormat(ElfLoader.ELF_NAME);
|
program.setExecutableFormat(ElfLoader.ELF_NAME);
|
||||||
|
|
||||||
|
@ -169,9 +172,6 @@ class ElfProgramBuilder extends MemorySectionResolver implements ElfLoadHelper {
|
||||||
processGNU(monitor);
|
processGNU(monitor);
|
||||||
processGNU_readOnly(monitor);
|
processGNU_readOnly(monitor);
|
||||||
|
|
||||||
createFileComment(program.getMinAddress(), monitor);
|
|
||||||
addProgramProperties(monitor);
|
|
||||||
|
|
||||||
success = true;
|
success = true;
|
||||||
}
|
}
|
||||||
finally {
|
finally {
|
||||||
|
@ -258,36 +258,71 @@ class ElfProgramBuilder extends MemorySectionResolver implements ElfLoadHelper {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void addProgramProperties(TaskMonitor monitor) {
|
private void addProgramProperties(TaskMonitor monitor) throws CancelledException {
|
||||||
if (monitor.isCancelled()) {
|
|
||||||
return;
|
monitor.checkCanceled();
|
||||||
}
|
monitor.setMessage("Adding program properties...");
|
||||||
|
|
||||||
Options props = program.getOptions(Program.PROGRAM_INFO);
|
Options props = program.getOptions(Program.PROGRAM_INFO);
|
||||||
|
|
||||||
|
// Preserve original image base which may be required for DWARF address fixup.
|
||||||
|
// String is used to avoid decimal rendering of long values in display.
|
||||||
|
props.setString(ElfLoader.ELF_ORIGINAL_IMAGE_BASE_PROPERTY,
|
||||||
|
"0x" + Long.toHexString(elf.getImageBase()));
|
||||||
|
props.setBoolean(ElfLoader.ELF_PRELINKED_PROPERTY, elf.isPreLinked());
|
||||||
|
|
||||||
|
String elfFileType;
|
||||||
|
boolean isRelocatable = false;
|
||||||
switch (elf.e_type()) {
|
switch (elf.e_type()) {
|
||||||
case ElfConstants.ET_CORE:
|
case ElfConstants.ET_NONE:
|
||||||
case ElfConstants.ET_DYN:
|
elfFileType = "unspecified";
|
||||||
|
break;
|
||||||
case ElfConstants.ET_REL:
|
case ElfConstants.ET_REL:
|
||||||
props.setBoolean(RelocationTable.RELOCATABLE_PROP_NAME, true);
|
elfFileType = "relocatable";
|
||||||
|
isRelocatable = true;
|
||||||
|
break;
|
||||||
|
case ElfConstants.ET_EXEC:
|
||||||
|
elfFileType = "executable";
|
||||||
|
break;
|
||||||
|
case ElfConstants.ET_DYN:
|
||||||
|
elfFileType = "shared object";
|
||||||
|
isRelocatable = true;
|
||||||
|
break;
|
||||||
|
case ElfConstants.ET_CORE:
|
||||||
|
elfFileType = "core";
|
||||||
|
isRelocatable = true;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
props.setBoolean(RelocationTable.RELOCATABLE_PROP_NAME, false);
|
elfFileType = "unknown";
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
props.setString(ElfLoader.ELF_FILE_TYPE_PROPERTY, elfFileType);
|
||||||
|
props.setBoolean(RelocationTable.RELOCATABLE_PROP_NAME, isRelocatable);
|
||||||
|
|
||||||
|
int fileIndex = 0;
|
||||||
|
ElfSymbolTable[] symbolTables = elf.getSymbolTables();
|
||||||
|
for (ElfSymbolTable symbolTable : symbolTables) {
|
||||||
|
monitor.checkCanceled();
|
||||||
|
String[] files = symbolTable.getSourceFiles();
|
||||||
|
for (String file : files) {
|
||||||
|
monitor.checkCanceled();
|
||||||
|
props.setString(ElfLoader.ELF_SOURCE_FILE_PROPERTY_PREFIX + pad(fileIndex++) + "]",
|
||||||
|
file);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int libraryIndex = 0;
|
||||||
|
ElfDynamicTable dynamicTable = elf.getDynamicTable();
|
||||||
|
if (dynamicTable != null) {
|
||||||
|
String[] neededLibs = elf.getDynamicLibraryNames();
|
||||||
|
for (String neededLib : neededLibs) {
|
||||||
|
monitor.checkCanceled();
|
||||||
|
props.setString(
|
||||||
|
ElfLoader.ELF_REQUIRED_LIBRARY_PROPERTY_PREFIX + pad(libraryIndex++) + "]",
|
||||||
|
neededLib);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// TODO: What was the intent of the following block? I'm commenting out for now because this
|
|
||||||
// code does nothing useful. But I'll leave it here in case it's a template for
|
|
||||||
// something that 'should' be implemented.
|
|
||||||
//
|
|
||||||
// // save order list of library dependencies
|
|
||||||
//
|
|
||||||
// String[] dynamicLibraryNames = elf.getDynamicLibraryNames();
|
|
||||||
// if (dynamicLibraryNames.length != 0) {
|
|
||||||
// StringBuilder buf = new StringBuilder();
|
|
||||||
// for (String libName : dynamicLibraryNames) {
|
|
||||||
// // TODO?
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// }
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private AddressRange getMarkupMemoryRangeConstraint(Address addr) {
|
private AddressRange getMarkupMemoryRangeConstraint(Address addr) {
|
||||||
|
@ -2746,69 +2781,6 @@ class ElfProgramBuilder extends MemorySectionResolver implements ElfLoadHelper {
|
||||||
return nextRelocStart;
|
return nextRelocStart;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void createFileComment(Address minAddr, TaskMonitor monitor) {
|
|
||||||
if (minAddr == null) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (monitor.isCancelled()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
monitor.setMessage("Creating file comment...");
|
|
||||||
|
|
||||||
Options props = program.getOptions(Program.PROGRAM_INFO);
|
|
||||||
|
|
||||||
switch (elf.e_type()) {
|
|
||||||
case ElfConstants.ET_CORE:
|
|
||||||
props.setString("ELF File Type", "core");
|
|
||||||
break;
|
|
||||||
case ElfConstants.ET_DYN:
|
|
||||||
props.setString("ELF File Type", "shared object");
|
|
||||||
break;
|
|
||||||
case ElfConstants.ET_EXEC:
|
|
||||||
props.setString("ELF File Type", "executable");
|
|
||||||
break;
|
|
||||||
case ElfConstants.ET_NONE:
|
|
||||||
props.setString("ELF File Type", "unspecified");
|
|
||||||
break;
|
|
||||||
case ElfConstants.ET_REL:
|
|
||||||
props.setString("ELF File Type", "relocatable");
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
props.setString("ELF File Type", "unknown");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
int fileIndex = 0;
|
|
||||||
ElfSymbolTable[] symbolTables = elf.getSymbolTables();
|
|
||||||
for (ElfSymbolTable symbolTable : symbolTables) {
|
|
||||||
if (monitor.isCancelled()) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
String[] files = symbolTable.getSourceFiles();
|
|
||||||
for (String file : files) {
|
|
||||||
if (monitor.isCancelled()) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
props.setString(ElfLoader.ELF_SOURCE_FILE_PROPERTY_PREFIX + pad(fileIndex++) + "]",
|
|
||||||
file);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int libraryIndex = 0;
|
|
||||||
ElfDynamicTable dynamicTable = elf.getDynamicTable();
|
|
||||||
if (dynamicTable != null) {
|
|
||||||
String[] neededLibs = elf.getDynamicLibraryNames();
|
|
||||||
for (String neededLib : neededLibs) {
|
|
||||||
if (monitor.isCancelled()) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
props.setString(
|
|
||||||
ElfLoader.ELF_REQUIRED_LIBRARY_PROPERTY_PREFIX + pad(libraryIndex++) + "]",
|
|
||||||
neededLib);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private String pad(int value) {
|
private String pad(int value) {
|
||||||
return StringUtilities.pad("" + value, ' ', 4);
|
return StringUtilities.pad("" + value, ' ', 4);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue