Two fixes. Better PLT pruning (don't emit PLTs for local functions).

If emitting a reloc against a readonly section in a shared image,
cause TEXTREL to be set.
This commit is contained in:
matt 2012-07-17 21:37:21 +00:00
parent 09369a733c
commit b7c801cac8

View File

@ -973,39 +973,21 @@ elf_vax_adjust_dynamic_symbol (info, h)
if (h->type == STT_FUNC
|| h->needs_plt)
{
if (! info->shared
&& !h->def_dynamic
&& !h->ref_dynamic
/* We must always create the plt entry if it was referenced
by a PLTxxO relocation. In this case we already recorded
it as a dynamic symbol. */
&& h->dynindx == -1)
if (h->plt.refcount == 0
|| SYMBOL_CALLS_LOCAL (info, 0)
|| (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
&& h->root.type == bfd_link_hash_undefweak))
{
/* This case can occur if we saw a PLTxx reloc in an input
file, but the symbol was never referred to by a dynamic
object. In such a case, we don't actually need to build
a procedure linkage table, and we can just do a PCxx
reloc instead. */
BFD_ASSERT (h->needs_plt);
object, or if all references were garbage collected.. In
such a case, we don't actually need to build a procedure
linkage table, and we can just do a PCxx reloc instead. */
h->plt.offset = (bfd_vma) -1;
return TRUE;
}
/* GC may have rendered this entry unused. */
if (h->plt.refcount <= 0)
{
h->needs_plt = 0;
h->plt.offset = (bfd_vma) -1;
return TRUE;
}
/* Make sure this symbol is output as a dynamic symbol. */
if (h->dynindx == -1)
{
if (! bfd_elf_link_record_dynamic_symbol (info, h))
return FALSE;
}
s = bfd_get_section_by_name (dynobj, ".plt");
BFD_ASSERT (s != NULL);
@ -1751,14 +1733,15 @@ elf_vax_relocate_section (bfd *output_bfd,
}
}
if (strcmp (bfd_get_section_name (input_bfd, input_section),
".text") == 0 ||
(info->shared
&& ELF32_R_TYPE(outrel.r_info) != R_VAX_32
&& ELF32_R_TYPE(outrel.r_info) != R_VAX_RELATIVE
&& ELF32_R_TYPE(outrel.r_info) != R_VAX_COPY
&& ELF32_R_TYPE(outrel.r_info) != R_VAX_JMP_SLOT
&& ELF32_R_TYPE(outrel.r_info) != R_VAX_GLOB_DAT))
if (input_section->flags & SEC_READONLY)
info->flags |= DF_TEXTREL;
if (input_section->flags & SEC_READONLY
|| (ELF32_R_TYPE(outrel.r_info) != R_VAX_32
&& ELF32_R_TYPE(outrel.r_info) != R_VAX_RELATIVE
&& ELF32_R_TYPE(outrel.r_info) != R_VAX_COPY
&& ELF32_R_TYPE(outrel.r_info) != R_VAX_JMP_SLOT
&& ELF32_R_TYPE(outrel.r_info) != R_VAX_GLOB_DAT))
{
if (h != NULL)
(*_bfd_error_handler)