mirror of
https://github.com/NationalSecurityAgency/ghidra.git
synced 2025-10-04 10:19:23 +02:00
Gp-3178 fixed AddressOutOfBoundsException when rebasing with pinned
symbols
This commit is contained in:
parent
738e662e82
commit
2cb37fc303
2 changed files with 14 additions and 12 deletions
|
@ -36,7 +36,6 @@ import ghidra.test.AbstractGhidraHeadlessIntegrationTest;
|
|||
import ghidra.util.exception.InvalidInputException;
|
||||
import ghidra.util.exception.NotFoundException;
|
||||
import ghidra.util.task.TaskMonitor;
|
||||
import ghidra.util.task.TaskMonitorAdapter;
|
||||
|
||||
public class PinnedSymbolTest extends AbstractGhidraHeadlessIntegrationTest {
|
||||
private static int EXPECTED_PROCESSOR_SYMBOLS = 9;
|
||||
|
@ -63,11 +62,13 @@ public class PinnedSymbolTest extends AbstractGhidraHeadlessIntegrationTest {
|
|||
checkProcessorSymbolsInPlace(EXPECTED_PROCESSOR_SYMBOLS + EXPECTED_USER_SYMBOLS);
|
||||
assertNotNull(symbolTable.getPrimarySymbol(addr(4)));
|
||||
|
||||
long imageBaseMove = 0x100;
|
||||
Address movedBobAddress = originalBobAddress.add(imageBaseMove);
|
||||
Address movedFunctionAddress = originalFunctionAddress.add(imageBaseMove);
|
||||
Address originalImageBase = program.getImageBase();
|
||||
Address newImageBase = addr(0x100);
|
||||
long imageBaseMove = newImageBase.subtract(originalImageBase);
|
||||
Address movedBobAddress = originalBobAddress.addWrap(imageBaseMove);
|
||||
Address movedFunctionAddress = originalFunctionAddress.addWrap(imageBaseMove);
|
||||
|
||||
program.setImageBase(addr(imageBaseMove), true);
|
||||
program.setImageBase(newImageBase, true);
|
||||
|
||||
// expect one new symbol for pinned function
|
||||
checkProcessorSymbolsInPlace(EXPECTED_PROCESSOR_SYMBOLS + EXPECTED_USER_SYMBOLS + 1);
|
||||
|
@ -259,6 +260,7 @@ public class PinnedSymbolTest extends AbstractGhidraHeadlessIntegrationTest {
|
|||
program = new ProgramDB("z80", lang, lang.getDefaultCompilerSpec(), this);
|
||||
symbolTable = program.getSymbolTable();
|
||||
space = program.getAddressFactory().getDefaultAddressSpace();
|
||||
program.setImageBase(addr(0xff00), BATCH_MODE);
|
||||
|
||||
originalBobAddress = addr(ORIGINAL_BOB_ADDRESS);
|
||||
originalFunctionAddress = addr(ORIGINAL_FUNCTION_ADDRESS);
|
||||
|
@ -269,7 +271,6 @@ public class PinnedSymbolTest extends AbstractGhidraHeadlessIntegrationTest {
|
|||
createBobSymbol();
|
||||
createPinnedFunctionSymbol();
|
||||
|
||||
|
||||
}
|
||||
|
||||
private void createProcessorSymbols(Language lang) throws InvalidInputException {
|
||||
|
@ -309,7 +310,8 @@ public class PinnedSymbolTest extends AbstractGhidraHeadlessIntegrationTest {
|
|||
private void createMemBlock() throws Exception {
|
||||
byte[] bytesOne = new byte[100];
|
||||
TaskMonitor m = TaskMonitor.DUMMY;
|
||||
program.getMemory().createInitializedBlock("B1", addr(0),
|
||||
program.getMemory()
|
||||
.createInitializedBlock("B1", addr(0),
|
||||
new ByteArrayInputStream(bytesOne), bytesOne.length, m, false);
|
||||
|
||||
}
|
||||
|
|
|
@ -2448,7 +2448,7 @@ public class SymbolManager implements SymbolTable, ManagerDB {
|
|||
Set<Address> primaryFixups = new HashSet<>();
|
||||
for (SymbolDB symbol : fixupPinnedSymbols) {
|
||||
Address currentAddress = symbol.getAddress();
|
||||
Address beforeBaseChangeAddress = oldBase.add(currentAddress.subtract(base));
|
||||
Address beforeBaseChangeAddress = oldBase.addWrap(currentAddress.subtract(base));
|
||||
primaryFixups.add(currentAddress);
|
||||
primaryFixups.add(beforeBaseChangeAddress);
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue