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
[email protected]
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}"