[PATCH] arm64: vdso: disable .eh_frame_hdr via /DISCARD/ instead of --no-eh-frame-hdr
Ard Biesheuvel
ardb at kernel.org
Mon Jan 4 05:11:36 EST 2021
On Wed, 30 Dec 2020 at 23:20, Peter Collingbourne <pcc at google.com> wrote:
>
> Currently with ld.lld we emit an empty .eh_frame_hdr section (and a
> corresponding program header) into the vDSO. With ld.bfd the section
> is not emitted but the program header is, with p_vaddr set to 0. This
> can lead to unwinders attempting to interpret the data at whichever
> location the program header happens to point to as an unwind info
> header. This happens to be mostly harmless as long as the byte at
> that location (interpreted as a version number) has a value other
> than 1, causing both libgcc and LLVM libunwind to ignore the section
> (in libunwind's case, after printing an error message to stderr),
> but it could lead to worse problems if the byte happened to be 1 or
> the program header points to non-readable memory (e.g. if the empty
> section was placed at a page boundary).
>
> Instead of disabling .eh_frame_hdr via --no-eh-frame-hdr (which
> also has the downside of being unsupported by older versions of GNU
> binutils), disable it by discarding the section, and stop emitting
> the program header that points to it.
>
> I understand that we intend to emit valid unwind info for the vDSO
> at some point. Once that happens this patch can be reverted.
>
> Signed-off-by: Peter Collingbourne <pcc at google.com>
> Link: https://linux-review.googlesource.com/id/If745fd9cadcb31b4010acbf5693727fe111b0863
Acked-by: Ard Biesheuvel <ardb at kernel.org>
although I am slighty concerned that we haven't been able to converge
on a proper fix yet.
> ---
> arch/arm64/kernel/vdso/Makefile | 3 +--
> arch/arm64/kernel/vdso/vdso.lds.S | 5 +----
> 2 files changed, 2 insertions(+), 6 deletions(-)
>
> diff --git a/arch/arm64/kernel/vdso/Makefile b/arch/arm64/kernel/vdso/Makefile
> index a8f8e409e2bf..cd9c3fa25902 100644
> --- a/arch/arm64/kernel/vdso/Makefile
> +++ b/arch/arm64/kernel/vdso/Makefile
> @@ -24,8 +24,7 @@ btildflags-$(CONFIG_ARM64_BTI_KERNEL) += -z force-bti
> # routines, as x86 does (see 6f121e548f83 ("x86, vdso: Reimplement vdso.so
> # preparation in build-time C")).
> ldflags-y := -shared -nostdlib -soname=linux-vdso.so.1 --hash-style=sysv \
> - -Bsymbolic $(call ld-option, --no-eh-frame-hdr) --build-id=sha1 -n \
> - $(btildflags-y) -T
> + -Bsymbolic --build-id=sha1 -n $(btildflags-y) -T
>
> ccflags-y := -fno-common -fno-builtin -fno-stack-protector -ffixed-x18
> ccflags-y += -DDISABLE_BRANCH_PROFILING -DBUILD_VDSO
> diff --git a/arch/arm64/kernel/vdso/vdso.lds.S b/arch/arm64/kernel/vdso/vdso.lds.S
> index d808ad31e01f..61dbb4c838ef 100644
> --- a/arch/arm64/kernel/vdso/vdso.lds.S
> +++ b/arch/arm64/kernel/vdso/vdso.lds.S
> @@ -40,9 +40,6 @@ SECTIONS
> PROVIDE (_etext = .);
> PROVIDE (etext = .);
>
> - .eh_frame_hdr : { *(.eh_frame_hdr) } :text :eh_frame_hdr
> - .eh_frame : { KEEP (*(.eh_frame)) } :text
> -
> .dynamic : { *(.dynamic) } :text :dynamic
>
> .rodata : { *(.rodata*) } :text
> @@ -54,6 +51,7 @@ SECTIONS
> *(.note.GNU-stack)
> *(.data .data.* .gnu.linkonce.d.* .sdata*)
> *(.bss .sbss .dynbss .dynsbss)
> + *(.eh_frame .eh_frame_hdr)
> }
> }
>
> @@ -66,7 +64,6 @@ PHDRS
> text PT_LOAD FLAGS(5) FILEHDR PHDRS; /* PF_R|PF_X */
> dynamic PT_DYNAMIC FLAGS(4); /* PF_R */
> note PT_NOTE FLAGS(4); /* PF_R */
> - eh_frame_hdr PT_GNU_EH_FRAME;
> }
>
> /*
> --
> 2.29.2.729.g45daf8777d-goog
>
More information about the linux-arm-kernel
mailing list