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.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);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue