diff mbox

linux-tools/perf: fix build for MIPS by using the right emulation on LD

Message ID 20170217105905.32151-1-Vincent.Riera@imgtec.com
State Accepted
Headers show

Commit Message

Vicente Olivert Riera Feb. 17, 2017, 10:59 a.m. UTC
Passing just the endianness flag to LD is not enough. We need to pass
the right emulation flag which will set everything for us, not only the
endianness.

Signed-off-by: Vicente Olivert Riera <Vincent.Riera@imgtec.com>
---
 package/linux-tools/linux-tool-perf.mk | 30 +++++++++++++++++++-----------
 1 file changed, 19 insertions(+), 11 deletions(-)

Comments

Thomas Petazzoni Feb. 17, 2017, 1:26 p.m. UTC | #1
Hello,

On Fri, 17 Feb 2017 10:59:05 +0000, Vicente Olivert Riera wrote:

> +# We need to pass an argument to ld for setting the emulation when
> +# building for MIPS architecture, otherwise the default one will always
> +# be used and the compilation for most variants will fail.
> +ifeq ($(BR2_mips),y)
> +PERF_MAKE_FLAGS += LD="$(TARGET_LD) -m elf32btsmip"
> +else ifeq ($(BR2_mipsel),y)
> +PERF_MAKE_FLAGS += LD="$(TARGET_LD) -m elf32ltsmip"
> +else ifeq ($(BR2_mips64),y)
> +ifeq ($(BR2_MIPS_NABI32),y)
> +PERF_MAKE_FLAGS += LD="$(TARGET_LD) -m elf32btsmipn32"
> +else
> +PERF_MAKE_FLAGS += LD="$(TARGET_LD) -m elf64btsmip"
> +endif
> +else ifeq ($(BR2_mips64el),y)
> +ifeq ($(BR2_MIPS_NABI32),y)
> +PERF_MAKE_FLAGS += LD="$(TARGET_LD) -m elf32ltsmipn32"
> +else
> +PERF_MAKE_FLAGS += LD="$(TARGET_LD) -m elf64ltsmip"
> +endif
>  endif

This is really getting nasty, especially since gcc already knows about
this. Why not use gcc instead of ld?

Thomas
Vicente Olivert Riera Feb. 17, 2017, 1:38 p.m. UTC | #2
Hi Thomas,

On 17/02/17 13:26, Thomas Petazzoni wrote:
> Hello,
> 
> On Fri, 17 Feb 2017 10:59:05 +0000, Vicente Olivert Riera wrote:
> 
>> +# We need to pass an argument to ld for setting the emulation when
>> +# building for MIPS architecture, otherwise the default one will always
>> +# be used and the compilation for most variants will fail.
>> +ifeq ($(BR2_mips),y)
>> +PERF_MAKE_FLAGS += LD="$(TARGET_LD) -m elf32btsmip"
>> +else ifeq ($(BR2_mipsel),y)
>> +PERF_MAKE_FLAGS += LD="$(TARGET_LD) -m elf32ltsmip"
>> +else ifeq ($(BR2_mips64),y)
>> +ifeq ($(BR2_MIPS_NABI32),y)
>> +PERF_MAKE_FLAGS += LD="$(TARGET_LD) -m elf32btsmipn32"
>> +else
>> +PERF_MAKE_FLAGS += LD="$(TARGET_LD) -m elf64btsmip"
>> +endif
>> +else ifeq ($(BR2_mips64el),y)
>> +ifeq ($(BR2_MIPS_NABI32),y)
>> +PERF_MAKE_FLAGS += LD="$(TARGET_LD) -m elf32ltsmipn32"
>> +else
>> +PERF_MAKE_FLAGS += LD="$(TARGET_LD) -m elf64ltsmip"
>> +endif
>>  endif
> 
> This is really getting nasty, especially since gcc already knows about
> this. Why not use gcc instead of ld?

Ideally, perf's build system would use gcc for linking instead of ld,
but that's not the case.

This is something we discussed in the past when we were talking about
creating a wrapper for ld, as we already have for gcc. We decided to not
do it and instead let those packages that were using ld for linking to
fail, so we could identify them and fix their build system in order to
link with gcc instead.

But, what happen when you really need to fix the problem and you don't
have the time/skills/whatever to modify the package's build system to
make it link with gcc?

Regards,

Vincent

> 
> Thomas
>
Arnout Vandecappelle Oct. 23, 2017, 4:46 p.m. UTC | #3
On 17-02-17 11:59, Vicente Olivert Riera wrote:
> Passing just the endianness flag to LD is not enough. We need to pass
> the right emulation flag which will set everything for us, not only the
> endianness.
> 
> Signed-off-by: Vicente Olivert Riera <Vincent.Riera@imgtec.com>

 Since there really is no other way to fix this problem, even if the fix is
