When gcc-4.2.2 is built with the '--with-sysroot=$path' configure option,
gcc does correctly prepend $path to the default include and library search
dirs,
but the default linux dynamic linker, /lib/ld-linux.so.2, is still used, even
though $path/lib/ld-linux.so.2 exists.
Thus to link programs with a new glibc under $path, one must still supply the
'-Wl,-dynamic-linker,$path/lib/ld-linux.so.2' argument to the resulting gcc
in order to use the glibc under $path .
It seems strange and unlikely to work that gcc then by default attempts to
link to a glibc under $path, but still uses the dynamic linker from the
system glibc under /lib.
A very simple patch will fix this for linux :
--- diff -u gcc/config/linux.h~ gcc/config/linux.h :
--- gcc/config/linux.h~ 2007-09-01 11:28:30.000000000 -0400
+++ gcc/config/linux.h 2007-09-01 11:28:30.000000000 -0400
@@ -104,7 +104,11 @@
#if UCLIBC_DEFAULT
#define CHOOSE_DYNAMIC_LINKER(G, U) "%{mglibc:%{muclibc:%e-mglibc and -muclibc
used together}" G ";:" U "}"
#else
+#ifndef TARGET_SYSTEM_ROOT
#define CHOOSE_DYNAMIC_LINKER(G, U) "%{muclibc:%{mglibc:%e-mglibc and -muclibc
used together}" U ";:" G "}"
+#else
+#define CHOOSE_DYNAMIC_LINKER(G, U) "%{muclibc:%{mglibc:%e-mglibc and -muclibc
used together}" U ";:" TARGET_SYSTEM_ROOT G "}"
+#endif
#endif
/* For most targets the following definitions suffice;
---
Since TARGET_SYSTEM_ROOT is only defined by configure when --with-sysroot
is specfied, this works OK; the dynamic linker under $path/lib/ is used
by default, unless the -Wl,-dynamic-linker ld option is supplied for a build.
Perhaps when the '--sysroot=$path' gcc option is supplied, a dynamic linker at
the $path/lib/ld-linux.so.2 location should also be the default.
Using the default system /lib/ld-linux.so.2 when a user has built gcc with the
--with-sysroot configure option makes it impossible to install a new gcc
and glibc under a non-default location under $path without having to add the
'-Wl,-dynamic-linker,$path/lib/ld-linux.so.2' option to every build, thus
defeating the purpose of --with-sysroot IMHO - one could simply append
the '-I$path/include -L$path/lib -B$path/lib
-Wl,-dynamic-linker,$path/lib/ld-linux.so.2' options to every build,
and get the same effect without building gcc with --with-sysroot.
But when one wants to test software against a new gcc+glibc combination
installed in a non-default location, not having to change the options used
to compile the software under test is a major advantage, and is only made
possible by gcc supplying the correct dynamic linker argument by default.
So, please, consider fixing this issue. Thanks!
--
Summary: --with-sysroot does not change default linux glibc
dynamic-linker path
Product: gcc
Version: unknown
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: bootstrap
AssignedTo: unassigned at gcc dot gnu dot org
ReportedBy: jason dot vas dot dias at gmail dot com
GCC build triplet: i386-linux-gnu
GCC host triplet: i386-linux-gnu
GCC target triplet: i386-linux-gnu
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=34257