[LLVMdev] [lld] Wrong references for C++ COMDAT groups

Adhemerval Zanella
2015-05-07T15:02:00Z

Looks like it is also not working on x86_64, using clang/lld I am seeing
a segmentation fault:

Dump of assembler code for function _Z4funcj:
   0x0000000000400590 <+0>:	push   %rbp
   0x0000000000400591 <+1>:	push   %rbx
   0x0000000000400592 <+2>:	push   %rax
   0x0000000000400593 <+3>:	mov    %edi,%ebp
   0x0000000000400595 <+5>:	pop    %rdx
   0x0000000000400596 <+6>:	cld
=> 0x0000000000400597 <+7>:	or     %esi,0x46(%rdi)
   0x000000000040059a <+10>:	mov    $0xde000018,%edi

Where the disassemble should be:

Disassembly of section .text:

0000000000000000 <_Z4funcj>:
   0:   55                      push   %rbp
   1:   53                      push   %rbx
   2:   50                      push   %rax
   3:   89 fd                   mov    %edi,%ebp
   5:   83 fd 09                cmp    $0x9,%ebp
   8:   77 46                   ja     50 <_Z4funcj+0x50>
   a:   bf 18 00 00 00          mov    $0x18,%edi
   f:   e8 00 00 00 00          callq  14 <_Z4funcj+0x14>
  14:   48 89 c3                mov    %rax,%rbx
  17:   48 c7 03 00 00 00 00    movq   $0x0,(%rbx)
  1e:   89 6b 08                mov    %ebp,0x8(%rbx)
  21:   bf 0e 00 00 00          mov    $0xe,%edi
  26:   e8 00 00 00 00          callq  2b <_Z4funcj+0x2b>

As for aarch64, x86_64 object shows some relocation in group sections:

Relocation section '.rela.text' at offset 0xb48 contains 2 entries:
  Offset          Info           Type           Sym. Value    Sym. Name + Addend
000000000005  003200000002 R_X86_64_PC32     0000000000000000
_ZNSt9exceptionD2Ev - 4
00000000000e  003700000002 R_X86_64_PC32     0000000000000000 _ZdlPv - 4

That should me meant only for the group section text, not the default text
segment.


On 06-05-2015 18:18, Shankar Easwaran wrote:
> Does this test pass on X86_64 ? Groups are read in the Reader and is
documented below :-
>
> See http://lld.llvm.org/design.html#linking-steps on Section Groups to get
more information.
>
> On Wed, May 6, 2015 at 9:43 AM, Adhemerval Zanella <adhemerval.zanella
at linaro.org <mailto:adhemerval.zanella at linaro.org>> wrote:
>
>     Hi,
>
>     Checking the llvm test-suite
SingleSource/Regression/C++/EH/class_hierarchy
>     testcase on aarch64 I noted something strange:
>
>     Dump of assembler code for function _Z4funcj:
>        0x0000000000400650 <+0>:     stp     x22, x21, [sp,#-48]!
>        0x0000000000400654 <+4>:     stp     x20, x19, [sp,#16]
>        0x0000000000400658 <+8>:     stp     x29, x30, [sp,#32]
>        0x000000000040065c <+12>:    add     x29, sp, #0x20
>     => 0x0000000000400660 <+16>:    .inst   0x2bfffff7 ; undefined
>
>     Where it should be:
>
>     0000000000000000 <_Z4funcj>:
>        0:   a9bd57f6        stp     x22, x21, [sp,#-48]!
>        4:   a9014ff4        stp     x20, x19, [sp,#16]
>        8:   a9027bfd        stp     x29, x30, [sp,#32]
>        c:   910083fd        add     x29, sp, #0x20
>       10:   2a0003f3        mov     w19, w0
>
>     And there is no relocation (static or dynamic) point to the faulty
instruction.
>     It exist, however, a group section relocation with same offset, but for
a
>     different text segments (the exception handler stub create by clang):
>
>     Relocation section '.rela.text' at offset 0xed8 contains 2
entries:
>       Offset          Info           Type           Sym. Value    Sym. Name
+ Addend
>     000000000010  00480000011b R_AARCH64_CALL26  0000000000000000
_ZNSt9exceptionD2Ev + 0
>     000000000020  004d0000011a R_AARCH64_JUMP26  0000000000000000 _ZdlPv +
0
>
>     Relocation section '.rela.text' at offset 0xf08 contains 2
entries:
>       Offset          Info           Type           Sym. Value    Sym. Name
+ Addend
>     000000000010  00480000011b R_AARCH64_CALL26  0000000000000000
_ZNSt9exceptionD2Ev + 0
>     000000000020  004d0000011a R_AARCH64_JUMP26  0000000000000000 _ZdlPv +
0
>
>     Relocation section '.rela.text' at offset 0xf38 contains 2
entries:
>       Offset          Info           Type           Sym. Value    Sym. Name
+ Addend
>     000000000010  00480000011b R_AARCH64_CALL26  0000000000000000
_ZNSt9exceptionD2Ev + 0
>     000000000020  004d0000011a R_AARCH64_JUMP26  0000000000000000 _ZdlPv +
0
>
>     However seems that LLD is indeed condescending them, but create
duplicated references
>     for the wrong segments:
>
>     Writing atom: _Z4funcj | 1520
>                     Handle relocJump26 - S: 400460 A: 0 P: 400660 result:
3ffff98
>                     Handle relocJump26 - S: 400470 A: 0 P: 400670 result:
3ffff98
>
>     The first relocJump26 shouldn't be applied to .text segment
0x400660, but solely on the
>     _ZN4BaseD0Ev section.  I am trying to debug how lld exactly is
generating this wrong
>     Reference, but I still can right figure out.  Any idea of what is
happening here?
>
>