https://sourceware.org/bugzilla/show_bug.cgi?id=32789
Bug ID: 32789
Summary: sframe: relocatable link of multiple text sections
claims FDE to be sorted
Product: binutils
Version: 2.45 (HEAD)
Status: UNCONFIRMED
Severity: normal
Priority: P2
Component: ld
Assignee: unassigned at sourceware dot org
Reporter: jremus at linux dot ibm.com
Target Milestone: ---
When performing a relocatable link of multiple text sections of different name
(e.g. .text and .text.hot or when compiling with -ffunction-sections) the
resulting .sframe section claims its SFrame FDE to be sorted on PC. In general
I think this is wrong, as the ELF object file does not specify load addresses
or order of the individual .text.* sections. Note that it may be fine for the
Linux Kernel module loader use, if it loads the .text.* sections in the same
order they appear in the .ko.
Sample to demonstrate the issue:
#!/bin/bash
set -e -u -x
cat <<EOF > sframe-foobar.c
void foo(void) {}
void bar(void) { foo(); }
EOF
gcc -fPIC -ffunction-sections -Wa,--gsframe -o sframe-foobar.o -c
sframe-foobar.c
ld -relocatable -o sframe-foobar-relocatable.o sframe-foobar.o
objdump -d --sframe sframe-foobar-relocatable.o
readelf -WSr --sframe sframe-foobar-relocatable.o
The resulting relocatable object looks as follows on s390x (minimized excerpt
of "readelf -WSr --sframe" output):
Section Headers:
[Nr] Name Address Off Size
[ 2] .text.foo 0000000000000000 000040 000010
[ 3] .text.bar 0000000000000000 000050 000020
[ 4] .rela.text.bar 0000000000000000 0002c8 000018
[ 7] .sframe 0000000000000000 0000d8 000070
[ 8] .rela.sframe 0000000000000000 000310 000030
Relocation section '.rela.sframe' at offset 0x310 contains 2 entries:
Offset Type Symbol's Name + Addend
000000000000001c R_390_PC32 .text.foo + 1c
0000000000000030 R_390_PC32 .text.bar + 30
Contents of the SFrame section .sframe:
Header :
Version: SFRAME_VERSION_2
Flags: SFRAME_F_FDE_SORTED
Num FDEs: 2
Num FREs: 9
Function Index :
func idx [0]: pc = 0x0, size = 16 bytes
STARTPC CFA FP RA
0000000000000000 sp+160 u u
0000000000000004 sp+160 r16 u*
0000000000000008 fp+160 r16 u*
000000000000000e sp+160 u u
func idx [1]: pc = 0x0, size = 32 bytes
STARTPC CFA FP RA
0000000000000000 sp+160 u u
0000000000000006 sp+160 c-72 c-48
000000000000000c sp+320 c-72 c-48
0000000000000010 fp+320 c-72 c-48
000000000000001e sp+160 u u
While the relocations in .rela.sframe would correctly update the FDE function
start address fields, loading .text.bar at a lower address than .text.foo would
invalidate the SFRAME_F_FDE_SORTED property.
--
You are receiving this mail because:
You are on the CC list for the bug.