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
}
/* 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)
{
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. */
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))
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
|| 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);
}
}
/* Don't allocate .got.plt section if there are no GOT nor PLT
entries and there is no reference to _GLOBAL_OFFSET_TABLE_. */
if ((htab->elf.hgot == NULL
- || !htab->elf.hgot->ref_regular_nonweak)
+ || !htab->got_referenced)
&& (htab->elf.sgotplt->size == bed->got_header_size)
&& (htab->elf.splt == NULL
|| htab->elf.splt->size == 0)
|| htab->elf.iplt->size == 0)
&& (htab->elf.igotplt == NULL
|| htab->elf.igotplt->size == 0))
- htab->elf.sgotplt->size = 0;
+ {
+ htab->elf.sgotplt->size = 0;
+ /* Solaris requires to keep _GLOBAL_OFFSET_TABLE_ even if it
+ isn't used. */
+ if (htab->elf.hgot != NULL && htab->target_os != is_solaris)
+ {
+ /* Remove the unused _GLOBAL_OFFSET_TABLE_ from symbol
+ table. */
+ htab->elf.hgot->root.type = bfd_link_hash_undefined;
+ htab->elf.hgot->root.u.undef.abfd
+ = htab->elf.hgot->root.u.def.section->owner;
+ htab->elf.hgot->root.linker_def = 0;
+ htab->elf.hgot->ref_regular = 0;
+ htab->elf.hgot->def_regular = 0;
+ }
+ }
}
if (_bfd_elf_eh_frame_present (info))
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;
}
{
_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;
}
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);
}