ELF: Copy dyn_relocs in _bfd_elf_link_hash_copy_indirect
Copy dyn_relocs in _bfd_elf_link_hash_copy_indirect instead of in each target backend. PR ld/26067 * elf32-arm.c (elf32_arm_copy_indirect_symbol): Don't copy dyn_relocs. * elf32-csky.c (csky_elf_copy_indirect_symbol): Likewise. * elf32-hppa.c (elf32_hppa_copy_indirect_symbol): Likewise. * elf32-metag.c (elf_metag_copy_indirect_symbol): Likewise. * elf32-microblaze.c (microblaze_elf_copy_indirect_symbol): Likewise. * elf32-nds32.c (nds32_elf_copy_indirect_symbol): Likewise. * elf32-nios2.c (nios2_elf32_copy_indirect_symbol): Likewise. * elf32-or1k.c (or1k_elf_copy_indirect_symbol): Likewise. * elf32-s390.c (elf_s390_copy_indirect_symbol): Likewise. * elf32-sh.c (sh_elf_copy_indirect_symbol): Likewise. * elf32-tilepro.c (tilepro_elf_copy_indirect_symbol): Likewise. * elf64-s390.c (elf_s390_copy_indirect_symbol): Likewise. * elfnn-aarch64.c (elfNN_aarch64_copy_indirect_symbol): Likewise. * elfnn-riscv.c (riscv_elf_copy_indirect_symbol): Likewise. * elfxx-sparc.c (_bfd_sparc_elf_copy_indirect_symbol): Likewise. * elfxx-tilegx.c (tilegx_elf_copy_indirect_symbol): Likewise. * elfxx-x86.c (_bfd_x86_elf_copy_indirect_symbol): Likewise. * elf32-lm32.c (lm32_elf_copy_indirect_symbol): Removed. (elf_backend_copy_indirect_symbol): Likewise. * elf32-m32r.c (m32r_elf_copy_indirect_symbol): Removed. (elf_backend_copy_indirect_symbol): Likewise. * elflink.c (_bfd_elf_link_hash_copy_indirect): Copy dyn_relocs.
This commit is contained in:
parent
5dbc8b372f
commit
ad172eaa4f
@ -1,3 +1,31 @@
|
||||
2020-06-03 H.J. Lu <hongjiu.lu@intel.com>
|
||||
|
||||
PR ld/26067
|
||||
* elf32-arm.c (elf32_arm_copy_indirect_symbol): Don't copy
|
||||
dyn_relocs.
|
||||
* elf32-csky.c (csky_elf_copy_indirect_symbol): Likewise.
|
||||
* elf32-hppa.c (elf32_hppa_copy_indirect_symbol): Likewise.
|
||||
* elf32-metag.c (elf_metag_copy_indirect_symbol): Likewise.
|
||||
* elf32-microblaze.c (microblaze_elf_copy_indirect_symbol):
|
||||
Likewise.
|
||||
* elf32-nds32.c (nds32_elf_copy_indirect_symbol): Likewise.
|
||||
* elf32-nios2.c (nios2_elf32_copy_indirect_symbol): Likewise.
|
||||
* elf32-or1k.c (or1k_elf_copy_indirect_symbol): Likewise.
|
||||
* elf32-s390.c (elf_s390_copy_indirect_symbol): Likewise.
|
||||
* elf32-sh.c (sh_elf_copy_indirect_symbol): Likewise.
|
||||
* elf32-tilepro.c (tilepro_elf_copy_indirect_symbol): Likewise.
|
||||
* elf64-s390.c (elf_s390_copy_indirect_symbol): Likewise.
|
||||
* elfnn-aarch64.c (elfNN_aarch64_copy_indirect_symbol): Likewise.
|
||||
* elfnn-riscv.c (riscv_elf_copy_indirect_symbol): Likewise.
|
||||
* elfxx-sparc.c (_bfd_sparc_elf_copy_indirect_symbol): Likewise.
|
||||
* elfxx-tilegx.c (tilegx_elf_copy_indirect_symbol): Likewise.
|
||||
* elfxx-x86.c (_bfd_x86_elf_copy_indirect_symbol): Likewise.
|
||||
* elf32-lm32.c (lm32_elf_copy_indirect_symbol): Removed.
|
||||
(elf_backend_copy_indirect_symbol): Likewise.
|
||||
* elf32-m32r.c (m32r_elf_copy_indirect_symbol): Removed.
|
||||
(elf_backend_copy_indirect_symbol): Likewise.
|
||||
* elflink.c (_bfd_elf_link_hash_copy_indirect): Copy dyn_relocs.
|
||||
|
||||
2020-06-03 H.J. Lu <hongjiu.lu@intel.com>
|
||||
|
||||
PR ld/26067
|
||||
|
@ -4028,37 +4028,6 @@ elf32_arm_copy_indirect_symbol (struct bfd_link_info *info,
|
||||
edir = (struct elf32_arm_link_hash_entry *) dir;
|
||||
eind = (struct elf32_arm_link_hash_entry *) ind;
|
||||
|
||||
if (ind->dyn_relocs != NULL)
|
||||
{
|
||||
if (dir->dyn_relocs != NULL)
|
||||
{
|
||||
struct elf_dyn_relocs **pp;
|
||||
struct elf_dyn_relocs *p;
|
||||
|
||||
/* Add reloc counts against the indirect sym to the direct sym
|
||||
list. Merge any entries against the same section. */
|
||||
for (pp = &ind->dyn_relocs; (p = *pp) != NULL; )
|
||||
{
|
||||
struct elf_dyn_relocs *q;
|
||||
|
||||
for (q = dir->dyn_relocs; q != NULL; q = q->next)
|
||||
if (q->sec == p->sec)
|
||||
{
|
||||
q->pc_count += p->pc_count;
|
||||
q->count += p->count;
|
||||
*pp = p->next;
|
||||
break;
|
||||
}
|
||||
if (q == NULL)
|
||||
pp = &p->next;
|
||||
}
|
||||
*pp = dir->dyn_relocs;
|
||||
}
|
||||
|
||||
dir->dyn_relocs = ind->dyn_relocs;
|
||||
ind->dyn_relocs = NULL;
|
||||
}
|
||||
|
||||
if (ind->root.type == bfd_link_hash_indirect)
|
||||
{
|
||||
/* Copy over PLT info. */
|
||||
|
@ -2447,35 +2447,6 @@ csky_elf_copy_indirect_symbol (struct bfd_link_info *info,
|
||||
edir = (struct csky_elf_link_hash_entry *) dir;
|
||||
eind = (struct csky_elf_link_hash_entry *) ind;
|
||||
|
||||
if (ind->dyn_relocs != NULL)
|
||||
{
|
||||
if (dir->dyn_relocs != NULL)
|
||||
{
|
||||
struct elf_dyn_relocs **pp;
|
||||
struct elf_dyn_relocs *p;
|
||||
|
||||
/* Add reloc counts against the indirect sym to the direct sym
|
||||
list. Merge any entries against the same section. */
|
||||
for (pp = &ind->dyn_relocs; (p = *pp) != NULL; )
|
||||
{
|
||||
struct elf_dyn_relocs *q;
|
||||
|
||||
for (q = dir->dyn_relocs; q != NULL; q = q->next)
|
||||
if (q->sec == p->sec)
|
||||
{
|
||||
q->pc_count += p->pc_count;
|
||||
q->count += p->count;
|
||||
*pp = p->next;
|
||||
break;
|
||||
}
|
||||
if (q == NULL)
|
||||
pp = &p->next;
|
||||
}
|
||||
*pp = dir->dyn_relocs;
|
||||
}
|
||||
dir->dyn_relocs = ind->dyn_relocs;
|
||||
ind->dyn_relocs = NULL;
|
||||
}
|
||||
if (ind->root.type == bfd_link_hash_indirect
|
||||
&& dir->got.refcount <= 0)
|
||||
{
|
||||
|
@ -1040,42 +1040,6 @@ elf32_hppa_copy_indirect_symbol (struct bfd_link_info *info,
|
||||
hh_dir = hppa_elf_hash_entry (eh_dir);
|
||||
hh_ind = hppa_elf_hash_entry (eh_ind);
|
||||
|
||||
if (eh_ind->dyn_relocs != NULL
|
||||
&& eh_ind->root.type == bfd_link_hash_indirect)
|
||||
{
|
||||
if (eh_dir->dyn_relocs != NULL)
|
||||
{
|
||||
struct elf_dyn_relocs **hdh_pp;
|
||||
struct elf_dyn_relocs *hdh_p;
|
||||
|
||||
/* Add reloc counts against the indirect sym to the direct sym
|
||||
list. Merge any entries against the same section. */
|
||||
for (hdh_pp = &eh_ind->dyn_relocs; (hdh_p = *hdh_pp) != NULL; )
|
||||
{
|
||||
struct elf_dyn_relocs *hdh_q;
|
||||
|
||||
for (hdh_q = eh_dir->dyn_relocs;
|
||||
hdh_q != NULL;
|
||||
hdh_q = hdh_q->next)
|
||||
if (hdh_q->sec == hdh_p->sec)
|
||||
{
|
||||
#if RELATIVE_DYNRELOCS
|
||||
hdh_q->pc_count += hdh_p->pc_count;
|
||||
#endif
|
||||
hdh_q->count += hdh_p->count;
|
||||
*hdh_pp = hdh_p->next;
|
||||
break;
|
||||
}
|
||||
if (hdh_q == NULL)
|
||||
hdh_pp = &hdh_p->next;
|
||||
}
|
||||
*hdh_pp = eh_dir->dyn_relocs;
|
||||
}
|
||||
|
||||
eh_dir->dyn_relocs = eh_ind->dyn_relocs;
|
||||
eh_ind->dyn_relocs = NULL;
|
||||
}
|
||||
|
||||
if (eh_ind->root.type == bfd_link_hash_indirect)
|
||||
{
|
||||
hh_dir->plabel |= hh_ind->plabel;
|
||||
|
@ -2390,47 +2390,6 @@ lm32_elf_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info)
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/* Copy the extra info we tack onto an elf_link_hash_entry. */
|
||||
|
||||
static void
|
||||
lm32_elf_copy_indirect_symbol (struct bfd_link_info *info,
|
||||
struct elf_link_hash_entry *dir,
|
||||
struct elf_link_hash_entry *ind)
|
||||
{
|
||||
if (ind->dyn_relocs != NULL)
|
||||
{
|
||||
if (dir->dyn_relocs != NULL)
|
||||
{
|
||||
struct elf_dyn_relocs **pp;
|
||||
struct elf_dyn_relocs *p;
|
||||
|
||||
/* Add reloc counts against the indirect sym to the direct sym
|
||||
list. Merge any entries against the same section. */
|
||||
for (pp = &ind->dyn_relocs; (p = *pp) != NULL;)
|
||||
{
|
||||
struct elf_dyn_relocs *q;
|
||||
|
||||
for (q = dir->dyn_relocs; q != NULL; q = q->next)
|
||||
if (q->sec == p->sec)
|
||||
{
|
||||
q->pc_count += p->pc_count;
|
||||
q->count += p->count;
|
||||
*pp = p->next;
|
||||
break;
|
||||
}
|
||||
if (q == NULL)
|
||||
pp = &p->next;
|
||||
}
|
||||
*pp = dir->dyn_relocs;
|
||||
}
|
||||
|
||||
dir->dyn_relocs = ind->dyn_relocs;
|
||||
ind->dyn_relocs = NULL;
|
||||
}
|
||||
|
||||
_bfd_elf_link_hash_copy_indirect (info, dir, ind);
|
||||
}
|
||||
|
||||
static bfd_boolean
|
||||
lm32_elf_always_size_sections (bfd *output_bfd, struct bfd_link_info *info)
|
||||
{
|
||||
@ -2518,7 +2477,6 @@ lm32_elf_fdpic_copy_private_bfd_data (bfd *ibfd, bfd *obfd)
|
||||
#define bfd_elf32_bfd_link_hash_table_create lm32_elf_link_hash_table_create
|
||||
#define elf_backend_check_relocs lm32_elf_check_relocs
|
||||
#define elf_backend_reloc_type_class lm32_elf_reloc_type_class
|
||||
#define elf_backend_copy_indirect_symbol lm32_elf_copy_indirect_symbol
|
||||
#define elf_backend_size_dynamic_sections lm32_elf_size_dynamic_sections
|
||||
#define elf_backend_omit_section_dynsym _bfd_elf_omit_section_dynsym_all
|
||||
#define elf_backend_create_dynamic_sections lm32_elf_create_dynamic_sections
|
||||
|
@ -1658,47 +1658,6 @@ m32r_elf_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info)
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/* Copy the extra info we tack onto an elf_link_hash_entry. */
|
||||
|
||||
static void
|
||||
m32r_elf_copy_indirect_symbol (struct bfd_link_info *info,
|
||||
struct elf_link_hash_entry *dir,
|
||||
struct elf_link_hash_entry *ind)
|
||||
{
|
||||
if (ind->dyn_relocs != NULL)
|
||||
{
|
||||
if (dir->dyn_relocs != NULL)
|
||||
{
|
||||
struct elf_dyn_relocs **pp;
|
||||
struct elf_dyn_relocs *p;
|
||||
|
||||
/* Add reloc counts against the indirect sym to the direct sym
|
||||
list. Merge any entries against the same section. */
|
||||
for (pp = &ind->dyn_relocs; (p = *pp) != NULL;)
|
||||
{
|
||||
struct elf_dyn_relocs *q;
|
||||
|
||||
for (q = dir->dyn_relocs; q != NULL; q = q->next)
|
||||
if (q->sec == p->sec)
|
||||
{
|
||||
q->pc_count += p->pc_count;
|
||||
q->count += p->count;
|
||||
*pp = p->next;
|
||||
break;
|
||||
}
|
||||
if (q == NULL)
|
||||
pp = &p->next;
|
||||
}
|
||||
*pp = dir->dyn_relocs;
|
||||
}
|
||||
|
||||
dir->dyn_relocs = ind->dyn_relocs;
|
||||
ind->dyn_relocs = NULL;
|
||||
}
|
||||
|
||||
_bfd_elf_link_hash_copy_indirect (info, dir, ind);
|
||||
}
|
||||
|
||||
|
||||
/* Adjust a symbol defined by a dynamic object and referenced by a
|
||||
regular object. The current definition is in some section of the
|
||||
@ -3811,7 +3770,6 @@ m32r_elf_reloc_type_class (const struct bfd_link_info *info ATTRIBUTE_UNUSED,
|
||||
#define elf_backend_adjust_dynamic_symbol m32r_elf_adjust_dynamic_symbol
|
||||
#define elf_backend_finish_dynamic_symbol m32r_elf_finish_dynamic_symbol
|
||||
#define elf_backend_reloc_type_class m32r_elf_reloc_type_class
|
||||
#define elf_backend_copy_indirect_symbol m32r_elf_copy_indirect_symbol
|
||||
|
||||
#define elf_backend_can_gc_sections 1
|
||||
/*#if !USE_REL
|
||||
|
@ -2390,41 +2390,6 @@ elf_metag_copy_indirect_symbol (struct bfd_link_info *info,
|
||||
hh_dir = metag_elf_hash_entry (eh_dir);
|
||||
hh_ind = metag_elf_hash_entry (eh_ind);
|
||||
|
||||
if (eh_ind->dyn_relocs != NULL)
|
||||
{
|
||||
if (eh_dir->dyn_relocs != NULL)
|
||||
{
|
||||
struct elf_dyn_relocs **hdh_pp;
|
||||
struct elf_dyn_relocs *hdh_p;
|
||||
|
||||
if (eh_ind->root.type == bfd_link_hash_indirect)
|
||||
abort ();
|
||||
|
||||
/* Add reloc counts against the weak sym to the strong sym
|
||||
list. Merge any entries against the same section. */
|
||||
for (hdh_pp = &eh_ind->dyn_relocs; (hdh_p = *hdh_pp) != NULL; )
|
||||
{
|
||||
struct elf_dyn_relocs *hdh_q;
|
||||
|
||||
for (hdh_q = eh_dir->dyn_relocs; hdh_q != NULL;
|
||||
hdh_q = hdh_q->next)
|
||||
if (hdh_q->sec == hdh_p->sec)
|
||||
{
|
||||
hdh_q->pc_count += hdh_p->pc_count;
|
||||
hdh_q->count += hdh_p->count;
|
||||
*hdh_pp = hdh_p->next;
|
||||
break;
|
||||
}
|
||||
if (hdh_q == NULL)
|
||||
hdh_pp = &hdh_p->next;
|
||||
}
|
||||
*hdh_pp = eh_dir->dyn_relocs;
|
||||
}
|
||||
|
||||
eh_dir->dyn_relocs = eh_ind->dyn_relocs;
|
||||
eh_ind->dyn_relocs = NULL;
|
||||
}
|
||||
|
||||
if (eh_ind->root.type == bfd_link_hash_indirect
|
||||
&& eh_dir->got.refcount <= 0)
|
||||
{
|
||||
|
@ -2575,40 +2575,6 @@ microblaze_elf_copy_indirect_symbol (struct bfd_link_info *info,
|
||||
edir = (struct elf32_mb_link_hash_entry *) dir;
|
||||
eind = (struct elf32_mb_link_hash_entry *) ind;
|
||||
|
||||
if (ind->dyn_relocs != NULL)
|
||||
{
|
||||
if (dir->dyn_relocs != NULL)
|
||||
{
|
||||
struct elf_dyn_relocs **pp;
|
||||
struct elf_dyn_relocs *p;
|
||||
|
||||
if (ind->root.type == bfd_link_hash_indirect)
|
||||
abort ();
|
||||
|
||||
/* Add reloc counts against the weak sym to the strong sym
|
||||
list. Merge any entries against the same section. */
|
||||
for (pp = &ind->dyn_relocs; (p = *pp) != NULL; )
|
||||
{
|
||||
struct elf_dyn_relocs *q;
|
||||
|
||||
for (q = dir->dyn_relocs; q != NULL; q = q->next)
|
||||
if (q->sec == p->sec)
|
||||
{
|
||||
q->pc_count += p->pc_count;
|
||||
q->count += p->count;
|
||||
*pp = p->next;
|
||||
break;
|
||||
}
|
||||
if (q == NULL)
|
||||
pp = &p->next;
|
||||
}
|
||||
*pp = dir->dyn_relocs;
|
||||
}
|
||||
|
||||
dir->dyn_relocs = ind->dyn_relocs;
|
||||
ind->dyn_relocs = NULL;
|
||||
}
|
||||
|
||||
edir->tls_mask |= eind->tls_mask;
|
||||
|
||||
_bfd_elf_link_hash_copy_indirect (info, dir, ind);
|
||||
|
@ -3874,40 +3874,6 @@ nds32_elf_copy_indirect_symbol (struct bfd_link_info *info,
|
||||
edir = (struct elf_nds32_link_hash_entry *) dir;
|
||||
eind = (struct elf_nds32_link_hash_entry *) ind;
|
||||
|
||||
if (ind->dyn_relocs != NULL)
|
||||
{
|
||||
if (dir->dyn_relocs != NULL)
|
||||
{
|
||||
struct elf_dyn_relocs **pp;
|
||||
struct elf_dyn_relocs *p;
|
||||
|
||||
if (ind->root.type == bfd_link_hash_indirect)
|
||||
abort ();
|
||||
|
||||
/* Add reloc counts against the weak sym to the strong sym
|
||||
list. Merge any entries against the same section. */
|
||||
for (pp = &ind->dyn_relocs; (p = *pp) != NULL;)
|
||||
{
|
||||
struct elf_dyn_relocs *q;
|
||||
|
||||
for (q = dir->dyn_relocs; q != NULL; q = q->next)
|
||||
if (q->sec == p->sec)
|
||||
{
|
||||
q->pc_count += p->pc_count;
|
||||
q->count += p->count;
|
||||
*pp = p->next;
|
||||
break;
|
||||
}
|
||||
if (q == NULL)
|
||||
pp = &p->next;
|
||||
}
|
||||
*pp = dir->dyn_relocs;
|
||||
}
|
||||
|
||||
dir->dyn_relocs = ind->dyn_relocs;
|
||||
ind->dyn_relocs = NULL;
|
||||
}
|
||||
|
||||
if (ind->root.type == bfd_link_hash_indirect)
|
||||
{
|
||||
if (dir->got.refcount <= 0)
|
||||
|
@ -4637,37 +4637,6 @@ nios2_elf32_copy_indirect_symbol (struct bfd_link_info *info,
|
||||
edir = (struct elf32_nios2_link_hash_entry *) dir;
|
||||
eind = (struct elf32_nios2_link_hash_entry *) ind;
|
||||
|
||||
if (ind->dyn_relocs != NULL)
|
||||
{
|
||||
if (dir->dyn_relocs != NULL)
|
||||
{
|
||||
struct elf_dyn_relocs **pp;
|
||||
struct elf_dyn_relocs *p;
|
||||
|
||||
/* Add reloc counts against the indirect sym to the direct sym
|
||||
list. Merge any entries against the same section. */
|
||||
for (pp = &ind->dyn_relocs; (p = *pp) != NULL; )
|
||||
{
|
||||
struct elf_dyn_relocs *q;
|
||||
|
||||
for (q = dir->dyn_relocs; q != NULL; q = q->next)
|
||||
if (q->sec == p->sec)
|
||||
{
|
||||
q->pc_count += p->pc_count;
|
||||
q->count += p->count;
|
||||
*pp = p->next;
|
||||
break;
|
||||
}
|
||||
if (q == NULL)
|
||||
pp = &p->next;
|
||||
}
|
||||
*pp = dir->dyn_relocs;
|
||||
}
|
||||
|
||||
dir->dyn_relocs = ind->dyn_relocs;
|
||||
ind->dyn_relocs = NULL;
|
||||
}
|
||||
|
||||
if (ind->root.type == bfd_link_hash_indirect
|
||||
&& dir->got.refcount <= 0)
|
||||
{
|
||||
|
@ -3177,37 +3177,6 @@ or1k_elf_copy_indirect_symbol (struct bfd_link_info *info,
|
||||
edir = (struct elf_or1k_link_hash_entry *) dir;
|
||||
eind = (struct elf_or1k_link_hash_entry *) ind;
|
||||
|
||||
if (ind->dyn_relocs != NULL)
|
||||
{
|
||||
if (dir->dyn_relocs != NULL)
|
||||
{
|
||||
struct elf_dyn_relocs **pp;
|
||||
struct elf_dyn_relocs *p;
|
||||
|
||||
/* Add reloc counts against the indirect sym to the direct sym
|
||||
list. Merge any entries against the same section. */
|
||||
for (pp = &ind->dyn_relocs; (p = *pp) != NULL;)
|
||||
{
|
||||
struct elf_dyn_relocs *q;
|
||||
|
||||
for (q = dir->dyn_relocs; q != NULL; q = q->next)
|
||||
if (q->sec == p->sec)
|
||||
{
|
||||
q->pc_count += p->pc_count;
|
||||
q->count += p->count;
|
||||
*pp = p->next;
|
||||
break;
|
||||
}
|
||||
if (q == NULL)
|
||||
pp = &p->next;
|
||||
}
|
||||
*pp = dir->dyn_relocs;
|
||||
}
|
||||
|
||||
dir->dyn_relocs = ind->dyn_relocs;
|
||||
ind->dyn_relocs = NULL;
|
||||
}
|
||||
|
||||
if (ind->root.type == bfd_link_hash_indirect)
|
||||
{
|
||||
if (dir->got.refcount <= 0)
|
||||
|
@ -828,37 +828,6 @@ elf_s390_copy_indirect_symbol (struct bfd_link_info *info,
|
||||
edir = (struct elf_s390_link_hash_entry *) dir;
|
||||
eind = (struct elf_s390_link_hash_entry *) ind;
|
||||
|
||||
if (ind->dyn_relocs != NULL)
|
||||
{
|
||||
if (dir->dyn_relocs != NULL)
|
||||
{
|
||||
struct elf_dyn_relocs **pp;
|
||||
struct elf_dyn_relocs *p;
|
||||
|
||||
/* Add reloc counts against the indirect sym to the direct sym
|
||||
list. Merge any entries against the same section. */
|
||||
for (pp = &ind->dyn_relocs; (p = *pp) != NULL; )
|
||||
{
|
||||
struct elf_dyn_relocs *q;
|
||||
|
||||
for (q = dir->dyn_relocs; q != NULL; q = q->next)
|
||||
if (q->sec == p->sec)
|
||||
{
|
||||
q->pc_count += p->pc_count;
|
||||
q->count += p->count;
|
||||
*pp = p->next;
|
||||
break;
|
||||
}
|
||||
if (q == NULL)
|
||||
pp = &p->next;
|
||||
}
|
||||
*pp = dir->dyn_relocs;
|
||||
}
|
||||
|
||||
dir->dyn_relocs = ind->dyn_relocs;
|
||||
ind->dyn_relocs = NULL;
|
||||
}
|
||||
|
||||
if (ind->root.type == bfd_link_hash_indirect
|
||||
&& dir->got.refcount <= 0)
|
||||
{
|
||||
|
@ -5303,36 +5303,6 @@ sh_elf_copy_indirect_symbol (struct bfd_link_info *info,
|
||||
edir = (struct elf_sh_link_hash_entry *) dir;
|
||||
eind = (struct elf_sh_link_hash_entry *) ind;
|
||||
|
||||
if (ind->dyn_relocs != NULL)
|
||||
{
|
||||
if (dir->dyn_relocs != NULL)
|
||||
{
|
||||
struct elf_dyn_relocs **pp;
|
||||
struct elf_dyn_relocs *p;
|
||||
|
||||
/* Add reloc counts against the indirect sym to the direct sym
|
||||
list. Merge any entries against the same section. */
|
||||
for (pp = &ind->dyn_relocs; (p = *pp) != NULL; )
|
||||
{
|
||||
struct elf_dyn_relocs *q;
|
||||
|
||||
for (q = dir->dyn_relocs; q != NULL; q = q->next)
|
||||
if (q->sec == p->sec)
|
||||
{
|
||||
q->pc_count += p->pc_count;
|
||||
q->count += p->count;
|
||||
*pp = p->next;
|
||||
break;
|
||||
}
|
||||
if (q == NULL)
|
||||
pp = &p->next;
|
||||
}
|
||||
*pp = dir->dyn_relocs;
|
||||
}
|
||||
|
||||
dir->dyn_relocs = ind->dyn_relocs;
|
||||
ind->dyn_relocs = NULL;
|
||||
}
|
||||
edir->gotplt_refcount = eind->gotplt_refcount;
|
||||
eind->gotplt_refcount = 0;
|
||||
edir->funcdesc.refcount += eind->funcdesc.refcount;
|
||||
|
@ -1292,37 +1292,6 @@ tilepro_elf_copy_indirect_symbol (struct bfd_link_info *info,
|
||||
edir = (struct tilepro_elf_link_hash_entry *) dir;
|
||||
eind = (struct tilepro_elf_link_hash_entry *) ind;
|
||||
|
||||
if (ind->dyn_relocs != NULL)
|
||||
{
|
||||
if (dir->dyn_relocs != NULL)
|
||||
{
|
||||
struct elf_dyn_relocs **pp;
|
||||
struct elf_dyn_relocs *p;
|
||||
|
||||
/* Add reloc counts against the indirect sym to the direct sym
|
||||
list. Merge any entries against the same section. */
|
||||
for (pp = &ind->dyn_relocs; (p = *pp) != NULL; )
|
||||
{
|
||||
struct elf_dyn_relocs *q;
|
||||
|
||||
for (q = dir->dyn_relocs; q != NULL; q = q->next)
|
||||
if (q->sec == p->sec)
|
||||
{
|
||||
q->pc_count += p->pc_count;
|
||||
q->count += p->count;
|
||||
*pp = p->next;
|
||||
break;
|
||||
}
|
||||
if (q == NULL)
|
||||
pp = &p->next;
|
||||
}
|
||||
*pp = dir->dyn_relocs;
|
||||
}
|
||||
|
||||
dir->dyn_relocs = ind->dyn_relocs;
|
||||
ind->dyn_relocs = NULL;
|
||||
}
|
||||
|
||||
if (ind->root.type == bfd_link_hash_indirect
|
||||
&& dir->got.refcount <= 0)
|
||||
{
|
||||
|
@ -747,37 +747,6 @@ elf_s390_copy_indirect_symbol (struct bfd_link_info *info,
|
||||
edir = (struct elf_s390_link_hash_entry *) dir;
|
||||
eind = (struct elf_s390_link_hash_entry *) ind;
|
||||
|
||||
if (ind->dyn_relocs != NULL)
|
||||
{
|
||||
if (dir->dyn_relocs != NULL)
|
||||
{
|
||||
struct elf_dyn_relocs **pp;
|
||||
struct elf_dyn_relocs *p;
|
||||
|
||||
/* Add reloc counts against the indirect sym to the direct sym
|
||||
list. Merge any entries against the same section. */
|
||||
for (pp = &ind->dyn_relocs; (p = *pp) != NULL; )
|
||||
{
|
||||
struct elf_dyn_relocs *q;
|
||||
|
||||
for (q = dir->dyn_relocs; q != NULL; q = q->next)
|
||||
if (q->sec == p->sec)
|
||||
{
|
||||
q->pc_count += p->pc_count;
|
||||
q->count += p->count;
|
||||
*pp = p->next;
|
||||
break;
|
||||
}
|
||||
if (q == NULL)
|
||||
pp = &p->next;
|
||||
}
|
||||
*pp = dir->dyn_relocs;
|
||||
}
|
||||
|
||||
dir->dyn_relocs = ind->dyn_relocs;
|
||||
ind->dyn_relocs = NULL;
|
||||
}
|
||||
|
||||
if (ind->root.type == bfd_link_hash_indirect
|
||||
&& dir->got.refcount <= 0)
|
||||
{
|
||||
|
@ -7650,6 +7650,37 @@ _bfd_elf_link_hash_copy_indirect (struct bfd_link_info *info,
|
||||
{
|
||||
struct elf_link_hash_table *htab;
|
||||
|
||||
if (ind->dyn_relocs != NULL)
|
||||
{
|
||||
if (dir->dyn_relocs != NULL)
|
||||
{
|
||||
struct elf_dyn_relocs **pp;
|
||||
struct elf_dyn_relocs *p;
|
||||
|
||||
/* Add reloc counts against the indirect sym to the direct sym
|
||||
list. Merge any entries against the same section. */
|
||||
for (pp = &ind->dyn_relocs; (p = *pp) != NULL; )
|
||||
{
|
||||
struct elf_dyn_relocs *q;
|
||||
|
||||
for (q = dir->dyn_relocs; q != NULL; q = q->next)
|
||||
if (q->sec == p->sec)
|
||||
{
|
||||
q->pc_count += p->pc_count;
|
||||
q->count += p->count;
|
||||
*pp = p->next;
|
||||
break;
|
||||
}
|
||||
if (q == NULL)
|
||||
pp = &p->next;
|
||||
}
|
||||
*pp = dir->dyn_relocs;
|
||||
}
|
||||
|
||||
dir->dyn_relocs = ind->dyn_relocs;
|
||||
ind->dyn_relocs = NULL;
|
||||
}
|
||||
|
||||
/* Copy down any references that we may have already seen to the
|
||||
symbol which just became indirect. */
|
||||
|
||||
|
@ -2851,37 +2851,6 @@ elfNN_aarch64_copy_indirect_symbol (struct bfd_link_info *info,
|
||||
edir = (struct elf_aarch64_link_hash_entry *) dir;
|
||||
eind = (struct elf_aarch64_link_hash_entry *) ind;
|
||||
|
||||
if (ind->dyn_relocs != NULL)
|
||||
{
|
||||
if (dir->dyn_relocs != NULL)
|
||||
{
|
||||
struct elf_dyn_relocs **pp;
|
||||
struct elf_dyn_relocs *p;
|
||||
|
||||
/* Add reloc counts against the indirect sym to the direct sym
|
||||
list. Merge any entries against the same section. */
|
||||
for (pp = &ind->dyn_relocs; (p = *pp) != NULL;)
|
||||
{
|
||||
struct elf_dyn_relocs *q;
|
||||
|
||||
for (q = dir->dyn_relocs; q != NULL; q = q->next)
|
||||
if (q->sec == p->sec)
|
||||
{
|
||||
q->pc_count += p->pc_count;
|
||||
q->count += p->count;
|
||||
*pp = p->next;
|
||||
break;
|
||||
}
|
||||
if (q == NULL)
|
||||
pp = &p->next;
|
||||
}
|
||||
*pp = dir->dyn_relocs;
|
||||
}
|
||||
|
||||
dir->dyn_relocs = ind->dyn_relocs;
|
||||
ind->dyn_relocs = NULL;
|
||||
}
|
||||
|
||||
if (ind->root.type == bfd_link_hash_indirect)
|
||||
{
|
||||
/* Copy over PLT info. */
|
||||
|
@ -415,37 +415,6 @@ riscv_elf_copy_indirect_symbol (struct bfd_link_info *info,
|
||||
edir = (struct riscv_elf_link_hash_entry *) dir;
|
||||
eind = (struct riscv_elf_link_hash_entry *) ind;
|
||||
|
||||
if (ind->dyn_relocs != NULL)
|
||||
{
|
||||
if (dir->dyn_relocs != NULL)
|
||||
{
|
||||
struct elf_dyn_relocs **pp;
|
||||
struct elf_dyn_relocs *p;
|
||||
|
||||
/* Add reloc counts against the indirect sym to the direct sym
|
||||
list. Merge any entries against the same section. */
|
||||
for (pp = &ind->dyn_relocs; (p = *pp) != NULL; )
|
||||
{
|
||||
struct elf_dyn_relocs *q;
|
||||
|
||||
for (q = dir->dyn_relocs; q != NULL; q = q->next)
|
||||
if (q->sec == p->sec)
|
||||
{
|
||||
q->pc_count += p->pc_count;
|
||||
q->count += p->count;
|
||||
*pp = p->next;
|
||||
break;
|
||||
}
|
||||
if (q == NULL)
|
||||
pp = &p->next;
|
||||
}
|
||||
*pp = dir->dyn_relocs;
|
||||
}
|
||||
|
||||
dir->dyn_relocs = ind->dyn_relocs;
|
||||
ind->dyn_relocs = NULL;
|
||||
}
|
||||
|
||||
if (ind->root.type == bfd_link_hash_indirect
|
||||
&& dir->got.refcount <= 0)
|
||||
{
|
||||
|
@ -1285,37 +1285,6 @@ _bfd_sparc_elf_copy_indirect_symbol (struct bfd_link_info *info,
|
||||
edir = (struct _bfd_sparc_elf_link_hash_entry *) dir;
|
||||
eind = (struct _bfd_sparc_elf_link_hash_entry *) ind;
|
||||
|
||||
if (ind->dyn_relocs != NULL)
|
||||
{
|
||||
if (dir->dyn_relocs != NULL)
|
||||
{
|
||||
struct elf_dyn_relocs **pp;
|
||||
struct elf_dyn_relocs *p;
|
||||
|
||||
/* Add reloc counts against the indirect sym to the direct sym
|
||||
list. Merge any entries against the same section. */
|
||||
for (pp = &ind->dyn_relocs; (p = *pp) != NULL; )
|
||||
{
|
||||
struct elf_dyn_relocs *q;
|
||||
|
||||
for (q = dir->dyn_relocs; q != NULL; q = q->next)
|
||||
if (q->sec == p->sec)
|
||||
{
|
||||
q->pc_count += p->pc_count;
|
||||
q->count += p->count;
|
||||
*pp = p->next;
|
||||
break;
|
||||
}
|
||||
if (q == NULL)
|
||||
pp = &p->next;
|
||||
}
|
||||
*pp = dir->dyn_relocs;
|
||||
}
|
||||
|
||||
dir->dyn_relocs = ind->dyn_relocs;
|
||||
ind->dyn_relocs = NULL;
|
||||
}
|
||||
|
||||
if (ind->root.type == bfd_link_hash_indirect && dir->got.refcount <= 0)
|
||||
{
|
||||
edir->tls_type = eind->tls_type;
|
||||
|
@ -1501,37 +1501,6 @@ tilegx_elf_copy_indirect_symbol (struct bfd_link_info *info,
|
||||
edir = (struct tilegx_elf_link_hash_entry *) dir;
|
||||
eind = (struct tilegx_elf_link_hash_entry *) ind;
|
||||
|
||||
if (ind->dyn_relocs != NULL)
|
||||
{
|
||||
if (dir->dyn_relocs != NULL)
|
||||
{
|
||||
struct elf_dyn_relocs **pp;
|
||||
struct elf_dyn_relocs *p;
|
||||
|
||||
/* Add reloc counts against the indirect sym to the direct sym
|
||||
list. Merge any entries against the same section. */
|
||||
for (pp = &ind->dyn_relocs; (p = *pp) != NULL; )
|
||||
{
|
||||
struct elf_dyn_relocs *q;
|
||||
|
||||
for (q = dir->dyn_relocs; q != NULL; q = q->next)
|
||||
if (q->sec == p->sec)
|
||||
{
|
||||
q->pc_count += p->pc_count;
|
||||
q->count += p->count;
|
||||
*pp = p->next;
|
||||
break;
|
||||
}
|
||||
if (q == NULL)
|
||||
pp = &p->next;
|
||||
}
|
||||
*pp = dir->dyn_relocs;
|
||||
}
|
||||
|
||||
dir->dyn_relocs = ind->dyn_relocs;
|
||||
ind->dyn_relocs = NULL;
|
||||
}
|
||||
|
||||
if (ind->root.type == bfd_link_hash_indirect
|
||||
&& dir->got.refcount <= 0)
|
||||
{
|
||||
|
@ -1766,37 +1766,6 @@ _bfd_x86_elf_copy_indirect_symbol (struct bfd_link_info *info,
|
||||
edir = (struct elf_x86_link_hash_entry *) dir;
|
||||
eind = (struct elf_x86_link_hash_entry *) ind;
|
||||
|
||||
if (ind->dyn_relocs != NULL)
|
||||
{
|
||||
if (dir->dyn_relocs != NULL)
|
||||
{
|
||||
struct elf_dyn_relocs **pp;
|
||||
struct elf_dyn_relocs *p;
|
||||
|
||||
/* Add reloc counts against the indirect sym to the direct sym
|
||||
list. Merge any entries against the same section. */
|
||||
for (pp = &ind->dyn_relocs; (p = *pp) != NULL; )
|
||||
{
|
||||
struct elf_dyn_relocs *q;
|
||||
|
||||
for (q = dir->dyn_relocs; q != NULL; q = q->next)
|
||||
if (q->sec == p->sec)
|
||||
{
|
||||
q->pc_count += p->pc_count;
|
||||
q->count += p->count;
|
||||
*pp = p->next;
|
||||
break;
|
||||
}
|
||||
if (q == NULL)
|
||||
pp = &p->next;
|
||||
}
|
||||
*pp = dir->dyn_relocs;
|
||||
}
|
||||
|
||||
dir->dyn_relocs = ind->dyn_relocs;
|
||||
ind->dyn_relocs = NULL;
|
||||
}
|
||||
|
||||
if (ind->root.type == bfd_link_hash_indirect
|
||||
&& dir->got.refcount <= 0)
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user