Buildroot Archive on lore.kernel.org
 help / color / mirror / Atom feed
* [Buildroot] [PATCH 1/2] toolchain: wrap 'ld' so that a ld emulation can be specified
@ 2013-06-05 21:59 Thomas Petazzoni
  2013-06-05 21:59 ` [Buildroot] [PATCH 2/2] arch: define appropriate ld emulation values for the MIPS architecture Thomas Petazzoni
  2013-06-06  8:31 ` [Buildroot] [PATCH 1/2] toolchain: wrap 'ld' so that a ld emulation can be specified Markos Chandras
  0 siblings, 2 replies; 14+ messages in thread
From: Thomas Petazzoni @ 2013-06-05 21:59 UTC (permalink / raw)
  To: buildroot

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@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

^ permalink raw reply related	[flat|nested] 14+ messages in thread
* [Buildroot] [PATCH 1/2] toolchain: wrap 'ld' so that a ld emulation can be specified
@ 2016-02-20  9:33 Jan Heylen
  2016-03-22 16:19 ` Jan Heylen
  2016-03-30 21:55 ` Arnout Vandecappelle
  0 siblings, 2 replies; 14+ messages in thread
From: Jan Heylen @ 2016-02-20  9:33 UTC (permalink / raw)
  To: buildroot

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@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

^ permalink raw reply related	[flat|nested] 14+ messages in thread

end of thread, other threads:[~2016-03-31 12:26 UTC | newest]

Thread overview: 14+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-06-05 21:59 [Buildroot] [PATCH 1/2] toolchain: wrap 'ld' so that a ld emulation can be specified Thomas Petazzoni
2013-06-05 21:59 ` [Buildroot] [PATCH 2/2] arch: define appropriate ld emulation values for the MIPS architecture Thomas Petazzoni
2013-06-06  8:37   ` Markos Chandras
2013-06-06  8:57     ` Thomas Petazzoni
2013-06-06  9:04       ` Markos Chandras
2013-06-06  8:31 ` [Buildroot] [PATCH 1/2] toolchain: wrap 'ld' so that a ld emulation can be specified Markos Chandras
2013-06-06  8:51   ` Thomas Petazzoni
2013-06-06  8:56     ` Markos Chandras
2013-06-06  9:13       ` Markos Chandras
2013-06-06 10:04         ` Markos Chandras
  -- strict thread matches above, loose matches on Subject: below --
2016-02-20  9:33 Jan Heylen
2016-03-22 16:19 ` Jan Heylen
2016-03-30 21:55 ` Arnout Vandecappelle
2016-03-31 12:26   ` Jan Heylen

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox