Merge pull request #639 from stilor/tweak-gcc-movelibs

When moving gcc libs, prefer the same directory as libc
This commit is contained in:
Alexey Neyman 2017-03-19 00:34:51 -07:00 committed by GitHub
commit 89f0971391
20 changed files with 737 additions and 105 deletions

View File

@ -15,15 +15,30 @@ config GDB_GDBSERVER_HAS_IPA_LIB
depends on GDB_7_2_or_later
default y
# gdbserver is then linked with "-static -Wl,--dynamic-list=..." which
config GDB_GDBSERVER_STATIC
bool
prompt "Build a static gdbserver"
depends on CONFIGURE_has_static_link
default y
depends on EXPERIMENTAL
help
In case you have trouble with dynamic loading of shared libraries,
you will find that a static gdbserver comes in handy.
However, it has been noticed at least on x86 that enabling this
option produces an invalid gdbserver binary. It is linked with
"-static -Wl,--dynamic-list=..." which
# (a) requests invalid program interpreter
# (b) crashes glibc/uClibc-ng and does not work with musl
# See https://sourceware.org/ml/libc-alpha/2017-03/msg00267.html
It is possible it would work with other architectures, hence it is
not completely removed. Use with care and report to the mailing list
if the resulting gdbserver works.
For further details, see:
https://sourceware.org/bugzilla/show_bug.cgi?id=19617
https://sourceware.org/bugzilla/show_bug.cgi?id=21086
config GDB_GDBSERVER_BUILD_IPA_LIB
bool
prompt "Build the IPA library"

View File

@ -15,9 +15,24 @@ if GDB_NATIVE
config GDB_NATIVE_STATIC
bool
prompt "Build a static native gdb"
depends on CONFIGURE_has_static_link
depends on EXPERIMENTAL
help
In case you have trouble with dynamic loading of shared libraries,
you will find that a static gdb comes in handy.
However, it has been noticed at least on x86 that enabling this
option produces an invalid gdb binary. It is linked with
"-static -Wl,--dynamic-list=..." which
# (a) requests invalid program interpreter
# (b) crashes glibc/uClibc-ng and does not work with musl
# See https://sourceware.org/ml/libc-alpha/2017-03/msg00267.html
It is possible it would work with other architectures, hence it is
not completely removed. Use with care and report to the mailing list
if the resulting gdbserver works.
For further details, see:
https://sourceware.org/bugzilla/show_bug.cgi?id=19617
https://sourceware.org/bugzilla/show_bug.cgi?id=21086
endif # GDB_NATIVE

View File

@ -51,6 +51,29 @@ config MULTILIB
NOTE: The multilib feature in crosstool-NG is not well-tested.
Use at your own risk, and report success and/or failure.
config DEMULTILIB
bool "Attempt to combine libraries into a single directory"
default y if !MULTILIB
depends on !MULTILIB || EXPERIMENTAL
help
Normally, Crosstool-NG installs the libraries into the directories
as the configure for these libraries determines appropriate. For
example, for AArch64 glibc wants to install the libraries into
/lib64 but the default dynamic linker path is /lib/ld-linux-aarch64.so.1
(which is installed as a symlink to ../lib64/ld-VER.so).
However, not all consumers of the toolchain can handle the libraries
residing in multiple directories. To appease them, crosstool-NG can
attempt to combine the libraries back into a single /lib directory and
create all other directories as symlinks to /lib. This requires all
the library names to be unique within each sysroot.
Note that GCC may also use separate sysroots for different multilibs.
Hence it may make sense to enable this option even for multilib toolchains.
However, separate roots are rare (any other architecture aside from
SuperH using them?) and hence not well tested in crosstool-NG; therefore,
this option is experimental when MULTILIB is enabled.
#--------------------------------------
config ARCH_SUPPORTS_BOTH_MMU
bool

View File

@ -0,0 +1,42 @@
From 1b967f3cb0682dd05128ef13495c2dca2a04dc4e Mon Sep 17 00:00:00 2001
From: Alexey Neyman <stilor@att.net>
Date: Sat, 11 Mar 2017 17:27:09 -0800
Subject: [PATCH] Fix library paths on PowerPC
First, need to match against just the CPU name, not the whole triplet.
Otherwise, the test picks up "*le-*" pattern from x86_64-apple-darwin
triplet.
Second, it should be testing for $target, not $host. Host may be
little endian by default, and the sysroot directory layout shouldn't
depend on whether it is built on LE or BE machine.
Signed-off-by: Alexey Neyman <stilor@att.net>
---
ld/emulparams/elf32ppccommon.sh | 10 +++++-----
1 file changed, 5 insertions(+), 5 deletions(-)
diff --git a/ld/emulparams/elf32ppccommon.sh b/ld/emulparams/elf32ppccommon.sh
index 1f54ef8..d00cf68 100644
--- a/ld/emulparams/elf32ppccommon.sh
+++ b/ld/emulparams/elf32ppccommon.sh
@@ -44,11 +44,11 @@ fi
# Look for 64 bit target libraries in /lib64, /usr/lib64 etc., first.
# Similarly, look for 32 bit libraries in /lib32, /usr/lib32 etc.
-case "$host":"$EMULATION_NAME" in
- *le-*:*64lppc*) LIBPATH_SUFFIX=64 ;;
- *le-*:*32lppc*) LIBPATH_SUFFIX=32 ;;
- *le-*:*64*) LIBPATH_SUFFIX=64be ;;
- *le-*:*32*) LIBPATH_SUFFIX=32be ;;
+case `echo "$target" | sed -e 's/-.*//'`:"$EMULATION_NAME" in
+ *le:*64lppc*) LIBPATH_SUFFIX=64 ;;
+ *le:*32lppc*) LIBPATH_SUFFIX=32 ;;
+ *le:*64*) LIBPATH_SUFFIX=64be ;;
+ *le:*32*) LIBPATH_SUFFIX=32be ;;
*:*64lppc*) LIBPATH_SUFFIX=64le ;;
*:*32lppc*) LIBPATH_SUFFIX=32le ;;
*:*64*) LIBPATH_SUFFIX=64 ;;
--
2.9.3

View File

