[PATCH] x86-64: Remove sframe relocs against discarded sections

Jan Beulich jbeulich@suse.com
Wed Jul 16 06:44:08 GMT 2025


On 15.07.2025 23:16, Indu Bhagat wrote:
> On 7/15/25 12:20 AM, Jan Beulich wrote:
>> On 15.07.2025 07:51, Sam James wrote:
>>> From: "H.J. Lu" <hjl.tools@gmail.com>
>>>
>>> Since unlike eh_frame editing code, sframe editing code keeps
>>> R_X86_64_NONE reloc as is, its r_offset is wrong, we must not
>>> generate R_X86_64_NONE reloc in sframe section against discarded
>>> sections for "ld -r".
>>>
>>> bfd/
>>>
>>> 	PR ld/33156
>>> 	* elf64-x86-64.c (elf_x86_64_relocate_section): Also remove
>>> 	sframe relocations against discarded sections for "ld -r".
>>>
>>> ld/
>>>
>>> 	PR ld/33156
>>> 	* testsuite/ld-elf/eh-group.exp (as_gsframe): New.
>>> 	Assemble eh-group.o with $as_gsframe.
>>>
>>> Signed-off-by: H.J. Lu <hjl.tools@gmail.com>
>>> ---
>>> Sent on H.J.'s behalf. OK?
>>
>> What's the relationship with what it now 5f9bf0cf711a ("sframe: Allow
>> input R_*_NONE relocations")? Indu's reply there suggests to me that
>> altering the number of relocs may be a problem.
>>
> 
> For SFrame sections, at parsing time, the code creates a cache of which 
> functions are discarded via _bfd_elf_discard_section_sframe (called via 
> bfd_elf_discard_info).  So for input sections, there is reliance on 
> relocs being in order of the functions.
> 
> At the time of relocation in elf_x86_64_relocate_section (), deleting 
> the R_*_NONE relocs will not pose problem, because we use the cache 
> created above. So the patch that H.J. proposes should be OK (as far as I 
> can reason so far).
> 
> That aside, taking a step back, the reason why these R_*_NONE are 
> causing issues is (as HJ said) that their r_offset is wrong.  We get 
> bfd_reloc_outofrange in elf_x86_64_relocate_section () --> 
> _bfd_final_link_relocate () --> bfd_reloc_offset_in_range ().  To fix it 
> the generic code in elf_link_input_bfd, for deleted relas, this would mean:
> 
>    last_offset = ...
>    last_offset += ...
> 
>    irela->r_offset = _bfd_elf_section_offset (output_bfd,
>                                               flinfo->info, o,
>                                               irela->r_offset);
> 
>    if (irela->r_offset >= (bfd_vma) -2)
>      {
>        /* This is a reloc for a deleted entry or somesuch.
>           Turn it into an R_*_NONE reloc, at the same
>           offset as the last reloc.  elf_eh_frame.c and
>           bfd_elf_discard_info rely on reloc offsets
>           being ordered.  */
> -     irela->r_offset = last_offset;
> +     if (elf_section_type (o) == SHT_GNU_SFRAME)
> +       irela->r_offset = sframe_last_dummy_offset;
> +     else
> +       irela->r_offset = last_offset;
>        irela->r_info = 0;
>        irela->r_addend = 0;
>        continue;
>      }
> 
>     last_offset = irela->r_offset;
> +  sframe_last_dummy_offset = irela->r_offset;

This would imo be yet worse than what H.J.'s patch does. I know I'm repeating
myself, but all of the special casing for SFrame is quite unhelpful.

Jan


More information about the Binutils mailing list