diff options
author | Maciej W. Rozycki <macro@mips.com> | 2018-07-11 17:44:45 +0100 |
---|---|---|
committer | Maciej W. Rozycki <macro@mips.com> | 2018-07-11 17:44:45 +0100 |
commit | 1cb83cac9a8974bdb12aac90018ad1165ba86274 (patch) | |
tree | 4f7e81df67ab99004599f21cddc7b57b8de736ea /bfd | |
parent | 9143e72c6d4ddefbcb41c0f6361ad140354145ef (diff) | |
download | gdb-1cb83cac9a8974bdb12aac90018ad1165ba86274.zip gdb-1cb83cac9a8974bdb12aac90018ad1165ba86274.tar.gz gdb-1cb83cac9a8974bdb12aac90018ad1165ba86274.tar.bz2 |
MIPS/BFD: Fix TLS relocation resolution for regular executables
Correct an issue with commit 0f20cc3522e7 ("TLS support for MIPS"),
<https://sourceware.org/ml/binutils/2005-02/msg00607.html>, where a
condition used to determine whether to use a dynamic symbol for GD, LD
and IE TLS dynamic relocations against a symbol that has been defined
locally has been incorrectly reversed.
It's executables rather than dynamic shared objects where no symbol is
required, because such symbols cannot be preempted and therefore their
values (thread pointer offsets) are fixed at the static link time as is
the associated module ID of the main executable, so the original
condition should have been `shared' instead of `!shared'. This wrong
condition was then later converted from `!shared' to `!bfd_link_pic',
with commit 0e1862bb401f ("Add output_type to bfd_link_info").
Use the correct `bfd_link_dll' condition then, and adjust code for the
dynamic symbol index possibly being -1 as with symbols that have been
forced local, removing unnecessary dynamic relocations from dynamic
regular executables. PIE executables are unaffected as the existing
condition excluded them by chance due to the conversion mentioned above.
Adjust test cases accordingly.
bfd/
* elfxx-mips.c (mips_tls_got_relocs): Use `bfd_link_dll' rather
than `!bfd_link_pic' in determining the dynamic symbol index.
Avoid the index of -1.
(mips_elf_initialize_tls_slots): Likewise. Flatten code by
moving `dyn' to the beginning of the function block.
ld/
* testsuite/ld-mips-elf/tlsdyn-o32.d: Update test for dynamic
relocation removal.
* testsuite/ld-mips-elf/tlsdyn-o32.got: Likewise.
* testsuite/ld-mips-elf/tlsdyn-o32-1.d: Likewise.
* testsuite/ld-mips-elf/tlsdyn-o32-1.got: Likewise.
* testsuite/ld-mips-elf/tlsdyn-o32-2.d: Likewise.
* testsuite/ld-mips-elf/tlsdyn-o32-2.got: Likewise.
* testsuite/ld-mips-elf/tlsdyn-o32-3.d: Likewise.
* testsuite/ld-mips-elf/tlsdyn-o32-3.got: Likewise.
Diffstat (limited to 'bfd')
-rw-r--r-- | bfd/ChangeLog | 8 | ||||
-rw-r--r-- | bfd/elfxx-mips.c | 22 |
2 files changed, 18 insertions, 12 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 402cdc4..d4e2c21 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,4 +1,12 @@ 2018-07-11 Maciej W. Rozycki <macro@mips.com> + + * elfxx-mips.c (mips_tls_got_relocs): Use `bfd_link_dll' rather + than `!bfd_link_pic' in determining the dynamic symbol index. + Avoid the index of -1. + (mips_elf_initialize_tls_slots): Likewise. Flatten code by + moving `dyn' to the beginning of the function block. + +2018-07-11 Maciej W. Rozycki <macro@mips.com> Rich Felker <bugdal@aerifal.cx> PR ld/22570 diff --git a/bfd/elfxx-mips.c b/bfd/elfxx-mips.c index a353907..d919423 100644 --- a/bfd/elfxx-mips.c +++ b/bfd/elfxx-mips.c @@ -3251,8 +3251,10 @@ mips_tls_got_relocs (struct bfd_link_info *info, unsigned char tls_type, bfd_boolean need_relocs = FALSE; bfd_boolean dyn = elf_hash_table (info)->dynamic_sections_created; - if (h && WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, bfd_link_pic (info), h) - && (!bfd_link_pic (info) || !SYMBOL_REFERENCES_LOCAL (info, h))) + if (h != NULL + && h->dynindx != -1 + && WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, bfd_link_pic (info), h) + && (bfd_link_dll (info) || !SYMBOL_REFERENCES_LOCAL (info, h))) indx = h->dynindx; if ((bfd_link_dll (info) || indx != 0) @@ -3340,6 +3342,7 @@ mips_elf_initialize_tls_slots (bfd *abfd, struct bfd_link_info *info, struct mips_elf_link_hash_entry *h, bfd_vma value) { + bfd_boolean dyn = elf_hash_table (info)->dynamic_sections_created; struct mips_elf_link_hash_table *htab; int indx; asection *sreloc, *sgot; @@ -3353,16 +3356,11 @@ mips_elf_initialize_tls_slots (bfd *abfd, struct bfd_link_info *info, sgot = htab->root.sgot; indx = 0; - if (h != NULL) - { - bfd_boolean dyn = elf_hash_table (info)->dynamic_sections_created; - - if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, bfd_link_pic (info), - &h->root) - && (!bfd_link_pic (info) - || !SYMBOL_REFERENCES_LOCAL (info, &h->root))) - indx = h->root.dynindx; - } + if (h != NULL + && h->root.dynindx != -1 + && WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, bfd_link_pic (info), &h->root) + && (bfd_link_dll (info) || !SYMBOL_REFERENCES_LOCAL (info, &h->root))) + indx = h->root.dynindx; if (entry->tls_initialized) return; |