[LLVMdev] [lld] Wrong references for C++ COMDAT groups
Adhemerval Zanella
adhemerval.zanella at linaro.org
Thu May 7 08:09:01 PDT 2015
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?
>>
>>
More information about the llvm-dev
mailing list