Issue 127284
Summary [ELF][LTO] Invalid relocations when libcalls are synthesized by ISel
Labels lld:ELF, LTO
Assignees
Reporter arichardson
    I was trying to build an arm32 binary that uses 64-bit division a LTO build of compiler-rt.

The 64-bit division function in compiler-rt (`__aeabi_ldivmod`) is written in assembly and calls the C function `__divmoddi4`, which works fine normally. However, when building with LTO the call inside __aeabi_ldivmod is replaced with a jump to address zero, which then crashes my program.


__aeabi_ldivmod dump:
```
Disassembly of section .text:

00000000 <__aeabi_ldivmod>:
       0: e92d4040      push {r6, lr}
       4: e24dd010      sub     sp, sp, #16
       8: e28d6008 add     r6, sp, #8
       c: e58d6000      str     r6, [sp]
      10: ebfffffe      bl      0x10 <__aeabi_ldivmod+0x10> @ imm = #-0x8
 00000010:  R_ARM_CALL   __divmoddi4
      14: e59d2008      ldr r2, [sp, #0x8]
      18: e59d300c      ldr     r3, [sp, #0xc]
      1c: e28dd010      add     sp, sp, #16
      20: e8bd8040      pop     {r6, pc}
```

I discussed this issue with @ilovepi and it appears that one problem here is that the call to __aeabi_ldivmod is generated post-LTO and the __divmoddi4 symbol is marked as not needed before final codegen.
However, it does seem like lld should be reporting an error for the missing __divmoddi4 instead of using address zero (it is not marked as weak, so that is invalid).
When building with `-pie` instead of position dependent static linking, I do get an error:
```
ld.lld: error: relocation R_ARM_CALL cannot refer to absolute symbol: __divmoddi4
>>> defined in divmoddi4.bc
>>> referenced by aeabi_ldivmod.o:(__aeabi_ldivmod)
```
This suggests __divmoddi4 was replaced with and absolute zero symbol.
I have created a minimized test case which I will upload as a PR shortly.
_______________________________________________
llvm-bugs mailing list
llvm-bugs@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs

Reply via email to