elf_backend_dtrel_excludes_plt
[deliverable/binutils-gdb.git] / bfd / elf64-x86-64.c
index 3cb5c8055dca9a6bafa155f29d81334a582afef1..2e21899f0e5c91d96284836ec22296fd8754e159 100644 (file)
@@ -285,6 +285,7 @@ elf_x86_64_rtype_to_howto (bfd *abfd, unsigned r_type)
     {
       if (r_type >= (unsigned int) R_X86_64_standard)
        {
+         /* xgettext:c-format */
          _bfd_error_handler (_("%B: invalid relocation type %d"),
                              abfd, (int) r_type);
          r_type = R_X86_64_NONE;
@@ -1654,6 +1655,7 @@ elf_x86_64_tls_transition (struct bfd_link_info *info, bfd *abfd,
        }
 
       _bfd_error_handler
+       /* xgettext:c-format */
        (_("%B: TLS transition from %s to %s against `%s' at 0x%lx "
           "in section `%A' failed"),
         abfd, sec, from->name, to->name, name,
@@ -1712,6 +1714,7 @@ elf_x86_64_need_pic (bfd *input_bfd, asection *sec,
       pic = _("; recompile with -fPIC");
     }
 
+  /* xgettext:c-format */
   _bfd_error_handler (_("%B: relocation %s against %s%s`%s' can "
                        "not be used when making a shared object%s"),
                      input_bfd, howto->name, und, v, name, pic);
@@ -1877,7 +1880,10 @@ elf_x86_64_convert_load_reloc (bfd *abfd, asection *sec,
             bfd_elf_record_link_assignment.   */
          if (h->def_regular
              && (h->root.type == bfd_link_hash_new
-                 || h->root.type == bfd_link_hash_undefined))
+                 || h->root.type == bfd_link_hash_undefined
+                 || ((h->root.type == bfd_link_hash_defined
+                      || h->root.type == bfd_link_hash_defweak)
+                     && h->root.u.def.section == bfd_und_section_ptr)))
            {
              /* Skip since R_X86_64_32/R_X86_64_32S may overflow.  */
              if (require_reloc_pc32)
@@ -2204,6 +2210,7 @@ elf_x86_64_check_relocs (bfd *abfd, struct bfd_link_info *info,
 
       if (r_symndx >= NUM_SHDR_ENTRIES (symtab_hdr))
        {
+         /* xgettext:c-format */
          _bfd_error_handler (_("%B: bad symbol index: %d"),
                              abfd, r_symndx);
          goto error_return;
@@ -2267,6 +2274,7 @@ elf_x86_64_check_relocs (bfd *abfd, struct bfd_link_info *info,
                  name = bfd_elf_sym_name (abfd, symtab_hdr, isym,
                                           NULL);
                _bfd_error_handler
+                 /* xgettext:c-format */
                  (_("%B: relocation %s against symbol `%s' isn't "
                     "supported in x32 mode"), abfd,
                   x86_64_elf_howto_table[r_type].name, name);
@@ -2327,6 +2335,7 @@ elf_x86_64_check_relocs (bfd *abfd, struct bfd_link_info *info,
                        goto error_return;
                    }
                }
+             /* Fall through.  */
 
            case R_X86_64_32S:
            case R_X86_64_PC64:
@@ -2455,6 +2464,7 @@ elf_x86_64_check_relocs (bfd *abfd, struct bfd_link_info *info,
                      name = bfd_elf_sym_name (abfd, symtab_hdr,
                                               isym, NULL);
                    _bfd_error_handler
+                     /* xgettext:c-format */
                      (_("%B: '%s' accessed both as normal and thread local symbol"),
                       abfd, name);
                    bfd_set_error (bfd_error_bad_value);
@@ -2525,6 +2535,7 @@ elf_x86_64_check_relocs (bfd *abfd, struct bfd_link_info *info,
        case R_X86_64_32:
          if (!ABI_64_P (abfd))
            goto pointer;
+         /* Fall through.  */
        case R_X86_64_8:
        case R_X86_64_16:
        case R_X86_64_32S:
@@ -3453,6 +3464,7 @@ elf_x86_64_readonly_dynrelocs (struct elf_link_hash_entry *h,
 
          if ((info->warn_shared_textrel && bfd_link_pic (info))
              || info->error_textrel)
+           /* xgettext:c-format */
            info->callbacks->einfo (_("%P: %B: warning: relocation against `%s' in readonly section `%A'\n"),
                                    p->sec->owner, h->root.root.string,
                                    p->sec);
@@ -3661,6 +3673,7 @@ elf_x86_64_size_dynamic_sections (bfd *output_bfd,
                      info->flags |= DF_TEXTREL;
                      if ((info->warn_shared_textrel && bfd_link_pic (info))
                          || info->error_textrel)
+                       /* xgettext:c-format */
                        info->callbacks->einfo (_("%P: %B: warning: relocation in readonly section `%A'\n"),
                                                p->sec->owner, p->sec);
                    }
@@ -4145,6 +4158,7 @@ elf_x86_64_relocate_section (bfd *output_bfd,
       if (r_type >= (int) R_X86_64_standard)
        {
          _bfd_error_handler
+           /* xgettext:c-format */
            (_("%B: unrecognized relocation (0x%x) in section `%A'"),
             input_bfd, input_section, r_type);
          bfd_set_error (bfd_error_bad_value);
@@ -4372,6 +4386,7 @@ bad_ifunc_reloc:
                name = bfd_elf_sym_name (input_bfd, symtab_hdr, sym,
                                         NULL);
              _bfd_error_handler
+               /* xgettext:c-format */
                (_("%B: relocation %s against STT_GNU_IFUNC "
                   "symbol `%s' isn't supported"), input_bfd,
                 howto->name, name);
@@ -4397,6 +4412,7 @@ do_ifunc_pointer:
                    name = bfd_elf_sym_name (input_bfd, symtab_hdr,
                                             sym, NULL);
                  _bfd_error_handler
+                   /* xgettext:c-format */
                    (_("%B: relocation %s against STT_GNU_IFUNC "
                       "symbol `%s' has non-zero addend: %d"),
                     input_bfd, howto->name, name, rel->r_addend);
@@ -4632,6 +4648,7 @@ do_ifunc_pointer:
                    }
 
                  _bfd_error_handler
+                   /* xgettext:c-format */
                    (_("%B: relocation R_X86_64_GOTOFF64 against undefined %s `%s' can not be used when making a shared object"),
                     input_bfd, v, h->root.root.string);
                  bfd_set_error (bfd_error_bad_value);
@@ -4644,6 +4661,7 @@ do_ifunc_pointer:
                       && ELF_ST_VISIBILITY (h->other) == STV_PROTECTED)
                {
                  _bfd_error_handler
+             /* xgettext:c-format */
                    (_("%B: relocation R_X86_64_GOTOFF64 against protected %s `%s' can not be used when making a shared object"),
                     input_bfd,
                     h->type == STT_FUNC ? "function" : "data",
@@ -4675,10 +4693,17 @@ do_ifunc_pointer:
             symbols it's the symbol itself relative to GOT.  */
          if (h != NULL
              /* See PLT32 handling.  */
-             && h->plt.offset != (bfd_vma) -1
+             && (h->plt.offset != (bfd_vma) -1
+                 || eh->plt_got.offset != (bfd_vma) -1)
              && htab->elf.splt != NULL)
            {
-             if (htab->plt_bnd != NULL)
+             if (eh->plt_got.offset != (bfd_vma) -1)
+               {
+                 /* Use the GOT PLT.  */
+                 resolved_plt = htab->plt_got;
+                 plt_offset = eh->plt_got.offset;
+               }
+             else if (htab->plt_bnd != NULL)
                {
                  resolved_plt = htab->plt_bnd;
                  plt_offset = eh->plt_bnd.offset;
@@ -4911,6 +4936,7 @@ direct:
                                                     sym, NULL);
                          if (addend < 0)
                            _bfd_error_handler
+                             /* xgettext:c-format */
                              (_("%B: addend -0x%x in relocation %s against "
                                 "symbol `%s' at 0x%lx in section `%A' is "
                                 "out of range"),
@@ -4919,6 +4945,7 @@ direct:
                               (unsigned long) rel->r_offset);
                          else
                            _bfd_error_handler
+                             /* xgettext:c-format */
                              (_("%B: addend 0x%x in relocation %s against "
                                 "symbol `%s' at 0x%lx in section `%A' is "
                                 "out of range"),
@@ -5542,6 +5569,7 @@ direct:
                                      rel->r_offset) != (bfd_vma) -1)
        {
          _bfd_error_handler
+           /* xgettext:c-format */
            (_("%B(%A+0x%lx): unresolvable %s relocation against symbol `%s'"),
             input_bfd,
             input_section,
@@ -5581,6 +5609,7 @@ check_relocation_error:
          else
            {
              _bfd_error_handler
+               /* xgettext:c-format */
                (_("%B(%A+0x%lx): reloc against `%s': error %d"),
                 input_bfd, input_section,
                 (long) rel->r_offset, name, (int) r);
@@ -5773,6 +5802,7 @@ elf_x86_64_finish_dynamic_symbol (bfd *output_bfd,
 
       /* Check PC-relative offset overflow in PLT entry.  */
       if ((plt_got_pcrel_offset + 0x80000000) > 0xffffffff)
+       /* xgettext:c-format */
        info->callbacks->einfo (_("%F%B: PC-relative offset overflow in PLT entry for `%s'\n"),
                                output_bfd, h->root.root.string);
 
@@ -5831,6 +5861,7 @@ elf_x86_64_finish_dynamic_symbol (bfd *output_bfd,
                 check relocation index for overflow since branch displacement
                 will overflow first.  */
              if (plt0_offset > 0x80000000)
+               /* xgettext:c-format */
                info->callbacks->einfo (_("%F%B: branch displacement overflow in PLT entry for `%s'\n"),
                                        output_bfd, h->root.root.string);
              bfd_put_32 (output_bfd, - plt0_offset,
@@ -5895,6 +5926,7 @@ elf_x86_64_finish_dynamic_symbol (bfd *output_bfd,
       got_after_plt = got->output_section->vma > plt->output_section->vma;
       if ((got_after_plt && got_pcrel_offset < 0)
          || (!got_after_plt && got_pcrel_offset > 0))
+       /* xgettext:c-format */
        info->callbacks->einfo (_("%F%B: PC-relative offset overflow in GOT PLT entry for `%s'\n"),
                                output_bfd, h->root.root.string);
 
@@ -6182,21 +6214,6 @@ elf_x86_64_finish_dynamic_sections (bfd *output_bfd,
              dyn.d_un.d_val = s->size;
              break;
 
-           case DT_RELASZ:
-             /* The procedure linkage table relocs (DT_JMPREL) should
-                not be included in the overall relocs (DT_RELA).
-                Therefore, we override the DT_RELASZ entry here to
-                make it not include the JMPREL relocs.  Since the
-                linker script arranges for .rela.plt to follow all
-                other relocation sections, we don't have to worry
-                about changing the DT_RELA entry.  */
-             if (htab->elf.srelplt != NULL)
-               {
-                 s = htab->elf.srelplt->output_section;
-                 dyn.d_un.d_val -= s->size;
-               }
-             break;
-
            case DT_TLSDESC_PLT:
              s = htab->elf.splt;
              dyn.d_un.d_ptr = s->output_section->vma + s->output_offset
@@ -6726,6 +6743,7 @@ static const struct bfd_elf_special_section
 #define elf_backend_plt_alignment           4
 #define elf_backend_extern_protected_data   1
 #define elf_backend_caches_rawsize         1
+#define elf_backend_dtrel_excludes_plt     1
 
 #define elf_info_to_howto                  elf_x86_64_info_to_howto
 
This page took 0.028358 seconds and 4 git commands to generate.