33 lines
1.3 KiB
Diff
33 lines
1.3 KiB
Diff
|
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;
|
||
|
}
|
||
|
|