[binutils-gdb] ld: bfd: sframe: Update section size also for relocatable links

Indu Bhagat ibhagat@sourceware.org
Sun Jul 6 19:55:00 GMT 2025


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=f851723e655f1bd58cdb4e92e1c09f222e16a494

commit f851723e655f1bd58cdb4e92e1c09f222e16a494
Author: Jens Remus <jremus@linux.ibm.com>
Date:   Sun Jul 6 12:47:43 2025 -0700

    ld: bfd: sframe: Update section size also for relocatable links
    
    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
    
    While at it, remove the incorrect code comment.  There is no
    relationship between "do not update size" and the fact that the
    "contents have not been relocated".
    
    bfd/
            * elf-sframe.c (_bfd_elf_write_section_sframe): Update section
            size also for relocatable links.
    
    Signed-off-by: Jens Remus <jremus@linux.ibm.com>

Diff:
---
 bfd/elf-sframe.c | 4 +---
 1 file changed, 1 insertion(+), 3 deletions(-)

diff --git a/bfd/elf-sframe.c b/bfd/elf-sframe.c
index 33ff5043d31..24a3d35013a 100644
--- a/bfd/elf-sframe.c
+++ b/bfd/elf-sframe.c
@@ -668,13 +668,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.  */
 
   sframe_encoder_free (&sfe_ctx);


More information about the Binutils-cvs mailing list