[PATCH] Skip convert lui to GPREL_L for .LANCHOR

Lifang Xia lifang_xia@linux.alibaba.com
Fri Mar 12 03:21:27 GMT 2021


Hi Nelson,

I report a bug here: https://sourceware.org/bugzilla/show_bug.cgi?id=27566

BRs,
Lifang

在 2021/3/12 10:38, Nelson Chu 写道:
> Hi Lifang,
>
> Could you add the ld testcase for this?  It's better to report the
> details somewhere, like sourceware bugzilla or riscv github.  I find a
> similar fix in PR25258,
> https://sourceware.org/bugzilla/show_bug.cgi?id=25258.  The patch
> works only for c.lui relaxation, so I think we might need a similar
> fix for the regular lui to gp relaxation, rather than just disable the
> relaxation.  Anyway, we need a testcase or at least a reduced case can
> be reproduced.
>
> Thanks
> Nelson
>
> On Thu, Mar 11, 2021 at 9:05 PM Lifang Xia via Binutils
> <binutils@sourceware.org> wrote:
>> If the .LANCHOR defined in .rodata, the gp may not reach the symbol
>> after lang_size_relro_segment while linking with "-z relro".
>>
>> bfd/
>>          * elfnn-riscv.c (_bfd_riscv_relax_lui): Skip that the symbol
>>            is defined in rodata and linking with "-z relro".
>> ---
>>   bfd/elfnn-riscv.c | 12 ++++++++----
>>   1 file changed, 8 insertions(+), 4 deletions(-)
>>
>> diff --git a/bfd/elfnn-riscv.c b/bfd/elfnn-riscv.c
>> index 364d67b..74dce3c 100644
>> --- a/bfd/elfnn-riscv.c
>> +++ b/bfd/elfnn-riscv.c
>> @@ -4251,10 +4251,14 @@ _bfd_riscv_relax_lui (bfd *abfd,
>>        Valid gp range conservatively because of alignment issue.  */
>>     if (undefined_weak
>>         || (VALID_ITYPE_IMM (symval)
>> -         || (symval >= gp
>> -             && VALID_ITYPE_IMM (symval - gp + max_alignment + reserve_size))
>> -         || (symval < gp
>> -             && VALID_ITYPE_IMM (symval - gp - max_alignment - reserve_size))))
>> +         /* Skip that the symbol defined in rodata by .set, such as .LANCHOR,
>> +            and link with -z relro. The symbol may not be accessed with gp.  */
>> +         || (!(sym_sec->flags & SEC_READONLY
>> +               && link_info->relro)
>> +             && ((symval >= gp
>> +                  && VALID_ITYPE_IMM (symval - gp + max_alignment + reserve_size))
>> +                 || (symval < gp
>> +                     && VALID_ITYPE_IMM (symval - gp - max_alignment - reserve_size))))))
>>       {
>>         unsigned sym = ELFNN_R_SYM (rel->r_info);
>>         switch (ELFNN_R_TYPE (rel->r_info))
>> --
>> 2.6.0-rc0
>>


More information about the Binutils mailing list