[Buildroot] [PATCH 1/2] toolchain: wrap 'ld' so that a ld emulation can be specified

Markos Chandras hwoarang at gentoo.org
Thu Jun 6 08:31:25 UTC 2013


On 5 June 2013 22:59, Thomas Petazzoni
<thomas.petazzoni at free-electrons.com> wrote:
> On some architectures, such as MIPS, the linker supports several 'ld
> emulation', and depending on which flavor of the architecture you're
> building for, one should be passing the proper -m <something> option
> to ld, otherwise ld defaults to the default emulation, which may not
> necessarily be compatible with the object files that are being
> linked. See for example the following build failure:
>
>   http://autobuild.buildroot.org/results/0e1/0e18e02e01148afb36acd2293b3fdc56c6bb8413/build-end.log
>
> So, we extend the toolchain wrapper to also wrap the ld linker, and
> allow a BR_LD_EMULATION variable to be passed to it.
>
> Signed-off-by: Thomas Petazzoni <thomas.petazzoni at free-electrons.com>
> ---
>  arch/Config.in                                     |  3 +++
>  toolchain/toolchain-external/ext-tool.mk           |  6 ++++-
>  .../toolchain-external/ext-toolchain-wrapper.c     | 26 +++++++++++++++++-----
>  3 files changed, 29 insertions(+), 6 deletions(-)
>
> diff --git a/arch/Config.in b/arch/Config.in
> index 5ca05cd..aab9922 100644
> --- a/arch/Config.in
> +++ b/arch/Config.in
> @@ -192,6 +192,9 @@ config BR2_GCC_TARGET_CPU
>  config BR2_GCC_TARGET_CPU_REVISION
>         string
>
> +config BR2_LD_TARGET_EMULATION
> +       string
> +
>  # Set up target binary format
>  choice
>         prompt "Target Binary Format"
> diff --git a/toolchain/toolchain-external/ext-tool.mk b/toolchain/toolchain-external/ext-tool.mk
> index 93b3b15..c132e6a 100644
> --- a/toolchain/toolchain-external/ext-tool.mk
> +++ b/toolchain/toolchain-external/ext-tool.mk
> @@ -141,6 +141,7 @@ CC_TARGET_CPU_:=$(call qstrip,$(BR2_GCC_TARGET_CPU)-$(BR2_GCC_TARGET_CPU_REVISIO
>  endif
>  CC_TARGET_ARCH_:=$(call qstrip,$(BR2_GCC_TARGET_ARCH))
>  CC_TARGET_ABI_:=$(call qstrip,$(BR2_GCC_TARGET_ABI))
> +LD_TARGET_EMULATION_:=$(call qstrip,$(BR2_LD_TARGET_EMULATION))
>
>  # march/mtune/floating point mode needs to be passed to the external toolchain
>  # to select the right multilib variant
> @@ -164,6 +165,9 @@ ifneq ($(CC_TARGET_ABI_),)
>  TOOLCHAIN_EXTERNAL_CFLAGS += -mabi=$(CC_TARGET_ABI_)
>  TOOLCHAIN_EXTERNAL_WRAPPER_ARGS += -DBR_ABI='"$(CC_TARGET_ABI_)"'
>  endif
> +ifneq ($(LD_TARGET_EMULATION_),)
> +TOOLCHAIN_EXTERNAL_WRAPPER_ARGS += -DBR_LD_EMULATION='"$(LD_TARGET_EMULATION_)"'
> +endif
>  ifeq ($(BR2_BINFMT_FLAT),y)
>  TOOLCHAIN_EXTERNAL_CFLAGS += -Wl,-elf2flt
>  TOOLCHAIN_EXTERNAL_WRAPPER_ARGS += -DBR_BINFMT_FLAT
> @@ -468,7 +472,7 @@ $(HOST_DIR)/usr/bin/ext-toolchain-wrapper: $(STAMP_DIR)/ext-toolchain-installed
>         for i in $(TOOLCHAIN_EXTERNAL_CROSS)*; do \
>                 base=$${i##*/}; \
>                 case "$$base" in \
> -               *cc|*cc-*|*++|*++-*|*cpp) \
> +               *cc|*cc-*|*++|*++-*|*cpp|*ld) \
>                         ln -sf $(@F) $$base; \
>                         ;; \
>                 *) \
> diff --git a/toolchain/toolchain-external/ext-toolchain-wrapper.c b/toolchain/toolchain-external/ext-toolchain-wrapper.c
> index 9d79d68..e2b945e 100644
> --- a/toolchain/toolchain-external/ext-toolchain-wrapper.c
> +++ b/toolchain/toolchain-external/ext-toolchain-wrapper.c
> @@ -23,7 +23,7 @@
>  static char path[PATH_MAX];
>  static char sysroot[PATH_MAX];
>
> -static char *predef_args[] = {
> +static char *gcc_predef_args[] = {
>         path,
>         "--sysroot", sysroot,
>  #ifdef BR_ARCH
> @@ -55,13 +55,21 @@ static char *predef_args[] = {
>  #endif
>  };
>
> +static char *ld_predef_args[] = {
> +       path,
> +#ifdef BR_LD_EMULATION
> +       "-m", BR_LD_EMULATION,
> +#endif
> +};
> +
>  int main(int argc, char **argv)
>  {
>         char **args, **cur;
>         char *relbasedir, *absbasedir;
>         char *progpath = argv[0];
>         char *basename;
> -       int ret, i, count = 0;
> +       char **predef_args;
> +       int ret, i, predef_args_sz, count = 0;
>
>         /* Calculate the relative paths */
>         basename = strrchr(progpath, '/');
> @@ -113,15 +121,23 @@ int main(int argc, char **argv)
>                 return 3;
>         }
>
> -       cur = args = malloc(sizeof(predef_args) + (sizeof(char *) * argc));
> +       if (!strncmp("-ld", basename + strlen(basename) - 3, 3)) {
> +               predef_args_sz = sizeof(ld_predef_args);
> +               predef_args = ld_predef_args;
> +       } else {
> +               predef_args_sz = sizeof(gcc_predef_args);
> +               predef_args = gcc_predef_args;
> +       }
> +
> +       cur = args = malloc(predef_args_sz + (sizeof(char *) * argc));
>         if (args == NULL) {
>                 perror(__FILE__ ": malloc");
>                 return 2;
>         }
>
>         /* start with predefined args */
> -       memcpy(cur, predef_args, sizeof(predef_args));
> -       cur += sizeof(predef_args) / sizeof(predef_args[0]);
> +       memcpy(cur, predef_args, predef_args_sz);
> +       cur += predef_args_sz / sizeof(char *);
>
>         /* append forward args */
>         memcpy(cur, &argv[1], sizeof(char *) * (argc - 1));
> --
> 1.8.1.2
>
> _______________________________________________
> buildroot mailing list
> buildroot at busybox.net
> http://lists.busybox.net/mailman/listinfo/buildroot

Hi Thomas,

My understanding is that this is also a problem with buildroot
toolchains as well. So whilst your patch fixes the problem with
external
toolchains, MIPS64/n64 buildroot toolchains will still have the same problem.

--
Regards,
Markos Chandras - Gentoo Linux Developer
http://dev.gentoo.org/~hwoarang


More information about the buildroot mailing list