aboutsummaryrefslogtreecommitdiff
path: root/sysdeps
diff options
context:
space:
mode:
authorSzabolcs Nagy <szabolcs.nagy@arm.com>2020-10-22 17:55:01 +0100
committerSzabolcs Nagy <szabolcs.nagy@arm.com>2020-11-04 12:26:02 +0000
commita3c78954ee0009e558b7e6b9eb05208814099e21 (patch)
tree87a9063333322b9825757bd0a6306afb1c93c3bb /sysdeps
parent28ff0f650c36a2871eb968751be77fd38673c1c6 (diff)
downloadglibc-a3c78954ee0009e558b7e6b9eb05208814099e21.zip
glibc-a3c78954ee0009e558b7e6b9eb05208814099e21.tar.gz
glibc-a3c78954ee0009e558b7e6b9eb05208814099e21.tar.bz2
aarch64: Fix DT_AARCH64_VARIANT_PCS handling [BZ #26798]
The variant PCS support was ineffective because in the common case linkmap->l_mach.plt == 0 but then the symbol table flags were ignored and normal lazy binding was used instead of resolving the relocs early. (This was a misunderstanding about how GOT[1] is setup by the linker.) In practice this mainly affects SVE calls when the vector length is more than 128 bits, then the top bits of the argument registers get clobbered during lazy binding. Fixes bug 26798. (cherry picked from commit 558251bd8785760ad40fcbfeaaee5d27fa5b0fe4)
Diffstat (limited to 'sysdeps')
-rw-r--r--sysdeps/aarch64/dl-machine.h12
1 files changed, 4 insertions, 8 deletions
diff --git a/sysdeps/aarch64/dl-machine.h b/sysdeps/aarch64/dl-machine.h
index d3e87d6..7295b76 100644
--- a/sysdeps/aarch64/dl-machine.h
+++ b/sysdeps/aarch64/dl-machine.h
@@ -388,13 +388,6 @@ elf_machine_lazy_rel (struct link_map *map,
/* Check for unexpected PLT reloc type. */
if (__builtin_expect (r_type == AARCH64_R(JUMP_SLOT), 1))
{
- if (map->l_mach.plt == 0)
- {
- /* Prelinking. */
- *reloc_addr += l_addr;
- return;
- }
-
if (1) /* DT_AARCH64_VARIANT_PCS is not available, so always check. */
{
/* Check the symbol table for variant PCS symbols. */
@@ -418,7 +411,10 @@ elf_machine_lazy_rel (struct link_map *map,
}
}
- *reloc_addr = map->l_mach.plt;
+ if (map->l_mach.plt == 0)
+ *reloc_addr += l_addr;
+ else
+ *reloc_addr = map->l_mach.plt;
}
else if (__builtin_expect (r_type == AARCH64_R(TLSDESC), 1))
{