Message ID | 20190529182324.8140-1-Jason@zx2c4.com (mailing list archive) |
---|---|
State | Mainlined, archived |
Commit | c5d0e49e8d8f1a23034fdf8e935afc0c8f7ae27d |
Headers | show |
Series | arm: vdso: pass --be8 to linker if necessary | expand |
Hi Jason, Thanks for catching this. On Thu, May 30, 2019 at 3:26 AM Jason A. Donenfeld <Jason@zx2c4.com> wrote: > > The commit fe00e50b2db8 ("ARM: 8858/1: vdso: use $(LD) instead of $(CC) > to link VDSO") removed the passing of CFLAGS, since ld doesn't take > those directly. However, prior, big-endian ARM was relying on gcc to > translate its -mbe8 option into ld's --be8 option. Lacking this, ld 'git grep -- -mbe8' has no hit. Is it a toolchain internal flag? > generated be32 code, making the VDSO generate SIGILL when called by > userspace. > > This commit passes --be8 if CONFIG_CPU_ENDIAN_BE8 is enabled. > > Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com> > Cc: Masahiro Yamada <yamada.masahiro@socionext.com> > Cc: Russell King <rmk+kernel@armlinux.org.uk> > Cc: Arnd Bergmann <arnd@arndb.de> > Cc: Ard Biesheuvel <ard.biesheuvel@linaro.org> > --- > arch/arm/vdso/Makefile | 5 +++-- > 1 file changed, 3 insertions(+), 2 deletions(-) > > diff --git a/arch/arm/vdso/Makefile b/arch/arm/vdso/Makefile > index fadf554d9391..1f5ec9741e6d 100644 > --- a/arch/arm/vdso/Makefile > +++ b/arch/arm/vdso/Makefile > @@ -10,9 +10,10 @@ obj-vdso := $(addprefix $(obj)/, $(obj-vdso)) > ccflags-y := -fPIC -fno-common -fno-builtin -fno-stack-protector > ccflags-y += -DDISABLE_BRANCH_PROFILING > > -ldflags-y = -Bsymbolic --no-undefined -soname=linux-vdso.so.1 \ > +ldflags-$(CONFIG_CPU_ENDIAN_BE8) := --be8 > +ldflags-y := -Bsymbolic --no-undefined -soname=linux-vdso.so.1 \ > -z max-page-size=4096 -z common-page-size=4096 \ > - -nostdlib -shared \ > + -nostdlib -shared $(ldflags-y) \ > $(call ld-option, --hash-style=sysv) \ > $(call ld-option, --build-id) \ > -T > -- > 2.21.0 > -- Best Regards Masahiro Yamada
Hey Masahiro, I'm not sure exactly. I did just notice another place --be8 is being added: ifeq ($(CONFIG_CPU_ENDIAN_BE8),y) LDFLAGS_vmlinux += --be8 KBUILD_LDFLAGS_MODULE += --be8 endif I suppose it's possible that this is kbuild related where one of those isn't winding up in the right place. I did see that the commit that this patch addresses uses "=" instead of the more usual ":=" or "+=" for whatever reason. Jason
On Fri, May 31, 2019 at 11:01:23AM +0900, Masahiro Yamada wrote: > Hi Jason, > > Thanks for catching this. > > On Thu, May 30, 2019 at 3:26 AM Jason A. Donenfeld <Jason@zx2c4.com> wrote: > > > > The commit fe00e50b2db8 ("ARM: 8858/1: vdso: use $(LD) instead of $(CC) > > to link VDSO") removed the passing of CFLAGS, since ld doesn't take > > those directly. However, prior, big-endian ARM was relying on gcc to > > translate its -mbe8 option into ld's --be8 option. Lacking this, ld > > > 'git grep -- -mbe8' has no hit. It isn't -mbe8, it is --be8 $ arm-linux-gcc --target-help ... --be8 Output BE8 format image > > Is it a toolchain internal flag? > > > > > generated be32 code, making the VDSO generate SIGILL when called by > > userspace. > > > > This commit passes --be8 if CONFIG_CPU_ENDIAN_BE8 is enabled. > > > > Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com> > > Cc: Masahiro Yamada <yamada.masahiro@socionext.com> > > Cc: Russell King <rmk+kernel@armlinux.org.uk> > > Cc: Arnd Bergmann <arnd@arndb.de> > > Cc: Ard Biesheuvel <ard.biesheuvel@linaro.org> > > --- > > arch/arm/vdso/Makefile | 5 +++-- > > 1 file changed, 3 insertions(+), 2 deletions(-) > > > > diff --git a/arch/arm/vdso/Makefile b/arch/arm/vdso/Makefile > > index fadf554d9391..1f5ec9741e6d 100644 > > --- a/arch/arm/vdso/Makefile > > +++ b/arch/arm/vdso/Makefile > > @@ -10,9 +10,10 @@ obj-vdso := $(addprefix $(obj)/, $(obj-vdso)) > > ccflags-y := -fPIC -fno-common -fno-builtin -fno-stack-protector > > ccflags-y += -DDISABLE_BRANCH_PROFILING > > > > -ldflags-y = -Bsymbolic --no-undefined -soname=linux-vdso.so.1 \ > > +ldflags-$(CONFIG_CPU_ENDIAN_BE8) := --be8 > > +ldflags-y := -Bsymbolic --no-undefined -soname=linux-vdso.so.1 \ > > -z max-page-size=4096 -z common-page-size=4096 \ > > - -nostdlib -shared \ > > + -nostdlib -shared $(ldflags-y) \ > > $(call ld-option, --hash-style=sysv) \ > > $(call ld-option, --build-id) \ > > -T > > -- > > 2.21.0 > > > > > -- > Best Regards > Masahiro Yamada >
Hey Masahiro, Considering ARM big endian userland is pretty badly broken without this, we should probably have this merged in the next rc or rather soon. Was there additional information you needed? Would you prefer Russell queues up my patch or did you want to make further build system changes? Jason
Hi. On Fri, May 31, 2019 at 5:20 PM Jason A. Donenfeld <Jason@zx2c4.com> wrote: > > Hey Masahiro, > > I'm not sure exactly. I did just notice another place --be8 is being added: That is not my question. I just asked about your commit log: "big-endian ARM was relying on gcc to translate its -mbe8 option into ld's --be8 option" I grepped '-mbe8', but I did not see it anywhere in the source tree. So, I just wondered where it came from. > ifeq ($(CONFIG_CPU_ENDIAN_BE8),y) > LDFLAGS_vmlinux += --be8 > KBUILD_LDFLAGS_MODULE += --be8 > endif > > I suppose it's possible that this is kbuild related where one of those > isn't winding up in the right place. I did see that the commit that > this patch addresses uses "=" instead of the more usual ":=" or "+=" > for whatever reason. > > Jason Perhaps, the following will be cleaner: ldflags-$(CONFIG_CPU_ENDIAN_BE8) += --be8 ldflags-y += -Bsymbolic --no-undefined -soname=linux-vdso.so.1 \ -z max-page-size=4096 -z common-page-size=4096 \ -nostdlib -shared \ $(call ld-option, --hash-style=sysv) \ $(call ld-option, --build-id) \ -T I think this fix-up should be applied by Russell. Please note he does not pick up patches directly from ML. To ask him to pick up patches, you need to put patches into his patch tracker. (patches@arm.linux.org.uk)
diff --git a/arch/arm/vdso/Makefile b/arch/arm/vdso/Makefile index fadf554d9391..1f5ec9741e6d 100644 --- a/arch/arm/vdso/Makefile +++ b/arch/arm/vdso/Makefile @@ -10,9 +10,10 @@ obj-vdso := $(addprefix $(obj)/, $(obj-vdso)) ccflags-y := -fPIC -fno-common -fno-builtin -fno-stack-protector ccflags-y += -DDISABLE_BRANCH_PROFILING -ldflags-y = -Bsymbolic --no-undefined -soname=linux-vdso.so.1 \ +ldflags-$(CONFIG_CPU_ENDIAN_BE8) := --be8 +ldflags-y := -Bsymbolic --no-undefined -soname=linux-vdso.so.1 \ -z max-page-size=4096 -z common-page-size=4096 \ - -nostdlib -shared \ + -nostdlib -shared $(ldflags-y) \ $(call ld-option, --hash-style=sysv) \ $(call ld-option, --build-id) \ -T
The commit fe00e50b2db8 ("ARM: 8858/1: vdso: use $(LD) instead of $(CC) to link VDSO") removed the passing of CFLAGS, since ld doesn't take those directly. However, prior, big-endian ARM was relying on gcc to translate its -mbe8 option into ld's --be8 option. Lacking this, ld generated be32 code, making the VDSO generate SIGILL when called by userspace. This commit passes --be8 if CONFIG_CPU_ENDIAN_BE8 is enabled. Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com> Cc: Masahiro Yamada <yamada.masahiro@socionext.com> Cc: Russell King <rmk+kernel@armlinux.org.uk> Cc: Arnd Bergmann <arnd@arndb.de> Cc: Ard Biesheuvel <ard.biesheuvel@linaro.org> --- arch/arm/vdso/Makefile | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)