Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/external/gpl3/binutils/dist/bfd Two fixes. Better PLT pruni...
details: https://anonhg.NetBSD.org/src/rev/d9393d191507
branches: trunk
changeset: 780246:d9393d191507
user: matt <matt%NetBSD.org@localhost>
date: Tue Jul 17 21:37:21 2012 +0000
description:
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.
diffstat:
external/gpl3/binutils/dist/bfd/elf32-vax.c | 51 +++++++++-------------------
1 files changed, 17 insertions(+), 34 deletions(-)
diffs (75 lines):
diff -r 40c2478bc13e -r d9393d191507 external/gpl3/binutils/dist/bfd/elf32-vax.c
--- a/external/gpl3/binutils/dist/bfd/elf32-vax.c Tue Jul 17 21:35:26 2012 +0000
+++ b/external/gpl3/binutils/dist/bfd/elf32-vax.c Tue Jul 17 21:37:21 2012 +0000
@@ -973,39 +973,21 @@
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;
+ h->needs_plt = 0;
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 @@
}
}
- 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)
Home |
Main Index |
Thread Index |
Old Index