Merge remote-tracking branch 'origin/patch'

This commit is contained in:
ghidra1 2024-07-29 17:57:26 -04:00
commit 7df082198a
4 changed files with 37 additions and 37 deletions

View file

@ -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) {

View file

@ -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);

View file

@ -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,11 +888,9 @@ class ElfProgramBuilder extends MemorySectionResolver implements ElfLoadHelper {
}
}
finally {
if (context != null) {
context.dispose();
}
}
}
private void processRelocationTable(ElfRelocationTable relocationTable,
ElfRelocationContext<?> context, TaskMonitor monitor) throws CancelledException {
@ -956,9 +955,9 @@ class ElfProgramBuilder extends MemorySectionResolver implements ElfLoadHelper {
ElfRelocationContext<?> context, AddressSpace relocationSpace, long baseWordOffset,
TaskMonitor monitor) throws CancelledException {
if (context != null) {
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,11 +1046,10 @@ class ElfProgramBuilder extends MemorySectionResolver implements ElfLoadHelper {
}
}
if (context != null) {
if (relrTypeUnknown) {
status = Status.UNSUPPORTED;
ElfRelocationHandler.bookmarkUnsupportedRelr(program, relocAddr,
symbolIndex, symbolName);
ElfRelocationHandler.bookmarkUnsupportedRelr(program, relocAddr, symbolIndex,
symbolName);
}
else {
RelocationResult result = context.processRelocation(reloc, relocAddr);
@ -1056,7 +1057,6 @@ class ElfProgramBuilder extends MemorySectionResolver implements ElfLoadHelper {
status = result.status();
}
}
}
catch (MemoryAccessException e) {
if (type != 0) { // ignore if type 0 which is always NONE (no relocation performed)
status = Status.FAILURE;
@ -1072,10 +1072,8 @@ class ElfProgramBuilder extends MemorySectionResolver implements ElfLoadHelper {
}
}
if (context != null) {
context.endRelocationTableProcessing();
}
}
@Override
public long getOriginalValue(Address addr, boolean signExtend) throws MemoryAccessException {

View file

@ -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);
}