mirror of
https://github.com/NationalSecurityAgency/ghidra.git
synced 2025-10-05 10:49:34 +02:00
GP-619: dbgeng reports full image path, when possible.
This commit is contained in:
parent
01bd8b9ef0
commit
86caedef05
8 changed files with 59 additions and 12 deletions
|
@ -26,6 +26,8 @@ public interface DbgModule {
|
||||||
|
|
||||||
String getImageName();
|
String getImageName();
|
||||||
|
|
||||||
|
String getModuleName();
|
||||||
|
|
||||||
Long getKnownBase();
|
Long getKnownBase();
|
||||||
|
|
||||||
Integer getSize();
|
Integer getSize();
|
||||||
|
|
|
@ -72,6 +72,11 @@ public class DbgModuleImpl implements DbgModule {
|
||||||
return info == null ? getName() : info.imageName;
|
return info == null ? getName() : info.imageName;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getModuleName() {
|
||||||
|
return info == null ? getName() : info.moduleName;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Long getKnownBase() {
|
public Long getKnownBase() {
|
||||||
return info == null ? 0L : info.baseOffset;
|
return info == null ? 0L : info.baseOffset;
|
||||||
|
|
|
@ -43,6 +43,11 @@ public interface DbgModelTargetModule extends //
|
||||||
: nameAttr.getCachedAttribute(VALUE_ATTRIBUTE_NAME).toString();
|
: nameAttr.getCachedAttribute(VALUE_ATTRIBUTE_NAME).toString();
|
||||||
String sizestr =
|
String sizestr =
|
||||||
size == null ? "1" : size.getCachedAttribute(VALUE_ATTRIBUTE_NAME).toString();
|
size == null ? "1" : size.getCachedAttribute(VALUE_ATTRIBUTE_NAME).toString();
|
||||||
|
String shortnamestr = namestr;
|
||||||
|
int sep = shortnamestr.lastIndexOf('\\');
|
||||||
|
if (sep > 0 && sep < shortnamestr.length()) {
|
||||||
|
shortnamestr = shortnamestr.substring(sep + 1);
|
||||||
|
}
|
||||||
Long base = Long.parseUnsignedLong(basestr, 16);
|
Long base = Long.parseUnsignedLong(basestr, 16);
|
||||||
Integer sz = Integer.parseInt(sizestr, 16);
|
Integer sz = Integer.parseInt(sizestr, 16);
|
||||||
Address min = space.getAddress(base);
|
Address min = space.getAddress(base);
|
||||||
|
@ -52,8 +57,9 @@ public interface DbgModelTargetModule extends //
|
||||||
|
|
||||||
String oldval = (String) getCachedAttribute(DISPLAY_ATTRIBUTE_NAME);
|
String oldval = (String) getCachedAttribute(DISPLAY_ATTRIBUTE_NAME);
|
||||||
map.put(MODULE_NAME_ATTRIBUTE_NAME, namestr);
|
map.put(MODULE_NAME_ATTRIBUTE_NAME, namestr);
|
||||||
map.put(DISPLAY_ATTRIBUTE_NAME, namestr);
|
map.put(SHORT_DISPLAY_ATTRIBUTE_NAME, shortnamestr);
|
||||||
setModified(map, !namestr.equals(oldval));
|
map.put(DISPLAY_ATTRIBUTE_NAME, shortnamestr);
|
||||||
|
setModified(map, !shortnamestr.equals(oldval));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
|
@ -65,7 +65,8 @@ public class DbgModelTargetModuleImpl extends DbgModelTargetObjectImpl
|
||||||
// sections.getName(), sections, //
|
// sections.getName(), sections, //
|
||||||
), Map.of( //
|
), Map.of( //
|
||||||
DISPLAY_ATTRIBUTE_NAME, getIndex(), //
|
DISPLAY_ATTRIBUTE_NAME, getIndex(), //
|
||||||
MODULE_NAME_ATTRIBUTE_NAME, module.getName(), //
|
SHORT_DISPLAY_ATTRIBUTE_NAME, module.getName(), //
|
||||||
|
MODULE_NAME_ATTRIBUTE_NAME, module.getImageName(), //
|
||||||
"BaseAddress", space.getAddress(module.getKnownBase()), //
|
"BaseAddress", space.getAddress(module.getKnownBase()), //
|
||||||
"ImageName", module.getImageName(), //
|
"ImageName", module.getImageName(), //
|
||||||
"TimeStamp", module.getTimeStamp(), //
|
"TimeStamp", module.getTimeStamp(), //
|
||||||
|
|
|
@ -29,14 +29,17 @@ import ghidra.dbg.util.PathUtils;
|
||||||
import ghidra.program.model.address.*;
|
import ghidra.program.model.address.*;
|
||||||
import ghidra.util.Msg;
|
import ghidra.util.Msg;
|
||||||
|
|
||||||
@TargetObjectSchemaInfo(name = "Module", elements = {
|
@TargetObjectSchemaInfo(name = "Module", elements = { //
|
||||||
@TargetElementType(type = Void.class) }, attributes = {
|
@TargetElementType(type = Void.class) //
|
||||||
@TargetAttributeType(type = Void.class) })
|
}, attributes = { //
|
||||||
|
@TargetAttributeType(type = Void.class) //
|
||||||
|
})
|
||||||
public class GdbModelTargetModule
|
public class GdbModelTargetModule
|
||||||
extends DefaultTargetObject<TargetObject, GdbModelTargetModuleContainer>
|
extends DefaultTargetObject<TargetObject, GdbModelTargetModuleContainer>
|
||||||
implements TargetModule<GdbModelTargetModule> {
|
implements TargetModule<GdbModelTargetModule> {
|
||||||
|
|
||||||
public static final String VISIBLE_RANGE_ATTRIBUTE_NAME = "range";
|
public static final String VISIBLE_RANGE_ATTRIBUTE_NAME = "range";
|
||||||
|
public static final String VISIBLE_MODULE_NAME_ATTRIBUTE_NAME = "module name";
|
||||||
|
|
||||||
protected static String indexModule(GdbModule module) {
|
protected static String indexModule(GdbModule module) {
|
||||||
return module.getName();
|
return module.getName();
|
||||||
|
@ -66,11 +69,15 @@ public class GdbModelTargetModule
|
||||||
this.symbols = new GdbModelTargetSymbolContainer(this);
|
this.symbols = new GdbModelTargetSymbolContainer(this);
|
||||||
|
|
||||||
range = doGetRange(); // Likely [0,0]
|
range = doGetRange(); // Likely [0,0]
|
||||||
changeAttributes(List.of(), List.of(sections, symbols),
|
changeAttributes(List.of(), List.of(sections, symbols), Map.of( //
|
||||||
Map.of(VISIBLE_RANGE_ATTRIBUTE_NAME, range, RANGE_ATTRIBUTE_NAME, range,
|
VISIBLE_RANGE_ATTRIBUTE_NAME, range, //
|
||||||
MODULE_NAME_ATTRIBUTE_NAME, module.getName(), UPDATE_MODE_ATTRIBUTE_NAME,
|
VISIBLE_MODULE_NAME_ATTRIBUTE_NAME, module.getName(), //
|
||||||
TargetUpdateMode.FIXED, DISPLAY_ATTRIBUTE_NAME, module.getName()),
|
RANGE_ATTRIBUTE_NAME, range, //
|
||||||
"Initialized");
|
MODULE_NAME_ATTRIBUTE_NAME, module.getName(), //
|
||||||
|
UPDATE_MODE_ATTRIBUTE_NAME, TargetUpdateMode.FIXED, //
|
||||||
|
SHORT_DISPLAY_ATTRIBUTE_NAME, getDisplay(), //
|
||||||
|
DISPLAY_ATTRIBUTE_NAME, getDisplay() //
|
||||||
|
), "Initialized");
|
||||||
}
|
}
|
||||||
|
|
||||||
public CompletableFuture<Void> init() {
|
public CompletableFuture<Void> init() {
|
||||||
|
@ -92,7 +99,12 @@ public class GdbModelTargetModule
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getDisplay() {
|
public String getDisplay() {
|
||||||
return module.getName();
|
String shortName = module.getName();
|
||||||
|
int sep = shortName.lastIndexOf('/');
|
||||||
|
if (sep > 0 && sep < shortName.length()) {
|
||||||
|
shortName = shortName.substring(sep + 1);
|
||||||
|
}
|
||||||
|
return shortName;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected AddressRange doGetRange() {
|
protected AddressRange doGetRange() {
|
||||||
|
@ -124,4 +136,10 @@ public class GdbModelTargetModule
|
||||||
public AddressRange getVisibleRange() {
|
public AddressRange getVisibleRange() {
|
||||||
return range;
|
return range;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TargetAttributeType(name = VISIBLE_MODULE_NAME_ATTRIBUTE_NAME)
|
||||||
|
public String getVisibleModuleName() {
|
||||||
|
return module.getName();
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -74,6 +74,7 @@ public class JdiModelTargetReferenceType extends JdiModelTargetType implements /
|
||||||
Address zero = impl.getAddressSpace("ram").getAddress(0L);
|
Address zero = impl.getAddressSpace("ram").getAddress(0L);
|
||||||
changeAttributes(List.of(), List.of(), Map.of( //
|
changeAttributes(List.of(), List.of(), Map.of( //
|
||||||
DISPLAY_ATTRIBUTE_NAME, reftype.name(), //
|
DISPLAY_ATTRIBUTE_NAME, reftype.name(), //
|
||||||
|
SHORT_DISPLAY_ATTRIBUTE_NAME, reftype.name(), //
|
||||||
RANGE_ATTRIBUTE_NAME, new AddressRangeImpl(zero, zero), //
|
RANGE_ATTRIBUTE_NAME, new AddressRangeImpl(zero, zero), //
|
||||||
MODULE_NAME_ATTRIBUTE_NAME, reftype.name(), //
|
MODULE_NAME_ATTRIBUTE_NAME, reftype.name(), //
|
||||||
UPDATE_MODE_ATTRIBUTE_NAME, TargetUpdateMode.FIXED //
|
UPDATE_MODE_ATTRIBUTE_NAME, TargetUpdateMode.FIXED //
|
||||||
|
|
|
@ -73,6 +73,7 @@ public class DebuggerModulesProvider extends ComponentProviderAdapter {
|
||||||
implements EnumeratedTableColumn<ModuleTableColumns, ModuleRow> {
|
implements EnumeratedTableColumn<ModuleTableColumns, ModuleRow> {
|
||||||
BASE("Base Address", Address.class, ModuleRow::getBase),
|
BASE("Base Address", Address.class, ModuleRow::getBase),
|
||||||
MAX("Max Address", Address.class, ModuleRow::getMaxAddress),
|
MAX("Max Address", Address.class, ModuleRow::getMaxAddress),
|
||||||
|
SHORT_NAME("Name", String.class, ModuleRow::getShortName),
|
||||||
NAME("Module Name", String.class, ModuleRow::getName, ModuleRow::setName),
|
NAME("Module Name", String.class, ModuleRow::getName, ModuleRow::setName),
|
||||||
LIFESPAN("Lifespan", Range.class, ModuleRow::getLifespan),
|
LIFESPAN("Lifespan", Range.class, ModuleRow::getLifespan),
|
||||||
LENGTH("Length", Long.class, ModuleRow::getLength);
|
LENGTH("Length", Long.class, ModuleRow::getLength);
|
||||||
|
|
|
@ -39,6 +39,19 @@ public class ModuleRow {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public String getShortName() {
|
||||||
|
String name = module.getName();
|
||||||
|
int sep = name.lastIndexOf('\\');
|
||||||
|
if (sep > 0 && sep < name.length()) {
|
||||||
|
name = name.substring(sep + 1);
|
||||||
|
}
|
||||||
|
sep = name.lastIndexOf('/');
|
||||||
|
if (sep > 0 && sep < name.length()) {
|
||||||
|
name = name.substring(sep + 1);
|
||||||
|
}
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
public String getName() {
|
public String getName() {
|
||||||
return module.getName();
|
return module.getName();
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue