[PATCH,V3 9/9] ld: bfd: sframe: Update section size also for relocatable links
Indu Bhagat
indu.bhagat@oracle.com
Mon Jun 16 06:47:05 GMT 2025
On 6/13/25 5:53 AM, Jan Beulich wrote:
> On 13.06.2025 09:32, Indu Bhagat wrote:
>> From: Jens Remus <jremus@linux.ibm.com>
>>
>> For relocatable links the output .sframe section size may be wrong.
>> This can be observed when dumping the SFrame information from the x86-64
>> sframe-reloc-1 test:
>>
>> Name Address Off Size
>> .sframe 0000000000000000 000110 00007f
>>
>> Offset Type Symbol's Value Symbol's Name + Addend
>> 000000000000001c R_X86_64_PC32 0000000000000000 .text + 1c
>> 0000000000000030 R_X86_64_PC32 0000000000000000 .text + 65
>>
>> 0x00000000 e2de0201 0300f800 02000000 08000000 ................
>> 0x00000010 1e000000 00000000 28000000 00000000 ........(.......
>> 0x00000020 35000000 00000000 04000000 00000000 5...............
>> 0x00000030 00000000 25000000 0f000000 04000000 ....%...........
>> offset 1st FRE---^^^^^^^^ ^^^^^^^^---number of FREs
>> 0x00000040 00000000 00030801 0510f004 0410f034 ...............4
>> FDE info---^^ | begin of FDEs
>> 0x00000050 0508f000 03080105 10f00404 10f02405 ..............$.
>> 11111112222222223333333334444---FRE 1, 2, 3, 4
>> 0x00000060 08f00000 00000000 00000000 00000000 ................
>> 4444^^^^...
>> 0x00000070 00000000 00000000 00000000 000000 ...............
>> ...^^^^^^---excessive section
>>
>> When running the x86-64 test cross build on a big-endian system, such
>> as s390x, objdump and readelf fail to dump the SFrame information with
>> the following error message:
>>
>> Error: SFrame decode failure: Buffer does not contain SFrame data.
>>
>> This is because the following check in flip_sframe() fails, which gets
>> only invoked if the endianness of the SFrame data is different from the
>> host system one:
>>
>> /* All FDEs and FREs must have been endian flipped by now. */
>> if ((j != ihp->sfh_num_fres) || (bytes_flipped != (buf_size - hdrsz)))
>> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>>
>> With:
>> j=8, ihp->sfh_num_fres=8, bytes_flipped=70, buf_size=127, hdrsz=28
>
> All of this describes the symptom pretty extensively. However, ...
>
>> --- a/bfd/elf-sframe.c
>> +++ b/bfd/elf-sframe.c
>> @@ -660,13 +660,11 @@ _bfd_elf_write_section_sframe (bfd *abfd, struct bfd_link_info *info)
>> (file_ptr) sec->output_offset,
>> sec->size))
>> retval = false;
>> - else if (!bfd_link_relocatable (info))
>> + else
>> {
>> Elf_Internal_Shdr *hdr = &elf_section_data (sec)->this_hdr;
>> hdr->sh_size = sec->size;
>> }
>> - /* For relocatable links, do not update the section size as the section
>> - contents have not been relocated. */
>
> ... it doesn't become clear in how far this comment was wrong, and hence
> why for relocatable links the size also needs updating. (And yes, the
> connection between "has been relocated" and "size needs updating" looks
> suspect to me, but what's wrong with that wants calling out imo.)
>
I do not recall why this comment was added originally, and I cannot make
sense of this one now either. I dont see the connection between "do not
update size" because the "contents have not been relocated" ATM...
> Furthermore I'd expect a wrong section size to also manifest (as a
> problem) when endian-ness is the same between host and target. Is there
> some other issue lurking somewhere?
>
For the relocatable links, SFrame section sizes were more than the
actual data written in bytes.
In SFrame sections, there is an offset (sfh_fre_len) in the SFrame
header that indicate the length of the last (variable length)
sub-section. Whether or not the size of section poses an issue depends
on the reader I think. E.g., the current readers (SFrame decoder
object, dumper) were not going over to read the non-valid-data bytes for
the case when no endian swap was needed. For the case when endian swap
is needed, Jens proposed a change
https://sourceware.org/pipermail/binutils/2025-June/141519.html which
will make it in soon.
More information about the Binutils
mailing list