MIPS: VDSO: Force link endianness
authorPaul Burton <paul.burton@mips.com>
Tue, 7 Aug 2018 23:09:56 +0000 (16:09 -0700)
committerPaul Burton <paul.burton@mips.com>
Tue, 7 Aug 2018 23:16:13 +0000 (16:16 -0700)
When building the VDSO with clang it appears to invoke ld without
specifying endianness, even though clang itself was provided with a -EB
or -EL flag. This results in the build failing due to a mismatch between
the objects that are the input to ld, and the output it is attempting to
create:

  VDSO    arch/mips/vdso/vdso.so.dbg.raw
  mips-linux-ld: arch/mips/vdso/elf.o: compiled for a big endian system
    and target is little endian
  mips-linux-ld: arch/mips/vdso/elf.o: endianness incompatible with that
    of the selected emulation
  mips-linux-ld: failed to merge target specific data of file
    arch/mips/vdso/elf.o
  ...

Work around this problem by explicitly specifying the link endianness
using -Wl,-EB or -Wl,-EL when -EB or -EL are part of KBUILD_CFLAGS. This
resolves the build failure when using clang, and doesn't have any
negative effect on gcc.

Signed-off-by: Paul Burton <paul.burton@mips.com>
arch/mips/vdso/Makefile

index bd79b27faa2b9194ad75e982f1e35809baf0530e..34605ca214984c7257507fa2fb5925eb48bd9f92 100644 (file)
@@ -44,6 +44,7 @@ endif
 # VDSO linker flags.
 VDSO_LDFLAGS := \
        -Wl,-Bsymbolic -Wl,--no-undefined -Wl,-soname=linux-vdso.so.1 \
+       $(addprefix -Wl$(comma),$(filter -E%,$(KBUILD_CFLAGS))) \
        -nostdlib -shared \
        $(call cc-ldoption, -Wl$(comma)--hash-style=sysv) \
        $(call cc-ldoption, -Wl$(comma)--build-id)