sys-libs/glibc: workaround ia64 early ldso crashes #503838
authorMike Frysinger <vapier@gentoo.org>
Mon, 28 Dec 2015 18:23:57 +0000 (13:23 -0500)
committerMike Frysinger <vapier@gentoo.org>
Mon, 28 Dec 2015 18:31:07 +0000 (13:31 -0500)
sys-libs/glibc/files/2.19/glibc-2.19-ia64-gcc-4.8-reloc-hack.patch [new file with mode: 0644]
sys-libs/glibc/glibc-2.19-r1.ebuild
sys-libs/glibc/glibc-2.20-r2.ebuild
sys-libs/glibc/glibc-2.21-r1.ebuild
sys-libs/glibc/glibc-2.22-r1.ebuild

diff --git a/sys-libs/glibc/files/2.19/glibc-2.19-ia64-gcc-4.8-reloc-hack.patch b/sys-libs/glibc/files/2.19/glibc-2.19-ia64-gcc-4.8-reloc-hack.patch
new file mode 100644 (file)
index 0000000..72a616a
--- /dev/null
@@ -0,0 +1,32 @@
+https://bugs.gentoo.org/503838
+http://gcc.gnu.org/PR60465
+https://sourceware.org/ml/libc-alpha/2015-12/msg00556.html
+https://trofi.github.io/posts/189-glibc-on-ia64-or-how-relocations-bootstrap.html
+
+newer versions of gcc generate relocations in the elf_get_dynamic_info func
+which glibc relies on to populate some info structs.  those structs are then
+used by ldso to process relocations in itself.  glibc requires that there are
+no relocations until that point (*after* elf_get_dynamic_info), so we end up
+crashing during elf_get_dynamic_info because the relocation has not yet been
+processed.
+
+this hack shuffles the code in a way that tricks gcc into not generating the
+relocation.  we need to figure out something better for upstream.
+
+--- a/elf/get-dynamic-info.h
++++ b/elf/get-dynamic-info.h
+@@ -66,8 +66,12 @@ elf_get_dynamic_info (struct link_map *l, ElfW(Dyn) *temp)
+       info[DT_VALTAGIDX (dyn->d_tag) + DT_NUM + DT_THISPROCNUM
+            + DT_VERSIONTAGNUM + DT_EXTRANUM] = dyn;
+       else if ((d_tag_utype) DT_ADDRTAGIDX (dyn->d_tag) < DT_ADDRNUM)
+-      info[DT_ADDRTAGIDX (dyn->d_tag) + DT_NUM + DT_THISPROCNUM
+-           + DT_VERSIONTAGNUM + DT_EXTRANUM + DT_VALNUM] = dyn;
++      {
++        d_tag_utype i =
++            DT_ADDRTAGIDX (dyn->d_tag) + DT_NUM + DT_THISPROCNUM
++            + DT_VERSIONTAGNUM + DT_EXTRANUM + DT_VALNUM;
++        info[i] = dyn;
++      }
+       ++dyn;
+     }
index a683fa59060af0a6b4e8bb5eaeb1b5976b11cee7..998b7fda0c9cd8150e679bbb11f182569934f638 100644 (file)
@@ -157,8 +157,11 @@ eblit-src_unpack-pre() {
 }
 
 eblit-src_unpack-post() {
+       cd "${S}"
+
+       epatch "${FILESDIR}"/2.19/${PN}-2.19-ia64-gcc-4.8-reloc-hack.patch #503838
+
        if use hardened ; then
-               cd "${S}"
                einfo "Patching to get working PIE binaries on PIE (hardened) platforms"
                gcc-specs-pie && epatch "${FILESDIR}"/2.17/glibc-2.17-hardened-pie.patch
                epatch "${FILESDIR}"/2.19/glibc-2.19-hardened-configure-picdefault.patch
index 8280980a41699c7ee93d61d2f013286c9944ee4e..0ea96b27052f0af9398284ea8dfc83af0685f56b 100644 (file)
@@ -160,6 +160,8 @@ eblit-src_unpack-pre() {
 eblit-src_prepare-post() {
        cd "${S}"
 
+       epatch "${FILESDIR}"/2.19/${PN}-2.19-ia64-gcc-4.8-reloc-hack.patch #503838
+
        if use hardened ; then
                einfo "Patching to get working PIE binaries on PIE (hardened) platforms"
                gcc-specs-pie && epatch "${FILESDIR}"/2.17/glibc-2.17-hardened-pie.patch
index 9963ae3152d5a6604b1a5fd53df70eb3a4b330b8..3dcbb52c367d8647cdd5ba9cc380cf3d22cf1185 100644 (file)
@@ -160,6 +160,8 @@ eblit-src_unpack-pre() {
 eblit-src_prepare-post() {
        cd "${S}"
 
+       epatch "${FILESDIR}"/2.19/${PN}-2.19-ia64-gcc-4.8-reloc-hack.patch #503838
+
        if use hardened ; then
                einfo "Patching to get working PIE binaries on PIE (hardened) platforms"
                gcc-specs-pie && epatch "${FILESDIR}"/2.17/glibc-2.17-hardened-pie.patch
index d6f6033f0d081c36a0c4647d82840ae3f6955272..6e41fa91e6651cb5cb8bed4e6d104a3051570805 100644 (file)
@@ -163,6 +163,8 @@ eblit-src_unpack-pre() {
 eblit-src_prepare-post() {
        cd "${S}"
 
+       epatch "${FILESDIR}"/2.19/${PN}-2.19-ia64-gcc-4.8-reloc-hack.patch #503838
+
        if use hardened ; then
                # We don't enable these for non-hardened as the output is very terse --
                # it only states that a crash happened.  The default upstream behavior