@ -0,0 +1,42 @@
From 1b967f3cb0682dd05128ef13495c2dca2a04dc4e Mon Sep 17 00:00:00 2001
From: Alexey Neyman <stilor@att.net>
Date: Sat, 11 Mar 2017 17:27:09 -0800
Subject: [PATCH] Fix library paths on PowerPC
First, need to match against just the CPU name, not the whole triplet.
Otherwise, the test picks up "*le-*" pattern from x86_64-apple-darwin
triplet.
Second, it should be testing for $target, not $host. Host may be
little endian by default, and the sysroot directory layout shouldn't
depend on whether it is built on LE or BE machine.
Signed-off-by: Alexey Neyman <stilor@att.net>
---
ld/emulparams/elf32ppccommon.sh | 10 +++++-----
1 file changed, 5 insertions(+), 5 deletions(-)
diff --git a/ld/emulparams/elf32ppccommon.sh b/ld/emulparams/elf32ppccommon.sh
index 1f54ef8..d00cf68 100644
--- a/ld/emulparams/elf32ppccommon.sh
+++ b/ld/emulparams/elf32ppccommon.sh
@@ -44,11 +44,11 @@ fi
# Look for 64 bit target libraries in /lib64, /usr/lib64 etc., first.
# Similarly, look for 32 bit libraries in /lib32, /usr/lib32 etc.
-case "$host":"$EMULATION_NAME" in
- *le-*:*64lppc*) LIBPATH_SUFFIX=64 ;;
- *le-*:*32lppc*) LIBPATH_SUFFIX=32 ;;
- *le-*:*64*) LIBPATH_SUFFIX=64be ;;
- *le-*:*32*) LIBPATH_SUFFIX=32be ;;
+case `echo "$target" | sed -e 's/-.*//'`:"$EMULATION_NAME" in
+ *le:*64lppc*) LIBPATH_SUFFIX=64 ;;
+ *le:*32lppc*) LIBPATH_SUFFIX=32 ;;
+ *le:*64*) LIBPATH_SUFFIX=64be ;;
+ *le:*32*) LIBPATH_SUFFIX=32be ;;
*:*64lppc*) LIBPATH_SUFFIX=64le ;;
*:*32lppc*) LIBPATH_SUFFIX=32le ;;
*:*64*) LIBPATH_SUFFIX=64 ;;
--
2.9.3

View File

@ -0,0 +1,42 @@
From 1b967f3cb0682dd05128ef13495c2dca2a04dc4e Mon Sep 17 00:00:00 2001
From: Alexey Neyman <stilor@att.net>
Date: Sat, 11 Mar 2017 17:27:09 -0800
Subject: [PATCH] Fix library paths on PowerPC
First, need to match against just the CPU name, not the whole triplet.
Otherwise, the test picks up "*le-*" pattern from x86_64-apple-darwin
triplet.
Second, it should be testing for $target, not $host. Host may be
little endian by default, and the sysroot directory layout shouldn't
depend on whether it is built on LE or BE machine.
Signed-off-by: Alexey Neyman <stilor@att.net>
---
ld/emulparams/elf32ppccommon.sh | 10 +++++-----
1 file changed, 5 insertions(+), 5 deletions(-)
diff --git a/ld/emulparams/elf32ppccommon.sh b/ld/emulparams/elf32ppccommon.sh
index 1f54ef8..d00cf68 100644
--- a/ld/emulparams/elf32ppccommon.sh
+++ b/ld/emulparams/elf32ppccommon.sh
@@ -44,11 +44,11 @@ fi
# Look for 64 bit target libraries in /lib64, /usr/lib64 etc., first.
# Similarly, look for 32 bit libraries in /lib32, /usr/lib32 etc.
-case "$host":"$EMULATION_NAME" in
- *le-*:*64lppc*) LIBPATH_SUFFIX=64 ;;
- *le-*:*32lppc*) LIBPATH_SUFFIX=32 ;;
- *le-*:*64*) LIBPATH_SUFFIX=64be ;;
- *le-*:*32*) LIBPATH_SUFFIX=32be ;;
+case `echo "$target" | sed -e 's/-.*//'`:"$EMULATION_NAME" in
+ *le:*64lppc*) LIBPATH_SUFFIX=64 ;;
+ *le:*32lppc*) LIBPATH_SUFFIX=32 ;;
+ *le:*64*) LIBPATH_SUFFIX=64be ;;
+ *le:*32*) LIBPATH_SUFFIX=32be ;;
*:*64lppc*) LIBPATH_SUFFIX=64le ;;
*:*32lppc*) LIBPATH_SUFFIX=32le ;;
*:*64*) LIBPATH_SUFFIX=64 ;;
--
2.9.3

View File

@ -0,0 +1,42 @@
From 1b967f3cb0682dd05128ef13495c2dca2a04dc4e Mon Sep 17 00:00:00 2001
From: Alexey Neyman <stilor@att.net>
Date: Sat, 11 Mar 2017 17:27:09 -0800
Subject: [PATCH] Fix library paths on PowerPC
First, need to match against just the CPU name, not the whole triplet.
Otherwise, the test picks up "*le-*" pattern from x86_64-apple-darwin
triplet.
Second, it should be testing for $target, not $host. Host may be
little endian by default, and the sysroot directory layout shouldn't
depend on whether it is built on LE or BE machine.
Signed-off-by: Alexey Neyman <stilor@att.net>
---
ld/emulparams/elf32ppccommon.sh | 10 +++++-----
1 file changed, 5 insertions(+), 5 deletions(-)
diff --git a/ld/emulparams/elf32ppccommon.sh b/ld/emulparams/elf32ppccommon.sh
index 1f54ef8..d00cf68 100644
--- a/ld/emulparams/elf32ppccommon.sh
+++ b/ld/emulparams/elf32ppccommon.sh
@@ -44,11 +44,11 @@ fi
# Look for 64 bit target libraries in /lib64, /usr/lib64 etc., first.
# Similarly, look for 32 bit libraries in /lib32, /usr/lib32 etc.
-case "$host":"$EMULATION_NAME" in
- *le-*:*64lppc*) LIBPATH_SUFFIX=64 ;;
- *le-*:*32lppc*) LIBPATH_SUFFIX=32 ;;
- *le-*:*64*) LIBPATH_SUFFIX=64be ;;
- *le-*:*32*) LIBPATH_SUFFIX=32be ;;
+case `echo "$target" | sed -e 's/-.*//'`:"$EMULATION_NAME" in
+ *le:*64lppc*) LIBPATH_SUFFIX=64 ;;
+ *le:*32lppc*) LIBPATH_SUFFIX=32 ;;
+ *le:*64*) LIBPATH_SUFFIX=64be ;;
+ *le:*32*) LIBPATH_SUFFIX=32be ;;
*:*64lppc*) LIBPATH_SUFFIX=64le ;;
*:*32lppc*) LIBPATH_SUFFIX=32le ;;
*:*64*) LIBPATH_SUFFIX=64 ;;
--
2.9.3

View File

@ -0,0 +1,42 @@
From 1b967f3cb0682dd05128ef13495c2dca2a04dc4e Mon Sep 17 00:00:00 2001
From: Alexey Neyman <stilor@att.net>
Date: Sat, 11 Mar 2017 17:27:09 -0800
Subject: [PATCH] Fix library paths on PowerPC
First, need to match against just the CPU name, not the whole triplet.
Otherwise, the test picks up "*le-*" pattern from x86_64-apple-darwin
triplet.
Second, it should be testing for $target, not $host. Host may be
little endian by default, and the sysroot directory layout shouldn't
depend on whether it is built on LE or BE machine.
Signed-off-by: Alexey Neyman <stilor@att.net>
---
ld/emulparams/elf32ppccommon.sh | 10 +++++-----
1 file changed, 5 insertions(+), 5 deletions(-)
diff --git a/ld/emulparams/elf32ppccommon.sh b/ld/emulparams/elf32ppccommon.sh
index 1f54ef8..d00cf68 100644
--- a/ld/emulparams/elf32ppccommon.sh
+++ b/ld/emulparams/elf32ppccommon.sh
@@ -44,11 +44,11 @@ fi
# Look for 64 bit target libraries in /lib64, /usr/lib64 etc., first.
# Similarly, look for 32 bit libraries in /lib32, /usr/lib32 etc.
-case "$host":"$EMULATION_NAME" in
- *le-*:*64lppc*) LIBPATH_SUFFIX=64 ;;
- *le-*:*32lppc*) LIBPATH_SUFFIX=32 ;;
- *le-*:*64*) LIBPATH_SUFFIX=64be ;;
- *le-*:*32*) LIBPATH_SUFFIX=32be ;;
+case `echo "$target" | sed -e 's/-.*//'`:"$EMULATION_NAME" in
+ *le:*64lppc*) LIBPATH_SUFFIX=64 ;;
+ *le:*32lppc*) LIBPATH_SUFFIX=32 ;;
+ *le:*64*) LIBPATH_SUFFIX=64be ;;
+ *le:*32*) LIBPATH_SUFFIX=32be ;;
*:*64lppc*) LIBPATH_SUFFIX=64le ;;
*:*32lppc*) LIBPATH_SUFFIX=32le ;;
*:*64*) LIBPATH_SUFFIX=64 ;;
--
2.9.3

View File

@ -0,0 +1,46 @@
diff -urpN uClibc-ng-1.0.22.orig/ldso/ldso/dl-elf.c uClibc-ng-1.0.22/ldso/ldso/dl-elf.c
--- uClibc-ng-1.0.22.orig/ldso/ldso/dl-elf.c 2017-03-14 12:17:57.754063532 -0700
+++ uClibc-ng-1.0.22/ldso/ldso/dl-elf.c 2017-03-14 17:14:21.846398236 -0700
@@ -307,6 +307,19 @@ struct elf_resolve *_dl_load_shared_libr
}
}
#endif
+
+#ifdef LDSO_MULTILIB_DIR
+ /* If multilib directory is selected, search it before falling back to
+ standard lib directories. */
+ _dl_if_debug_dprint("\tsearching multilib lib path list\n");
+ tpnt1 = search_for_named_library(libname, rflags,
+ UCLIBC_RUNTIME_PREFIX LDSO_MULTILIB_DIR ":"
+ UCLIBC_RUNTIME_PREFIX "usr" LDSO_MULTILIB_DIR,
+ rpnt, NULL);
+ if (tpnt1 != NULL)
+ return tpnt1;
+#endif
+
#if defined SHARED && defined __LDSO_SEARCH_INTERP_PATH__
/* Look for libraries wherever the shared library loader
* was installed */
@@ -315,6 +328,7 @@ struct elf_resolve *_dl_load_shared_libr
if (tpnt1 != NULL)
return tpnt1;
#endif
+
/* Lastly, search the standard list of paths for the library.
This list must exactly match the list in uClibc/ldso/util/ldd.c */
_dl_if_debug_dprint("\tsearching full lib path list\n");
diff -urpN uClibc-ng-1.0.22.orig/ldso/ldso/Makefile.in uClibc-ng-1.0.22/ldso/ldso/Makefile.in
--- uClibc-ng-1.0.22.orig/ldso/ldso/Makefile.in 2017-03-14 12:17:57.754063532 -0700
+++ uClibc-ng-1.0.22/ldso/ldso/Makefile.in 2017-03-14 15:35:35.277104175 -0700
@@ -34,6 +34,11 @@ CFLAGS-$(DODEBUG)-ldso/ldso := -O2 -g
CFLAGS-ldso.c := -DLDSO_ELFINTERP=\"$(TARGET_ARCH)/elfinterp.c\"
+# Search non-default multilib directories
+ifneq ($(MULTILIB_DIR),lib)
+CFLAGS-ldso.c += -DLDSO_MULTILIB_DIR=\"$(MULTILIB_DIR)\"
+endif
+
ifeq ($(TARGET_ARCH),arc)
CFLAGS-ldso.c += -mno-long-calls
endif

View File

@ -0,0 +1,46 @@
diff -urpN uClibc-ng-1.0.22.orig/ldso/ldso/dl-elf.c uClibc-ng-1.0.22/ldso/ldso/dl-elf.c
--- uClibc-ng-1.0.22.orig/ldso/ldso/dl-elf.c 2017-03-14 12:17:57.754063532 -0700
+++ uClibc-ng-1.0.22/ldso/ldso/dl-elf.c 2017-03-14 17:14:21.846398236 -0700
@@ -307,6 +307,19 @@ struct elf_resolve *_dl_load_shared_libr
}
}
#endif
+
+#ifdef LDSO_MULTILIB_DIR
+ /* If multilib directory is selected, search it before falling back to
+ standard lib directories. */
+ _dl_if_debug_dprint("\tsearching multilib lib path list\n");
+ tpnt1 = search_for_named_library(libname, rflags,
+ UCLIBC_RUNTIME_PREFIX LDSO_MULTILIB_DIR ":"
+ UCLIBC_RUNTIME_PREFIX "usr" LDSO_MULTILIB_DIR,
+ rpnt, NULL);
+ if (tpnt1 != NULL)
+ return tpnt1;
+#endif
+
#if defined SHARED && defined __LDSO_SEARCH_INTERP_PATH__
/* Look for libraries wherever the shared library loader
* was installed */
@@ -315,6 +328,7 @@ struct elf_resolve *_dl_load_shared_libr
if (tpnt1 != NULL)
return tpnt1;
#endif
+
/* Lastly, search the standard list of paths for the library.
This list must exactly match the list in uClibc/ldso/util/ldd.c */
_dl_if_debug_dprint("\tsearching full lib path list\n");
diff -urpN uClibc-ng-1.0.22.orig/ldso/ldso/Makefile.in uClibc-ng-1.0.22/ldso/ldso/Makefile.in
--- uClibc-ng-1.0.22.orig/ldso/ldso/Makefile.in 2017-03-14 12:17:57.754063532 -0700
+++ uClibc-ng-1.0.22/ldso/ldso/Makefile.in 2017-03-14 15:35:35.277104175 -0700
@@ -34,6 +34,11 @@ CFLAGS-$(DODEBUG)-ldso/ldso := -O2 -g
CFLAGS-ldso.c := -DLDSO_ELFINTERP=\"$(TARGET_ARCH)/elfinterp.c\"
+# Search non-default multilib directories
+ifneq ($(MULTILIB_DIR),lib)
+CFLAGS-ldso.c += -DLDSO_MULTILIB_DIR=\"$(MULTILIB_DIR)\"
+endif
+
ifeq ($(TARGET_ARCH),arc)
CFLAGS-ldso.c += -mno-long-calls
endif

View File

@ -0,0 +1,46 @@
diff -urpN uClibc-ng-1.0.22.orig/ldso/ldso/dl-elf.c uClibc-ng-1.0.22/ldso/ldso/dl-elf.c
--- uClibc-ng-1.0.22.orig/ldso/ldso/dl-elf.c 2017-03-14 12:17:57.754063532 -0700
+++ uClibc-ng-1.0.22/ldso/ldso/dl-elf.c 2017-03-14 17:14:21.846398236 -0700
@@ -307,6 +307,19 @@ struct elf_resolve *_dl_load_shared_libr
}
}
#endif
+
+#ifdef LDSO_MULTILIB_DIR
+ /* If multilib directory is selected, search it before falling back to
+ standard lib directories. */
+ _dl_if_debug_dprint("\tsearching multilib lib path list\n");
+ tpnt1 = search_for_named_library(libname, rflags,
+ UCLIBC_RUNTIME_PREFIX LDSO_MULTILIB_DIR ":"
+ UCLIBC_RUNTIME_PREFIX "usr" LDSO_MULTILIB_DIR,
+ rpnt, NULL);
+ if (tpnt1 != NULL)
+ return tpnt1;
+#endif
+
#if defined SHARED && defined __LDSO_SEARCH_INTERP_PATH__
/* Look for libraries wherever the shared library loader
* was installed */
@@ -315,6 +328,7 @@ struct elf_resolve *_dl_load_shared_libr
if (tpnt1 != NULL)
return tpnt1;
#endif
+
/* Lastly, search the standard list of paths for the library.
This list must exactly match the list in uClibc/ldso/util/ldd.c */
_dl_if_debug_dprint("\tsearching full lib path list\n");
diff -urpN uClibc-ng-1.0.22.orig/ldso/ldso/Makefile.in uClibc-ng-1.0.22/ldso/ldso/Makefile.in
--- uClibc-ng-1.0.22.orig/ldso/ldso/Makefile.in 2017-03-14 12:17:57.754063532 -0700
+++ uClibc-ng-1.0.22/ldso/ldso/Makefile.in 2017-03-14 15:35:35.277104175 -0700
@@ -34,6 +34,11 @@ CFLAGS-$(DODEBUG)-ldso/ldso := -O2 -g
CFLAGS-ldso.c := -DLDSO_ELFINTERP=\"$(TARGET_ARCH)/elfinterp.c\"
+# Search non-default multilib directories
+ifneq ($(MULTILIB_DIR),lib)
+CFLAGS-ldso.c += -DLDSO_MULTILIB_DIR=\"$(MULTILIB_DIR)\"
+endif
+
ifeq ($(TARGET_ARCH),arc)
CFLAGS-ldso.c += -mno-long-calls
endif

View File

@ -0,0 +1,38 @@
diff -urpN uClibc-0.9.33.2.orig/ldso/ldso/dl-elf.c uClibc-0.9.33.2/ldso/ldso/dl-elf.c
--- uClibc-0.9.33.2.orig/ldso/ldso/dl-elf.c 2017-03-14 23:40:57.527113741 -0700
+++ uClibc-0.9.33.2/ldso/ldso/dl-elf.c 2017-03-14 23:42:19.308005691 -0700
@@ -284,6 +284,19 @@ struct elf_resolve *_dl_load_shared_libr
}
}
#endif
+
+#ifdef LDSO_MULTILIB_DIR
+ /* If multilib directory is selected, search it before falling back to
+ standard lib directories. */
+ _dl_if_debug_dprint("\tsearching multilib lib path list\n");
+ tpnt1 = search_for_named_library(libname, rflags,
+ UCLIBC_RUNTIME_PREFIX LDSO_MULTILIB_DIR ":"
+ UCLIBC_RUNTIME_PREFIX "usr" LDSO_MULTILIB_DIR,
+ rpnt);
+ if (tpnt1 != NULL)
+ return tpnt1;
+#endif
+
#if defined SHARED && defined __LDSO_SEARCH_INTERP_PATH__
/* Look for libraries wherever the shared library loader
* was installed */
diff -urpN uClibc-0.9.33.2.orig/ldso/ldso/Makefile.in uClibc-0.9.33.2/ldso/ldso/Makefile.in
--- uClibc-0.9.33.2.orig/ldso/ldso/Makefile.in 2017-03-14 23:40:57.527113741 -0700
+++ uClibc-0.9.33.2/ldso/ldso/Makefile.in 2017-03-14 23:41:45.215634328 -0700
@@ -30,6 +30,11 @@ CFLAGS-ldso/ldso/$(TARGET_ARCH)/ := $(CF
CFLAGS-ldso.c := -DLDSO_ELFINTERP=\"$(TARGET_ARCH)/elfinterp.c\" $(CFLAGS-ldso)
+# Search non-default multilib directories
+ifneq ($(MULTILIB_DIR),lib)
+CFLAGS-ldso.c += -DLDSO_MULTILIB_DIR=\"$(MULTILIB_DIR)\"
+endif
+
LDFLAGS-$(UCLIBC_FORMAT_DSBT_ELF)-$(UCLIBC_LDSO_NAME).so := -Wl,--dsbt-index=1
ifneq ($(SUPPORT_LD_DEBUG),y)
LDFLAGS-$(UCLIBC_LDSO_NAME).so := $(LDFLAGS)

View File

@ -1,8 +1,9 @@
CT_ARCH_FLOAT_SW=y
CT_ARCH_arm=y
CT_MULTILIB=y
CT_ARCH_FLOAT_SW=y
CT_TARGET_VENDOR="multilib"
CT_KERNEL_linux=y
# CT_SHARED_LIBS is not set
CT_BINUTILS_LINKER_LD_GOLD=y
CT_BINUTILS_GOLD_THREADS=y
CT_BINUTILS_LD_WRAPPER=y

View File

@ -129,6 +129,40 @@ cc_gcc_classify_opt() {
echo "unknown"
}
evaluate_multilib_cflags()
{
local multi_dir multi_os_dir multi_os_dir_gcc multi_root multi_flags multi_index multi_count
local mdir mdir_os dirtop
local f
for arg in "$@"; do
eval "${arg// /\\ }"
done
mdir="lib/${multi_dir}"
mdir_os="lib/${multi_os_dir_gcc}"
CT_SanitizeVarDir mdir mdir_os
CT_DoLog EXTRA " '${multi_flags}' --> ${mdir} (gcc) ${mdir_os} (os)"
for f in ${multi_flags}; do
eval ml_`cc_gcc_classify_opt ${f}`=seen
done
if [ "${CT_DEMULTILIB}" = "y" ]; then
case "${mdir_os}" in
lib/*)
;;
*)
dirtop="${mdir_os%%/*}"
if [ ! -e "${multi_root}/${mdir_os}" ]; then
CT_DoExecLog ALL ln -sfv lib "${multi_root}/${mdir_os}"
fi
if [ ! -e "${multi_root}/usr/${mdir_os}" ]; then
CT_DoExecLog ALL ln -sfv lib "${multi_root}/usr/${mdir_os}"
fi
;;
esac
fi
}
#------------------------------------------------------------------------------
# This function lists the multilibs configured in the compiler (even if multilib
# is disabled - so that it lists the default GCC/OS directory, which may differ
@ -151,9 +185,11 @@ cc_gcc_classify_opt() {
# work, but 'gcc -mabi=32 -mabi=n32' produces an internal error in ld. Thus we do
# not supply target's CFLAGS in multilib builds - and after compiling pass-1 gcc,
# attempt to determine which CFLAGS need to be filtered out.
#
# 3. If "demultilibing" is in effect, create top-level directories for any
# multilibs not in lib/ as symlinks to lib.
cc_gcc_multilib_housekeeping() {
local cc host
local flags osdir dir multilibs i f
local multilib_defaults
local suffix sysroot base lnk
local ml_arch ml_abi ml_cpu ml_tune ml_fpu ml_float ml_endian ml_mode ml_unknown ml
@ -175,25 +211,7 @@ cc_gcc_multilib_housekeeping() {
multilib_defaults=( $( cc_gcc_get_spec multilib_defaults "${cc}" | \
sed 's/\(^\|[[:space:]]\+\)\([^[:space:]]\)/ -\2/g' ) )
CT_DoLog EXTRA "gcc default flags: '${multilib_defaults}'"
multilibs=( $( "${cc}" -print-multi-lib ) )
if [ ${#multilibs[@]} -ne 0 ]; then
CT_DoLog EXTRA "gcc configured with these multilibs (including the default):"
for i in "${multilibs[@]}"; do
dir="lib/${i%%;*}"
flags="${i#*;}"
flags=${flags//@/ -}
flags=$( echo ${flags} )
osdir="lib/"$( "${cc}" -print-multi-os-directory ${flags} )
CT_SanitizeVarDir dir osdir
CT_DoLog EXTRA " '${flags}' --> ${dir} (gcc) ${osdir} (os)"
for f in ${flags}; do
eval ml_`cc_gcc_classify_opt ${f}`=seen
done
done
else
CT_DoLog WARN "no multilib configuration: GCC unusable?"
fi
CT_IterateMultilibs evaluate_multilib_cflags evaluate_cflags
# Filtering out some of the options provided in CT-NG config. Then *prepend*
# them to CT_TARGET_CFLAGS, like scripts/crosstool-NG.sh does. Zero out
@ -789,8 +807,8 @@ do_gcc_for_build() {
}
gcc_movelibs() {
local multi_flags multi_dir multi_os_dir multi_root multi_index multi_count
local gcc_dir
local multi_flags multi_dir multi_os_dir multi_os_dir_gcc multi_root multi_index multi_count
local gcc_dir dst_dir
for arg in "$@"; do
eval "${arg// /\\ }"
@ -803,6 +821,15 @@ gcc_movelibs() {
# GCC didn't install anything outside of sysroot
return
fi
# Depending on the selected libc, we may or may not have the ${multi_os_dir_gcc}
# created by libc installation. If we do, use it. If we don't, use ${multi_os_dir}
# to avoid creating an otherwise empty directory.
dst_dir="${multi_root}/lib/${multi_os_dir_gcc}"
if [ ! -d "${dst_dir}" ]; then
dst_dir="${multi_root}/lib/${multi_os_dir}"
fi
CT_SanitizeVarDir dst_dir gcc_dir
ls "${gcc_dir}" | while read f; do
case "${f}" in
*.ld)
@ -812,8 +839,8 @@ gcc_movelibs() {
;;
esac
if [ -f "${gcc_dir}/${f}" ]; then
CT_DoExecLog ALL mkdir -p "${multi_root}/lib/${multi_os_dir}"
CT_DoExecLog ALL mv "${gcc_dir}/${f}" "${multi_root}/lib/${multi_os_dir}/${f}"
CT_DoExecLog ALL mkdir -p "${dst_dir}"
CT_DoExecLog ALL mv "${gcc_dir}/${f}" "${dst_dir}/${f}"
fi
done
}

View File

@ -1,5 +1,27 @@
# This file contains crosstool-NG internal steps
create_ldso_conf()
{
local multi_dir multi_os_dir multi_os_dir_gcc multi_root multi_flags multi_index multi_count multi_target
local b d
for arg in "$@"; do
eval "${arg// /\\ }"
done
CT_DoExecLog ALL mkdir -p "${multi_root}/etc"
for b in /lib /usr/lib /usr/local/lib; do
d="${b}/${multi_os_dir}"
CT_SanitizeVarDir d
echo "${d}" >> "${multi_root}/etc/ld.so.conf"
if [ "${multi_os_dir}" != "${multi_os_dir_gcc}" ]; then
d="${b}/${multi_os_dir_gcc}"
CT_SanitizeVarDir d
echo "${d}" >> "${multi_root}/etc/ld.so.conf"
fi
done
}
# This step is called once all components were built, to remove
# un-wanted files, to add tuple aliases, and to add the final
# crosstool-NG-provided files.
@ -10,7 +32,14 @@ do_finish() {
local gcc_version
local exe_suffix
CT_DoStep INFO "Cleaning-up the toolchain's directory"
CT_DoStep INFO "Finalizing the toolchain's directory"
if [ "${CT_SHARED_LIBS}" = "y" ]; then
# Create /etc/ld.so.conf
CT_mkdir_pushd "${CT_BUILD_DIR}/build-create-ldso"
CT_IterateMultilibs create_ldso_conf create-ldso
CT_Popd
fi
if [ "${CT_STRIP_HOST_TOOLCHAIN_EXECUTABLES}" = "y" ]; then
case "$CT_HOST" in
@ -103,25 +132,8 @@ do_finish() {
# Create the aliases to the target tools
CT_DoLog EXTRA "Creating toolchain aliases"
CT_Pushd "${CT_PREFIX_DIR}/bin"
for t in "${CT_TARGET}-"*; do
if [ -n "${CT_TARGET_ALIAS}" ]; then
_t=$(echo "$t" |sed -r -e 's/^'"${CT_TARGET}"'-/'"${CT_TARGET_ALIAS}"'-/;')
CT_DoExecLog ALL ln -sfv "${t}" "${_t}"
fi
if [ -n "${CT_TARGET_ALIAS_SED_EXPR}" ]; then
_t=$(echo "$t" |sed -r -e "${CT_TARGET_ALIAS_SED_EXPR}")
if [ "${_t}" = "${t}" ]; then
CT_DoLog WARN "The sed expression '${CT_TARGET_ALIAS_SED_EXPR}' has no effect on '${t}'"
else
CT_DoExecLog ALL ln -sfv "${t}" "${_t}"
fi
fi
done
CT_Popd
CT_DoLog EXTRA "Removing access to the build system tools"
CT_DoExecLog DEBUG rm -rf "${CT_PREFIX_DIR}/buildtools"
CT_SymlinkTools "${CT_PREFIX_DIR}/bin" "${CT_PREFIX_DIR}/bin" \
"${CT_TARGET_ALIAS}" "${CT_TARGET_ALIAS_SED_EXPR}"
# Remove the generated documentation files
if [ "${CT_REMOVE_DOCS}" = "y" ]; then

View File

@ -297,6 +297,8 @@ do_libc_backend_once() {
# or even after they get installed...
echo "ac_cv_path_BASH_SHELL=/bin/bash" >>config.cache
CT_SymlinkToolsMultilib
# Configure with --prefix the way we want it on the target...
# There are a whole lot of settings here. You'll probably want
# to read up on what they all mean, and customize a bit, possibly

View File

@ -29,7 +29,9 @@ do_libc() {
}
do_libc_post_cc() {
:
# MUSL creates dynamic linker symlink with absolute path - which works on the
# target but not on the host. We want our cross-ldd tool to work.
CT_MultilibFixupLDSO
}
do_libc_backend() {
@ -102,6 +104,8 @@ do_libc_backend_once() {
extra_config+=( "--includedir=/usr/include/${hdr_install_subdir}" )
fi
CT_SymlinkToolsMultilib
# NOTE: musl handles the build/host/target a little bit differently
# then one would expect:
# build : not used

View File

@ -453,51 +453,5 @@ do_libc_post_cc() {
# file in /lib. Thus, need to do this after all the variants are built.
# Moreover, need to do this after the final compiler is built: on targets
# that use elf2flt, the core compilers cannot find ld when running elf2flt.
CT_DoStep INFO "Checking dynamic linker symlinks"
CT_mkdir_pushd "${CT_BUILD_DIR}/build-libc-post_cc"
echo "int main(void) { return 0; }" > test-ldso.c
CT_IterateMultilibs do_libc_ldso_fixup ldso_fixup
CT_Popd
CT_EndStep
}
do_libc_ldso_fixup() {
local multi_dir multi_os_dir multi_root multi_flags multi_index multi_count
local binary
local ldso ldso_f ldso_d multilib_dir
for arg in "$@"; do
eval "${arg// /\\ }"
done
CT_DoLog EXTRA "Checking dynamic linker for multilib '${multi_flags}'"
multilib_dir="/lib/${multi_os_dir}"
CT_SanitizeVarDir multilib_dir
CT_DoExecLog ALL "${CT_TARGET}-${CT_CC}" -o test-ldso ../test-ldso.c ${multi_flags}
if [ -r "test-ldso.gdb" ]; then
binary="test-ldso.gdb"
else
binary="test-ldso"
fi
if ${CT_TARGET}-readelf -Wl "${binary}" | grep -q 'Requesting program interpreter: '; then
ldso=$( ${CT_TARGET}-readelf -Wl "${binary}" | \
grep 'Requesting program interpreter: ' | \
sed -e 's,.*: ,,' -e 's,\].*,,' )
fi
CT_DoLog DEBUG "Detected dynamic linker for multilib '${multi_flags}': '${ldso}'"
ldso_d="${ldso%/ld*.so.*}"
ldso_f="${ldso##*/}"
# Create symlink if GCC produced an executable, dynamically linked, it was requesting
# a linker not in the current directory, and there is no such file in the expected
# ldso dir.
if [ -n "${ldso}" -a "${ldso_d}" != "${multilib_dir}" -a ! -r "${multi_root}${ldso}" ]; then
# Convert ldso_d to "how many levels we need to go up" and remove
# leading slash.
ldso_d=$( echo "${ldso_d#/}" | sed 's,[^/]\+,..,g' )
CT_DoExecLog ALL ln -sf "${ldso_d}${multilib_dir}/${ldso_f}" \
"${multi_root}${ldso}"
fi
CT_MultilibFixupLDSO
}

