correct ft32 reloc range test
[deliverable/binutils-gdb.git] / bfd / elfxx-x86.c
index fc08d1b977fc9a238bc57693caefd267bf5a656c..5f55c948edc55bff8b0ccf52387f1af6163418cb 100644 (file)
@@ -179,6 +179,7 @@ elf_x86_allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf)
          asection *s = htab->elf.splt;
          asection *second_s = htab->plt_second;
          asection *got_s = htab->plt_got;
+         bfd_boolean use_plt;
 
          /* If this is the first .plt entry, make room for the special
             first entry.  The .plt section is used by prelink to undo
@@ -196,12 +197,19 @@ elf_x86_allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf)
            }
 
          /* If this symbol is not defined in a regular file, and we are
-            not generating a shared library, then set the symbol to this
-            location in the .plt.  This is required to make function
-            pointers compare as equal between the normal executable and
-            the shared library.  */
-         if (! bfd_link_pic (info)
-             && !h->def_regular)
+            generating PDE, then set the symbol to this location in the
+            .plt.  This is required to make function pointers compare
+            as equal between PDE and the shared library.
+
+            NB: If PLT is PC-relative, we can use the .plt in PIE for
+            function address. */
+         if (h->def_regular)
+           use_plt = FALSE;
+         else if (htab->pcrel_plt)
+           use_plt = ! bfd_link_dll (info);
+         else
+           use_plt = bfd_link_pde (info);
+         if (use_plt)
            {
              if (use_plt_got)
                {
@@ -560,15 +568,15 @@ maybe_set_textrel (struct elf_link_hash_entry *h, void *inf)
 
       info->flags |= DF_TEXTREL;
       /* xgettext:c-format */
-      info->callbacks->minfo (_("%B: dynamic relocation against `%T' "
-                               "in read-only section `%A'\n"),
+      info->callbacks->minfo (_("%pB: dynamic relocation against `%pT' "
+                               "in read-only section `%pA'\n"),
                              sec->owner, h->root.root.string, sec);
 
       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 read-only section `%A'\n"),
+       info->callbacks->einfo (_("%P: %pB: warning: relocation against `%s' "
+                                 "in read-only section `%pA'\n"),
                                sec->owner, h->root.root.string, sec);
 
       /* Not an error, just cut short the traversal.  */
@@ -771,6 +779,7 @@ _bfd_x86_elf_link_hash_table_create (bfd *abfd)
       ret->dt_reloc_sz = DT_RELASZ;
       ret->dt_reloc_ent = DT_RELAENT;
       ret->got_entry_size = 8;
+      ret->pcrel_plt = TRUE;
       ret->tls_get_addr = "__tls_get_addr";
     }
   if (ABI_64_P (abfd))
@@ -798,6 +807,7 @@ _bfd_x86_elf_link_hash_table_create (bfd *abfd)
          ret->dt_reloc_ent = DT_RELENT;
          ret->sizeof_reloc = sizeof (Elf32_External_Rel);
          ret->got_entry_size = 4;
+         ret->pcrel_plt = FALSE;
          ret->pointer_r_type = R_386_32;
          ret->dynamic_interpreter = ELF32_DYNAMIC_INTERPRETER;
          ret->dynamic_interpreter_size
@@ -960,8 +970,8 @@ _bfd_x86_elf_size_dynamic_sections (bfd *output_bfd,
                          || info->error_textrel)
                        /* xgettext:c-format */
                        info->callbacks->einfo
-                         (_("%P: %B: warning: relocation "
-                            "in read-only section `%A'\n"),
+                         (_("%P: %pB: warning: relocation "
+                            "in read-only section `%pA'\n"),
                           p->sec->owner, p->sec);
                    }
                }
@@ -1357,7 +1367,7 @@ _bfd_x86_elf_finish_dynamic_sections (bfd *output_bfd,
       if (bfd_is_abs_section (htab->elf.sgotplt->output_section))
        {
          _bfd_error_handler
-           (_("discarded output section: `%A'"), htab->elf.sgotplt);
+           (_("discarded output section: `%pA'"), htab->elf.sgotplt);
          return NULL;
        }
 
@@ -2262,10 +2272,10 @@ _bfd_x86_elf_parse_gnu_properties (bfd *abfd, unsigned int type,
        {
          _bfd_error_handler
            ((type == GNU_PROPERTY_X86_ISA_1_USED
-             ? _("error: %B: <corrupt x86 ISA used size: 0x%x>")
+             ? _("error: %pB: <corrupt x86 ISA used size: 0x%x>")
              : (type == GNU_PROPERTY_X86_ISA_1_NEEDED
-                ? _("error: %B: <corrupt x86 ISA needed size: 0x%x>")
-                : _("error: %B: <corrupt x86 feature size: 0x%x>"))),
+                ? _("error: %pB: <corrupt x86 ISA needed size: 0x%x>")
+                : _("error: %pB: <corrupt x86 feature size: 0x%x>"))),
             abfd, datasz);
          return property_corrupt;
        }
@@ -2442,7 +2452,7 @@ _bfd_x86_elf_link_setup_gnu_properties
          if (!bfd_set_section_alignment (ebfd, sec, class_align))
            {
 error_alignment:
-             info->callbacks->einfo (_("%F%A: failed to align section\n"),
+             info->callbacks->einfo (_("%F%pA: failed to align section\n"),
                                      sec);
            }
 
This page took 0.024779 seconds and 4 git commands to generate.