diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/elf/relocation/ElfRelocationContext.java b/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/elf/relocation/ElfRelocationContext.java index 1414d0cf97..1bbf224e54 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/elf/relocation/ElfRelocationContext.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/elf/relocation/ElfRelocationContext.java @@ -4,9 +4,9 @@ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @@ -181,7 +181,8 @@ public class ElfRelocationContext { * 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 symbolMap) { diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/pe/PEx64UnwindInfoDataType.java b/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/pe/PEx64UnwindInfoDataType.java index f6b71959d8..da43861fbe 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/pe/PEx64UnwindInfoDataType.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/pe/PEx64UnwindInfoDataType.java @@ -4,9 +4,9 @@ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @@ -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); diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/util/opinion/ElfProgramBuilder.java b/Ghidra/Features/Base/src/main/java/ghidra/app/util/opinion/ElfProgramBuilder.java index c883e70a35..a60405e8c3 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/util/opinion/ElfProgramBuilder.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/util/opinion/ElfProgramBuilder.java @@ -4,9 +4,9 @@ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @@ -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 diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/EnumDataType.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/EnumDataType.java index 60934ecf4d..102e19d3f1 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/EnumDataType.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/EnumDataType.java @@ -4,9 +4,9 @@ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @@ -130,6 +130,7 @@ public class EnumDataType extends GenericDataType implements Enum { List names = new ArrayList<>(); Collection> values = valueMap.values(); for (List list : values) { + list = new ArrayList<>(list); Collections.sort(list); names.addAll(list); }