View File

@ -1750,15 +1750,156 @@ CT_IterateMultilibs() {
dir_postfix=_${multi_dir//\//_}
dir_postfix=${dir_postfix%_.}
CT_mkdir_pushd "${prefix}${dir_postfix}"
$func multi_dir="${multi_dir}" \
multi_os_dir="${multi_os_dir}" \
multi_flags="${multi_flags}" \
multi_root="${multi_root}" \
multi_target="${multi_target}" \
multi_index="${multi_index}" \
multi_count="${#multilibs[@]}" \
$func multi_dir="${multi_dir}" \
multi_os_dir="${multi_os_dir}" \
multi_os_dir_gcc="${multi_os_dir_gcc}" \
multi_flags="${multi_flags}" \
multi_root="${multi_root}" \
multi_target="${multi_target}" \
multi_index="${multi_index}" \
multi_count="${#multilibs[@]}" \
"$@"
CT_Popd
multi_index=$((multi_index+1))
done
}
# Create symbolic links in buildtools for binutils using a different
# target name.
# Usage:
# CT_SymlinkTools BIN-DIR SRC-DIR NEW-PREFIX SED-EXPR
CT_SymlinkTools()
{
local bindir="$1"
local srcdir="$2"
local newpfx="$3"
local sedexpr="$4"
local dirpfx
local t _t
# if bindir==srcdir, create symlinks just with the filename
if [ "${bindir}" != "${srcdir}" ]; then
dirpfx="${srcdir}/"
fi
CT_Pushd "${srcdir}"
for t in "${CT_TARGET}-"*; do
if [ -n "${newpfx}" -a "${newpfx}" != "${CT_TARGET}" ]; then
_t="${newpfx}-${t#${CT_TARGET}-}"
CT_DoExecLog ALL ln -sfv "${dirpfx}${t}" "${bindir}/${_t}"
fi
if [ -n "${sedexpr}" ]; then
_t=$( echo "${t}" | sed -r -e "${sedexpr}" )
if [ "${_t}" = "${t}" ]; then
CT_DoLog WARN "The sed expression '${sedexpr}' has no effect on '${t}'"
else
CT_DoExecLog ALL ln -sfv "${dirpfx}${t}" "${bindir}/${_t}"
fi
fi
done
CT_Popd
}
# Create symbolic links for multilib iterator. Expects ${multi_target}
# variable to indicate the desired triplet for the tools.
CT_SymlinkToolsMultilib()
{
# Make configure detect ${target}-tool binaries even if it is different
# from configured tuple. Only symlink to final tools if they're executable
# on build.
CT_SymlinkTools "${CT_BUILDTOOLS_PREFIX_DIR}/bin" \
"${CT_BUILDTOOLS_PREFIX_DIR}/bin" "${multi_target}"
case "${CT_TOOLCHAIN_TYPE}" in
native|cross)
CT_SymlinkTools "${CT_BUILDTOOLS_PREFIX_DIR}/bin" \
"${CT_PREFIX_DIR}/bin" "${multi_target}"
;;
esac
}
# Helper (iterator) for CT_MultilibFixupLDSO
CT__FixupLDSO()
{
local multi_dir multi_os_dir multi_root multi_flags multi_index multi_count multi_target
local binary
local ldso ldso_l ldso_f ldso_d ldso_u multilib_dir
for arg in "$@"; do
eval "${arg// /\\ }"
done
CT_DoLog EXTRA "Checking dynamic linker for multilib '${multi_flags}'"
multilib_dir="/lib/${multi_os_dir}"
CT_SanitizeVarDir multilib_dir
CT_DoExecLog ALL "${CT_TARGET}-${CT_CC}" -o test-ldso ../test-ldso.c ${multi_flags}
if [ -r "test-ldso.gdb" ]; then
binary="test-ldso.gdb"
else
binary="test-ldso"
fi
if ${CT_TARGET}-readelf -Wl "${binary}" | grep -q 'Requesting program interpreter: '; then
ldso=$( ${CT_TARGET}-readelf -Wl "${binary}" | \
grep 'Requesting program interpreter: ' | \
sed -e 's,.*: ,,' -e 's,\].*,,' )
fi
CT_DoLog DEBUG "Detected dynamic linker for multilib '${multi_flags}': '${ldso}'"
# Create symlink if GCC produced a dynamically linked executable.
if [ -z "${ldso}" ]; then
return # Probably, we're building a static toolchain.
fi
ldso_d="${ldso%/ld*.so.*}"
ldso_f="${ldso##*/}"
# Convert ldso_d to "how many levels we need to go up" and remove
# leading slash.
ldso_u=$( echo "${ldso_d#/}" | sed 's,[^/]\+,..,g' )
# If the requested dynamic linker exists, but is a symlink - check that it is either
# relative (in which case, if it is readable, we trust libc to have created it properly)
# or otherwise, convert it from absolute (target) path to a relative path that works on
# both host & target.
if [ -L "${multi_root}${ldso}" ]; then
ldso_l=`readlink "${multi_root}${ldso}"`
case "${ldso_l}" in
/*) # Absolute, convert to relative
if [ -r "${multi_root}${ldso_l}" ]; then
CT_DoExecLog ALL ln -sfv "${ldso_u}${ldso_l}" "${multi_root}${ldso}"
else
CT_DoLog WARN "Compiler selects '${ldso}' as dynamic linker for '${multi_flags}'"
CT_DoLog WARN "but '${ldso}' is a symlink to '${ldso_l}' which is not valid on target."
fi
;;
*) # Relative, must be readable
if [ ! -r "${multi_root}${ldso}" ]; then
CT_DoLog WARN "Compiler selects '${ldso}' as dynamic linker for '${multi_flags}'"
CT_DoLog WARN "but '${ldso}' is a symlink to '${ldso_l}' which is invalid relative symlink."
fi
;;
esac
return
elif [ -r "${multi_root}${ldso}" ]; then
return # Not a symlink but readable - looks like libc installed a real executable.
fi
# Is it requesting a linker not in the current directory? uClibc case.
if [ "${ldso_d}" != "${multilib_dir}" ]; then
CT_DoExecLog ALL ln -sfv "${ldso_u}${multilib_dir}/${ldso_f}" \
"${multi_root}${ldso}"
fi
}
# Go over multilib variants and check that the requested dynamic linker
# is present and resolves on both target and host.
CT_MultilibFixupLDSO()
{
CT_DoStep INFO "Checking dynamic linker symlinks"
CT_mkdir_pushd "${CT_BUILD_DIR}/build-libc-check-ldso"
echo "int main(void) { return 0; }" > test-ldso.c
CT_IterateMultilibs CT__FixupLDSO ldso_fixup
CT_Popd
CT_EndStep
}

View File

@ -16,6 +16,10 @@ fake_load_addr_rpath="$((0xdeadc0de))"
fake_load_addr_sysroot="$((0x8badf00d))"
ld_library_path="/lib:/usr/lib"
need_e_class=
need_e_flags=
need_e_mach=
do_error() {
printf "%s: %s\n" "${my_name}" "$*" >&2
}
@ -200,6 +204,35 @@ do_report_needed_found() {
"${sys}"
}
do_check_compat() {
local file="${1}"
local info e_mach e_class e_flags
if [ ! -r "${file}" ]; then
return 1
fi
info=`${readelf} -Wh "${file}"`
e_class=`echo "${info}" | "${sed}" -nr 's/.*Class:[[:space:]]*//p'`
e_mach=`echo "${info}" | "${sed}" -nr 's/.*Machine:[[:space:]]*//p'`
e_flags=`echo "${info}" | "${sed}" -nr 's/.*Flags:[[:space:]]*//p'`
if [ "${e_class}" != "${need_e_class}" ]; then
do_trace "-> skip incompatible '%s' (class '%s', need '%s')\n" \
"${base}${d}/${needed}" "${e_class}" "${need_e_class}"
return 1
fi
if [ "${e_mach}" != "${need_e_mach}" ]; then
do_trace "-> skip incompatible '%s' (machine '%s', need '%s')\n" \
"${base}${d}/${needed}" "${e_mach}" "${need_e_mach}"
return 1
fi
if [ "${e_flags}" != "${need_e_flags}" ]; then
do_trace "-> skip incompatible '%s' (flags '%s', need '%s')\n" \
"${base}${d}/${needed}" "${e_flags}" "${need_e_flags}"
return 1
fi
return 0
}
# Search a needed file, scanning ${lib_dir} in the root directory
do_find_needed() {
local needed="${1}"
@ -229,7 +262,7 @@ do_find_needed() {
fi
for d in "${dirs[@]}"; do
do_trace "-> looking in '%s' (%s)\n" "${d}" "${where}"
if [ -f "${base}${d}/${needed}" ]; then
if do_check_compat "${base}${d}/${needed}"; then
found="${d}/${needed}"
do_trace "---> found\n"
break 2
@ -250,9 +283,11 @@ do_find_needed() {
# Scan a file for all NEEDED tags
do_process_file() {
local file="${1}"
local initial="${2}"
local -a save_search_rpath
local n m
local found
local info
do_trace "Parsing file '%s'\n" "${file}"
@ -270,6 +305,17 @@ do_process_file() {
done
do_trace ": end search path\n"
if [ -n "${initial}" ]; then
if ! "${readelf}" -Wl "${file}" |
"${grep}" 'Requesting program interpreter: ' >/dev/null; then
printf " not a dynamic executable\n"
exit 1
fi
info=`${readelf} -Wh "${file}"`
need_e_class=`echo "${info}" | "${sed}" -nr 's/.*Class:[[:space:]]*//p'`
need_e_mach=`echo "${info}" | "${sed}" -nr 's/.*Machine:[[:space:]]*//p'`
need_e_flags=`echo "${info}" | "${sed}" -nr 's/.*Flags:[[:space:]]*//p'`
fi
for n in $( "${readelf}" -d "${file}" \
|"${grep}" -E '\(NEEDED\)' \
|"${sed}" -r -e 's/^.*Shared library:[[:space:]]+\[([^]]+)\].*/\1/;' \
@ -324,6 +370,12 @@ do_scan_etc_ldsoconf() {
do_trace "Finished parsing ld.so.conf: '%s'\n" "${ldsoconf}"
}
if [ -z "${1}" ]; then
show_help
elif [ ! -r "${1}" ]; then
do_error "${1}: No such file or directory"
fi
# Build up the full list of search directories
declare -a needed_search_path
do_trace "Adding basic lib dirs\n"
@ -348,5 +400,5 @@ done
declare -a needed_list
declare -a search_rpath
do_trace "Scanning file '%s'\n" "${1}"
do_process_file "${1}"
do_process_file "${1}" initial
do_trace "Done scanning file '%s'\n" "${1}"