Re: [PATCH v5 0/8] unwind, arm64: add sframe unwinder for kernel
Dylan Hatch <[email protected]> Mon, 18 May 2026 10:55:37 -0700
| Newsgroups | org.kernel.vger.linux-toolchains,org.infradead.lists.linux-arm-kernel,org.kernel.vger.linux-kernel,org.kernel.vger.live-patching |
|---|---|
| Message-ID | <CADBMgpx38SUUuYYCm612STqh01jqv817WnJeeXYTD7Uc1r-fug@mail.gmail.com> |
Hi Mostafa, On Fri, May 15, 2026 at 4:32=E2=80=AFAM Mostafa Saleh <[email protected]>= wrote: > > On Tue, Apr 28, 2026 at 06:36:35PM +0000, Dylan Hatch wrote: > > Implement a generic kernel sframe-based [1] unwinder. The main goal is > > to improve reliable stacktrace on arm64 by unwinding across exception > > boundaries. > > > > On x86, the ORC unwinder provides reliable stacktrace through similar > > methodology, but arm64 lacks the necessary support from objtool to > > create ORC unwind tables. > > > > Currently, there's already a sframe unwinder proposed for userspace: [2= ]. > > To maintain common definitions and algorithms for sframe lookup, a > > substantial portion of this patch series aims to refactor the sframe > > lookup code to support both kernel and userspace sframe sections. > > > > Currently, only GNU Binutils support sframe. This series relies on the > > Sframe V3 format, which is supported in binutils 2.46. > > > > These patches are based on Steven Rostedt's sframe/core branch [3], > > which is and aggregation of existing work done for x86 sframe userspace > > unwind, and contains [2]. This branch is, in turn, based on Linux > > v7.0-rc3. This full series (applied to the sframe/core branch) is > > available on github: [4]. > > > > Not sure if related, but after updating my toolchain > (aarch64-linux-gnu-gcc (Debian 15.2.0-4) 15.2.0), I hit link errors: > ld.lld: error: arch/arm64/kernel/vdso/vgettimeofday.o:(.sframe) is being = placed in '.sframe' > ld.lld: error: arch/arm64/kernel/vdso/vgetrandom.o:(.sframe) is being pla= ced in '.sframe` Previously when developing against the SFrame V2 format, I had fixed these warnings with the VDSO Makefile change currently in this series: diff --git a/arch/arm64/kernel/vdso/Makefile b/arch/arm64/kernel/vdso/Makef= ile index 7dec05dd33b7..c60ef921956f 100644 --- a/arch/arm64/kernel/vdso/Makefile +++ b/arch/arm64/kernel/vdso/Makefile @@ -38,7 +38,7 @@ ccflags-y +=3D -DDISABLE_BRANCH_PROFILING -DBUILD_VDSO CC_FLAGS_REMOVE_VDSO :=3D $(CC_FLAGS_FTRACE) -Os $(CC_FLAGS_SCS) \ $(RANDSTRUCT_CFLAGS) $(KSTACK_ERASE_CFLAGS) \ $(GCC_PLUGINS_CFLAGS) \ - $(CC_FLAGS_LTO) $(CC_FLAGS_CFI) \ + $(CC_FLAGS_LTO) $(CC_FLAGS_CFI) $(CC_FLAGS_SFRAME) = \ -Wmissing-prototypes -Wmissing-declarations CC_FLAGS_ADD_VDSO :=3D -O2 -mcmodel=3Dtiny -fasynchronous-unwind-tables But the warnings seem to have returned after upgrading my toolchain, possibly due to SFrame V3 or some confounding change in GCC. The --gsframe in the assembler should be set to 'no' by default, so perhaps GCC is providing an override --gsframe internally? > > I applied this series hoping that fix it, but it doesn't, so far I > have this hack : > diff --git a/arch/arm64/kernel/vdso/vdso.lds.S b/arch/arm64/kernel/vdso/v= dso.lds.S > index 52314be29191..53bdf757ee44 100644 > --- a/arch/arm64/kernel/vdso/vdso.lds.S > +++ b/arch/arm64/kernel/vdso/vdso.lds.S > @@ -77,7 +77,7 @@ SECTIONS > /DISCARD/ : { > *(.data .data.* .gnu.linkonce.d.* .sdata*) > *(.bss .sbss .dynbss .dynsbss) > - *(.eh_frame .eh_frame_hdr) > + *(.eh_frame .eh_frame_hdr .sframe) > } > } > > diff --git a/include/asm-generic/vmlinux.lds.h b/include/asm-generic/vmli= nux.lds.h > index 60c8c22fd3e4..759903acd6fc 100644 > --- a/include/asm-generic/vmlinux.lds.h > +++ b/include/asm-generic/vmlinux.lds.h > @@ -1064,6 +1064,7 @@ > /* ld.bfd warns about .gnu.version* even when not emitted */ \ > *(.gnu.version*) \ > *(__tracepoint_check) \ > + *(.sframe) \ > > #define DISCARDS \ > /DISCARD/ : { \ Since this series only handles kernel stacktrace, I believe it's better to omit the .sframe section entirely in the case where only ARCH_SUPPORTS_UNWIND_KERNEL_SFRAME is enabled. I think this hack may work better for this purpose: diff --git a/arch/arm64/kernel/vdso/Makefile b/arch/arm64/kernel/vdso/Makef= ile index c60ef921956f..29f802bfedb1 100644 --- a/arch/arm64/kernel/vdso/Makefile +++ b/arch/arm64/kernel/vdso/Makefile @@ -41,7 +41,7 @@ CC_FLAGS_REMOVE_VDSO :=3D $(CC_FLAGS_FTRACE) -Os $(CC_FLAGS_SCS) \ $(CC_FLAGS_LTO) $(CC_FLAGS_CFI) $(CC_FLAGS_SFRAME) = \ -Wmissing-prototypes -Wmissing-declarations -CC_FLAGS_ADD_VDSO :=3D -O2 -mcmodel=3Dtiny -fasynchronous-unwind-tables +CC_FLAGS_ADD_VDSO :=3D -O2 -mcmodel=3Dtiny -fasynchronous-unwind-tables -Wa,--gsframe=3Dno CFLAGS_REMOVE_vgettimeofday.o =3D $(CC_FLAGS_REMOVE_VDSO) CFLAGS_REMOVE_vgetrandom.o =3D $(CC_FLAGS_REMOVE_VDSO) Though, I don't understand why it is necessary to provide --gsframe=3Dno explicitly. If this approach seems ok to other folks/maintainers, I can fold this into my series. On the topic of SFrame for VDSO, Jens has a patch adding support for this as part of a series to support userspace SFrame unwinding for arm64: https://lore.kernel.org/lkml/[email protected]/ > > > Thanks, > Mostafa > Thanks, Dylan