sys-libs/glibc: enable IFUNC support only on whitelisted ARCHes, bug #641216
authorSergei Trofimovich <slyfox@gentoo.org>
Wed, 20 Dec 2017 09:35:00 +0000 (09:35 +0000)
committerSergei Trofimovich <slyfox@gentoo.org>
Wed, 20 Dec 2017 09:52:55 +0000 (09:52 +0000)
We explicitly disable IFUNC support on the following targets:
    alpha/hppa/ia64/mips/m68k/nios2/riscv/sh
to workaround weak IFUNC detection on binutils/glibc side.

Otherwise at least on ia64 glibc generates IFUNC entries against
compat librt.so.1 symbols (to redirect them back to libc.so.6)
but linker does not produce correct relocations. As a result all
IFUNC-backed functions don't work.

Reported-by: Émeric Maschino
Bug: https://sourceware.org/PR22634
Closes: https://bugs.gentoo.org/641216
Signed-off-by: Sergei Trofimovich <slyfox@gentoo.org>
eclass/toolchain-glibc.eclass
sys-libs/glibc/glibc-2.26-r3.ebuild

index 6580be2fb1e047935c2abe9a5ec00ad1523d879b..d9c692f2ad8f07a5377987820c07d0fe9b68fefc 100644 (file)
@@ -815,6 +815,17 @@ glibc_do_configure() {
                esac
        fi
 
+       # Keep a whitelist of targets supporing IFUNC. glibc's ./configure
+       # is not robust enough to detect proper support:
+       #    https://bugs.gentoo.org/641216
+       #    https://sourceware.org/PR22634#c0
+       case $(tc-arch ${CTARGET}) in
+               # Keep whitelist of targets where autodetection mostly works.
+               amd64|x86|sparc|ppc|ppc64|arm|arm64|s390) ;;
+               # Blacklist everywhere else
+               *) myconf+=( libc_cv_ld_gnu_indirect_function=no ) ;;
+       esac
+
        if version_is_at_least 2.25 ; then
                myconf+=( --enable-stackguard-randomization )
        else
index ceb5b6846859f23a68c987daa5f9ac071d804e8f..b936a612e1fbf6677e5a43ff145676561eb22f54 100644 (file)
@@ -342,6 +342,17 @@ glibc_do_configure() {
        esac
        myconf+=( --enable-stackguard-randomization )
 
+       # Keep a whitelist of targets supporing IFUNC. glibc's ./configure
+       # is not robust enough to detect proper support:
+       #    https://bugs.gentoo.org/641216
+       #    https://sourceware.org/PR22634#c0
+       case $(tc-arch ${CTARGET}) in
+               # Keep whitelist of targets where autodetection mostly works.
+               amd64|x86|sparc|ppc|ppc64|arm|arm64|s390) ;;
+               # Blacklist everywhere else
+               *) myconf+=( libc_cv_ld_gnu_indirect_function=no ) ;;
+       esac
+
        [[ $(tc-is-softfloat) == "yes" ]] && myconf+=( --without-fp )
 
        if [[ $1 == "nptl" ]] ; then