ugly, I've applied to master, thanks.

 If anyone can come up with a better way (not involving an LD wrapper - just a
few places need it so it's not worth it), please speak up!

 Regards,
 Arnout

> ---
>  package/linux-tools/linux-tool-perf.mk | 30 +++++++++++++++++++-----------
>  1 file changed, 19 insertions(+), 11 deletions(-)
> 
> diff --git a/package/linux-tools/linux-tool-perf.mk b/package/linux-tools/linux-tool-perf.mk
> index 16f3a58..69492ba 100644
> --- a/package/linux-tools/linux-tool-perf.mk
> +++ b/package/linux-tools/linux-tool-perf.mk
> @@ -28,17 +28,25 @@ PERF_MAKE_FLAGS = \
>  	NO_LIBPYTHON=1 \
>  	NO_LIBBIONIC=1
>  
> -# We need to pass an argument to ld for setting the endianness when
> -# building it for MIPS architecture, otherwise the default one will
> -# always be used (which is big endian) and the compilation for little
> -# endian will always fail showing an error like this one:
> -#  LD    foo.o
> -# mips-linux-gnu-ld: foo.o: compiled for a little endian system and
> -# target is big endian
> -ifeq ($(BR2_mips)$(BR2_mips64),y)
> -PERF_MAKE_FLAGS += LD="$(TARGET_LD) -EB"
> -else ifeq ($(BR2_mipsel)$(BR2_mips64el),y)
> -PERF_MAKE_FLAGS += LD="$(TARGET_LD) -EL"
> +# We need to pass an argument to ld for setting the emulation when
> +# building for MIPS architecture, otherwise the default one will always
> +# be used and the compilation for most variants will fail.
> +ifeq ($(BR2_mips),y)
> +PERF_MAKE_FLAGS += LD="$(TARGET_LD) -m elf32btsmip"
> +else ifeq ($(BR2_mipsel),y)
> +PERF_MAKE_FLAGS += LD="$(TARGET_LD) -m elf32ltsmip"
> +else ifeq ($(BR2_mips64),y)
> +ifeq ($(BR2_MIPS_NABI32),y)
> +PERF_MAKE_FLAGS += LD="$(TARGET_LD) -m elf32btsmipn32"
> +else
> +PERF_MAKE_FLAGS += LD="$(TARGET_LD) -m elf64btsmip"
> +endif
> +else ifeq ($(BR2_mips64el),y)
> +ifeq ($(BR2_MIPS_NABI32),y)
> +PERF_MAKE_FLAGS += LD="$(TARGET_LD) -m elf32ltsmipn32"
> +else
> +PERF_MAKE_FLAGS += LD="$(TARGET_LD) -m elf64ltsmip"
> +endif
>  endif
>  
>  # The call to backtrace() function fails for ARC, because for some
>
diff mbox

Patch

diff --git a/package/linux-tools/linux-tool-perf.mk b/package/linux-tools/linux-tool-perf.mk
index 16f3a58..69492ba 100644
--- a/package/linux-tools/linux-tool-perf.mk
+++ b/package/linux-tools/linux-tool-perf.mk
@@ -28,17 +28,25 @@  PERF_MAKE_FLAGS = \
 	NO_LIBPYTHON=1 \
 	NO_LIBBIONIC=1
 
-# We need to pass an argument to ld for setting the endianness when
-# building it for MIPS architecture, otherwise the default one will
-# always be used (which is big endian) and the compilation for little
-# endian will always fail showing an error like this one:
-#  LD    foo.o
-# mips-linux-gnu-ld: foo.o: compiled for a little endian system and
-# target is big endian
-ifeq ($(BR2_mips)$(BR2_mips64),y)
-PERF_MAKE_FLAGS += LD="$(TARGET_LD) -EB"
-else ifeq ($(BR2_mipsel)$(BR2_mips64el),y)
-PERF_MAKE_FLAGS += LD="$(TARGET_LD) -EL"
+# We need to pass an argument to ld for setting the emulation when
+# building for MIPS architecture, otherwise the default one will always
+# be used and the compilation for most variants will fail.
+ifeq ($(BR2_mips),y)
+PERF_MAKE_FLAGS += LD="$(TARGET_LD) -m elf32btsmip"
+else ifeq ($(BR2_mipsel),y)
+PERF_MAKE_FLAGS += LD="$(TARGET_LD) -m elf32ltsmip"
+else ifeq ($(BR2_mips64),y)
+ifeq ($(BR2_MIPS_NABI32),y)
+PERF_MAKE_FLAGS += LD="$(TARGET_LD) -m elf32btsmipn32"
+else
+PERF_MAKE_FLAGS += LD="$(TARGET_LD) -m elf64btsmip"
+endif
+else ifeq ($(BR2_mips64el),y)
+ifeq ($(BR2_MIPS_NABI32),y)
+PERF_MAKE_FLAGS += LD="$(TARGET_LD) -m elf32ltsmipn32"
+else
+PERF_MAKE_FLAGS += LD="$(TARGET_LD) -m elf64ltsmip"
+endif
 endif
 
 # The call to backtrace() function fails for ARC, because for some