[llvm-dev] question about --emit-relocs with lld

Kees Cook via llvm-dev llvm-dev at lists.llvm.org
Thu Apr 4 13:21:00 PDT 2019


Hi,

While doing Linux kernel builds linked with lld, I've tracked down a
difference that breaks relocation of the kernel image (e.g. under
KASLR[1]). Some relocations are changed to ABS (weirdly, all are in
.rodata section). Note the difference below in the resulting linked
output.
.L__const._start.instance becomes *ABS* only under lld:

$ cat minimal.c
struct minimal {
        void *pointer;
        int value;
};

void _start(void)
{
        struct minimal instance = {
                .value = 1,
        };
}
$ llvm-build/x86/bin/clang -c minimal.c
$ /usr/bin/ld.bfd --emit-relocs minimal.o -o minimal.bfd
$ llvm-build/x86/bin/ld.lld --emit-relocs minimal.o -o minimal.lld
$ objdump -Sdr minimal.bfd
...
00000000004000b0 <_start>:
  4000b0:       55                      push   %rbp
  4000b1:       48 89 e5                mov    %rsp,%rbp
  4000b4:       48 8b 04 25 d0 00 40    mov    0x4000d0,%rax
  4000bb:       00
                        4000b8: R_X86_64_32S    .rodata
  4000bc:       48 89 45 f0             mov    %rax,-0x10(%rbp)
  4000c0:       48 8b 04 25 d8 00 40    mov    0x4000d8,%rax
  4000c7:       00
                        4000c4: R_X86_64_32S    .L__const._start.instance+0x8
  4000c8:       48 89 45 f8             mov    %rax,-0x8(%rbp)
  4000cc:       5d                      pop    %rbp
  4000cd:       c3                      retq

$ objdump -Sdr minimal.lld
...
0000000000201000 <_start>:
  201000:       55                      push   %rbp
  201001:       48 89 e5                mov    %rsp,%rbp
  201004:       48 8b 04 25 20 01 20    mov    0x200120,%rax
  20100b:       00
                        201008: R_X86_64_32S    .rodata
  20100c:       48 89 45 f0             mov    %rax,-0x10(%rbp)
  201010:       48 8b 04 25 28 01 20    mov    0x200128,%rax
  201017:       00
                        201014: R_X86_64_32S    *ABS*+0x8
  201018:       48 89 45 f8             mov    %rax,-0x8(%rbp)
  20101c:       5d                      pop    %rbp
  20101d:       c3                      retq

I'm not sure where to start looking for solving this...

Thanks!

-Kees

[1] https://github.com/ClangBuiltLinux/linux/issues/404

-- 
Kees Cook


More information about the llvm-dev mailing list