* elf-bfd.h (struct elf_link_local_dynamic_entry): Add init_refcount.
(struct elf_backend_data): Add can_refcount. * elf.c (_bfd_elf_link_hash_newfunc): Get rid of a few casts. Set got.refcount and plt.refcount from init_refcount. (_bfd_elf_link_hash_table_init): Set up init_refcount. (_bfd_elf_link_hash_copy_indirect): Reference got/plt.refcount rather than got/plt.offset, and test for <= 0 rather than -1. * elflink.h (size_dynamic_sections): Set init_refcount to -1. * elfxx-target.h (elf_backend_can_refcount): Define. (elfNN_bed): Init can_refcount. * linker.c (_bfd_link_hash_newfunc): Get rid of a few casts. (_bfd_generic_link_hash_newfunc): Likewise. * elf32-cris.c (cris_elf_check_relocs): Modify for refcounts starting from zero. (elf_backend_can_refcount): Define. * elf32-hppa.c (elf32_hppa_check_relocs): Modify for refcounts starting from zero. (elf32_hppa_copy_indirect_symbol): Make static to agree with prototype. (elf_backend_can_refcount): Define. * elf32-i386.c (elf_i386_check_relocs): Modify for refcounts starting from zero. (allocate_dynrelocs): Set plt/got.offset rather than *.refcount. (elf_i386_finish_dynamic_symbol): Expand SHN_UNDEF comment. (elf_i386_finish_dynamic_sections): Use local var so line < 80 chars. (elf_backend_can_refcount): Define. (elf_i386_copy_indirect_symbol): Make static to agree with prototype. Formatting fix. * elf32-m68k.c (elf_m68k_check_relocs): Modify for refcounts starting from zero. (elf_backend_can_refcount): Define. * elf32-ppc.c (ppc_elf_check_relocs): Modify for refcounts starting from zero. (elf_backend_can_refcount): Define. * elf32-s390.c (elf_s390_check_relocs): Modify for refcounts starting from zero. (elf_backend_can_refcount): Define. * elf64-s390.c (elf_s390_check_relocs): Modify for refcounts starting from zero. (elf_backend_can_refcount): Define. * elf64-x86-64.c (elf64_x86_64_check_relocs): Modify for refcounts starting from zero. (elf_backend_can_refcount): Define.
This commit is contained in:
parent
21d17a588f
commit
51b64d56a7
14 changed files with 202 additions and 226 deletions
49
bfd/elf.c
49
bfd/elf.c
|
@ -944,31 +944,31 @@ _bfd_elf_link_hash_newfunc (entry, table, string)
|
|||
struct bfd_hash_table *table;
|
||||
const char *string;
|
||||
{
|
||||
struct elf_link_hash_entry *ret = (struct elf_link_hash_entry *) entry;
|
||||
|
||||
/* Allocate the structure if it has not already been allocated by a
|
||||
subclass. */
|
||||
if (ret == (struct elf_link_hash_entry *) NULL)
|
||||
ret = ((struct elf_link_hash_entry *)
|
||||
bfd_hash_allocate (table, sizeof (struct elf_link_hash_entry)));
|
||||
if (ret == (struct elf_link_hash_entry *) NULL)
|
||||
return (struct bfd_hash_entry *) ret;
|
||||
if (entry == NULL)
|
||||
{
|
||||
entry = bfd_hash_allocate (table, sizeof (struct elf_link_hash_entry));
|
||||
if (entry == NULL)
|
||||
return entry;
|
||||
}
|
||||
|
||||
/* Call the allocation method of the superclass. */
|
||||
ret = ((struct elf_link_hash_entry *)
|
||||
_bfd_link_hash_newfunc ((struct bfd_hash_entry *) ret,
|
||||
table, string));
|
||||
if (ret != (struct elf_link_hash_entry *) NULL)
|
||||
entry = _bfd_link_hash_newfunc (entry, table, string);
|
||||
if (entry != NULL)
|
||||
{
|
||||
struct elf_link_hash_entry *ret = (struct elf_link_hash_entry *) entry;
|
||||
struct elf_link_hash_table *htab = (struct elf_link_hash_table *) table;
|
||||
|
||||
/* Set local fields. */
|
||||
ret->indx = -1;
|
||||
ret->size = 0;
|
||||
ret->dynindx = -1;
|
||||
ret->dynstr_index = 0;
|
||||
ret->weakdef = NULL;
|
||||
ret->got.offset = (bfd_vma) -1;
|
||||
ret->plt.offset = (bfd_vma) -1;
|
||||
ret->linker_section_pointer = (elf_linker_section_pointers_t *)0;
|
||||
ret->got.refcount = htab->init_refcount;
|
||||
ret->plt.refcount = htab->init_refcount;
|
||||
ret->linker_section_pointer = NULL;
|
||||
ret->verinfo.verdef = NULL;
|
||||
ret->vtable_entries_used = NULL;
|
||||
ret->vtable_entries_size = 0;
|
||||
|
@ -982,7 +982,7 @@ _bfd_elf_link_hash_newfunc (entry, table, string)
|
|||
ret->elf_link_hash_flags = ELF_LINK_NON_ELF;
|
||||
}
|
||||
|
||||
return (struct bfd_hash_entry *) ret;
|
||||
return entry;
|
||||
}
|
||||
|
||||
/* Copy data from an indirect symbol to its direct symbol, hiding the
|
||||
|
@ -1002,21 +1002,21 @@ _bfd_elf_link_hash_copy_indirect (dir, ind)
|
|||
| ELF_LINK_HASH_REF_REGULAR_NONWEAK
|
||||
| ELF_LINK_NON_GOT_REF));
|
||||
|
||||
/* Copy over the global and procedure linkage table offset entries.
|
||||
/* Copy over the global and procedure linkage table refcount entries.
|
||||
These may have been already set up by a check_relocs routine. */
|
||||
if (dir->got.offset == (bfd_vma) -1)
|
||||
if (dir->got.refcount <= 0)
|
||||
{
|
||||
dir->got.offset = ind->got.offset;
|
||||
ind->got.offset = (bfd_vma) -1;
|
||||
dir->got.refcount = ind->got.refcount;
|
||||
ind->got.refcount = 0;
|
||||
}
|
||||
BFD_ASSERT (ind->got.offset == (bfd_vma) -1);
|
||||
BFD_ASSERT (ind->got.refcount <= 0);
|
||||
|
||||
if (dir->plt.offset == (bfd_vma) -1)
|
||||
if (dir->plt.refcount <= 0)
|
||||
{
|
||||
dir->plt.offset = ind->plt.offset;
|
||||
ind->plt.offset = (bfd_vma) -1;
|
||||
dir->plt.refcount = ind->plt.refcount;
|
||||
ind->plt.refcount = 0;
|
||||
}
|
||||
BFD_ASSERT (ind->plt.offset == (bfd_vma) -1);
|
||||
BFD_ASSERT (ind->plt.refcount <= 0);
|
||||
|
||||
if (dir->dynindx == -1)
|
||||
{
|
||||
|
@ -1053,6 +1053,7 @@ _bfd_elf_link_hash_table_init (table, abfd, newfunc)
|
|||
|
||||
table->dynamic_sections_created = false;
|
||||
table->dynobj = NULL;
|
||||
table->init_refcount = get_elf_backend_data (abfd)->can_refcount - 1;
|
||||
/* The first dynamic symbol is a dummy. */
|
||||
table->dynsymcount = 1;
|
||||
table->dynstr = NULL;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue