Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
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 ```
- Loading branch information