I have a question about building a toolchain that uses (at run time) a dynamic linker and system libraries and headers that are in a non-standard place.
I just noticed the IBM --with-advance-toolchain option and I would like to replicate it for aarch64. Let me first describe what I do now: configure/build BINUTILS with --prefix=${X} --with-sysroot=${X} configure/build an initial GCC (all-gcc all-target-libgcc) with --prefix=${X} --with-sysroot=${X} configure/build GLIBC, using that GCC, with --prefix=/usr, followed by install with DESTDIR=${X} configure/build final GCC with --prefix=${X} --with-sysroot=${X} This all works, but if I want my executables to find the shared libraries and dynamic linker from ${X} when they are running, I need to compile things with: -Wl,--rpath=${X}/lib64 -Wl,--dynamic-linker=${X}/lib/ld-linux-aarch64.so.1 I would like these used by default so I took some ideas from --with-advance-toolchain and used that to automatically add these options to LINK_SPEC (see attached patch). I can compile and link a program with this setup, but when I run the program I get: % ./x Inconsistency detected by ld.so: get-dynamic-info.h: 147: elf_get_dynamic_info: Assertion `info[DT_RPATH] == NULL' failed! I am not sure why this doesn't work. Can anyone help me understand why this doesn't work or help me figure out how else I might be able to get the functionality I want. That is: to use shared libraries and a dynamic linker (at run time) that are in a non-standard location without needing to compile or link with special flags. Steve Ellcey sell...@marvell.com Here is the patch I am trying, I use the --with-advance-toolchain option as an absolute pathname instead of relative to /opt like IBM does and I set it to ${X} in a build that otherwise looks like what I describe above. Everything works until I start the final GCC build which is when I get the assertion. diff --git a/gcc/config.gcc b/gcc/config.gcc index 481bc9586a7..0532139b0b1 100644 --- a/gcc/config.gcc +++ b/gcc/config.gcc @@ -3879,7 +3879,7 @@ fi supported_defaults= case "${target}" in aarch64*-*-*) - supported_defaults="abi cpu arch" + supported_defaults="abi cpu arch advance_toolchain" for which in cpu arch; do eval "val=\$with_$which" @@ -3981,6 +3981,23 @@ case "${target}" in exit 1 fi done + if test "x$with_advance_toolchain" != x; then + at=$with_advance_toolchain + if test -d "$at/." -a -d "$at/include/."; then + tm_file="$tm_file ./advance-toolchain.h" + ( + echo "/* Use Advance Toolchain $at */" + echo "#undef LINK_ADVANCE_SPEC" + echo "#define LINK_ADVANCE_SPEC" \ + "\"--rpath=$at/lib%{mabi=ilp32:ilp32}%{mabi=lp64:64} \ + "--rpath=$at/usr/lib%{mabi=ilp32:ilp32}%{mabi=lp64:64} \ + "--dynamic-linker=$at/lib/ld-linux-aarch64%{mbig-endian:_be}%{mabi=ilp32:_ilp32}.so.1\"" + ) > advance-toolchain.h + else + echo "Unknown advance-toolchain $at" + exit 1 + fi + fi ;; alpha*-*-*) diff --git a/gcc/config/aarch64/aarch64-linux.h b/gcc/config/aarch64/aarch64-linux.h index 6ff2163b633..d76fa56c73e 100644 --- a/gcc/config/aarch64/aarch64-linux.h +++ b/gcc/config/aarch64/aarch64-linux.h @@ -47,7 +47,10 @@ -maarch64linux%{mabi=ilp32:32}%{mbig-endian:b}" -#define LINK_SPEC LINUX_TARGET_LINK_SPEC AARCH64_ERRATA_LINK_SPEC +#ifndef LINK_ADVANCE_SPEC +#define LINK_ADVANCE_SPEC +#endif +#define LINK_SPEC LINUX_TARGET_LINK_SPEC AARCH64_ERRATA_LINK_SPEC LINK_ADVANCE_SPEC #define GNU_USER_TARGET_MATHFILE_SPEC \ "%{Ofast|ffast-math|funsafe-math-optimizations:crtfastmath.o%s}"