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

Shankar Easwaran shankare at codeaurora.org
Thu May 7 08:22:58 PDT 2015


You could use map that contains section header instead of name.

On 5/7/2015 10:09 AM, Adhemerval Zanella wrote:
> And I think the problem is somewhat related to 'ELFFile<ELFT>::createAtoms'
> where it first creates a StringMap only with segment name and then
> process the groups based atoms.  With just a map related the segment's name
> to the atom, the COMDAT group section will find for all atom's in all 'text'
> segment, where it should handle only the one with the index listed in the
> groups section.
>
> I am still tinkering a better strategy to organize this, any suggestions?
>
> On 07-05-2015 12:02, Adhemerval Zanella wrote:
>> 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?
>>>
>>>
> _______________________________________________
> LLVM Developers mailing list
> LLVMdev at cs.uiuc.edu         http://llvm.cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
>


-- 
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, hosted by the Linux Foundation




More information about the llvm-dev mailing list