[PATCH] arm64: vdso: Include .eh_frame in debug ELF

Vincent Whitchurch vincent.whitchurch at axis.com
Fri Nov 25 02:37:40 PST 2022


We currently strip out .eh_frame to work around crashes in libgcc when
it tries to unwind out of signal handlers, see commit 87676cfca141
("arm64: vdso: Disable dwarf unwinding through the sigreturn
trampoline").

The .eh_frame does however have correct unwind information for the
functions implemented in C in vgettimeofday.c, but currently this
information is not available even for offline unwinding using the
vdso.so.dbg.  As a result of this, perf built with libdw is unable to
unwind the stack when the PC is inside one of these functions.

To fix this, strip the .eh_frame section only from the vdso.so and not
from the vdso.so.dbg.  This can be used by offline unwinders with access
to the debug symbols, and will not affect libgcc since the section will
still not be present in the normal vDSO.

Cc: Tamas Zsoldos <tamas.zsoldos at arm.com>
Cc: Szabolcs Nagy <szabolcs.nagy at arm.com>
Cc: Daniel Kiss <daniel.kiss at arm.com>
Cc: Vincenzo Frascino <vincenzo.frascino at arm.com>
Cc: Ard Biesheuvel <ardb at kernel.org>
Signed-off-by: Vincent Whitchurch <vincent.whitchurch at axis.com>
---
 arch/arm64/kernel/vdso/Makefile   | 2 +-
 arch/arm64/kernel/vdso/vdso.lds.S | 3 ++-
 2 files changed, 3 insertions(+), 2 deletions(-)

diff --git a/arch/arm64/kernel/vdso/Makefile b/arch/arm64/kernel/vdso/Makefile
index 619e2dc7ee14..91aac17e11bc 100644
--- a/arch/arm64/kernel/vdso/Makefile
+++ b/arch/arm64/kernel/vdso/Makefile
@@ -65,7 +65,7 @@ $(obj)/vdso.so.dbg: $(obj)/vdso.lds $(obj-vdso) FORCE
 	$(call if_changed,vdsold_and_vdso_check)
 
 # Strip rule for the .so file
-$(obj)/%.so: OBJCOPYFLAGS := -S
+$(obj)/%.so: OBJCOPYFLAGS := -S --remove-section=.eh_frame --remove-section=.eh_frame_hdr
 $(obj)/%.so: $(obj)/%.so.dbg FORCE
 	$(call if_changed,objcopy)
 
diff --git a/arch/arm64/kernel/vdso/vdso.lds.S b/arch/arm64/kernel/vdso/vdso.lds.S
index 6028f1fe2d1c..66abf70efc58 100644
--- a/arch/arm64/kernel/vdso/vdso.lds.S
+++ b/arch/arm64/kernel/vdso/vdso.lds.S
@@ -31,6 +31,8 @@ SECTIONS
 	.gnu.version	: { *(.gnu.version) }
 	.gnu.version_d	: { *(.gnu.version_d) }
 	.gnu.version_r	: { *(.gnu.version_r) }
+	.eh_frame	: { *(.eh_frame) }
+	.eh_frame_hdr	: { *(.eh_frame_hdr) }
 
 	/*
 	 * Discard .note.gnu.property sections which are unused and have
@@ -78,7 +80,6 @@ SECTIONS
 	/DISCARD/	: {
 		*(.data .data.* .gnu.linkonce.d.* .sdata*)
 		*(.bss .sbss .dynbss .dynsbss)
-		*(.eh_frame .eh_frame_hdr)
 	}
 }
 
-- 
2.34.1




More information about the linux-arm-kernel mailing list