Martin Richtarsky via llvm-dev
2017-Mar-23 12:23 UTC
[llvm-dev] [LLD] Can't create dynamic relocation R_X86_64_64 against local symbol in readonly segment
Hi, the attached example works with bfd-ld and with gold, but not with lld: $ cat rodatareloc.s ... .align 16 leaq .JTab(%rip), %r10 jmp *(%r10, %rdx, 8) ... .section .rodata .JTab: .quad .L00, .L01, .L02, .L03, .L04, .L05, .L06, .L07 .quad .L08, .L09, .L10, .L11, .L12, .L13, .L14, .L15, .L16 $ gcc -o rodatareloc.s.o -c rodatareloc.s $ lld -o rodatareloc.so -shared rodatareloc.s.o ld: error: rodatareloc.s.o:(.rodata+0x0): can't create dynamic relocation R_X86_64_64 against local symbol in readonly segment defined in rodatareloc.s.o Changing the section from .rodata to .data fixes it, but I guess this should be supported also for .rodata. Should I open a bug? Best regards, Martin -------------- next part -------------- A non-text attachment was scrubbed... Name: lld_rodata_dynamic_relro.tar.gz Type: application/x-gzip Size: 807 bytes Desc: not available URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20170323/2aaf9665/attachment.bin>
Joerg Sonnenberger via llvm-dev
2017-Mar-23 14:14 UTC
[llvm-dev] [LLD] Can't create dynamic relocation R_X86_64_64 against local symbol in readonly segment
On Thu, Mar 23, 2017 at 01:23:24PM +0100, Martin Richtarsky via llvm-dev wrote:> ld: error: rodatareloc.s.o:(.rodata+0x0): can't create dynamic relocation > R_X86_64_64 against local symbol in readonly segment defined in > rodatareloc.s.o > > > Changing the section from .rodata to .data fixes it, but I guess this > should be supported also for .rodata. Should I open a bug?This is not a bug, lld is completely correct. You are explicitly asking for a read-only section and the choosen relocation is position dependent, so yes, it correctly bails out. Joerg
Rui Ueyama via llvm-dev
2017-Mar-23 15:14 UTC
[llvm-dev] [LLD] Can't create dynamic relocation R_X86_64_64 against local symbol in readonly segment
Yes, this is correct and expected behavior. But why do you want to make it work? On Thu, Mar 23, 2017 at 7:14 AM, Joerg Sonnenberger via llvm-dev < llvm-dev at lists.llvm.org> wrote:> On Thu, Mar 23, 2017 at 01:23:24PM +0100, Martin Richtarsky via llvm-dev > wrote: > > ld: error: rodatareloc.s.o:(.rodata+0x0): can't create dynamic relocation > > R_X86_64_64 against local symbol in readonly segment defined in > > rodatareloc.s.o > > > > > > Changing the section from .rodata to .data fixes it, but I guess this > > should be supported also for .rodata. Should I open a bug? > > This is not a bug, lld is completely correct. You are explicitly asking > for a read-only section and the choosen relocation is position > dependent, so yes, it correctly bails out. > > Joerg > _______________________________________________ > LLVM Developers mailing list > llvm-dev at lists.llvm.org > http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev >-------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20170323/c19e853d/attachment.html>
Rafael Avila de Espindola via llvm-dev
2017-Mar-23 15:23 UTC
[llvm-dev] [LLD] Can't create dynamic relocation R_X86_64_64 against local symbol in readonly segment
Martin Richtarsky via llvm-dev <llvm-dev at lists.llvm.org> writes:> Hi, > > the attached example works with bfd-ld and with gold, but not with lld: > > $ cat rodatareloc.s > ... > .align 16 > leaq .JTab(%rip), %r10 > jmp *(%r10, %rdx, 8) > ... > .section .rodata > .JTab: > .quad .L00, .L01, .L02, .L03, .L04, .L05, .L06, .L07 > .quad .L08, .L09, .L10, .L11, .L12, .L13, .L14, .L15, .L16 > > $ gcc -o rodatareloc.s.o -c rodatareloc.s > $ lld -o rodatareloc.so -shared rodatareloc.s.o > > ld: error: rodatareloc.s.o:(.rodata+0x0): can't create dynamic relocation > R_X86_64_64 against local symbol in readonly segment defined in > rodatareloc.s.o > > > Changing the section from .rodata to .data fixes it, but I guess this > should be supported also for .rodata. Should I open a bug?I think this is just a difference in defaults. If you pass "-z notext" to lld it should work. Cheers, Rafael
Martin Richtarsky via llvm-dev
2017-Mar-23 15:47 UTC
[llvm-dev] [LLD] Can't create dynamic relocation R_X86_64_64 against local symbol in readonly segment
Rafael Avila de Espindola wrote:>> $ gcc -o rodatareloc.s.o -c rodatareloc.s >> $ lld -o rodatareloc.so -shared rodatareloc.s.o >> >> ld: error: rodatareloc.s.o:(.rodata+0x0): can't create dynamic >> relocation >> R_X86_64_64 against local symbol in readonly segment defined in >> rodatareloc.s.o >> >> >> Changing the section from .rodata to .data fixes it, but I guess this >> should be supported also for .rodata. Should I open a bug? > > I think this is just a difference in defaults. If you pass "-z notext" > to lld it should work.Thanks, this helps! Any reason why the defaults are different to gold and presumably bfd-ld? I don't understand much of what is happening behind the scenes, but on loading time, couldn't the rodata section just be mapped read-only, and still the relocation be applied to the text section, pointing to wherever rodata was mapped? No modification should be necessary to the rodata section. Thanks and Best regards, Martin
Seemingly Similar Threads
- [LLD] Can't create dynamic relocation R_X86_64_64 against local symbol in readonly segment
- [LLVMdev] Assertion fails resolving R_X86_64_PC32 relocation
- [LLVMdev] Relocation issue with jump tables in ELF object files on X86_64
- [LLVMdev] Relocation issue with jump tables in ELF object files on X86_64
- [LLVMdev] Detrimental optimization for reducing relocations.