diff options
author | Szabolcs Nagy <szabolcs.nagy@arm.com> | 2019-04-25 15:35:35 +0100 |
---|---|---|
committer | Szabolcs Nagy <szabolcs.nagy@arm.com> | 2019-06-13 09:45:00 +0100 |
commit | 82bc69c012838a381c4167c156a06f4598f34227 (patch) | |
tree | bc144470174a699d006b4bfb171b859e9ba49488 /sysdeps/unix/sysv | |
parent | 55f82d328d2dd1c7c13c1992f4b9bf9c95b57551 (diff) | |
download | glibc-82bc69c012838a381c4167c156a06f4598f34227.tar.gz glibc-82bc69c012838a381c4167c156a06f4598f34227.tar.xz glibc-82bc69c012838a381c4167c156a06f4598f34227.zip |
aarch64: handle STO_AARCH64_VARIANT_PCS
Avoid lazy binding of symbols that may follow a variant PCS with different register usage convention from the base PCS. Currently the lazy binding entry code does not preserve all the registers required for AdvSIMD and SVE vector calls. Saving and restoring all registers unconditionally may break existing binaries, even if they never use vector calls, because of the larger stack requirement for lazy resolution, which can be significant on an SVE system. The solution is to mark all symbols in the symbol table that may follow a variant PCS so the dynamic linker can handle them specially. In this patch such symbols are always resolved at load time, not lazily. So currently LD_AUDIT for variant PCS symbols are not supported, for that the _dl_runtime_profile entry needs to be changed e.g. to unconditionally save/restore all registers (but pass down arg and retval registers to pltentry/exit callbacks according to the base PCS). This patch also removes a __builtin_expect from the modified code because the branch prediction hint did not seem useful. * sysdeps/aarch64/dl-dtprocnum.h: New file. * sysdeps/aarch64/dl-machine.h (DT_AARCH64): Define. (elf_machine_runtime_setup): Handle DT_AARCH64_VARIANT_PCS. (elf_machine_lazy_rel): Check STO_AARCH64_VARIANT_PCS and bind such symbols at load time. * sysdeps/aarch64/linkmap.h (struct link_map_machine): Add variant_pcs.
Diffstat (limited to 'sysdeps/unix/sysv')
0 files changed, 0 insertions, 0 deletions