Gp-3178 fixed AddressOutOfBoundsException when rebasing with pinned

symbols
This commit is contained in:
ghidragon 2023-03-14 14:47:37 -04:00
parent 738e662e82
commit 2cb37fc303
2 changed files with 14 additions and 12 deletions

View file

@ -36,7 +36,6 @@ import ghidra.test.AbstractGhidraHeadlessIntegrationTest;
import ghidra.util.exception.InvalidInputException; import ghidra.util.exception.InvalidInputException;
import ghidra.util.exception.NotFoundException; import ghidra.util.exception.NotFoundException;
import ghidra.util.task.TaskMonitor; import ghidra.util.task.TaskMonitor;
import ghidra.util.task.TaskMonitorAdapter;
public class PinnedSymbolTest extends AbstractGhidraHeadlessIntegrationTest { public class PinnedSymbolTest extends AbstractGhidraHeadlessIntegrationTest {
private static int EXPECTED_PROCESSOR_SYMBOLS = 9; private static int EXPECTED_PROCESSOR_SYMBOLS = 9;
@ -63,11 +62,13 @@ public class PinnedSymbolTest extends AbstractGhidraHeadlessIntegrationTest {
checkProcessorSymbolsInPlace(EXPECTED_PROCESSOR_SYMBOLS + EXPECTED_USER_SYMBOLS); checkProcessorSymbolsInPlace(EXPECTED_PROCESSOR_SYMBOLS + EXPECTED_USER_SYMBOLS);
assertNotNull(symbolTable.getPrimarySymbol(addr(4))); assertNotNull(symbolTable.getPrimarySymbol(addr(4)));
long imageBaseMove = 0x100; Address originalImageBase = program.getImageBase();
Address movedBobAddress = originalBobAddress.add(imageBaseMove); Address newImageBase = addr(0x100);
Address movedFunctionAddress = originalFunctionAddress.add(imageBaseMove); 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 // expect one new symbol for pinned function
checkProcessorSymbolsInPlace(EXPECTED_PROCESSOR_SYMBOLS + EXPECTED_USER_SYMBOLS + 1); checkProcessorSymbolsInPlace(EXPECTED_PROCESSOR_SYMBOLS + EXPECTED_USER_SYMBOLS + 1);
@ -192,7 +193,7 @@ public class PinnedSymbolTest extends AbstractGhidraHeadlessIntegrationTest {
assertEquals(SymbolType.LABEL, target.getSymbolType()); assertEquals(SymbolType.LABEL, target.getSymbolType());
assertTrue(target.isPinned()); assertTrue(target.isPinned());
Memory memory = program.getMemory(); Memory memory = program.getMemory();
MemoryBlock block = memory.getBlock(addr(0)); MemoryBlock block = memory.getBlock(addr(0));
memory.moveBlock(block, addr(moveAmount), TaskMonitor.DUMMY); memory.moveBlock(block, addr(moveAmount), TaskMonitor.DUMMY);
@ -259,6 +260,7 @@ public class PinnedSymbolTest extends AbstractGhidraHeadlessIntegrationTest {
program = new ProgramDB("z80", lang, lang.getDefaultCompilerSpec(), this); program = new ProgramDB("z80", lang, lang.getDefaultCompilerSpec(), this);
symbolTable = program.getSymbolTable(); symbolTable = program.getSymbolTable();
space = program.getAddressFactory().getDefaultAddressSpace(); space = program.getAddressFactory().getDefaultAddressSpace();
program.setImageBase(addr(0xff00), BATCH_MODE);
originalBobAddress = addr(ORIGINAL_BOB_ADDRESS); originalBobAddress = addr(ORIGINAL_BOB_ADDRESS);
originalFunctionAddress = addr(ORIGINAL_FUNCTION_ADDRESS); originalFunctionAddress = addr(ORIGINAL_FUNCTION_ADDRESS);
@ -269,7 +271,6 @@ public class PinnedSymbolTest extends AbstractGhidraHeadlessIntegrationTest {
createBobSymbol(); createBobSymbol();
createPinnedFunctionSymbol(); createPinnedFunctionSymbol();
} }
private void createProcessorSymbols(Language lang) throws InvalidInputException { private void createProcessorSymbols(Language lang) throws InvalidInputException {
@ -290,8 +291,8 @@ public class PinnedSymbolTest extends AbstractGhidraHeadlessIntegrationTest {
throws InvalidInputException, OverlappingFunctionException { throws InvalidInputException, OverlappingFunctionException {
AddressSet set = new AddressSet(originalFunctionAddress); AddressSet set = new AddressSet(originalFunctionAddress);
Function fun = program.getFunctionManager() Function fun = program.getFunctionManager()
.createFunction("MyFunction", originalFunctionAddress, set, .createFunction("MyFunction", originalFunctionAddress, set,
SourceType.USER_DEFINED); SourceType.USER_DEFINED);
Symbol symbol = fun.getSymbol(); Symbol symbol = fun.getSymbol();
symbol.setPinned(true); symbol.setPinned(true);
} }
@ -309,8 +310,9 @@ public class PinnedSymbolTest extends AbstractGhidraHeadlessIntegrationTest {
private void createMemBlock() throws Exception { private void createMemBlock() throws Exception {
byte[] bytesOne = new byte[100]; byte[] bytesOne = new byte[100];
TaskMonitor m = TaskMonitor.DUMMY; TaskMonitor m = TaskMonitor.DUMMY;
program.getMemory().createInitializedBlock("B1", addr(0), program.getMemory()
new ByteArrayInputStream(bytesOne), bytesOne.length, m, false); .createInitializedBlock("B1", addr(0),
new ByteArrayInputStream(bytesOne), bytesOne.length, m, false);
} }

View file

@ -2448,7 +2448,7 @@ public class SymbolManager implements SymbolTable, ManagerDB {
Set<Address> primaryFixups = new HashSet<>(); Set<Address> primaryFixups = new HashSet<>();
for (SymbolDB symbol : fixupPinnedSymbols) { for (SymbolDB symbol : fixupPinnedSymbols) {
Address currentAddress = symbol.getAddress(); Address currentAddress = symbol.getAddress();
Address beforeBaseChangeAddress = oldBase.add(currentAddress.subtract(base)); Address beforeBaseChangeAddress = oldBase.addWrap(currentAddress.subtract(base));
primaryFixups.add(currentAddress); primaryFixups.add(currentAddress);
primaryFixups.add(beforeBaseChangeAddress); primaryFixups.add(beforeBaseChangeAddress);