<html>
    <head>
      <base href="https://bugs.llvm.org/">
    </head>
    <body><table border="1" cellspacing="0" cellpadding="8">
        <tr>
          <th>Bug ID</th>
          <td><a class="bz_bug_link 
          bz_status_NEW "
   title="NEW - --emit-relocs shows some relocations moving to *ABS* when they should not"
   href="https://bugs.llvm.org/show_bug.cgi?id=41385">41385</a>
          </td>
        </tr>

        <tr>
          <th>Summary</th>
          <td>--emit-relocs shows some relocations moving to *ABS* when they should not
          </td>
        </tr>

        <tr>
          <th>Product</th>
          <td>lld
          </td>
        </tr>

        <tr>
          <th>Version</th>
          <td>unspecified
          </td>
        </tr>

        <tr>
          <th>Hardware</th>
          <td>PC
          </td>
        </tr>

        <tr>
          <th>OS</th>
          <td>Linux
          </td>
        </tr>

        <tr>
          <th>Status</th>
          <td>NEW
          </td>
        </tr>

        <tr>
          <th>Severity</th>
          <td>normal
          </td>
        </tr>

        <tr>
          <th>Priority</th>
          <td>P
          </td>
        </tr>

        <tr>
          <th>Component</th>
          <td>ELF
          </td>
        </tr>

        <tr>
          <th>Assignee</th>
          <td>unassignedbugs@nondot.org
          </td>
        </tr>

        <tr>
          <th>Reporter</th>
          <td>keescook@chromium.org
          </td>
        </tr>

        <tr>
          <th>CC</th>
          <td>llvm-bugs@lists.llvm.org, peter.smith@linaro.org
          </td>
        </tr></table>
      <p>
        <div>
        <pre>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!

[1] <a href="https://github.com/ClangBuiltLinux/linux/issues/404">https://github.com/ClangBuiltLinux/linux/issues/404</a></pre>
        </div>
      </p>


      <hr>
      <span>You are receiving this mail because:</span>

      <ul>
          <li>You are on the CC list for the bug.</li>
      </ul>
    </body>
</html>