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; }