mirror of
https://sourceware.org/git/glibc.git
synced 2024-12-28 05:21:13 +00:00
d6efcc118e
The PowerPC64 linker edits medium model toc-indirect code to toc-pointer relative: addis r9,r2,tc_entry_for_var@toc@ha ld r9,tc_entry_for_var@toc@l(r9) becomes addis r9,r2,(var-.TOC.)@ha addi r9,r9,(var-.TOC.)@l when "var" is known to be local to the binary. This isn't done for small-model toc-indirect code, because "var" is almost guaranteed to be too far away from .TOC. for a 16-bit signed offset. And, because the analysis of which .toc entry can be removed becomes much more complicated in objects that mix code models, they aren't removed if any small-model toc sequence appears in an object file. Unfortunately, glibc's build of ld.so smashes the needed objects together in a ld -r linking stage. This means the GOT/TOC is left with a whole lot of relative relocations which is untidy, but in itself is not a serious problem. However, static-pie on powerpc64 bombs due to a segfault caused by one of the small-model accesses before _dl_relocate_static_pie. (The very first one in rcrt1.o passing start_addresses in r8 to __libc_start_main.) So this patch makes all the toc/got accesses in assembly medium code model, and a couple of functions hidden. By itself this is not enough to give us working static-pie, but it is useful in isolation to enable better linker optimisation. There's a serious problem in libgcc too. libgcc ifuncs access the AT_HWCAP words stored in the tcb with an offset from the thread pointer (r13), but r13 isn't set at the time _dl_relocate_static_pie. A followup patch will fix that. Reviewed-by: Tulio Magno Quites Machado Filho <tuliom@linux.ibm.com> |
||
---|---|---|
.. | ||
bits | ||
fpu | ||
nofpu | ||
nptl | ||
power4 | ||
power6 | ||
powerpc32 | ||
powerpc64 | ||
sys/platform | ||
abort-instr.h | ||
atomic-machine.h | ||
cpu-features.c | ||
cpu-features.h | ||
dl-lookupcfg.h | ||
dl-procinfo.c | ||
dl-procinfo.h | ||
dl-tls.c | ||
dl-tls.h | ||
dl-tunables.list | ||
elf-initfini.h | ||
ffs.c | ||
fpu_control.h | ||
gccframe.h | ||
hwcapinfo.c | ||
hwcapinfo.h | ||
ifunc-sel.h | ||
jmpbuf-offsets.h | ||
jmpbuf-unwind.h | ||
ldsodefs.h | ||
libc-tls.c | ||
locale-defines.sym | ||
longjmp.c | ||
machine-gmon.h | ||
Makefile | ||
math-tests-snan-cast.h | ||
mod-cache-ppc.c | ||
mod-tlsopt-powerpc.c | ||
mp_clz_tab.c | ||
novmx-longjmp.c | ||
novmx-sigjmp.c | ||
novmxsetjmp.h | ||
preconfigure | ||
preconfigure.ac | ||
rtld-global-offsets.sym | ||
sigjmp.c | ||
sotruss-lib.c | ||
stackinfo.h | ||
sysdep.h | ||
test-arith.c | ||
test-arithf.c | ||
test-get_hwcap-static.c | ||
test-get_hwcap.c | ||
test-gettimebase.c | ||
tst-cache-ppc-static-dlopen.c | ||
tst-cache-ppc-static.c | ||
tst-cache-ppc.c | ||
tst-set_ppr.c | ||
tst-stack-align.h | ||
tst-tlsifunc-static.c | ||
tst-tlsifunc.c | ||
tst-tlsopt-powerpc.c | ||
Versions |