Commit 692cd11
committed
Fixed for veneers generated by linker for interworking
A compiler can do tail call optimizations, emitting
R_ARM_JUMP24 relocation instead of a normal call.
If this call has interworking (was from arm function to a thumb function
or vice versa), binutils produces a veneer, because it needs to do a
switch. By default these veneers do jumps to an absolute address. This
patch forces ld to produce veneers for position independent binaries.
tldr; no need for `--no-optimize-sibling-calls` anymore, sibling calls
will ✨ work ✨
An example of veneer before this patch:
```
81000010 <__func_thumb_from_arm>:
81000010: e51ff004 ldr pc, [pc, #-4] @ 0x81000014 <$d>
81000014 <$d>:
81000014: 01 00 00 81 .word 0x81000001
```
and after:
```
81000010 <__func_thumb_from_arm>:
81000010: e59fc004 ldr r12, [pc, #4] @ 0x8100001c <$d>
81000014: e08fc00c add r12, pc, r12
81000018: e12fff1c bx r12
8100001c <$d>:
8100001c: e5 ff ff ff .word 0xffffffe5
```1 parent 2dc7942 commit 692cd11
File tree
2 files changed
+14
-0
lines changed- patches/binutils
2 files changed
+14
-0
lines changed| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
301 | 301 | | |
302 | 302 | | |
303 | 303 | | |
| 304 | + | |
304 | 305 | | |
305 | 306 | | |
306 | 307 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
0 commit comments