Fix another memory access error triggered by attempting to parse a corrupt binary.
[deliverable/binutils-gdb.git] / bfd / elf64-ppc.c
index 319d58f86a03cddcb23c465c70a2e22266c6a328..f399e351e0b954772902e247bd9ebea2670e40bb 100644 (file)
@@ -8904,7 +8904,7 @@ ppc64_elf_tls_optimize (struct bfd_link_info *info)
    the values of any global symbols in a toc section that has been
    edited.  Globals in toc sections should be a rarity, so this function
    sets a flag if any are found in toc sections other than the one just
-   edited, so that futher hash table traversals can be avoided.  */
+   edited, so that further hash table traversals can be avoided.  */
 
 struct adjust_toc_info
 {
@@ -9400,7 +9400,7 @@ ppc64_elf_edit_toc (struct bfd_link_info *info)
 
       /* Merge the used and skip arrays.  Assume that TOC
         doublewords not appearing as either used or unused belong
-        to to an entry more than one doubleword in size.  */
+        to an entry more than one doubleword in size.  */
       for (drop = skip, keep = used, last = 0, some_unused = 0;
           drop < skip + (toc->size + 7) / 8;
           ++drop, ++keep)
@@ -12871,7 +12871,7 @@ ppc64_elf_size_stubs (struct bfd_link_info *info)
          *p++ = DW_CFA_register;
          *p++ = 65;
          *p++ = htab->opd_abi ? 12 : 0;
-         *p++ = DW_CFA_advance_loc + 4;
+         *p++ = DW_CFA_advance_loc + (htab->opd_abi ? 5 : 7);
          *p++ = DW_CFA_restore_extended;
          *p++ = 65;
          p += ((24 + align - 1) & -align) - 24;
@@ -14647,11 +14647,6 @@ ppc64_elf_relocate_section (bfd *output_bfd,
                   emitting a reloc.  */
                else
                  {
-                   int tlsopt
-                     = (htab->params->tls_get_addr_opt
-                        && htab->tls_get_addr_fd != NULL
-                        && htab->tls_get_addr_fd->elf.plt.plist != NULL);
-
                    relocation += addend;
                    if (tls_type != 0)
                      {
@@ -14663,8 +14658,7 @@ ppc64_elf_relocate_section (bfd *output_bfd,
                              relocation = 0;
                            else
                              relocation -= htab->elf.tls_sec->vma + DTP_OFFSET;
-                           if ((tls_type & TLS_TPREL)
-                               || (tlsopt && !(tls_type & TLS_DTPREL)))
+                           if (tls_type & TLS_TPREL)
                              relocation += DTP_OFFSET - TP_OFFSET;
                          }
 
@@ -14672,7 +14666,7 @@ ppc64_elf_relocate_section (bfd *output_bfd,
                          {
                            bfd_put_64 (output_bfd, relocation,
                                        got->contents + off + 8);
-                           relocation = !tlsopt;
+                           relocation = 1;
                          }
                      }
                    bfd_put_64 (output_bfd, relocation,
@@ -15080,32 +15074,6 @@ ppc64_elf_relocate_section (bfd *output_bfd,
                    addend = outrel.r_offset;
                }
            }
-         else if (r_type == R_PPC64_DTPMOD64
-                  && htab->params->tls_get_addr_opt
-                  && htab->tls_get_addr_fd != NULL
-                  && htab->tls_get_addr_fd->elf.plt.plist != NULL)
-           {
-             /* Set up for __tls_get_addr_opt stub, when this entry
-                does not have dynamic relocs.  */
-             relocation = 0;
-             /* Set up the next word for local dynamic.  If it turns
-                out to be global dynamic, the reloc will overwrite
-                this value.  */
-             if (rel->r_offset + 16 <= input_section->size)
-               bfd_put_64 (input_bfd, DTP_OFFSET - TP_OFFSET,
-                           contents + rel->r_offset + 8);
-           }
-         else if (r_type == R_PPC64_DTPREL64
-                  && htab->params->tls_get_addr_opt
-                  && htab->tls_get_addr_fd != NULL
-                  && htab->tls_get_addr_fd->elf.plt.plist != NULL
-                  && rel > relocs
-                  && rel[-1].r_info == ELF64_R_INFO (r_symndx, R_PPC64_DTPMOD64)
-                  && rel[-1].r_offset + 8 == rel->r_offset)
-           {
-             /* __tls_get_addr_opt stub value.  */
-             addend += DTP_OFFSET - TP_OFFSET;
-           }
          break;
 
        case R_PPC64_COPY:
@@ -15899,4 +15867,3 @@ ppc64_elf_finish_dynamic_sections (bfd *output_bfd,
 #define elf64_bed      elf64_powerpc_fbsd_bed
 
 #include "elf64-target.h"
-
This page took 0.025822 seconds and 4 git commands to generate.