24
24
import ghidra .program .model .mem .MemoryAccessException ;
25
25
import ghidra .program .model .mem .MemoryBlock ;
26
26
import ghidra .util .*;
27
- import ghidra .util .exception .AssertException ;
28
- import ghidra .util .exception .NotFoundException ;
27
+ import ghidra .util .exception .*;
29
28
30
29
/**
31
30
* <code>X86_64_ElfRelocationContext</code> provides ability to generate a
@@ -50,7 +49,10 @@ class X86_64_ElfRelocationContext extends ElfRelocationContext {
50
49
public long getSymbolValue (ElfSymbol symbol ) {
51
50
long symbolValue = super .getSymbolValue (symbol );
52
51
if (symbolValue == 0 && ElfConstants .GOT_SYMBOL_NAME .equals (symbol .getNameAsString ())) {
53
- Address gotAddr = allocateGot ();
52
+ Address gotAddr = symbolMap .get (symbol );
53
+ if (gotAddr == null ) {
54
+ gotAddr = allocateGot ();
55
+ }
54
56
if (gotAddr != null ) {
55
57
return gotAddr .getOffset ();
56
58
}
@@ -145,7 +147,7 @@ private Address allocateGot() {
145
147
return null ;
146
148
}
147
149
148
- if (gotElfSymbol != null && getSymbolAddress ( gotElfSymbol ) != null ) {
150
+ if (gotElfSymbol != null && gotElfSymbol . getValue ( ) != 0 ) {
149
151
throw new AssertException (ElfConstants .GOT_SYMBOL_NAME + " already allocated" );
150
152
}
151
153
@@ -155,8 +157,16 @@ private Address allocateGot() {
155
157
ElfRelocationHandler .GOT_BLOCK_NAME );
156
158
if (allocatedGotLimits != null &&
157
159
allocatedGotLimits .getMinAddress ().getOffset () < Integer .MAX_VALUE ) {
158
- // GOT must fall within first 32-bit segment
160
+ // NOTE: GOT must fall within first 32-bit segment
159
161
if (gotElfSymbol != null ) {
162
+ // remember where GOT was allocated
163
+ try {
164
+ loadHelper .createSymbol (allocatedGotLimits .getMinAddress (),
165
+ ElfConstants .GOT_SYMBOL_NAME , true , false , null );
166
+ }
167
+ catch (InvalidInputException e ) {
168
+ throw new AssertionError ("Unexpected exception" , e );
169
+ }
160
170
symbolMap .put (gotElfSymbol , allocatedGotLimits .getMinAddress ());
161
171
}
162
172
allocatedGotAddress = allocatedGotLimits .getMinAddress ();
0 commit comments