]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
[PR ld/22263][PR ld/25056] arm: Avoid dynamic TLS relocs in PIE
authorSzabolcs Nagy <szabolcs.nagy@arm.com>
Wed, 2 Oct 2019 18:46:46 +0000 (19:46 +0100)
committerSzabolcs Nagy <szabolcs.nagy@arm.com>
Thu, 10 Oct 2019 11:11:33 +0000 (12:11 +0100)
Dynamic relocs are only needed in an executable for TLS symbols if
those are defined in an external module and even then TLS access
can be relaxed to use IE model instead of GD.

Several bfd_link_pic checks are turned into bfd_link_dll checks
to fix TLS handling in PIE, for the same fix some other targets
used !bfd_link_executable checks, but that includes relocatable
objects so dll seems safer (in most cases either should work, since
dynamic relocations are not applied in relocatable objects).

On arm* fixes
FAIL: Build pr22263-1

bfd/

PR ld/22263
PR ld/25056
* elf32-arm.c (elf32_arm_tls_transition): Use bfd_link_dll instead of
bfd_link_pic for TLS checks.
(elf32_arm_final_link_relocate): Likewise.
(allocate_dynrelocs_for_symbol): Likewise.

bfd/ChangeLog
bfd/elf32-arm.c

index ebe81f31cc61cc115d7fbe536af4e42adf9f6798..acfe52f62d6d509c793dae38ad7b0edce80115de 100644 (file)
@@ -1,3 +1,14 @@
+2019-10-10  Szabolcs Nagy  <szabolcs.nagy@arm.com>
+
+       Apply from master
+       2019-10-04  Szabolcs Nagy  <szabolcs.nagy@arm.com>
+       PR ld/22263
+       PR ld/25056
+       * elf32-arm.c (elf32_arm_tls_transition): Use bfd_link_dll instead of
+       bfd_link_pic for TLS checks.
+       (elf32_arm_final_link_relocate): Likewise.
+       (allocate_dynrelocs_for_symbol): Likewise.
+
 2019-10-10  Szabolcs Nagy  <szabolcs.nagy@arm.com>
 
        Apply from master
index ff9a5ef604dedbf9d5d8c1fb846896546f7b28db..cce796dafd9457c520799ada452b2548a1f6c266 100644 (file)
@@ -4911,7 +4911,7 @@ elf32_arm_tls_transition (struct bfd_link_info *info, int r_type,
 {
   int is_local = (h == NULL);
 
-  if (bfd_link_pic (info)
+  if (bfd_link_dll (info)
       || (h && h->root.type == bfd_link_hash_undefweak))
     return r_type;
 
@@ -11697,7 +11697,7 @@ elf32_arm_final_link_relocate (reloc_howto_type *           howto,
          {
            /* If we don't know the module number, create a relocation
               for it.  */
-           if (bfd_link_pic (info))
+           if (bfd_link_dll (info))
              {
                Elf_Internal_Rela outrel;
 
@@ -11801,7 +11801,7 @@ elf32_arm_final_link_relocate (reloc_howto_type *           howto,
               now, and emit any relocations.  If both an IE GOT and a
               GD GOT are necessary, we emit the GD first.  */
 
-           if ((bfd_link_pic (info) || indx != 0)
+           if ((bfd_link_dll (info) || indx != 0)
                && (h == NULL
                    || (ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
                        && !resolved_to_zero)
@@ -11818,7 +11818,7 @@ elf32_arm_final_link_relocate (reloc_howto_type *           howto,
                /* We should have relaxed, unless this is an undefined
                   weak symbol.  */
                BFD_ASSERT ((h && (h->root.type == bfd_link_hash_undefweak))
-                           || bfd_link_pic (info));
+                           || bfd_link_dll (info));
                BFD_ASSERT (globals->sgotplt_jump_table_size + offplt + 8
                            <= globals->root.sgotplt->size);
 
@@ -16491,7 +16491,7 @@ allocate_dynrelocs_for_symbol (struct elf_link_hash_entry *h, void * inf)
            indx = h->dynindx;
 
          if (tls_type != GOT_NORMAL
-             && (bfd_link_pic (info) || indx != 0)
+             && (bfd_link_dll (info) || indx != 0)
              && (ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
                  || h->root.type != bfd_link_hash_undefweak))
            {