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:
parent
09369a733c
commit
b7c801cac8
49
external/gpl3/binutils/dist/bfd/elf32-vax.c
vendored
49
external/gpl3/binutils/dist/bfd/elf32-vax.c
vendored
@ -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)
|
||||
|
Loading…
Reference in New Issue
Block a user