mirror of
https://github.com/NationalSecurityAgency/ghidra.git
synced 2025-10-05 02:39:44 +02:00
Merge remote-tracking branch 'origin/patch'
This commit is contained in:
commit
7df082198a
4 changed files with 37 additions and 37 deletions
|
@ -181,7 +181,8 @@ public class ElfRelocationContext<H extends ElfRelocationHandler> {
|
|||
* Get a relocation context for a specfic Elf image and relocation table
|
||||
* @param loadHelper Elf load helper
|
||||
* @param symbolMap Elf symbol placement map
|
||||
* @return relocation context object
|
||||
* @return relocation context object. A generic context will be returned if a custom one
|
||||
* is not defined.
|
||||
*/
|
||||
public static ElfRelocationContext<?> getRelocationContext(ElfLoadHelper loadHelper,
|
||||
Map<ElfSymbol, Address> symbolMap) {
|
||||
|
|
|
@ -164,7 +164,7 @@ public class PEx64UnwindInfoDataType extends DynamicDataType {
|
|||
|
||||
private static EnumDataType unwindInfoFlagsEnum;
|
||||
|
||||
private EnumDataType defineUnwindInfoFlags() {
|
||||
private synchronized EnumDataType defineUnwindInfoFlags() {
|
||||
if (unwindInfoFlagsEnum == null) {
|
||||
unwindInfoFlagsEnum = new EnumDataType("UNW_FLAGS", 1);
|
||||
unwindInfoFlagsEnum.add("UNW_FLAG_NHANDLER", PEx64UnwindInfo.UNW_FLAG_NHANDLER);
|
||||
|
|
|
@ -879,7 +879,8 @@ class ElfProgramBuilder extends MemorySectionResolver implements ElfLoadHelper {
|
|||
}
|
||||
monitor.initialize(totalCount);
|
||||
|
||||
ElfRelocationContext<?> context = ElfRelocationContext.getRelocationContext(this, symbolMap);
|
||||
ElfRelocationContext<?> context =
|
||||
ElfRelocationContext.getRelocationContext(this, symbolMap);
|
||||
try {
|
||||
for (ElfRelocationTable relocationTable : relocationTables) {
|
||||
monitor.checkCancelled();
|
||||
|
@ -887,9 +888,7 @@ class ElfProgramBuilder extends MemorySectionResolver implements ElfLoadHelper {
|
|||
}
|
||||
}
|
||||
finally {
|
||||
if (context != null) {
|
||||
context.dispose();
|
||||
}
|
||||
context.dispose();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -956,9 +955,9 @@ class ElfProgramBuilder extends MemorySectionResolver implements ElfLoadHelper {
|
|||
ElfRelocationContext<?> context, AddressSpace relocationSpace, long baseWordOffset,
|
||||
TaskMonitor monitor) throws CancelledException {
|
||||
|
||||
if (context != null) {
|
||||
context.startRelocationTableProcessing(relocationTable);
|
||||
}
|
||||
boolean processRelocations = ElfLoaderOptionsFactory.performRelocations(options);
|
||||
|
||||
context.startRelocationTableProcessing(relocationTable);
|
||||
|
||||
ElfSymbolTable symbolTable = relocationTable.getAssociatedSymbolTable();
|
||||
ElfRelocation[] relocs = relocationTable.getRelocations();
|
||||
|
@ -977,7 +976,7 @@ class ElfProgramBuilder extends MemorySectionResolver implements ElfLoadHelper {
|
|||
|
||||
boolean relrTypeUnknown = false;
|
||||
int relrRelocationType = 0;
|
||||
if (relocationTable.isRelrTable() && context != null) {
|
||||
if (relocationTable.isRelrTable()) {
|
||||
relrRelocationType = context.getRelrRelocationType();
|
||||
if (relrRelocationType == 0) {
|
||||
relrTypeUnknown = true;
|
||||
|
@ -991,8 +990,8 @@ class ElfProgramBuilder extends MemorySectionResolver implements ElfLoadHelper {
|
|||
monitor.incrementProgress(1);
|
||||
|
||||
int type = reloc.getType();
|
||||
if (type == 0) {
|
||||
continue; // ignore relocation type 0 (i.e., ..._NONE)
|
||||
if (type == 0 && !relocationTable.isRelrTable()) {
|
||||
continue; // ignore relocation type 0 if not a RELR table (i.e., ..._NONE)
|
||||
}
|
||||
|
||||
int symbolIndex = reloc.getSymbolIndex();
|
||||
|
@ -1004,9 +1003,7 @@ class ElfProgramBuilder extends MemorySectionResolver implements ElfLoadHelper {
|
|||
Address baseAddress = relocationSpace.getTruncatedAddress(baseWordOffset, true);
|
||||
|
||||
// relocation offset (r_offset) is defined to be a byte offset (assume byte size is 1)
|
||||
Address relocAddr =
|
||||
context != null ? context.getRelocationAddress(baseAddress, reloc.getOffset())
|
||||
: baseAddress.addWrap(reloc.getOffset());
|
||||
Address relocAddr = context.getRelocationAddress(baseAddress, reloc.getOffset());
|
||||
|
||||
long[] values = new long[] { reloc.getSymbolIndex() };
|
||||
|
||||
|
@ -1018,6 +1015,11 @@ class ElfProgramBuilder extends MemorySectionResolver implements ElfLoadHelper {
|
|||
Status status = Status.SKIPPED;
|
||||
int byteLength = 0;
|
||||
try {
|
||||
|
||||
if (!processRelocations) {
|
||||
continue; // skip and record relocation
|
||||
}
|
||||
|
||||
if (unableToApplyRelocs) {
|
||||
status = Status.FAILURE;
|
||||
context.markRelocationError(relocAddr, type, symbolIndex, symbolName,
|
||||
|
@ -1044,17 +1046,15 @@ class ElfProgramBuilder extends MemorySectionResolver implements ElfLoadHelper {
|
|||
}
|
||||
}
|
||||
|
||||
if (context != null) {
|
||||
if (relrTypeUnknown) {
|
||||
status = Status.UNSUPPORTED;
|
||||
ElfRelocationHandler.bookmarkUnsupportedRelr(program, relocAddr,
|
||||
symbolIndex, symbolName);
|
||||
}
|
||||
else {
|
||||
RelocationResult result = context.processRelocation(reloc, relocAddr);
|
||||
byteLength = result.byteLength();
|
||||
status = result.status();
|
||||
}
|
||||
if (relrTypeUnknown) {
|
||||
status = Status.UNSUPPORTED;
|
||||
ElfRelocationHandler.bookmarkUnsupportedRelr(program, relocAddr, symbolIndex,
|
||||
symbolName);
|
||||
}
|
||||
else {
|
||||
RelocationResult result = context.processRelocation(reloc, relocAddr);
|
||||
byteLength = result.byteLength();
|
||||
status = result.status();
|
||||
}
|
||||
}
|
||||
catch (MemoryAccessException e) {
|
||||
|
@ -1072,9 +1072,7 @@ class ElfProgramBuilder extends MemorySectionResolver implements ElfLoadHelper {
|
|||
}
|
||||
}
|
||||
|
||||
if (context != null) {
|
||||
context.endRelocationTableProcessing();
|
||||
}
|
||||
context.endRelocationTableProcessing();
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -130,6 +130,7 @@ public class EnumDataType extends GenericDataType implements Enum {
|
|||
List<String> names = new ArrayList<>();
|
||||
Collection<List<String>> values = valueMap.values();
|
||||
for (List<String> list : values) {
|
||||
list = new ArrayList<>(list);
|
||||
Collections.sort(list);
|
||||
names.addAll(list);
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue