2011-04-29 13:09:26 +02:00
|
|
|
/**
|
2015-10-04 14:28:41 +02:00
|
|
|
* Buildroot wrapper for toolchains. This simply executes the real toolchain
|
|
|
|
* with a number of arguments (sysroot/arch/..) hardcoded, to ensure the
|
|
|
|
* toolchain uses the correct configuration.
|
2012-07-15 03:12:05 +02:00
|
|
|
* The hardcoded path arguments are defined relative to the actual location
|
|
|
|
* of the binary.
|
2011-04-29 13:09:26 +02:00
|
|
|
*
|
|
|
|
* (C) 2011 Peter Korsgaard <jacmet@sunsite.dk>
|
2011-06-21 21:54:27 +02:00
|
|
|
* (C) 2011 Daniel Nyström <daniel.nystrom@timeterminal.se>
|
2012-07-15 03:12:05 +02:00
|
|
|
* (C) 2012 Arnout Vandecappelle (Essensium/Mind) <arnout@mind.be>
|
2013-07-20 01:31:58 +02:00
|
|
|
* (C) 2013 Spenser Gilliland <spenser@gillilanding.com>
|
2011-04-29 13:09:26 +02:00
|
|
|
*
|
|
|
|
* This file is licensed under the terms of the GNU General Public License
|
|
|
|
* version 2. This program is licensed "as is" without any warranty of any
|
|
|
|
* kind, whether express or implied.
|
|
|
|
*/
|
|
|
|
|
2014-12-10 23:53:46 +01:00
|
|
|
#define _GNU_SOURCE
|
2011-04-29 13:09:26 +02:00
|
|
|
#include <stdio.h>
|
|
|
|
#include <string.h>
|
|
|
|
#include <limits.h>
|
|
|
|
#include <unistd.h>
|
2011-06-21 21:54:27 +02:00
|
|
|
#include <stdlib.h>
|
2014-12-10 23:53:46 +01:00
|
|
|
#include <errno.h>
|
2011-04-29 13:09:26 +02:00
|
|
|
|
2012-07-15 03:12:05 +02:00
|
|
|
static char path[PATH_MAX];
|
|
|
|
static char sysroot[PATH_MAX];
|
2011-04-29 13:09:26 +02:00
|
|
|
|
2013-07-20 01:31:58 +02:00
|
|
|
/**
|
|
|
|
* GCC errors out with certain combinations of arguments (examples are
|
2014-04-10 07:46:25 +02:00
|
|
|
* -mfloat-abi={hard|soft} and -m{little|big}-endian), so we have to ensure
|
2013-07-20 01:31:58 +02:00
|
|
|
* that we only pass the predefined one to the real compiler if the inverse
|
|
|
|
* option isn't in the argument list.
|
|
|
|
* This specifies the worst case number of extra arguments we might pass
|
toolchain/external: fix wrapper by not passing conflicting flags
In our wrapper, we forcibly add the -march=, -mcpu= and-mtune= flags
to the actual compiler, this in an attempt to always generate correct
and optimised code for the target.
But in some cases, the caller knows better than we do, and passes its
own set, or subset of those flags. In this case, some may conflict with
the ones we pass. The most prominent offender being the Linux kernel.
For example, on the ARM Raspberry Pi, the Linux kernel will set the
-march=armv6 flag and no -mcpu= flag, but we pass -mcpu=arm1176jzf-s,
which conflicts:
drivers/scsi/scsi_trace.c:1:0: warning: switch -mcpu=arm1176jzf-s
conflicts with -march=armv6 switch
(and so for all the files the kernel compiles, pretty messy)
(note: arm1176jzf-s is not an armv6, it is an armv6zk. Yeah...)
To avoid this situation, we scan our commandline for any occurence of
the possibly conflicting flags. If none is found, then we add our owns.
If any is found, then we don't add any of our owns.
The idea behind this is that we trust the caller to know better than
we do what it is doing. Since the biggest, and sole so far, offender
is the Linux kernel, then this is a rather safe bet.
Signed-off-by: "Yann E. MORIN" <yann.morin.1998@free.fr>
Cc: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
Cc: Peter Korsgaard <jacmet@uclibc.org>
Cc: Arnout Vandecappelle <arnout@mind.be>
Cc: Maxime Hadjinlian <maxime.hadjinlian@gmail.com>
Signed-off-by: Peter Korsgaard <peter@korsgaard.com>
2014-01-07 23:46:05 +01:00
|
|
|
* Currently, we have:
|
|
|
|
* -mfloat-abi=
|
|
|
|
* -march=
|
|
|
|
* -mcpu=
|
2013-07-20 01:31:58 +02:00
|
|
|
*/
|
2014-10-21 22:27:16 +02:00
|
|
|
#define EXCLUSIVE_ARGS 3
|
2013-07-20 01:31:58 +02:00
|
|
|
|
2011-06-21 21:54:27 +02:00
|
|
|
static char *predef_args[] = {
|
2011-04-29 13:09:26 +02:00
|
|
|
path,
|
2012-07-15 03:12:05 +02:00
|
|
|
"--sysroot", sysroot,
|
2011-04-29 13:09:26 +02:00
|
|
|
#ifdef BR_ABI
|
|
|
|
"-mabi=" BR_ABI,
|
|
|
|
#endif
|
2013-07-20 01:31:57 +02:00
|
|
|
#ifdef BR_FPU
|
arch: introduce BR2_GCC_TARGET_{FPU, FLOAT_ABI}
Buildroot already has the BR2_GCC_TARGET_{TUNE,ARCH,ABI,CPU} hidden
kconfig strings that allow per-architecture Config.in files to feed
the appropriate values of --with-{tune,arch,abi-cpu} when building
gcc, or the appropriate flags for the external toolchain wrapper.
This commit has two additional options:
BR2_GCC_TARGET_{FPU,FLOAT_ABI}, that allows to define the
--with-{fpu,float} gcc configure options for the internal backend, or
the -m{fpu,float-abi} options for the flags of the external toolchain
wrapper.
Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
Signed-off-by: Peter Korsgaard <jacmet@sunsite.dk>
2013-07-16 10:03:12 +02:00
|
|
|
"-mfpu=" BR_FPU,
|
|
|
|
#endif
|
2011-04-29 13:09:26 +02:00
|
|
|
#ifdef BR_SOFTFLOAT
|
|
|
|
"-msoft-float",
|
|
|
|
#endif /* BR_SOFTFLOAT */
|
2013-07-16 10:03:22 +02:00
|
|
|
#ifdef BR_MODE
|
|
|
|
"-m" BR_MODE,
|
|
|
|
#endif
|
2012-03-13 23:30:00 +01:00
|
|
|
#ifdef BR_64
|
|
|
|
"-m64",
|
|
|
|
#endif
|
2013-05-03 02:39:34 +02:00
|
|
|
#ifdef BR_BINFMT_FLAT
|
|
|
|
"-Wl,-elf2flt",
|
|
|
|
#endif
|
2013-10-14 11:52:25 +02:00
|
|
|
#ifdef BR_MIPS_TARGET_LITTLE_ENDIAN
|
|
|
|
"-EL",
|
|
|
|
#endif
|
2015-03-10 12:50:24 +01:00
|
|
|
#if defined(BR_MIPS_TARGET_BIG_ENDIAN) || defined(BR_ARC_TARGET_BIG_ENDIAN)
|
2013-10-14 11:52:25 +02:00
|
|
|
"-EB",
|
|
|
|
#endif
|
2011-12-31 12:09:33 +01:00
|
|
|
#ifdef BR_ADDITIONAL_CFLAGS
|
|
|
|
BR_ADDITIONAL_CFLAGS
|
|
|
|
#endif
|
2011-04-29 13:09:26 +02:00
|
|
|
};
|
|
|
|
|
2014-12-10 23:53:46 +01:00
|
|
|
static void check_unsafe_path(const char *path, int paranoid)
|
|
|
|
{
|
|
|
|
char **c;
|
|
|
|
static char *unsafe_paths[] = {
|
|
|
|
"/lib", "/usr/include", "/usr/lib", "/usr/local/include", "/usr/local/lib", NULL,
|
|
|
|
};
|
|
|
|
|
|
|
|
for (c = unsafe_paths; *c != NULL; c++) {
|
|
|
|
if (!strncmp(path, *c, strlen(*c))) {
|
|
|
|
fprintf(stderr, "%s: %s: unsafe header/library path used in cross-compilation: '%s'\n",
|
|
|
|
program_invocation_short_name,
|
|
|
|
paranoid ? "ERROR" : "WARNING", path);
|
|
|
|
if (paranoid)
|
|
|
|
exit(1);
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2011-04-29 13:09:26 +02:00
|
|
|
int main(int argc, char **argv)
|
|
|
|
{
|
2011-06-21 21:54:27 +02:00
|
|
|
char **args, **cur;
|
2012-07-15 03:12:05 +02:00
|
|
|
char *relbasedir, *absbasedir;
|
|
|
|
char *progpath = argv[0];
|
|
|
|
char *basename;
|
2013-09-21 00:00:30 +02:00
|
|
|
char *env_debug;
|
2014-12-10 23:53:46 +01:00
|
|
|
char *paranoid_wrapper;
|
|
|
|
int paranoid;
|
2013-09-21 00:00:30 +02:00
|
|
|
int ret, i, count = 0, debug;
|
2012-07-15 03:12:05 +02:00
|
|
|
|
|
|
|
/* Calculate the relative paths */
|
|
|
|
basename = strrchr(progpath, '/');
|
|
|
|
if (basename) {
|
|
|
|
*basename = '\0';
|
|
|
|
basename++;
|
|
|
|
relbasedir = malloc(strlen(progpath) + 7);
|
|
|
|
if (relbasedir == NULL) {
|
|
|
|
perror(__FILE__ ": malloc");
|
|
|
|
return 2;
|
|
|
|
}
|
|
|
|
sprintf(relbasedir, "%s/../..", argv[0]);
|
|
|
|
absbasedir = realpath(relbasedir, NULL);
|
|
|
|
} else {
|
|
|
|
basename = progpath;
|
2013-05-29 01:41:19 +02:00
|
|
|
absbasedir = malloc(PATH_MAX + 1);
|
|
|
|
ret = readlink("/proc/self/exe", absbasedir, PATH_MAX);
|
|
|
|
if (ret < 0) {
|
|
|
|
perror(__FILE__ ": readlink");
|
|
|
|
return 2;
|
|
|
|
}
|
|
|
|
absbasedir[ret] = '\0';
|
|
|
|
for (i = ret; i > 0; i--) {
|
|
|
|
if (absbasedir[i] == '/') {
|
|
|
|
absbasedir[i] = '\0';
|
|
|
|
if (++count == 3)
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
2012-07-15 03:12:05 +02:00
|
|
|
}
|
|
|
|
if (absbasedir == NULL) {
|
|
|
|
perror(__FILE__ ": realpath");
|
|
|
|
return 2;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Fill in the relative paths */
|
|
|
|
#ifdef BR_CROSS_PATH_REL
|
|
|
|
ret = snprintf(path, sizeof(path), "%s/" BR_CROSS_PATH_REL "/%s", absbasedir, basename);
|
gcc: use toolchain wrapper
We have a toolchain wrapper for external toolchain, but it is also
beneficial for internal toolchains, for the following reasons:
1. It can make sure that BR2_TARGET_OPTIMIZATION is passed to the
compiler even if a package's build system doesn't honor CFLAGS.
2. It allows us to do the unsafe path check (i.e. -I/usr/include)
without patching gcc.
3. It makes it simpler to implement building each package with a
separate staging directory (per-package staging).
4. It makes it simpler to implement a compiler hash check for ccache.
The wrapper is reused from the external toolchain. A third CROSS_PATH_
option is added to the wrapper: in this case, the real executable is in
the same directory, with the extension .real.
The creation of the simple symlinks is merged with the creation of the
wrapper symlinks, otherwise part of the -gcc-ar handling logic would
have to be repeated.
The complex case-condition could be refactored with the one for the
external toolchain, but then it becomes even more complex because
they each have special corner cases. For example, the internal
toolchain has to handle *.real to avoid creating an extra indirection
after host-gcc-{final,initial}-rebuild.
Instead of creating the .real files, it would also have been possible
to install the internal toolchain in $(HOST_DIR)/opt, similar to what
we do for the external toolchain. However, then we would also have to
copy things to the sysroot and do more of the magic that the external
toolchain is doing. So keeping it in $(HOST_DIR)/usr/bin is much
simpler.
Note that gcc-initial has to be wrapped as well, because it is used for
building libc and we want to apply the same magic when building libc.
Signed-off-by: Arnout Vandecappelle (Essensium/Mind) <arnout@mind.be>
Cc: Fabio Porcedda <fabio.porcedda@gmail.com>
Cc: Jérôme Oufella <jerome.oufella@savoirfairelinux.com>
Reviewed-by: Romain Naour <romain.naour@openwide.fr>
Signed-off-by: Peter Korsgaard <peter@korsgaard.com>
2015-10-04 14:28:42 +02:00
|
|
|
#elif BR_CROSS_PATH_ABS
|
2012-07-15 03:12:05 +02:00
|
|
|
ret = snprintf(path, sizeof(path), BR_CROSS_PATH_ABS "/%s", basename);
|
gcc: use toolchain wrapper
We have a toolchain wrapper for external toolchain, but it is also
beneficial for internal toolchains, for the following reasons:
1. It can make sure that BR2_TARGET_OPTIMIZATION is passed to the
compiler even if a package's build system doesn't honor CFLAGS.
2. It allows us to do the unsafe path check (i.e. -I/usr/include)
without patching gcc.
3. It makes it simpler to implement building each package with a
separate staging directory (per-package staging).
4. It makes it simpler to implement a compiler hash check for ccache.
The wrapper is reused from the external toolchain. A third CROSS_PATH_
option is added to the wrapper: in this case, the real executable is in
the same directory, with the extension .real.
The creation of the simple symlinks is merged with the creation of the
wrapper symlinks, otherwise part of the -gcc-ar handling logic would
have to be repeated.
The complex case-condition could be refactored with the one for the
external toolchain, but then it becomes even more complex because
they each have special corner cases. For example, the internal
toolchain has to handle *.real to avoid creating an extra indirection
after host-gcc-{final,initial}-rebuild.
Instead of creating the .real files, it would also have been possible
to install the internal toolchain in $(HOST_DIR)/opt, similar to what
we do for the external toolchain. However, then we would also have to
copy things to the sysroot and do more of the magic that the external
toolchain is doing. So keeping it in $(HOST_DIR)/usr/bin is much
simpler.
Note that gcc-initial has to be wrapped as well, because it is used for
building libc and we want to apply the same magic when building libc.
Signed-off-by: Arnout Vandecappelle (Essensium/Mind) <arnout@mind.be>
Cc: Fabio Porcedda <fabio.porcedda@gmail.com>
Cc: Jérôme Oufella <jerome.oufella@savoirfairelinux.com>
Reviewed-by: Romain Naour <romain.naour@openwide.fr>
Signed-off-by: Peter Korsgaard <peter@korsgaard.com>
2015-10-04 14:28:42 +02:00
|
|
|
#else /* BR_CROSS_PATH_SUFFIX */
|
|
|
|
ret = snprintf(path, sizeof(path), "%s/usr/bin/%s" BR_CROSS_PATH_SUFFIX, absbasedir, basename);
|
2012-07-15 03:12:05 +02:00
|
|
|
#endif
|
|
|
|
if (ret >= sizeof(path)) {
|
|
|
|
perror(__FILE__ ": overflow");
|
|
|
|
return 3;
|
|
|
|
}
|
|
|
|
ret = snprintf(sysroot, sizeof(sysroot), "%s/" BR_SYSROOT, absbasedir);
|
|
|
|
if (ret >= sizeof(sysroot)) {
|
|
|
|
perror(__FILE__ ": overflow");
|
|
|
|
return 3;
|
|
|
|
}
|
2011-04-29 13:09:26 +02:00
|
|
|
|
2013-07-20 01:31:58 +02:00
|
|
|
cur = args = malloc(sizeof(predef_args) +
|
|
|
|
(sizeof(char *) * (argc + EXCLUSIVE_ARGS)));
|
2011-06-21 21:54:27 +02:00
|
|
|
if (args == NULL) {
|
|
|
|
perror(__FILE__ ": malloc");
|
|
|
|
return 2;
|
2011-04-29 13:09:26 +02:00
|
|
|
}
|
|
|
|
|
2011-06-21 21:54:27 +02:00
|
|
|
/* start with predefined args */
|
|
|
|
memcpy(cur, predef_args, sizeof(predef_args));
|
|
|
|
cur += sizeof(predef_args) / sizeof(predef_args[0]);
|
|
|
|
|
2013-07-20 01:31:58 +02:00
|
|
|
#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;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (i == argc)
|
|
|
|
*cur++ = "-mfloat-abi=" BR_FLOAT_ABI;
|
|
|
|
#endif
|
|
|
|
|
toolchain/external: fix wrapper by not passing conflicting flags
In our wrapper, we forcibly add the -march=, -mcpu= and-mtune= flags
to the actual compiler, this in an attempt to always generate correct
and optimised code for the target.
But in some cases, the caller knows better than we do, and passes its
own set, or subset of those flags. In this case, some may conflict with
the ones we pass. The most prominent offender being the Linux kernel.
For example, on the ARM Raspberry Pi, the Linux kernel will set the
-march=armv6 flag and no -mcpu= flag, but we pass -mcpu=arm1176jzf-s,
which conflicts:
drivers/scsi/scsi_trace.c:1:0: warning: switch -mcpu=arm1176jzf-s
conflicts with -march=armv6 switch
(and so for all the files the kernel compiles, pretty messy)
(note: arm1176jzf-s is not an armv6, it is an armv6zk. Yeah...)
To avoid this situation, we scan our commandline for any occurence of
the possibly conflicting flags. If none is found, then we add our owns.
If any is found, then we don't add any of our owns.
The idea behind this is that we trust the caller to know better than
we do what it is doing. Since the biggest, and sole so far, offender
is the Linux kernel, then this is a rather safe bet.
Signed-off-by: "Yann E. MORIN" <yann.morin.1998@free.fr>
Cc: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
Cc: Peter Korsgaard <jacmet@uclibc.org>
Cc: Arnout Vandecappelle <arnout@mind.be>
Cc: Maxime Hadjinlian <maxime.hadjinlian@gmail.com>
Signed-off-by: Peter Korsgaard <peter@korsgaard.com>
2014-01-07 23:46:05 +01:00
|
|
|
#if defined(BR_ARCH) || \
|
|
|
|
defined(BR_CPU)
|
2015-07-26 12:53:07 +02:00
|
|
|
/* Add our -march/cpu flags, but only if none of
|
|
|
|
* -march/mtune/mcpu are already specified on the commandline
|
toolchain/external: fix wrapper by not passing conflicting flags
In our wrapper, we forcibly add the -march=, -mcpu= and-mtune= flags
to the actual compiler, this in an attempt to always generate correct
and optimised code for the target.
But in some cases, the caller knows better than we do, and passes its
own set, or subset of those flags. In this case, some may conflict with
the ones we pass. The most prominent offender being the Linux kernel.
For example, on the ARM Raspberry Pi, the Linux kernel will set the
-march=armv6 flag and no -mcpu= flag, but we pass -mcpu=arm1176jzf-s,
which conflicts:
drivers/scsi/scsi_trace.c:1:0: warning: switch -mcpu=arm1176jzf-s
conflicts with -march=armv6 switch
(and so for all the files the kernel compiles, pretty messy)
(note: arm1176jzf-s is not an armv6, it is an armv6zk. Yeah...)
To avoid this situation, we scan our commandline for any occurence of
the possibly conflicting flags. If none is found, then we add our owns.
If any is found, then we don't add any of our owns.
The idea behind this is that we trust the caller to know better than
we do what it is doing. Since the biggest, and sole so far, offender
is the Linux kernel, then this is a rather safe bet.
Signed-off-by: "Yann E. MORIN" <yann.morin.1998@free.fr>
Cc: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
Cc: Peter Korsgaard <jacmet@uclibc.org>
Cc: Arnout Vandecappelle <arnout@mind.be>
Cc: Maxime Hadjinlian <maxime.hadjinlian@gmail.com>
Signed-off-by: Peter Korsgaard <peter@korsgaard.com>
2014-01-07 23:46:05 +01:00
|
|
|
*/
|
|
|
|
for (i = 1; i < argc; i++) {
|
|
|
|
if (!strncmp(argv[i], "-march=", strlen("-march=")) ||
|
2015-07-26 12:53:07 +02:00
|
|
|
!strncmp(argv[i], "-mtune=", strlen("-mtune=")) ||
|
toolchain/external: fix wrapper by not passing conflicting flags
In our wrapper, we forcibly add the -march=, -mcpu= and-mtune= flags
to the actual compiler, this in an attempt to always generate correct
and optimised code for the target.
But in some cases, the caller knows better than we do, and passes its
own set, or subset of those flags. In this case, some may conflict with
the ones we pass. The most prominent offender being the Linux kernel.
For example, on the ARM Raspberry Pi, the Linux kernel will set the
-march=armv6 flag and no -mcpu= flag, but we pass -mcpu=arm1176jzf-s,
which conflicts:
drivers/scsi/scsi_trace.c:1:0: warning: switch -mcpu=arm1176jzf-s
conflicts with -march=armv6 switch
(and so for all the files the kernel compiles, pretty messy)
(note: arm1176jzf-s is not an armv6, it is an armv6zk. Yeah...)
To avoid this situation, we scan our commandline for any occurence of
the possibly conflicting flags. If none is found, then we add our owns.
If any is found, then we don't add any of our owns.
The idea behind this is that we trust the caller to know better than
we do what it is doing. Since the biggest, and sole so far, offender
is the Linux kernel, then this is a rather safe bet.
Signed-off-by: "Yann E. MORIN" <yann.morin.1998@free.fr>
Cc: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
Cc: Peter Korsgaard <jacmet@uclibc.org>
Cc: Arnout Vandecappelle <arnout@mind.be>
Cc: Maxime Hadjinlian <maxime.hadjinlian@gmail.com>
Signed-off-by: Peter Korsgaard <peter@korsgaard.com>
2014-01-07 23:46:05 +01:00
|
|
|
!strncmp(argv[i], "-mcpu=", strlen("-mcpu=" )))
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
if (i == argc) {
|
|
|
|
#ifdef BR_ARCH
|
|
|
|
*cur++ = "-march=" BR_ARCH;
|
|
|
|
#endif
|
|
|
|
#ifdef BR_CPU
|
|
|
|
*cur++ = "-mcpu=" BR_CPU;
|
|
|
|
#endif
|
|
|
|
}
|
2014-10-21 22:27:16 +02:00
|
|
|
#endif /* ARCH || CPU */
|
toolchain/external: fix wrapper by not passing conflicting flags
In our wrapper, we forcibly add the -march=, -mcpu= and-mtune= flags
to the actual compiler, this in an attempt to always generate correct
and optimised code for the target.
But in some cases, the caller knows better than we do, and passes its
own set, or subset of those flags. In this case, some may conflict with
the ones we pass. The most prominent offender being the Linux kernel.
For example, on the ARM Raspberry Pi, the Linux kernel will set the
-march=armv6 flag and no -mcpu= flag, but we pass -mcpu=arm1176jzf-s,
which conflicts:
drivers/scsi/scsi_trace.c:1:0: warning: switch -mcpu=arm1176jzf-s
conflicts with -march=armv6 switch
(and so for all the files the kernel compiles, pretty messy)
(note: arm1176jzf-s is not an armv6, it is an armv6zk. Yeah...)
To avoid this situation, we scan our commandline for any occurence of
the possibly conflicting flags. If none is found, then we add our owns.
If any is found, then we don't add any of our owns.
The idea behind this is that we trust the caller to know better than
we do what it is doing. Since the biggest, and sole so far, offender
is the Linux kernel, then this is a rather safe bet.
Signed-off-by: "Yann E. MORIN" <yann.morin.1998@free.fr>
Cc: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
Cc: Peter Korsgaard <jacmet@uclibc.org>
Cc: Arnout Vandecappelle <arnout@mind.be>
Cc: Maxime Hadjinlian <maxime.hadjinlian@gmail.com>
Signed-off-by: Peter Korsgaard <peter@korsgaard.com>
2014-01-07 23:46:05 +01:00
|
|
|
|
2014-12-10 23:53:46 +01:00
|
|
|
paranoid_wrapper = getenv("BR_COMPILER_PARANOID_UNSAFE_PATH");
|
|
|
|
if (paranoid_wrapper && strlen(paranoid_wrapper) > 0)
|
|
|
|
paranoid = 1;
|
|
|
|
else
|
|
|
|
paranoid = 0;
|
|
|
|
|
|
|
|
/* Check for unsafe library and header paths */
|
|
|
|
for (i = 1; i < argc; i++) {
|
|
|
|
|
|
|
|
/* Skip options that do not start with -I and -L */
|
|
|
|
if (strncmp(argv[i], "-I", 2) && strncmp(argv[i], "-L", 2))
|
|
|
|
continue;
|
|
|
|
|
|
|
|
/* We handle two cases: first the case where -I/-L and
|
|
|
|
* the path are separated by one space and therefore
|
|
|
|
* visible as two separate options, and then the case
|
|
|
|
* where they are stuck together forming one single
|
|
|
|
* option.
|
|
|
|
*/
|
|
|
|
if (argv[i][2] == '\0') {
|
|
|
|
i++;
|
|
|
|
if (i == argc)
|
|
|
|
continue;
|
|
|
|
check_unsafe_path(argv[i], paranoid);
|
|
|
|
} else {
|
|
|
|
check_unsafe_path(argv[i] + 2, paranoid);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2011-06-21 21:54:27 +02:00
|
|
|
/* append forward args */
|
|
|
|
memcpy(cur, &argv[1], sizeof(char *) * (argc - 1));
|
|
|
|
cur += argc - 1;
|
|
|
|
|
|
|
|
/* finish with NULL termination */
|
|
|
|
*cur = NULL;
|
2011-04-29 13:09:26 +02:00
|
|
|
|
2013-09-21 00:00:30 +02:00
|
|
|
/* Debug the wrapper to see actual arguments passed to
|
|
|
|
* the compiler:
|
|
|
|
* unset, empty, or 0: do not trace
|
|
|
|
* set to 1 : trace all arguments on a single line
|
|
|
|
* set to 2 : trace one argument per line
|
|
|
|
*/
|
2014-03-03 23:55:05 +01:00
|
|
|
if ((env_debug = getenv("BR2_DEBUG_WRAPPER"))) {
|
2013-09-21 00:00:30 +02:00
|
|
|
debug = atoi(env_debug);
|
|
|
|
if (debug > 0) {
|
|
|
|
fprintf(stderr, "Toolchain wrapper executing:");
|
|
|
|
for (i = 0; args[i]; i++)
|
|
|
|
fprintf(stderr, "%s'%s'",
|
2013-09-23 09:45:56 +02:00
|
|
|
(debug == 2) ? "\n " : " ", args[i]);
|
2013-09-21 00:00:30 +02:00
|
|
|
fprintf(stderr, "\n");
|
|
|
|
}
|
2013-07-18 23:54:50 +02:00
|
|
|
}
|
|
|
|
|
2011-04-29 13:09:26 +02:00
|
|
|
if (execv(path, args))
|
|
|
|
perror(path);
|
|
|
|
|
2011-06-21 21:54:27 +02:00
|
|
|
free(args);
|
|
|
|
|
2011-04-29 13:09:26 +02:00
|
|
|
return 2;
|
|
|
|
}
|