Files
binutils-gdb/ld/emulparams/elf64_s390.sh
Jens Remus 98d9fe6cb6 s390: Generate .eh_frame unwind information for .plt section
Enable unwinding using .eh_frame information through PLT entries.  Based
on x86-64.

This enhances stack traces if the instruction pointer is in a PLT entry.
For instance perf call graphs, when using --call-graph=dwarf, and Glibc
backtraces, when using backtrace() e.g. from a signal handler.
Note that GDB could already unwind through PLT entries using its s390-
specific prologue unwinder.

Furthermore this lays the foundation to generate SFrame information for
the PLT section in the future.

bfd/
	* elf64-s390.c: Include dwarf2.h.
	(PLT_CIE_SIZE, PLT_FDE_SIZE,
	PLT_FDE_START_OFFSET, PLT_FDE_LEN_OFFSET,
	elf_s390x_eh_frame_plt): New .eh_frame template for .plt
	section.
	(elf_s390_link_hash_table): Add plt_eh_frame field.
	(elf_s390_create_dynamic_sections): New s390-specific wrapper
	around _bfd_elf_create_dynamic_sections.  Create .eh_frame
	section for .plt section.
	(elf_backend_create_dynamic_sections): Register s390-specific
	elf_s390_create_dynamic_sections.
	(elf_s390_late_size_sections): Fill in .eh_frame section for
	.plt section.  Write .plt section size into .eh_frame FDE
	covering .plt section.
	(elf_s390_finish_dynamic_sections): Write .plt section start
	into .eh_frame FDE covering .plt section.  Call
	_bfd_elf_write_section_eh_frame on on htab->plt_eh_frame
	section.

ld/
	* NEWS: Add news entry.
	* emulparams/elf64_s390.sh: Include plt_unwind.sh.

ld/testsuite/
	* ld-s390/plt_64-1_eh.wf: New PLT .eh_frame generation test.
	* ld-s390/s390.exp: Link some existing test cases with
	--no-ld-generated-unwind-info so that they do not fail.  Run
	new PLT .eh_frame generation test.

Signed-off-by: Jens Remus <jremus@linux.ibm.com>
2025-01-27 16:47:10 +01:00

43 lines
989 B
Bash

source_sh ${srcdir}/emulparams/plt_unwind.sh
SCRIPT_NAME=elf
ELFSIZE=64
OUTPUT_FORMAT="elf64-s390"
NO_REL_RELOCS=yes
TEXT_START_ADDR=0x1000000
MAXPAGESIZE="CONSTANT (MAXPAGESIZE)"
COMMONPAGESIZE="CONSTANT (COMMONPAGESIZE)"
ARCH="s390:64-bit"
MACHINE=
NOP=0x07070707
TEMPLATE_NAME=elf
GENERATE_SHLIB_SCRIPT=yes
GENERATE_PIE_SCRIPT=yes
GENERATE_RELRO_SCRIPT=yes
NO_SMALL_DATA=yes
EXTRA_EM_FILE=s390
IREL_IN_PLT=
SEPARATE_GOTPLT=0
test -z "$RELRO" && unset SEPARATE_GOTPLT
SYMBOL_ABI_ALIGNMENT=2
# Treat a host that matches the target with the possible exception of "x"
# in the name as if it were native.
if test `echo "$host" | sed -e s/390x/390/` \
= `echo "$target" | sed -e s/390x/390/`; then
case " $EMULATION_LIBPATH " in
*" ${EMULATION_NAME} "*)
NATIVE=yes
esac
fi
# Look for 64 bit target libraries in /lib64, /usr/lib64 etc., first
# on Linux.
case "$target" in
s390*-linux*)
case "$EMULATION_NAME" in
*64*)
LIBPATH_SUFFIX=64 ;;
esac
;;
esac