[llvm-dev] lld dynamic relocation creation issue

Rafael EspĂ­ndola via llvm-dev llvm-dev at lists.llvm.org
Thu Feb 4 19:39:38 PST 2016


r259829 should hopefully make this easier for you.

Note that a similar issues exists in other ABIs. With x86_64, a file with just

foo:
.quad foo

will create a .o that has

  0x0 R_X86_64_64 .text 0x0


and running "ld.lld test.o -o test.so -shared" creates a .so file with

    0x1000 R_X86_64_RELATIVE - 0x1000

Cheers,
Rafael



On 4 February 2016 at 08:11, Adhemerval Zanella via llvm-dev
<llvm-dev at lists.llvm.org> wrote:
>
>
> On 03-02-2016 19:50, Rui Ueyama wrote:
>> We are refactoring the relocation generation code, but currently Writer::scanReloc adds relocation entries for the dynamic relocations. If "Out<ELFT>::RelaDyn->addReloc({&C, &RI});" is not called for your relocation, then no dynamic relocation will be created for that.
>>
>> What do you currently get? You didn't see any dynamic relocations for R_AACH_ABS64 relocs, do you?
>>
>
> Current there is no dynamic relocation creation for R_AARCH64_ABS64, which leads
> to invalid shared objects due invalid relocation against .{init,fini}_array.
>
> If I specifically set needsDynRelative to return true for R_AARCH64_ABS64 in
> PIC/PIE and set RelativeRel to the expected type (R_AARCH64_RELATIVE) I do see
> dynamic relocation being generated, with wrong target:
>
> Relocation section '.rela.dyn' at offset 0x4d8 contains 10 entries:
>   Offset          Info           Type           Sym. Value    Sym. Name + Addend
> 000000002000  000000000403 R_AARCH64_RELATIV                    0
>
> Disassembly of section .init_array:
>
> 0000000000002000 <__frame_dummy_init_array_entry>:
>     2000:       000010e8        .word   0x000010e8
>     2004:       00000000        .word   0x00000000
>
> 00000000000010e8 <frame_dummy>:
>     10e8:       a9bf7bfd        stp     x29, x30, [sp,#-16]!
>
> The R_AARCH64_ABS64 relocation will be place in '.init_array' section, but its
> value '0x10e8' (which points to the frame_dummy) should be used instead as the
> r_addend of the R_AARCH64_RELATIVE (because libc itself does not consider the
> value of the relocation itself, just the map address plus the dynamic relocation
> addend value).
>
> That's why I need to instruct a dynamic creation not in scanRolocs, but rather
> in relocateOne with the correct value of R_AARCH64_ABS64 to use it as the
> addend of the dynamic R_AARCH64_RELATIVE. And my doubt is exactly on how to
> design it on lld, where all the dynamic relocation are only create before
> any actual relocation computation.
>
> My first idea is to add a method 'InputSectionBase<ELFT>::addDynamicReloc'
> and then pass the InputSection on TargetInfo::relocateOne, but I am not
> sure if it would desirable.
>
>
>> On Wed, Feb 3, 2016 at 5:50 AM, Adhemerval Zanella via llvm-dev <llvm-dev at lists.llvm.org <mailto:llvm-dev at lists.llvm.org>> wrote:
>>
>>     Hi all,
>>
>>     Working on lld aarch64 support I came across an issue where I am not sure which
>>     would be best design approach to solve.
>>
>>     The aarch64 R_AARCH64_ABS64 relocation for PIC/PIE build requires a dynamic
>>     relocation (R_AARCH64_RELATIVE) with the value set as the addend of the
>>     relocation.  For instance, when linking the crtbeginS.o which contains:
>>
>>     Relocation section '.rela.init_array' at offset 0xd28 contains 1 entries:
>>       Offset          Info           Type           Sym. Value    Sym. Name + Addend
>>     000000000000  000200000101 R_AARCH64_ABS64   0000000000000000 .text + d4
>>
>>     The resulting dynamic relocation on the shared object should be:
>>
>>     Relocation section '.rela.dyn' at offset 0x548 contains 10 entries:
>>       Offset          Info           Type           Sym. Value    Sym. Name + Addend
>>     000000010dc0  000000000403 R_AARCH64_RELATIV                    7a8
>>
>>     Where 0x7a8 (dynamic relocation r_addend) points to a function at
>>     .text segment (in this case frame_dummy).
>>
>>     I am trying to made this on lld, but current step sequence is:
>>
>>     - Write::run
>>       \_ Write::createSections
>>          \_ Write::scanRelocs
>>             \_ Write::addReloc // Dynamic Relocation creation
>>       \_ Write::writeSections
>>          \_ OutputSectionBase::writeTo
>>             \_ InputSection::writeTo
>>                \_ InputSection::relocate
>>                   \_ TargetInfo::relocateOne
>>
>>     The problem is only at TargetInfo::relocate the target (aarch64) will see
>>     that the relocation is a R_AARCH64_ABS64 one and thus will need to create
>>     a dynamic R_AARCH64_RELATIVE relocation.
>>
>>     Also from comments at ELF/Writer.cpp:243 I noted that scanRelocs is done
>>     early as a design choice.  So I am not sure if it would be best to follow
>>     the second idea of the comment (and do the scan later *after* the relocations
>>     is computed) or if it would be better to allow the TargetInfo add a scan
>>     phase to handle such things (as other linker does).
>>
>>     Suggestions, tips, advices?
>>
>>     _______________________________________________
>>     LLVM Developers mailing list
>>     llvm-dev at lists.llvm.org <mailto:llvm-dev at lists.llvm.org>
>>     http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
>>
>>
> _______________________________________________
> LLVM Developers mailing list
> llvm-dev at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev


More information about the llvm-dev mailing list