https://sourceware.org/bugzilla/show_bug.cgi?id=33127

--- Comment #3 from Indu Bhagat <indu.bhagat at oracle dot com> ---
TL;DR: Some issue in the .gnu_object_only section which, IIUC, are generated
when there is (mixed) LTO and none-LTO usage with ld -r.  Currently the .sframe
section in the .gnu_object_only contents show one 1 FDE when we expect 2 FDEs.

Using gdb with the LTO 4a linker command line:

gdb --args <test_path>/objdir/ld/tmpdir/ld/ld -v -plugin
/usr/libexec/gcc/x86_64-redhat-linux/13/liblto_plugin.so
-plugin-opt=/usr/libexec/gcc/x86_64-redhat-linux/13/lto-wrapper
-plugin-opt=-fresolution=/tmp/ccYXTmaA.res -plugin-opt=-pass-through=-lgcc
-plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lc
-plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc_s --build-id
--no-add-needed --eh-frame-hdr --hash-style=gnu -m elf_x86_64 -dynamic-linker
/lib64/ld-linux-x86-64.so.2 -o tmpdir/lto-4a.exe
/usr/lib/gcc/x86_64-redhat-linux/13/../../../../lib64/crt1.o
/usr/lib/gcc/x86_64-redhat-linux/13/../../../../lib64/crti.o
/usr/lib/gcc/x86_64-redhat-linux/13/crtbegin.o
-L<test_path>/install/x86_64-pc-linux-gnu/lib64 -L<test_path>/install/lib64
-L/usr/local/lib64 -L/lib64 -L/usr/lib64
-L<test_path>/install/x86_64-pc-linux-gnu/lib -L<test_path>/install/lib
-L/usr/local/lib -L/lib -L/usr/lib
-L<test_path>/binutils-gdb/ld/testsuite/ld-plugin
-L<test_path>/objdir/ld/tmpdir/ld -L/usr/lib/gcc/x86_64-redhat-linux/13
-L/usr/lib/gcc/x86_64-redhat-linux/13/../../../../lib64 -L/lib/../lib64
-L/usr/lib/../lib64 -L/usr/lib/gcc/x86_64-redhat-linux/13/../../..
--no-warn-execstack --no-error-execstack tmpdir/lto-4r-a.o tmpdir/dummy.o -lgcc
--push-state --as-needed -lgcc_s --pop-state -lc -lgcc --push-state --as-needed
-lgcc_s --pop-state /usr/lib/gcc/x86_64-redhat-linux/13/crtend.o
/usr/lib/gcc/x86_64-redhat-linux/13/../../../../lib64/crtn.o

123       BFD_ASSERT (cookie->rels + fde_count == cookie->relend);
(gdb) p fde_count 
$3 = 1
(gdb) p sec->reloc_count 
$4 = 2
(gdb) p *abfd
$5 = {filename = 0x77cb60 "/tmp/ccWuq930.obj-only.o", xvec = 0x6b5a80
<x86_64_elf64_vec>, iostream = 0x76dc20, iovec = 0x6d0360 <cache_iovec>, 
  lru_prev = 0x718c40, lru_next = 0x71ee00, where = 395, mtime = 0, id = 9,
flags = 32785, format = bfd_object, direction = read_direction, 

The /tmp/ccWuq930.obj-only.o is the .gnu_object_only contents from the
tmpdir/lto-4r-a.o via cmdline_extract_object_only_section ().

Now, as for the generation of tmpdir/lto-4r-a.o, we see:

./ld-new -z norelro -z nomemory-seal 
-L<test_path>/binutils-gdb/ld/testsuite/ld-plugin  -r tmpdir/lto-4a.o
tmpdir/lto-4b.o tmpdir/lto-4c.o -o tmpdir/dump

mv tmpdir/dump tmpdir/lto-4r-a.o

So looking at .gnu_object_only in tmpdir/dump:
$ objcopy --dump-section .gnu_object_only=dump_gnu_object_only tmpdir/dump

$ readelf -r dump_gnu_object_only

Relocation section '.rela.text' at offset 0x378 contains 5 entries:   
  Offset          Info           Type           Sym. Value    Sym. Name +
Addend
000000000005  000e00000004 R_X86_64_PLT32    0000000000000020 bar - 4
00000000000a  00030000000a R_X86_64_32       0000000000000000 .rodata.str1.1 +
0
000000000013  000c00000004 R_X86_64_PLT32    0000000000000000 puts - 4
000000000021  00030000000a R_X86_64_32       0000000000000000 .rodata.str1.1 +
a
000000000026  000c00000004 R_X86_64_PLT32    0000000000000000 puts - 4

Relocation section '.rela.eh_frame' at offset 0x3f0 contains 2 entries:
  Offset          Info           Type           Sym. Value    Sym. Name +
Addend
000000000020  000100000002 R_X86_64_PC32     0000000000000000 .text + 0
000000000050  000100000002 R_X86_64_PC32     0000000000000000 .text + 20

Relocation section '.rela.sframe' at offset 0x420 contains 2 entries:
  Offset          Info           Type           Sym. Value    Sym. Name +
Addend
00000000001c  000100000002 R_X86_64_PC32     0000000000000000 .text + 0
00000000005c  000100000002 R_X86_64_PC32     0000000000000000 .text + 20

$ objdump -d dump_gnu_object_only   

dump_gnu_object_only:     file format elf64-x86-64     


Disassembly of section .text:

0000000000000000 <foo>:
   0:   48 83 ec 08             sub    $0x8,%rsp
   4:   e8 00 00 00 00          call   9 <foo+0x9>
   9:   bf 00 00 00 00          mov    $0x0,%edi
   e:   48 83 c4 08             add    $0x8,%rsp
  12:   e9 00 00 00 00          jmp    17 <foo+0x17>
  17:   66 0f 1f 84 00 00 00    nopw   0x0(%rax,%rax,1)
  1e:   00 00 

0000000000000020 <bar>:
  20:   bf 00 00 00 00          mov    $0x0,%edi
  25:   e9 00 00 00 00          jmp    2a <bar+0xa>

$ ../binutils/objdump --sframe dump_gnu_object_only

dump_gnu_object_only:     file format elf64-x86-64

Contents of the SFrame section .sframe:
  Header :

    Version: SFRAME_VERSION_2
    Flags: SFRAME_F_FDE_FUNC_START_PCREL
    CFA fixed RA offset: -8
    Num FDEs: 1
    Num FREs: 3

  Function Index :

    func idx [0]: pc = 0x0, size = 23 bytes
    STARTPC         CFA       FP        RA           
    0000000000000000  sp+8      u         f            
    0000000000000004  sp+16     u         f            
    0000000000000012  sp+8      u         f   

The expected number of SFrame FDEs is 2.

-- 
You are receiving this mail because:
You are on the CC list for the bug.

Reply via email to