@@ -184,7 +184,7 @@ def pad(self, alignment: int) -> None:
184
184
self .disassembly .append (f"{ offset :x} : { ' ' .join (['00' ] * padding )} " )
185
185
self .body .extend ([0 ] * padding )
186
186
187
- def emit_aarch64_trampoline (self , hole : Hole , alignment : int ) -> None :
187
+ def emit_aarch64_trampoline (self , hole : Hole , alignment : int ) -> Hole :
188
188
"""Even with the large code model, AArch64 Linux insists on 28-bit jumps."""
189
189
assert hole .symbol is not None
190
190
reuse_trampoline = hole .symbol in self .trampolines
@@ -194,14 +194,10 @@ def emit_aarch64_trampoline(self, hole: Hole, alignment: int) -> None:
194
194
else :
195
195
self .pad (alignment )
196
196
base = len (self .body )
197
- where = slice (hole .offset , hole .offset + 4 )
198
- instruction = int .from_bytes (self .body [where ], sys .byteorder )
199
- instruction &= 0xFC000000
200
- instruction |= ((base - hole .offset ) >> 2 ) & 0x03FFFFFF
201
- self .body [where ] = instruction .to_bytes (4 , sys .byteorder )
197
+ new_hole = hole .replace (addend = base , symbol = None , value = HoleValue .DATA )
202
198
203
199
if reuse_trampoline :
204
- return
200
+ return new_hole
205
201
206
202
self .disassembly += [
207
203
f"{ base + 4 * 0 :x} : 58000048 ldr x8, 8" ,
@@ -219,6 +215,7 @@ def emit_aarch64_trampoline(self, hole: Hole, alignment: int) -> None:
219
215
self .body .extend (code )
220
216
self .holes .append (hole .replace (offset = base + 8 , kind = "R_AARCH64_ABS64" ))
221
217
self .trampolines [hole .symbol ] = base
218
+ return new_hole
222
219
223
220
def remove_jump (self , * , alignment : int = 1 ) -> None :
224
221
"""Remove a zero-length continuation jump, if it exists."""
@@ -294,8 +291,9 @@ def process_relocations(self, *, alignment: int = 1) -> None:
294
291
in {"R_AARCH64_CALL26" , "R_AARCH64_JUMP26" , "ARM64_RELOC_BRANCH26" }
295
292
and hole .value is HoleValue .ZERO
296
293
):
297
- self .code .emit_aarch64_trampoline (hole , alignment )
294
+ new_hole = self .data .emit_aarch64_trampoline (hole , alignment )
298
295
self .code .holes .remove (hole )
296
+ self .code .holes .append (new_hole )
299
297
self .code .remove_jump (alignment = alignment )
300
298
self .code .pad (alignment )
301
299
self .data .pad (8 )
0 commit comments