Message ID | 20170217105905.32151-1-Vincent.Riera@imgtec.com |
---|---|
State | Accepted |
Headers | show |
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
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 >
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 --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
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(-)