diff options
author | Tamar Christina <tamar.christina@arm.com> | 2019-04-11 11:27:28 +0100 |
---|---|---|
committer | Tamar Christina <tamar.christina@arm.com> | 2019-04-11 11:30:03 +0100 |
commit | ce12121b63145322b4961bbb2b94b939cb916ba7 (patch) | |
tree | 3c30d02e802c3bf01f6f2c2a093d0908fe3b4469 /bfd/pe-i386.c | |
parent | bd7ceb8d26e011ff3fd23402ec2587d7c374f090 (diff) | |
download | gdb-ce12121b63145322b4961bbb2b94b939cb916ba7.zip gdb-ce12121b63145322b4961bbb2b94b939cb916ba7.tar.gz gdb-ce12121b63145322b4961bbb2b94b939cb916ba7.tar.bz2 |
AArch64: When DF_BIND_NOW don't use TLSDESC GOT value.
When using DF_BIND_NOW on AArch64 we don't reserve the GOT slot for a TLSDESC,
but we still emitted DT_TLSDESC_GOT and DT_TLSDESC_PLT. This caused random
memory corruption as the "special" value of (bfd_vma)-1 would be set for
dt_tlsdesc_got.
Since we don't have a value of dt_tlsdesc_got I also don't emit DT_TLSDESC_PLT
now becuase it would point to an incomplete PLT. To be able to write the PLT
entry DT_TLSDESC_GOT is needed and since we don't have one we can't write the
PLT entry either.
It is my understanding that GLIBC doesn't need these two entries when not lazy
loading. Conversely AArch32 does not reserve neither the GOT not the PLT slot
when doing DF_BIND_NOW.
AArch32 does not need these checks because these values are initialized to 0
and so the if (...) checks don't pass, but on AArch64 these are initialized
to (bfd_vma)-1 and thus we need some extra checks.
bfd/ChangeLog:
PR ld/24302
* elfnn-aarch64.c (elfNN_aarch64_size_dynamic_sections): Don't emit
DT_TLSDESC_GOT and DT_TLSDESC_PLT when DF_BIND_NOW.
(elfNN_aarch64_finish_dynamic_sections): Don't write PLT if DF_BIND_NOW.
ld/ChangeLog:
PR ld/24302
* testsuite/ld-aarch64/aarch64-elf.exp: Add new test.
* testsuite/ld-aarch64/tls-relax-gdesc-le-now.d: New test.
Diffstat (limited to 'bfd/pe-i386.c')
0 files changed, 0 insertions, 0 deletions