This patch changes configure.ac to allow gold 1.14 or above to be used
to configire glibc so that gold glibc bugs can be fixed. Tested with
CC="gcc -fuse-ld=gold" CXX="g++ -fuse-ld=gold"
on Fedora 25 with gold 1.14 (
20170623). Gold 1.14 was first released
in binutils 2.28.
On x86-64, for "make check", I got
Error in `/export/build/gnu/glibc-gold/build-x86_64-linux/elf/constload1': double free or corruption (fasttop): 0x00000000008755f0 ***
======= Backtrace: =========
/export/build/gnu/glibc-gold/build-x86_64-linux/libc.so.6(+0x772fb)[0x7f85225b52fb]
/export/build/gnu/glibc-gold/build-x86_64-linux/libc.so.6(+0x7d6c6)[0x7f85225bb6c6]
/export/build/gnu/glibc-gold/build-x86_64-linux/libc.so.6(+0x7df0e)[0x7f85225bbf0e]
/export/build/gnu/glibc-gold/build-x86_64-linux/dlfcn/libdl.so.2(+0x182d)[0x7f85226e682d]
/export/build/gnu/glibc-gold/build-x86_64-linux/dlfcn/libdl.so.2(dlclose+0x1f)[0x7f85226e623f]
/export/build/gnu/glibc-gold/build-x86_64-linux/elf/constload2.so(+0x933)[0x7f8522539933]
/export/build/gnu/glibc-gold/build-x86_64-linux/elf/ld.so(+0xfd1a)[0x7f85226fbd1a]
/export/build/gnu/glibc-gold/build-x86_64-linux/libc.so.6(+0x3c5e0)[0x7f852257a5e0]
/export/build/gnu/glibc-gold/build-x86_64-linux/libc.so.6(+0x3c63a)[0x7f852257a63a]
/export/build/gnu/glibc-gold/build-x86_64-linux/elf/constload2.so(+0x9aa)[0x7f85225399aa]
/export/build/gnu/glibc-gold/build-x86_64-linux/elf/ld.so(+0xf74a)[0x7f85226fb74a]
/export/build/gnu/glibc-gold/build-x86_64-linux/elf/ld.so(+0xf85b)[0x7f85226fb85b]
/export/build/gnu/glibc-gold/build-x86_64-linux/elf/ld.so(+0x13e98)[0x7f85226ffe98]
/export/build/gnu/glibc-gold/build-x86_64-linux/libc.so.6(_dl_catch_error+0x71)[0x7f85226643c1]
/export/build/gnu/glibc-gold/build-x86_64-linux/elf/ld.so(+0x13639)[0x7f85226ff639]
/export/build/gnu/glibc-gold/build-x86_64-linux/dlfcn/libdl.so.2(+0x1156)[0x7f85226e6156]
/export/build/gnu/glibc-gold/build-x86_64-linux/libc.so.6(_dl_catch_error+0x71)[0x7f85226643c1]
/export/build/gnu/glibc-gold/build-x86_64-linux/dlfcn/libdl.so.2(+0x1789)[0x7f85226e6789]
/export/build/gnu/glibc-gold/build-x86_64-linux/dlfcn/libdl.so.2(dlopen+0x32)[0x7f85226e61e2]
/export/build/gnu/glibc-gold/build-x86_64-linux/elf/constload1[0x4009ca]
/export/build/gnu/glibc-gold/build-x86_64-linux/libc.so.6(__libc_start_main+0xf1)[0x7f8522565231]
/export/build/gnu/glibc-gold/build-x86_64-linux/elf/constload1[0x400a5a]
======= Memory map: ========
00400000-
00401000 r-xp
00000000 08:11
26334965 /export/build/gnu/glibc-gold/build-x86_64-linux/elf/constload1
00401000-
00402000 r--p
00000000 08:11
26334965 /export/build/gnu/glibc-gold/build-x86_64-linux/elf/constload1
00402000-
00403000 rw-p
00001000 08:11
26334965 /export/build/gnu/glibc-gold/build-x86_64-linux/elf/constload1
00875000-
00896000 rw-p
00000000 00:00 0 [heap]
7f851c000000-
7f851c021000 rw-p
00000000 00:00 0
7f851c021000-
7f8520000000 ---p
00000000 00:00 0
7f85222f3000-
7f8522309000 r-xp
00000000 08:02 136658 /usr/lib64/libgcc_s-6.3.1-
20170216.so.1
7f8522309000-
7f8522508000 ---p
00016000 08:02 136658 /usr/lib64/libgcc_s-6.3.1-
20170216.so.1
7f8522508000-
7f8522509000 r--p
00015000 08:02 136658 /usr/lib64/libgcc_s-6.3.1-
20170216.so.1
7f8522509000-
7f852250a000 rw-p
00016000 08:02 136658 /usr/lib64/libgcc_s-6.3.1-
20170216.so.1
7f8522539000-
7f852253a000 r-xp
00000000 08:11
26334619 /export/build/gnu/glibc-gold/build-x86_64-linux/elf/constload2.so
7f852253a000-
7f852253b000 r--p
00000000 08:11
26334619 /export/build/gnu/glibc-gold/build-x86_64-linux/elf/constload2.so
7f852253b000-
7f852253c000 rw-p
00001000 08:11
26334619 /export/build/gnu/glibc-gold/build-x86_64-linux/elf/constload2.so
7f852253c000-
7f852253e000 rw-p
00000000 00:00 0
7f852253e000-
7f85226da000 r-xp
00000000 08:11
26309973 /export/build/gnu/glibc-gold/build-x86_64-linux/libc.so
7f85226da000-
7f85226db000 ---p
0019c000 08:11
26309973 /export/build/gnu/glibc-gold/build-x86_64-linux/libc.so
7f85226db000-
7f85226de000 r--p
0019c000 08:11
26309973 /export/build/gnu/glibc-gold/build-x86_64-linux/libc.so
7f85226de000-
7f85226e1000 rw-p
0019f000 08:11
26309973 /export/build/gnu/glibc-gold/build-x86_64-linux/libc.so
7f85226e1000-
7f85226e5000 rw-p
00000000 00:00 0
7f85226e5000-
7f85226e8000 r-xp
00000000 08:11
26313777 /export/build/gnu/glibc-gold/build-x86_64-linux/dlfcn/libdl.so
7f85226e8000-
7f85226e9000 r--p
00002000 08:11
26313777 /export/build/gnu/glibc-gold/build-x86_64-linux/dlfcn/libdl.so
7f85226e9000-
7f85226ea000 rw-p
00003000 08:11
26313777 /export/build/gnu/glibc-gold/build-x86_64-linux/dlfcn/libdl.so
7f85226ea000-
7f85226ec000 rw-p
00000000 00:00 0
7f85226ec000-
7f8522711000 r-xp
00000000 08:11
26309972 /export/build/gnu/glibc-gold/build-x86_64-linux/elf/ld.so
7f8522711000-
7f8522712000 rw-p
00000000 00:00 0
7f8522712000-
7f8522713000 r--p
00025000 08:11
26309972 /export/build/gnu/glibc-gold/build-x86_64-linux/elf/ld.so
7f8522713000-
7f8522714000 rw-p
00026000 08:11
26309972 /export/build/gnu/glibc-gold/build-x86_64-linux/elf/ld.so
7f8522714000-
7f8522715000 rw-p
00000000 00:00 0
7ffc5a2bd000-
7ffc5a2df000 rw-p
00000000 00:00 0 [stack]
7ffc5a32c000-
7ffc5a32e000 r--p
00000000 00:00 0 [vvar]
7ffc5a32e000-
7ffc5a330000 r-xp
00000000 00:00 0 [vdso]
ffffffffff600000-
ffffffffff601000 r-xp
00000000 00:00 0 [vsyscall]
and
make[4]: *** [/export/build/gnu/glibc-gold/build-x86_64-linux/elf/vismain] Error 1
This is because gold doesn't support protected data symbols:
configure:5672: checking linker support for protected data symbol
configure:5682: gcc -fuse-ld=gold -nostdlib -nostartfiles -fno-stack-protector -fPIC -shared conftest.c -o conftest.so
configure:5685: $? = 0
configure:5692: gcc -fuse-ld=gold -nostdlib -nostartfiles -fno-stack-protector conftest.c -o conftest conftest.so
/usr/local/bin/ld.gold: error: /tmp/ccXWoofs.o: cannot make copy relocation for protected symbol 'bar', defined in conftest.so
collect2: error: ld returned 1 exit status
make[4]: *** [/export/build/gnu/glibc-gold/build-x86_64-linux/elf/tst-split-dynreloc] Error 1
This is because gold doesn't support INSERT in linker script:
https://sourceware.org/bugzilla/show_bug.cgi?id=21676
The total failures are
FAIL: dlfcn/bug-dl-leaf
FAIL: elf/constload1
FAIL: elf/global
FAIL: elf/ifuncmain1
FAIL: elf/ifuncmain1pic
FAIL: elf/ifuncmain1pie
FAIL: elf/ifuncmain1vis
FAIL: elf/ifuncmain1vispic
FAIL: elf/ifuncmain1vispie
FAIL: elf/ifuncmain3
FAIL: elf/initfirst
FAIL: elf/preloadtest
FAIL: elf/tst-audit11
FAIL: elf/tst-audit12
FAIL: elf/tst-audit4
FAIL: elf/tst-audit5
FAIL: elf/tst-audit6
FAIL: elf/tst-audit7
FAIL: elf/tst-dlmodcount
FAIL: elf/tst-dlmopen1
FAIL: elf/tst-dlmopen3
FAIL: elf/tst-dlopenrpath
FAIL: elf/tst-latepthread
FAIL: elf/tst-leaks1-mem
FAIL: elf/tst-nodelete-dlclose
FAIL: elf/unload6
FAIL: nss/test-netdb
FAIL: nss/tst-nss-test1
FAIL: posix/tst-getaddrinfo5
[BZ #14995]
* configure.ac: Allow gold 1.14 or above to configire glibc
* configure: Regenerated.
+2017-06-28 H.J. Lu <hongjiu.lu@intel.com>
+
+ [BZ #14995]
+ * configure.ac: Allow gold 1.14 or above to configire glibc
+ * configure: Regenerated.
+
2017-06-28 Joseph Myers <joseph@codesourcery.com>
[BZ #21457]
AS=: critic_missing="$critic_missing as"
fi
-for ac_prog in $LD
+
+if test -n "`$LD --version | sed -n 's/^GNU \(gold\).*$/\1/p'`"; then
+ # Accept gold 1.14 or higher
+ for ac_prog in $LD
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_LD+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$LD"; then
+ ac_cv_prog_LD="$LD" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_LD="$ac_prog"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+LD=$ac_cv_prog_LD
+if test -n "$LD"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LD" >&5
+$as_echo "$LD" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ test -n "$LD" && break
+done
+
+if test -z "$LD"; then
+ ac_verc_fail=yes
+else
+ # Found it, now check the version.
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking version of $LD" >&5
+$as_echo_n "checking version of $LD... " >&6; }
+ ac_prog_version=`$LD --version 2>&1 | sed -n 's/^.*GNU gold.* \([0-9][0-9]*\.[0-9.]*\).*$/\1/p'`
+ case $ac_prog_version in
+ '') ac_prog_version="v. ?.??, bad"; ac_verc_fail=yes;;
+ 1.1[4-9]*|1.[2-9][0-9]*|1.1[0-9][0-9]*|[2-9].*|[1-9][0-9]*)
+ ac_prog_version="$ac_prog_version, ok"; ac_verc_fail=no;;
+ *) ac_prog_version="$ac_prog_version, bad"; ac_verc_fail=yes;;
+
+ esac
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_prog_version" >&5
+$as_echo "$ac_prog_version" >&6; }
+fi
+if test $ac_verc_fail = yes; then
+ LD=: critic_missing="$critic_missing GNU gold"
+fi
+
+else
+ for ac_prog in $LD
do
# Extract the first word of "$ac_prog", so it can be a program name with args.
set dummy $ac_prog; ac_word=$2
$as_echo "$ac_prog_version" >&6; }
fi
if test $ac_verc_fail = yes; then
- LD=: critic_missing="$critic_missing ld"
+ LD=: critic_missing="$critic_missing GNU ld"
fi
+fi
# These programs are version sensitive.
[GNU assembler.* \([0-9]*\.[0-9.]*\)],
[2.1[0-9][0-9]*|2.2[2-9]*|2.[3-9][0-9]*|[3-9].*|[1-9][0-9]*],
AS=: critic_missing="$critic_missing as")
-AC_CHECK_PROG_VER(LD, $LD, --version,
- [GNU ld.* \([0-9][0-9]*\.[0-9.]*\)],
- [2.1[0-9][0-9]*|2.2[2-9]*|2.[3-9][0-9]*|[3-9].*|[1-9][0-9]*],
- LD=: critic_missing="$critic_missing ld")
+
+if test -n "`$LD --version | sed -n 's/^GNU \(gold\).*$/\1/p'`"; then
+ # Accept gold 1.14 or higher
+ AC_CHECK_PROG_VER(LD, $LD, --version,
+ [GNU gold.* \([0-9][0-9]*\.[0-9.]*\)],
+ [1.1[4-9]*|1.[2-9][0-9]*|1.1[0-9][0-9]*|[2-9].*|[1-9][0-9]*],
+ LD=: critic_missing="$critic_missing GNU gold")
+else
+ AC_CHECK_PROG_VER(LD, $LD, --version,
+ [GNU ld.* \([0-9][0-9]*\.[0-9.]*\)],
+ [2.1[0-9][0-9]*|2.2[2-9]*|2.[3-9][0-9]*|[3-9].*|[1-9][0-9]*],
+ LD=: critic_missing="$critic_missing GNU ld")
+fi
# These programs are version sensitive.
AC_CHECK_TOOL_PREFIX