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

Jan Heylen heyleke at gmail.com
Tue Mar 22 16:19:44 UTC 2016


Hi,

it has been a month, I know the amount of patches in the queue is
high, but any luck at looking at this one, based upon a patch from
Thomas Petazzoni that was in the queue before, so should be ok ;-) ?

br,

Jan

On Sat, Feb 20, 2016 at 10:33 AM, Jan Heylen <heyleke at gmail.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.
>
>   So, we extend the toolchain wrapper to also wrap the ld linker, and
>   allow a BR_LD_EMULATION variable to be passed to it.
>
> Based upon patch from Thomas Petazzoni:
> http://thread.gmane.org/gmane.comp.lib.uclibc.buildroot/60942
>
> Signed-off-by: Jan Heylen <heyleke at gmail.com>
> ---
>  arch/Config.in                                     |  3 +
>  toolchain/toolchain-external/toolchain-external.mk |  6 +-
>  toolchain/toolchain-wrapper.c                      | 75 ++++++++++++++--------
>  3 files changed, 55 insertions(+), 29 deletions(-)
>
> diff --git a/arch/Config.in b/arch/Config.in
> index 401bd28..50816c6 100644
> --- a/arch/Config.in
> +++ b/arch/Config.in
> @@ -266,6 +266,9 @@ config BR2_GCC_TARGET_CPU
>  config BR2_GCC_TARGET_CPU_REVISION
>         string
>
> +config BR2_LD_TARGET_EMULATION
> +       string
> +
>  # The value of this option will be passed as --with-fpu=<value> when
>  # building gcc (internal backend) or -mfpu=<value> in the toolchain
>  # wrapper (external toolchain)
> diff --git a/toolchain/toolchain-external/toolchain-external.mk b/toolchain/toolchain-external/toolchain-external.mk
> index 6c3022a..9396377 100644
> --- a/toolchain/toolchain-external/toolchain-external.mk
> +++ b/toolchain/toolchain-external/toolchain-external.mk
> @@ -182,6 +182,7 @@ CC_TARGET_ABI_ := $(call qstrip,$(BR2_GCC_TARGET_ABI))
>  CC_TARGET_FPU_ := $(call qstrip,$(BR2_GCC_TARGET_FPU))
>  CC_TARGET_FLOAT_ABI_ := $(call qstrip,$(BR2_GCC_TARGET_FLOAT_ABI))
>  CC_TARGET_MODE_ := $(call qstrip,$(BR2_GCC_TARGET_MODE))
> +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
> @@ -213,6 +214,9 @@ ifneq ($(CC_TARGET_MODE_),)
>  TOOLCHAIN_EXTERNAL_CFLAGS += -m$(CC_TARGET_MODE_)
>  TOOLCHAIN_EXTERNAL_TOOLCHAIN_WRAPPER_ARGS += -DBR_MODE='"$(CC_TARGET_MODE_)"'
>  endif
> +ifneq ($(LD_TARGET_EMULATION_),)
> +TOOLCHAIN_EXTERNAL_TOOLCHAIN_WRAPPER_ARGS += -DBR_LD_EMULATION='"$(LD_TARGET_EMULATION_)"'
> +endif
>  ifeq ($(BR2_BINFMT_FLAT),y)
>  TOOLCHAIN_EXTERNAL_CFLAGS += -Wl,-elf2flt
>  TOOLCHAIN_EXTERNAL_TOOLCHAIN_WRAPPER_ARGS += -DBR_BINFMT_FLAT
> @@ -711,7 +715,7 @@ define TOOLCHAIN_EXTERNAL_INSTALL_WRAPPER
>                 *-ar|*-ranlib|*-nm) \
>                         ln -sf $$(echo $$i | sed 's%^$(HOST_DIR)%../..%') .; \
>                         ;; \
> -               *cc|*cc-*|*++|*++-*|*cpp) \
> +               *cc|*cc-*|*++|*++-*|*cpp|*ld) \
>                         ln -sf toolchain-wrapper $$base; \
>                         ;; \
>                 *gdb|*gdbtui) \
> diff --git a/toolchain/toolchain-wrapper.c b/toolchain/toolchain-wrapper.c
> index 887058f..25ce640 100644
> --- a/toolchain/toolchain-wrapper.c
> +++ b/toolchain/toolchain-wrapper.c
> @@ -42,7 +42,7 @@ static char sysroot[PATH_MAX];
>   */
>  #define EXCLUSIVE_ARGS 3
>
> -static char *predef_args[] = {
> +static char *gcc_predef_args[] = {
>  #ifdef BR_CCACHE
>         ccache_path,
>  #endif
> @@ -80,6 +80,13 @@ static char *predef_args[] = {
>  #endif
>  };
>
> +static char *ld_predef_args[] = {
> +       path,
> +#ifdef BR_LD_EMULATION
> +       "-m", BR_LD_EMULATION,
> +#endif
> +};
> +
>  static void check_unsafe_path(const char *path, int paranoid)
>  {
>         char **c;
> @@ -108,7 +115,8 @@ int main(int argc, char **argv)
>         char *env_debug;
>         char *paranoid_wrapper;
>         int paranoid;
> -       int ret, i, count = 0, debug;
> +       char **predef_args;
> +       int ret, i, predef_args_sz, count = 0, debug;
>
>         /* Calculate the relative paths */
>         basename = strrchr(progpath, '/');
> @@ -169,7 +177,15 @@ int main(int argc, char **argv)
>                 return 3;
>         }
>
> -       cur = args = malloc(sizeof(predef_args) +
> +       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 + EXCLUSIVE_ARGS)));
>         if (args == NULL) {
>                 perror(__FILE__ ": malloc");
> @@ -177,42 +193,45 @@ int main(int argc, char **argv)
>         }
>
>         /* 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 *);
>
> +       /* following extras should only happen for non-ld wrappers */
> +       if (predef_args != ld_predef_args) {
>  #ifdef BR_FLOAT_ABI
> -       /* add float abi if not overridden in args */
> -       for (i = 1; i < argc; i++) {
> -               if (!strncmp(argv[i], "-mfloat-abi=", strlen("-mfloat-abi=")) ||
> -                   !strcmp(argv[i], "-msoft-float") ||
> -                   !strcmp(argv[i], "-mhard-float"))
> -                       break;
> -       }
> +               /* add float abi if not overridden in args */
> +               for (i = 1; i < argc; i++) {
> +                       if (!strncmp(argv[i], "-mfloat-abi=", strlen("-mfloat-abi=")) ||
> +                                       !strcmp(argv[i], "-msoft-float") ||
> +                                       !strcmp(argv[i], "-mhard-float"))
> +                               break;
> +               }
>
> -       if (i == argc)
> -               *cur++ = "-mfloat-abi=" BR_FLOAT_ABI;
> +               if (i == argc)
> +                       *cur++ = "-mfloat-abi=" BR_FLOAT_ABI;
>  #endif
>
>  #if defined(BR_ARCH) || \
> -    defined(BR_CPU)
> -       /* Add our -march/cpu flags, but only if none of
> -        * -march/mtune/mcpu are already specified on the commandline
> -        */
> -       for (i = 1; i < argc; i++) {
> -               if (!strncmp(argv[i], "-march=", strlen("-march=")) ||
> -                   !strncmp(argv[i], "-mtune=", strlen("-mtune=")) ||
> -                   !strncmp(argv[i], "-mcpu=",  strlen("-mcpu=" )))
> -                       break;
> -       }
> -       if (i == argc) {
> +               defined(BR_CPU)
> +               /* Add our -march/cpu flags, but only if none of
> +                * -march/mtune/mcpu are already specified on the commandline
> +                */
> +               for (i = 1; i < argc; i++) {
> +                       if (!strncmp(argv[i], "-march=", strlen("-march=")) ||
> +                                       !strncmp(argv[i], "-mtune=", strlen("-mtune=")) ||
> +                                       !strncmp(argv[i], "-mcpu=",  strlen("-mcpu=" )))
> +                               break;
> +               }
> +               if (i == argc) {
>  #ifdef BR_ARCH
> -               *cur++ = "-march=" BR_ARCH;
> +                       *cur++ = "-march=" BR_ARCH;
>  #endif
>  #ifdef BR_CPU
> -               *cur++ = "-mcpu=" BR_CPU;
> +                       *cur++ = "-mcpu=" BR_CPU;
>  #endif
> -       }
> +               }
>  #endif /* ARCH || CPU */
> +       }
>
>         paranoid_wrapper = getenv("BR_COMPILER_PARANOID_UNSAFE_PATH");
>         if (paranoid_wrapper && strlen(paranoid_wrapper) > 0)
> --
> 2.5.0
>


More information about the buildroot mailing list