[RFC,SCHEME_B 4/7] ld: bfd: sframe: fix incorrect r_offset in RELA entries
Jan Beulich
jbeulich@suse.com
Tue Apr 15 05:58:30 GMT 2025
On 14.04.2025 20:35, Indu Bhagat wrote:
> On 4/7/25 8:02 AM, Jan Beulich wrote:
>> On 07.04.2025 02:25, Indu Bhagat wrote:
>>> --- a/bfd/elflink.c
>>> +++ b/bfd/elflink.c
>>> @@ -11974,7 +11974,11 @@ elf_link_input_bfd (struct elf_final_link_info *flinfo, bfd *input_bfd)
>>> continue;
>>> }
>>>
>>> - irela->r_offset += o->output_offset;
>>> + /* All SFrame FDEs from input sections are clubbed together
>>> + in the beginning of the output section. RELA offsets are
>>> + already up to date. PR ld/32666. */
>>> + if (o->sec_info_type != SEC_INFO_TYPE_SFRAME)
>>> + irela->r_offset += o->output_offset;
>>
>> I'm irritated by there still being such special casing here. You go to some
>> lengths in the description to explain this, but I fear I'm still not groking
>> it even after reading multiple times. In particular the absence of any special
>> casing here for SHF_MERGE sections makes we wonder why your content re-ordering
>> is requiring such.
>>
>
> A re-worded answer, in case it helps:
>
> In SFrame, all FDEs (fixed length structure) follow the SFrame Header. The
> correct offset (of the first field of the FDE) has been manually
> calculated via
> _bfd_elf_sframe_section_offset () (i.e., it calculates the offset of the
> FDE in
> the final output SFrame section).
>
> BTW, the "o" variable above holds the input section; that often is a
> source of
> confusion for me as well.
>
> Regarding SHF_MERGE, I am not sure where the r_offset is updated once
> elimination due to duplication is identified etc. But as with other
> (non-SFrame) sections, no special casing for SHF_MERGE is needed because it
> works in a two step-process:
> - update the r_offset to the updated value within the section
> - adjust the r_offset with the output_offset of the section
> (o->output_offset).
> Its only the SFrame section data layout that is not aligned to the two-step
> process.
And it can't be made match that other scheme? E.g. as outlined ...
>> To at least hide it from here, wouldn't it be possible to have
>> _bfd_elf_sframe_section_offset() do the "inverse" adjustment, for that to be
>> "undone" here? (For this it may help to remove the early return from the
>> function - the sole caller ensures it's the right type.)
... here?
> It is possible to hide it in _bfd_elf_sframe_section_offset(). I purposely
> chose to leave this in elflink.c (elf_link_input_bfd ()), because I
> thought it
> is less bug-prone and easier to follow. I can always leave a clear
> comment in
> _bfd_elf_sframe_section_offset (); I think the current testcases already
> should
> suffice to cover this code path.
Let me Cc Nick and Alan - maybe they have a specific view on this either
way, with their much longer experience.
Jan
More information about the Binutils
mailing list