<div dir="ltr"><div>Hi Stephen,</div><div><br></div><div>I think the bug is in objcopy, as it is creating a file that does not comply with the x86-64 psABI, which requires all relocations to be RELA:</div><div><a href="https://github.com/hjl-tools/x86-psABI/blob/hjl/master/object-files.tex#L429">https://github.com/hjl-tools/x86-psABI/blob/hjl/master/object-files.tex#L429</a><br></div>I also tried passing your bug-64.o to ld.gold, and it rejects it with an internal error.<div><br></div><div><div>$ ld.gold -r -o bug-64-2.o bug-64.o</div><div>ld.gold: internal error in scan_relocatable_relocs, at ../../gold/x86_64.cc:5118</div><div>$ ld.gold  -o bug-64-2.o bug-64.o</div><div>ld.gold: error: bug-64.o: unsupported REL reloc section</div><div>ld.gold: internal error in relocate_section, at ../../gold/x86_64.cc:5051</div><div><br></div><div>Probably what needs to happen is that we need to start rejecting files which use the wrong relocation type and a bug needs to be filed against objcopy.</div><div><br></div><div><div>Peter</div></div></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Tue, Jun 5, 2018 at 10:33 AM, Stephen Checkoway via llvm-dev <span dir="ltr"><<a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hi,<br>
<br>
I've tracked down what I believe is a bug in lld's relocation processing for R_X86_64_PC32 REL relocations.<br>
<br>
I'm producing the object file in a slightly unusual way: I'm using objcopy on a relocatable i386 ELF object file to convert it to x86_64 which transforms a R_386_PC32 into a R_X86_64_PC32.<br>
<br>
Steps to reproduce:<br>
<br>
1. Assemble the attached bug.asm using nasm and note the R_386_PC32 REL.<br>
<br>
$ nasm -felf32 -o bug.o bug.asm<br>
$ x86_64-elf-objdump -dr bug.o | grep -A1 -e '<_start>:'<br>
00000000 <_start>:<br>
   0:   e8 fc ff ff ff          call   1 <_start+0x1><br>
$ x86_64-elf-readelf -r bug.o<br>
<br>
Relocation section '.rel.text._start' at offset 0x260 contains 1 entry:<br>
 Offset     Info    Type            Sym.Value  Sym. Name<br>
00000001  00000302 R_386_PC32        00000000   .text.foo<br>
<br>
2. Convert bug.o to a 64-bit ELF object file and note the R_X86_64_PC32 REL (not RELA!)<br>
<br>
$ x86_64-elf-objcopy -I elf32-i386 -O elf64-x86-64 bug.o bug-64.o<br>
$ x86_64-elf-objdump -M i386 -dr bug-64.o | grep -A1 -e '<_start>:'<br>
0000000000000000 <_start>:<br>
   0:   e8 fc ff ff ff          call   1 <_start+0x1><br>
$ x86_64-elf-readelf -r bug-64.o<br>
<br>
Relocation section '.rel.text._start' at offset 0x128 contains 1 entry:<br>
  Offset          Info           Type           Sym. Value    Sym. Name<br>
000000000001  000300000002 R_X86_64_PC32     0000000000000000 .text.foo<br>
<br>
3. Link with a just-built ld.lld and note that the relocation has been misapplied. It's now calling foo+4 rather than foo.<br>
<br>
$ ./llvm-build/bin/ld.lld -melf_x86_64 -o bug-lld bug-64.o<br>
$ x86_64-elf-objdump -M i386 -d bug-64-lld | grep -A1 -e '<_start>:'<br>
0000000000201000 <_start>:<br>
  201000:       e8 0f 00 00 00          call   201014 <foo+0x4><br>
<br>
If you link with GNU ld instead, the relocation is applied correctly.<br>
<br>
$ x86_64-elf-ld -melf_x86_64 -o bug-64-ld bug-64.o<br>
$ x86_64-elf-objdump -M i386 -d bug-64-ld | grep -A1 -e '<_start>:'<br>
0000000000400080 <_start>:<br>
  400080:       e8 0b 00 00 00          call   400090 <foo><br>
<br>
Linking the 32-bit object file works correctly with both GNU ld and ld.lld.<br>
<br>
$ ./llvm-build/bin/ld.lld -melf_i386 -o bug-lld bug.o<br>
$ x86_64-elf-objdump -d bug-lld | grep -A1 -e '<_start>:'<br>
00011000 <_start>:<br>
   11000:       e8 0b 00 00 00          call   11010 <foo><br>
$ x86_64-elf-ld -melf_i386 -o bug-ld bug.o<br>
$ x86_64-elf-objdump -d bug-ld | grep -A1 -e '<_start>:'<br>
08048060 <_start>:<br>
 8048060:       e8 0b 00 00 00          call   8048070 <foo><br>
<br>
I'm not at all familiar with the lld source, but this looks a lot like getImplicitAddend() needs to be implemented for the X86_64 class.<br>
<br>
Alternatively (but much less useful for me) would be an error message that REL relocations are not supported on x86-64.<br>
<br>
I've attached all of the files created above, in case anyone wants to examine them.<br>
<br>
Thank you,<br>
<br>
Steve<br>
<span class="HOEnZb"><font color="#888888"><br>
-- <br>
Stephen Checkoway<br>
<br>
</font></span><br><br>
<br>______________________________<wbr>_________________<br>
LLVM Developers mailing list<br>
<a href="mailto:llvm-dev@lists.llvm.org">llvm-dev@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/<wbr>mailman/listinfo/llvm-dev</a><br>
<br></blockquote></div><br><br clear="all"><div><br></div>-- <br><div class="gmail_signature" data-smartmail="gmail_signature"><div dir="ltr">-- <div>Peter</div></div></div>
</div>