diff mbox series

arm: vdso: pass --be8 to linker if necessary

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

Commit Message

Jason A. Donenfeld May 29, 2019, 6:23 p.m. UTC
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(-)

Comments

Masahiro Yamada May 31, 2019, 2:01 a.m. UTC | #1
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
Jason A. Donenfeld May 31, 2019, 8:17 a.m. UTC | #2
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
Russell King (Oracle) May 31, 2019, 8:37 a.m. UTC | #3
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
>
Jason A. Donenfeld June 13, 2019, 5:03 p.m. UTC | #4
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
Masahiro Yamada June 18, 2019, 2:56 p.m. UTC | #5
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 mbox series

Patch

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