Infrastructure to warn the user about missing 32 bits libraries
authorThomas Petazzoni <thomas.petazzoni@free-electrons.com>
Sat, 29 Dec 2012 06:14:49 +0000 (06:14 +0000)
committerPeter Korsgaard <jacmet@sunsite.dk>
Sun, 6 Jan 2013 20:35:47 +0000 (21:35 +0100)
Many users trying to use external toolchains on x86-64 machines get a
very confusing message:

  "Can't execute cross-compiler"

They get this message because they forgot to install the 32 bits
compatibility libraries that are needed to run binaries compiled for
x86 on x86-64 machines.

Since this is the case for both external toolchains and certain
binary-only tools like SAM-BA, we add a new Kconfig option
BR2_HOSTARCH_NEEDS_IA32_LIBS, that packages must select if they need
the 32 bits compatibility libraries. When this option is enabled,
dependencies.sh checks that the 32 bits dynamic library loader is
present on the system, and if not, it stops and shows an error.

The path and name of the 32 bits dynamic loader is hardcoded because
it is very unlikely to change, as it would break the ABI for all
binaries.

Also, it is worth noting that the check will be done even if we're
running on a 32 bits machine. This is harmless, as 32 bits machines
necessarily have the 32 bits dynamic loader installed, so the error
will never show up in this case.

Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
Signed-off-by: Peter Korsgaard <jacmet@sunsite.dk>
Config.in
support/dependencies/dependencies.sh

index b319ac78c56ff5ad6619fe4c3035250e3f1ae91b..af77a83cb648ae9b95c5ca66476ceffe198383fb 100644 (file)
--- a/Config.in
+++ b/Config.in
@@ -14,6 +14,12 @@ config BR2_HOSTARCH
        string
        option env="HOSTARCH"
 
+# Hidden boolean selected by pre-built packages for x86, when they
+# need to run on x86-64 machines (example: pre-built external
+# toolchains, binary tools like SAM-BA, etc.).
+config BR2_HOSTARCH_NEEDS_IA32_LIBS
+       bool
+
 source "arch/Config.in"
 
 menu "Build options"
index eb5a48184831efbc8d9cb0ecd4a24ba87ae9a3a1..ca5845014948dc0dfa78a6e53ebd8cab0d2acdbf 100755 (executable)
@@ -175,3 +175,15 @@ if grep -E '^BR2_TARGET_GENERIC_ROOT_PASSWD=".+"$' $CONFIG_FILE > /dev/null 2>&1
         exit 1
     fi
 fi
+
+if grep -q ^BR2_HOSTARCH_NEEDS_IA32_LIBS=y $CONFIG_FILE ; then
+    if test ! -f /lib/ld-linux.so.2 ; then
+       /bin/echo -e "\nYour Buildroot configuration uses pre-built tools for the x86 architecture,"
+       /bin/echo -e "but your build machine uses the x86-64 architecture without the 32 bits compatibility"
+       /bin/echo -e "library."
+       /bin/echo -e "If you're running a Debian/Ubuntu distribution, install the libc:i386 package."
+       /bin/echo -e "For other distributions, refer to the documentation on how to install the 32 bits"
+       /bin/echo -e "compatibility libraries."
+       exit 1
+    fi
+fi