binutils/binutils-LTO-fix.patch
2020-10-14 10:26:27 +01:00

2149 lines
72 KiB
Diff
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

diff -rup binutils.orig/bfd/Makefile.am binutils-2.35/bfd/Makefile.am
--- binutils.orig/bfd/Makefile.am 2020-07-30 08:41:25.057236290 +0100
+++ binutils-2.35/bfd/Makefile.am 2020-07-30 09:05:24.474019185 +0100
@@ -946,8 +946,8 @@ DISTCLEANFILES = $(BUILD_CFILES) $(BUILD
bfdver.h: $(srcdir)/version.h $(srcdir)/development.sh $(srcdir)/Makefile.in
@echo "creating $@"
@bfd_version=`echo "$(VERSION)" | $(SED) -e 's/\([^\.]*\)\.*\([^\.]*\)\.*\([^\.]*\)\.*\([^\.]*\)\.*\([^\.]*\).*/\1.00\2.00\3.00\4.00\5/' -e 's/\([^\.]*\)\..*\(..\)\..*\(..\)\..*\(..\)\..*\(..\)$$/\1\2\3\4\5/'` ;\
- bfd_version_string="\"$(VERSION)-3.fc33\"" ;\
- bfd_soversion="$(VERSION)-3.fc33" ;\
+ bfd_version_string="\"$(VERSION)-4.fc33\"" ;\
+ bfd_soversion="$(VERSION)-4.fc33" ;\
bfd_version_package="\"$(PKGVERSION)\"" ;\
report_bugs_to="\"$(REPORT_BUGS_TO)\"" ;\
. $(srcdir)/development.sh ;\
diff -rup binutils.orig/bfd/Makefile.in binutils-2.35/bfd/Makefile.in
--- binutils.orig/bfd/Makefile.in 2020-07-30 08:41:25.043236381 +0100
+++ binutils-2.35/bfd/Makefile.in 2020-07-30 09:05:24.476019172 +0100
@@ -2058,8 +2058,8 @@ stmp-lcoff-h: $(LIBCOFF_H_FILES)
bfdver.h: $(srcdir)/version.h $(srcdir)/development.sh $(srcdir)/Makefile.in
@echo "creating $@"
@bfd_version=`echo "$(VERSION)" | $(SED) -e 's/\([^\.]*\)\.*\([^\.]*\)\.*\([^\.]*\)\.*\([^\.]*\)\.*\([^\.]*\).*/\1.00\2.00\3.00\4.00\5/' -e 's/\([^\.]*\)\..*\(..\)\..*\(..\)\..*\(..\)\..*\(..\)$$/\1\2\3\4\5/'` ;\
- bfd_version_string="\"$(VERSION)-3.fc33\"" ;\
- bfd_soversion="$(VERSION)-3.fc33" ;\
+ bfd_version_string="\"$(VERSION)-4.fc33\"" ;\
+ bfd_soversion="$(VERSION)-4.fc33" ;\
bfd_version_package="\"$(PKGVERSION)\"" ;\
report_bugs_to="\"$(REPORT_BUGS_TO)\"" ;\
. $(srcdir)/development.sh ;\
diff -rup binutils.orig/bfd/elf-bfd.h binutils-2.35/bfd/elf-bfd.h
--- binutils.orig/bfd/elf-bfd.h 2020-07-30 08:41:25.041236395 +0100
+++ binutils-2.35/bfd/elf-bfd.h 2020-07-30 09:06:39.392533879 +0100
@@ -224,6 +224,10 @@ struct elf_link_hash_entry
a strong defined symbol alias. U.ALIAS points to a list of aliases,
the definition having is_weakalias clear. */
unsigned int is_weakalias : 1;
+ /* There is relocation against symbol in the object. NB: It is only
+ set and used by elf_link_add_object_symbols after all LTO IR symbols
+ have been read. */
+ unsigned int has_reloc_after_lto_all_symbols_read : 1;
/* String table index in .dynstr if this is a dynamic symbol. */
unsigned long dynstr_index;
@@ -549,6 +553,16 @@ enum elf_target_os
is_nacl /* Native Client. */
};
+/* Used by bfd_sym_from_r_symndx to cache a small number of local
+ symbols. */
+#define LOCAL_SYM_CACHE_SIZE 32
+struct sym_cache
+{
+ bfd *abfd;
+ unsigned long indx[LOCAL_SYM_CACHE_SIZE];
+ Elf_Internal_Sym sym[LOCAL_SYM_CACHE_SIZE];
+};
+
/* ELF linker hash table. */
struct elf_link_hash_table
@@ -676,6 +690,9 @@ struct elf_link_hash_table
/* A linked list of dynamic BFD's loaded in the link. */
struct elf_link_loaded_list *dyn_loaded;
+ /* Small local sym cache. */
+ struct sym_cache sym_cache;
+
/* Short-cuts to get to dynamic linker sections. */
asection *sgot;
asection *sgotplt;
@@ -717,16 +734,6 @@ struct elf_link_hash_table
/* Returns TRUE if the hash table is a struct elf_link_hash_table. */
#define is_elf_hash_table(htab) \
(((struct bfd_link_hash_table *) (htab))->type == bfd_link_elf_hash_table)
-
-/* Used by bfd_sym_from_r_symndx to cache a small number of local
- symbols. */
-#define LOCAL_SYM_CACHE_SIZE 32
-struct sym_cache
-{
- bfd *abfd;
- unsigned long indx[LOCAL_SYM_CACHE_SIZE];
- Elf_Internal_Sym sym[LOCAL_SYM_CACHE_SIZE];
-};
/* Constant information held for an ELF backend. */
diff -rup binutils.orig/bfd/elf32-arm.c binutils-2.35/bfd/elf32-arm.c
--- binutils.orig/bfd/elf32-arm.c 2020-07-30 08:41:25.051236329 +0100
+++ binutils-2.35/bfd/elf32-arm.c 2020-07-30 09:06:39.393533872 +0100
@@ -3390,9 +3390,6 @@ struct elf32_arm_link_hash_table
bfd_vma offset;
} tls_ldm_got;
- /* Small local sym cache. */
- struct sym_cache sym_cache;
-
/* For convenience in allocate_dynrelocs. */
bfd * obfd;
@@ -15316,7 +15313,7 @@ elf32_arm_check_relocs (bfd *abfd, struc
if (r_symndx < symtab_hdr->sh_info)
{
/* A local symbol. */
- isym = bfd_sym_from_r_symndx (&htab->sym_cache,
+ isym = bfd_sym_from_r_symndx (&htab->root.sym_cache,
abfd, r_symndx);
if (isym == NULL)
return FALSE;
@@ -16871,7 +16868,8 @@ elf32_arm_size_dynamic_sections (bfd * o
s->size += 4;
}
- isym = bfd_sym_from_r_symndx (&htab->sym_cache, ibfd, symndx);
+ isym = bfd_sym_from_r_symndx (&htab->root.sym_cache, ibfd,
+ symndx);
if (isym == NULL)
return FALSE;
diff -rup binutils.orig/bfd/elf32-bfin.c binutils-2.35/bfd/elf32-bfin.c
--- binutils.orig/bfd/elf32-bfin.c 2020-07-30 08:41:25.051236329 +0100
+++ binutils-2.35/bfd/elf32-bfin.c 2020-07-30 09:06:39.394533866 +0100
@@ -4791,16 +4791,6 @@ struct bfin_link_hash_entry
struct bfin_pcrel_relocs_copied *pcrel_relocs_copied;
};
-/* bfin ELF linker hash table. */
-
-struct bfin_link_hash_table
-{
- struct elf_link_hash_table root;
-
- /* Small local sym cache. */
- struct sym_cache sym_cache;
-};
-
#define bfin_hash_entry(ent) ((struct bfin_link_hash_entry *) (ent))
static struct bfd_hash_entry *
@@ -4829,15 +4819,14 @@ bfin_link_hash_newfunc (struct bfd_hash_
static struct bfd_link_hash_table *
bfin_link_hash_table_create (bfd * abfd)
{
- struct bfin_link_hash_table *ret;
- size_t amt = sizeof (struct bfin_link_hash_table);
+ struct elf_link_hash_table *ret;
+ size_t amt = sizeof (struct elf_link_hash_table);
ret = bfd_zmalloc (amt);
if (ret == NULL)
return NULL;
- if (!_bfd_elf_link_hash_table_init (&ret->root, abfd,
- bfin_link_hash_newfunc,
+ if (!_bfd_elf_link_hash_table_init (ret, abfd, bfin_link_hash_newfunc,
sizeof (struct elf_link_hash_entry),
BFIN_ELF_DATA))
{
@@ -4845,9 +4834,7 @@ bfin_link_hash_table_create (bfd * abfd)
return NULL;
}
- ret->sym_cache.abfd = NULL;
-
- return &ret->root.root;
+ return &ret->root;
}
/* The size in bytes of an entry in the procedure linkage table. */
@@ -5418,10 +5405,6 @@ struct bfd_elf_special_section const elf
#define bfd_elf32_bfd_is_local_label_name \
bfin_is_local_label_name
-#define bfin_hash_table(p) \
- ((struct bfin_link_hash_table *) (p)->hash)
-
-
#define elf_backend_create_dynamic_sections \
_bfd_elf_create_dynamic_sections
diff -rup binutils.orig/bfd/elf32-csky.c binutils-2.35/bfd/elf32-csky.c
--- binutils.orig/bfd/elf32-csky.c 2020-07-30 08:41:25.053236316 +0100
+++ binutils-2.35/bfd/elf32-csky.c 2020-07-30 09:06:39.394533866 +0100
@@ -1208,9 +1208,6 @@ struct csky_elf_link_hash_table
{
struct elf_link_hash_table elf;
- /* Small local sym cache. */
- struct sym_cache sym_cache;
-
/* Data for R_CKCORE_TLS_LDM32 relocations. */
union
{
@@ -2477,7 +2474,7 @@ csky_elf_check_relocs (bfd * abfd,
if (r_symndx < symtab_hdr->sh_info)
{
/* A local symbol. */
- isym = bfd_sym_from_r_symndx (&htab->sym_cache,
+ isym = bfd_sym_from_r_symndx (&htab->elf.sym_cache,
abfd, r_symndx);
if (isym == NULL)
return FALSE;
@@ -2584,7 +2581,7 @@ csky_elf_check_relocs (bfd * abfd,
asection *s;
Elf_Internal_Sym *loc_isym;
- loc_isym = bfd_sym_from_r_symndx (&htab->sym_cache,
+ loc_isym = bfd_sym_from_r_symndx (&htab->elf.sym_cache,
abfd, r_symndx);
if (loc_isym == NULL)
return FALSE;
diff -rup binutils.orig/bfd/elf32-hppa.c binutils-2.35/bfd/elf32-hppa.c
--- binutils.orig/bfd/elf32-hppa.c 2020-07-30 08:41:25.043236381 +0100
+++ binutils-2.35/bfd/elf32-hppa.c 2020-07-30 09:06:39.394533866 +0100
@@ -286,9 +286,6 @@ struct elf32_hppa_link_hash_table
/* Set if we need a .plt stub to support lazy dynamic linking. */
unsigned int need_plt_stub:1;
- /* Small local sym cache. */
- struct sym_cache sym_cache;
-
/* Data for LDM relocations. */
union
{
@@ -1465,7 +1462,7 @@ elf32_hppa_check_relocs (bfd *abfd,
void *vpp;
Elf_Internal_Sym *isym;
- isym = bfd_sym_from_r_symndx (&htab->sym_cache,
+ isym = bfd_sym_from_r_symndx (&htab->etab.sym_cache,
abfd, r_symndx);
if (isym == NULL)
return FALSE;
@@ -4038,7 +4035,7 @@ elf32_hppa_relocate_section (bfd *output
else
{
Elf_Internal_Sym *isym
- = bfd_sym_from_r_symndx (&htab->sym_cache,
+ = bfd_sym_from_r_symndx (&htab->etab.sym_cache,
input_bfd, r_symndx);
if (isym == NULL)
return FALSE;
diff -rup binutils.orig/bfd/elf32-i386.c binutils-2.35/bfd/elf32-i386.c
--- binutils.orig/bfd/elf32-i386.c 2020-07-30 08:41:25.055236303 +0100
+++ binutils-2.35/bfd/elf32-i386.c 2020-07-30 09:06:39.395533860 +0100
@@ -1158,7 +1158,7 @@ elf_i386_tls_transition (struct bfd_link
{
Elf_Internal_Sym *isym;
- isym = bfd_sym_from_r_symndx (&htab->sym_cache,
+ isym = bfd_sym_from_r_symndx (&htab->elf.sym_cache,
abfd, r_symndx);
name = bfd_elf_sym_name (abfd, symtab_hdr, isym, NULL);
}
@@ -1251,7 +1251,7 @@ elf_i386_convert_load_reloc (bfd *abfd,
else
{
local_ref = TRUE;
- isym = bfd_sym_from_r_symndx (&htab->sym_cache, abfd,
+ isym = bfd_sym_from_r_symndx (&htab->elf.sym_cache, abfd,
r_symndx);
abs_symbol = isym->st_shndx == SHN_ABS;
}
@@ -1529,7 +1529,7 @@ elf_i386_check_relocs (bfd *abfd,
if (r_symndx < symtab_hdr->sh_info)
{
/* A local symbol. */
- isym = bfd_sym_from_r_symndx (&htab->sym_cache,
+ isym = bfd_sym_from_r_symndx (&htab->elf.sym_cache,
abfd, r_symndx);
if (isym == NULL)
goto error_return;
@@ -1859,7 +1859,7 @@ elf_i386_check_relocs (bfd *abfd,
void **vpp;
asection *s;
- isym = bfd_sym_from_r_symndx (&htab->sym_cache,
+ isym = bfd_sym_from_r_symndx (&htab->elf.sym_cache,
abfd, r_symndx);
if (isym == NULL)
goto error_return;
diff -rup binutils.orig/bfd/elf32-m32r.c binutils-2.35/bfd/elf32-m32r.c
--- binutils.orig/bfd/elf32-m32r.c 2020-07-30 08:41:25.045236368 +0100
+++ binutils-2.35/bfd/elf32-m32r.c 2020-07-30 09:06:39.395533860 +0100
@@ -1498,20 +1498,6 @@ struct elf_m32r_pcrel_relocs_copied
bfd_size_type count;
};
-/* m32r ELF linker hash table. */
-
-struct elf_m32r_link_hash_table
-{
- struct elf_link_hash_table root;
-
- /* Short-cuts to get to dynamic linker sections. */
- asection *sdynbss;
- asection *srelbss;
-
- /* Small local sym cache. */
- struct sym_cache sym_cache;
-};
-
/* Traverse an m32r ELF linker hash table. */
#define m32r_elf_link_hash_traverse(table, func, info) \
@@ -1524,21 +1510,21 @@ struct elf_m32r_link_hash_table
#define m32r_elf_hash_table(p) \
(elf_hash_table_id ((struct elf_link_hash_table *) ((p)->hash)) \
- == M32R_ELF_DATA ? ((struct elf_m32r_link_hash_table *) ((p)->hash)) : NULL)
+ == M32R_ELF_DATA ? ((struct elf_link_hash_table *) ((p)->hash)) : NULL)
/* Create an m32r ELF linker hash table. */
static struct bfd_link_hash_table *
m32r_elf_link_hash_table_create (bfd *abfd)
{
- struct elf_m32r_link_hash_table *ret;
- size_t amt = sizeof (struct elf_m32r_link_hash_table);
+ struct elf_link_hash_table *ret;
+ size_t amt = sizeof (struct elf_link_hash_table);
ret = bfd_zmalloc (amt);
if (ret == NULL)
return NULL;
- if (!_bfd_elf_link_hash_table_init (&ret->root, abfd,
+ if (!_bfd_elf_link_hash_table_init (ret, abfd,
_bfd_elf_link_hash_newfunc,
sizeof (struct elf_link_hash_entry),
M32R_ELF_DATA))
@@ -1547,7 +1533,7 @@ m32r_elf_link_hash_table_create (bfd *ab
return NULL;
}
- return &ret->root.root;
+ return &ret->root;
}
/* Create dynamic sections when linking against a dynamic object. */
@@ -1555,7 +1541,7 @@ m32r_elf_link_hash_table_create (bfd *ab
static bfd_boolean
m32r_elf_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info)
{
- struct elf_m32r_link_hash_table *htab;
+ struct elf_link_hash_table *htab;
flagword flags, pltflags;
asection *s;
const struct elf_backend_data *bed = get_elf_backend_data (abfd);
@@ -1578,7 +1564,7 @@ m32r_elf_create_dynamic_sections (bfd *a
pltflags |= SEC_READONLY;
s = bfd_make_section_anyway_with_flags (abfd, ".plt", pltflags);
- htab->root.splt = s;
+ htab->splt = s;
if (s == NULL
|| !bfd_set_section_alignment (s, bed->plt_alignment))
return FALSE;
@@ -1598,7 +1584,7 @@ m32r_elf_create_dynamic_sections (bfd *a
h = (struct elf_link_hash_entry *) bh;
h->def_regular = 1;
h->type = STT_OBJECT;
- htab->root.hplt = h;
+ htab->hplt = h;
if (bfd_link_pic (info)
&& ! bfd_elf_link_record_dynamic_symbol (info, h))
@@ -1609,12 +1595,12 @@ m32r_elf_create_dynamic_sections (bfd *a
bed->default_use_rela_p
? ".rela.plt" : ".rel.plt",
flags | SEC_READONLY);
- htab->root.srelplt = s;
+ htab->srelplt = s;
if (s == NULL
|| !bfd_set_section_alignment (s, ptralign))
return FALSE;
- if (htab->root.sgot == NULL
+ if (htab->sgot == NULL
&& !_bfd_elf_create_got_section (abfd, info))
return FALSE;
@@ -1669,7 +1655,7 @@ static bfd_boolean
m32r_elf_adjust_dynamic_symbol (struct bfd_link_info *info,
struct elf_link_hash_entry *h)
{
- struct elf_m32r_link_hash_table *htab;
+ struct elf_link_hash_table *htab;
bfd *dynobj;
asection *s;
@@ -1796,7 +1782,7 @@ static bfd_boolean
allocate_dynrelocs (struct elf_link_hash_entry *h, void * inf)
{
struct bfd_link_info *info;
- struct elf_m32r_link_hash_table *htab;
+ struct elf_link_hash_table *htab;
struct elf_dyn_relocs *p;
if (h->root.type == bfd_link_hash_indirect)
@@ -1807,7 +1793,7 @@ allocate_dynrelocs (struct elf_link_hash
if (htab == NULL)
return FALSE;
- if (htab->root.dynamic_sections_created
+ if (htab->dynamic_sections_created
&& h->plt.refcount > 0)
{
/* Make sure this symbol is output as a dynamic symbol.
@@ -1821,7 +1807,7 @@ allocate_dynrelocs (struct elf_link_hash
if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, bfd_link_pic (info), h))
{
- asection *s = htab->root.splt;
+ asection *s = htab->splt;
/* If this is the first .plt entry, make room for the special
first entry. */
@@ -1847,10 +1833,10 @@ allocate_dynrelocs (struct elf_link_hash
/* We also need to make an entry in the .got.plt section, which
will be placed in the .got section by the linker script. */
- htab->root.sgotplt->size += 4;
+ htab->sgotplt->size += 4;
/* We also need to make an entry in the .rel.plt section. */
- htab->root.srelplt->size += sizeof (Elf32_External_Rela);
+ htab->srelplt->size += sizeof (Elf32_External_Rela);
}
else
{
@@ -1878,13 +1864,13 @@ allocate_dynrelocs (struct elf_link_hash
return FALSE;
}
- s = htab->root.sgot;
+ s = htab->sgot;
h->got.offset = s->size;
s->size += 4;
- dyn = htab->root.dynamic_sections_created;
+ dyn = htab->dynamic_sections_created;
if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, bfd_link_pic (info), h))
- htab->root.srelgot->size += sizeof (Elf32_External_Rela);
+ htab->srelgot->size += sizeof (Elf32_External_Rela);
}
else
h->got.offset = (bfd_vma) -1;
@@ -1944,7 +1930,7 @@ allocate_dynrelocs (struct elf_link_hash
if (!h->non_got_ref
&& ((h->def_dynamic
&& !h->def_regular)
- || (htab->root.dynamic_sections_created
+ || (htab->dynamic_sections_created
&& (h->root.type == bfd_link_hash_undefweak
|| h->root.type == bfd_link_hash_undefined))))
{
@@ -1984,7 +1970,7 @@ static bfd_boolean
m32r_elf_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
struct bfd_link_info *info)
{
- struct elf_m32r_link_hash_table *htab;
+ struct elf_link_hash_table *htab;
bfd *dynobj;
asection *s;
bfd_boolean relocs;
@@ -1998,10 +1984,10 @@ m32r_elf_size_dynamic_sections (bfd *out
if (htab == NULL)
return FALSE;
- dynobj = htab->root.dynobj;
+ dynobj = htab->dynobj;
BFD_ASSERT (dynobj != NULL);
- if (htab->root.dynamic_sections_created)
+ if (htab->dynamic_sections_created)
{
/* Set the contents of the .interp section to the interpreter. */
if (bfd_link_executable (info) && !info->nointerp)
@@ -2060,8 +2046,8 @@ m32r_elf_size_dynamic_sections (bfd *out
symtab_hdr = &elf_tdata (ibfd)->symtab_hdr;
locsymcount = symtab_hdr->sh_info;
end_local_got = local_got + locsymcount;
- s = htab->root.sgot;
- srel = htab->root.srelgot;
+ s = htab->sgot;
+ srel = htab->srelgot;
for (; local_got < end_local_got; ++local_got)
{
if (*local_got > 0)
@@ -2078,7 +2064,7 @@ m32r_elf_size_dynamic_sections (bfd *out
/* Allocate global sym .plt and .got entries, and space for global
sym dynamic relocs. */
- elf_link_hash_traverse (&htab->root, allocate_dynrelocs, info);
+ elf_link_hash_traverse (htab, allocate_dynrelocs, info);
/* We now have determined the sizes of the various dynamic sections.
Allocate memory for them. */
@@ -2088,9 +2074,9 @@ m32r_elf_size_dynamic_sections (bfd *out
if ((s->flags & SEC_LINKER_CREATED) == 0)
continue;
- if (s == htab->root.splt
- || s == htab->root.sgot
- || s == htab->root.sgotplt
+ if (s == htab->splt
+ || s == htab->sgot
+ || s == htab->sgotplt
|| s == htab->sdynbss)
{
/* Strip this section if we don't need it; see the
@@ -2098,7 +2084,7 @@ m32r_elf_size_dynamic_sections (bfd *out
}
else if (CONST_STRNEQ (bfd_section_name (s), ".rela"))
{
- if (s->size != 0 && s != htab->root.srelplt)
+ if (s->size != 0 && s != htab->srelplt)
relocs = TRUE;
/* We use the reloc_count field as a counter if we need
@@ -2188,7 +2174,7 @@ m32r_elf_relocate_section (bfd *output_b
Elf_Internal_Rela *rel, *relend;
/* Assume success. */
bfd_boolean ret = TRUE;
- struct elf_m32r_link_hash_table *htab = m32r_elf_hash_table (info);
+ struct elf_link_hash_table *htab = m32r_elf_hash_table (info);
bfd_vma *local_got_offsets;
asection *sgot, *splt, *sreloc;
bfd_vma high_address = bfd_get_section_limit (input_bfd, input_section);
@@ -2198,8 +2184,8 @@ m32r_elf_relocate_section (bfd *output_b
local_got_offsets = elf_local_got_offsets (input_bfd);
- sgot = htab->root.sgot;
- splt = htab->root.splt;
+ sgot = htab->sgot;
+ splt = htab->splt;
sreloc = NULL;
rel = relocs;
@@ -2295,7 +2281,7 @@ m32r_elf_relocate_section (bfd *output_b
bfd_boolean dyn;
sec = h->root.u.def.section;
- dyn = htab->root.dynamic_sections_created;
+ dyn = htab->dynamic_sections_created;
sec = h->root.u.def.section;
if (r_type == R_M32R_GOTPC24
|| (r_type == R_M32R_GOTPC_HI_ULO
@@ -2516,7 +2502,7 @@ m32r_elf_relocate_section (bfd *output_b
off = h->got.offset;
BFD_ASSERT (off != (bfd_vma) -1);
- dyn = htab->root.dynamic_sections_created;
+ dyn = htab->dynamic_sections_created;
if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn,
bfd_link_pic (info),
h)
@@ -2576,7 +2562,7 @@ m32r_elf_relocate_section (bfd *output_b
/* We need to generate a R_M32R_RELATIVE reloc
for the dynamic linker. */
- srelgot = htab->root.srelgot;
+ srelgot = htab->srelgot;
BFD_ASSERT (srelgot != NULL);
outrel.r_offset = (sgot->output_section->vma
@@ -2892,7 +2878,7 @@ m32r_elf_finish_dynamic_symbol (bfd *out
struct elf_link_hash_entry *h,
Elf_Internal_Sym *sym)
{
- struct elf_m32r_link_hash_table *htab;
+ struct elf_link_hash_table *htab;
bfd_byte *loc;
#ifdef DEBUG_PIC
@@ -2918,9 +2904,9 @@ m32r_elf_finish_dynamic_symbol (bfd *out
BFD_ASSERT (h->dynindx != -1);
- splt = htab->root.splt;
- sgot = htab->root.sgotplt;
- srela = htab->root.srelplt;
+ splt = htab->splt;
+ sgot = htab->sgotplt;
+ srela = htab->srelplt;
BFD_ASSERT (splt != NULL && sgot != NULL && srela != NULL);
/* Get the index in the procedure linkage table which
@@ -3014,8 +3000,8 @@ m32r_elf_finish_dynamic_symbol (bfd *out
/* This symbol has an entry in the global offset table. Set it
up. */
- sgot = htab->root.sgot;
- srela = htab->root.srelgot;
+ sgot = htab->sgot;
+ srela = htab->srelgot;
BFD_ASSERT (sgot != NULL && srela != NULL);
rela.r_offset = (sgot->output_section->vma
@@ -3063,7 +3049,7 @@ m32r_elf_finish_dynamic_symbol (bfd *out
&& (h->root.type == bfd_link_hash_defined
|| h->root.type == bfd_link_hash_defweak));
- s = bfd_get_linker_section (htab->root.dynobj, ".rela.bss");
+ s = bfd_get_linker_section (htab->dynobj, ".rela.bss");
BFD_ASSERT (s != NULL);
rela.r_offset = (h->root.u.def.value
@@ -3078,7 +3064,7 @@ m32r_elf_finish_dynamic_symbol (bfd *out
}
/* Mark some specially defined symbols as absolute. */
- if (h == htab->root.hdynamic || h == htab->root.hgot)
+ if (h == htab->hdynamic || h == htab->hgot)
sym->st_shndx = SHN_ABS;
return TRUE;
@@ -3091,7 +3077,7 @@ static bfd_boolean
m32r_elf_finish_dynamic_sections (bfd *output_bfd,
struct bfd_link_info *info)
{
- struct elf_m32r_link_hash_table *htab;
+ struct elf_link_hash_table *htab;
bfd *dynobj;
asection *sdyn;
asection *sgot;
@@ -3104,12 +3090,12 @@ m32r_elf_finish_dynamic_sections (bfd *o
if (htab == NULL)
return FALSE;
- dynobj = htab->root.dynobj;
+ dynobj = htab->dynobj;
- sgot = htab->root.sgotplt;
+ sgot = htab->sgotplt;
sdyn = bfd_get_linker_section (dynobj, ".dynamic");
- if (htab->root.dynamic_sections_created)
+ if (htab->dynamic_sections_created)
{
asection *splt;
Elf32_External_Dyn *dyncon, *dynconend;
@@ -3132,17 +3118,17 @@ m32r_elf_finish_dynamic_sections (bfd *o
break;
case DT_PLTGOT:
- s = htab->root.sgotplt;
+ s = htab->sgotplt;
goto get_vma;
case DT_JMPREL:
- s = htab->root.srelplt;
+ s = htab->srelplt;
get_vma:
dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
break;
case DT_PLTRELSZ:
- s = htab->root.srelplt;
+ s = htab->srelplt;
dyn.d_un.d_val = s->size;
bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
break;
@@ -3150,7 +3136,7 @@ m32r_elf_finish_dynamic_sections (bfd *o
}
/* Fill in the first entry in the procedure linkage table. */
- splt = htab->root.splt;
+ splt = htab->splt;
if (splt && splt->size > 0)
{
if (bfd_link_pic (info))
@@ -3369,7 +3355,7 @@ m32r_elf_check_relocs (bfd *abfd,
struct elf_link_hash_entry **sym_hashes;
const Elf_Internal_Rela *rel;
const Elf_Internal_Rela *rel_end;
- struct elf_m32r_link_hash_table *htab;
+ struct elf_link_hash_table *htab;
bfd *dynobj;
asection *sreloc;
@@ -3384,7 +3370,7 @@ m32r_elf_check_relocs (bfd *abfd,
if (htab == NULL)
return FALSE;
- dynobj = htab->root.dynobj;
+ dynobj = htab->dynobj;
rel_end = relocs + sec->reloc_count;
for (rel = relocs; rel < rel_end; rel++)
@@ -3406,7 +3392,7 @@ m32r_elf_check_relocs (bfd *abfd,
}
/* Some relocs require a global offset table. */
- if (htab->root.sgot == NULL)
+ if (htab->sgot == NULL)
{
switch (r_type)
{
@@ -3423,7 +3409,7 @@ m32r_elf_check_relocs (bfd *abfd,
case R_M32R_GOTPC_LO:
case R_M32R_GOT24:
if (dynobj == NULL)
- htab->root.dynobj = dynobj = abfd;
+ htab->dynobj = dynobj = abfd;
if (!_bfd_elf_create_got_section (dynobj, info))
return FALSE;
break;
@@ -3540,7 +3526,7 @@ m32r_elf_check_relocs (bfd *abfd,
struct elf_dyn_relocs **head;
if (dynobj == NULL)
- htab->root.dynobj = dynobj = abfd;
+ htab->dynobj = dynobj = abfd;
/* When creating a shared object, we must copy these
relocs into the output file. We create a reloc
diff -rup binutils.orig/bfd/elf32-m68hc1x.h binutils-2.35/bfd/elf32-m68hc1x.h
--- binutils.orig/bfd/elf32-m68hc1x.h 2020-07-30 08:41:25.053236316 +0100
+++ binutils-2.35/bfd/elf32-m68hc1x.h 2020-07-30 09:06:39.395533860 +0100
@@ -120,9 +120,6 @@ struct m68hc11_elf_link_hash_table
int top_index;
asection **input_list;
- /* Small local sym cache. */
- struct sym_cache sym_cache;
-
bfd_boolean (* size_one_stub) (struct bfd_hash_entry*, void*);
bfd_boolean (* build_one_stub) (struct bfd_hash_entry*, void*);
};
diff -rup binutils.orig/bfd/elf32-m68k.c binutils-2.35/bfd/elf32-m68k.c
--- binutils.orig/bfd/elf32-m68k.c 2020-07-30 08:41:25.038236414 +0100
+++ binutils-2.35/bfd/elf32-m68k.c 2020-07-30 09:06:39.395533860 +0100
@@ -889,9 +889,6 @@ struct elf_m68k_link_hash_table
{
struct elf_link_hash_table root;
- /* Small local sym cache. */
- struct sym_cache sym_cache;
-
/* The PLT format used by this link, or NULL if the format has not
yet been chosen. */
const struct elf_m68k_plt_info *plt_info;
@@ -2836,7 +2833,7 @@ elf_m68k_check_relocs (bfd *abfd,
void *vpp;
Elf_Internal_Sym *isym;
- isym = bfd_sym_from_r_symndx (&elf_m68k_hash_table (info)->sym_cache,
+ isym = bfd_sym_from_r_symndx (&elf_m68k_hash_table (info)->root.sym_cache,
abfd, r_symndx);
if (isym == NULL)
return FALSE;
diff -rup binutils.orig/bfd/elf32-metag.c binutils-2.35/bfd/elf32-metag.c
--- binutils.orig/bfd/elf32-metag.c 2020-07-30 08:41:25.054236309 +0100
+++ binutils-2.35/bfd/elf32-metag.c 2020-07-30 09:06:39.396533853 +0100
@@ -823,9 +823,6 @@ struct elf_metag_link_hash_table
asection **input_list;
Elf_Internal_Sym **all_local_syms;
- /* Small local sym cache. */
- struct sym_cache sym_cache;
-
/* Data for LDM relocations. */
union
{
@@ -2098,7 +2095,7 @@ elf_metag_check_relocs (bfd *abfd,
if (r_symndx < symtab_hdr->sh_info)
{
/* A local symbol. */
- isym = bfd_sym_from_r_symndx (&htab->sym_cache,
+ isym = bfd_sym_from_r_symndx (&htab->etab.sym_cache,
abfd, r_symndx);
if (isym == NULL)
return FALSE;
diff -rup binutils.orig/bfd/elf32-microblaze.c binutils-2.35/bfd/elf32-microblaze.c
--- binutils.orig/bfd/elf32-microblaze.c 2020-07-30 08:41:25.042236388 +0100
+++ binutils-2.35/bfd/elf32-microblaze.c 2020-07-30 09:06:39.396533853 +0100
@@ -744,9 +744,6 @@ struct elf32_mb_link_hash_table
{
struct elf_link_hash_table elf;
- /* Small local sym to section mapping cache. */
- struct sym_cache sym_sec;
-
/* TLS Local Dynamic GOT Entry */
union {
bfd_signed_vma refcount;
@@ -2523,7 +2520,7 @@ microblaze_elf_check_relocs (bfd * abfd,
Elf_Internal_Sym *isym;
void *vpp;
- isym = bfd_sym_from_r_symndx (&htab->sym_sec,
+ isym = bfd_sym_from_r_symndx (&htab->elf.sym_cache,
abfd, r_symndx);
if (isym == NULL)
return FALSE;
diff -rup binutils.orig/bfd/elf32-nds32.c binutils-2.35/bfd/elf32-nds32.c
--- binutils.orig/bfd/elf32-nds32.c 2020-07-30 08:41:25.040236401 +0100
+++ binutils-2.35/bfd/elf32-nds32.c 2020-07-30 09:06:39.397533847 +0100
@@ -3696,8 +3696,6 @@ nds32_elf_link_hash_table_create (bfd *a
return NULL;
}
- ret->sdynbss = NULL;
- ret->srelbss = NULL;
ret->sym_ld_script = NULL;
return &ret->root.root;
@@ -3833,7 +3831,7 @@ nds32_elf_create_dynamic_sections (bfd *
initialize them at run time. The linker script puts the .dynbss
section into the .bss section of the final image. */
s = bfd_make_section (abfd, ".dynbss");
- htab->sdynbss = s;
+ htab->root.sdynbss = s;
if (s == NULL
|| !bfd_set_section_flags (s, SEC_ALLOC | SEC_LINKER_CREATED))
return FALSE;
@@ -3852,7 +3850,7 @@ nds32_elf_create_dynamic_sections (bfd *
{
s = bfd_make_section (abfd, (bed->default_use_rela_p
? ".rela.bss" : ".rel.bss"));
- htab->srelbss = s;
+ htab->root.srelbss = s;
if (s == NULL
|| !bfd_set_section_flags (s, flags | SEC_READONLY)
|| !bfd_set_section_alignment (s, ptralign))
@@ -3988,7 +3986,7 @@ nds32_elf_adjust_dynamic_symbol (struct
same memory location for the variable. */
htab = nds32_elf_hash_table (info);
- s = htab->sdynbss;
+ s = htab->root.sdynbss;
BFD_ASSERT (s != NULL);
/* We must generate a R_NDS32_COPY reloc to tell the dynamic linker
@@ -3999,7 +3997,7 @@ nds32_elf_adjust_dynamic_symbol (struct
{
asection *srel;
- srel = htab->srelbss;
+ srel = htab->root.srelbss;
BFD_ASSERT (srel != NULL);
srel->size += sizeof (Elf32_External_Rela);
h->needs_copy = 1;
@@ -7277,7 +7275,8 @@ nds32_elf_check_relocs (bfd *abfd, struc
void *vpp;
Elf_Internal_Sym *isym;
- isym = bfd_sym_from_r_symndx (&htab->sym_cache, abfd, r_symndx);
+ isym = bfd_sym_from_r_symndx (&htab->root.sym_cache,
+ abfd, r_symndx);
if (isym == NULL)
return FALSE;
diff -rup binutils.orig/bfd/elf32-nds32.h binutils-2.35/bfd/elf32-nds32.h
--- binutils.orig/bfd/elf32-nds32.h 2020-07-30 08:41:25.053236316 +0100
+++ binutils-2.35/bfd/elf32-nds32.h 2020-07-30 09:06:39.397533847 +0100
@@ -122,13 +122,6 @@ struct elf_nds32_link_hash_table
{
struct elf_link_hash_table root;
- /* Short-cuts to get to dynamic linker sections. */
- asection *sdynbss;
- asection *srelbss;
-
- /* Small local sym to section mapping cache. */
- struct sym_cache sym_cache;
-
/* Target dependent options. */
int relax_fp_as_gp; /* --mrelax-omit-fp. */
int eliminate_gc_relocs; /* --meliminate-gc-relocs. */
diff -rup binutils.orig/bfd/elf32-nios2.c binutils-2.35/bfd/elf32-nios2.c
--- binutils.orig/bfd/elf32-nios2.c 2020-07-30 08:41:25.049236342 +0100
+++ binutils-2.35/bfd/elf32-nios2.c 2020-07-30 09:06:39.397533847 +0100
@@ -1808,9 +1808,6 @@ struct elf32_nios2_link_hash_table
bfd_vma offset;
} tls_ldm_got;
- /* Small local sym cache. */
- struct sym_cache sym_cache;
-
bfd_vma res_n_size;
};
@@ -4902,7 +4899,7 @@ nios2_elf32_check_relocs (bfd *abfd, str
void *vpp;
Elf_Internal_Sym *isym;
- isym = bfd_sym_from_r_symndx (&htab->sym_cache,
+ isym = bfd_sym_from_r_symndx (&htab->root.sym_cache,
abfd, r_symndx);
if (isym == NULL)
return FALSE;
diff -rup binutils.orig/bfd/elf32-or1k.c binutils-2.35/bfd/elf32-or1k.c
--- binutils.orig/bfd/elf32-or1k.c 2020-07-30 08:41:25.046236362 +0100
+++ binutils-2.35/bfd/elf32-or1k.c 2020-07-30 09:06:39.397533847 +0100
@@ -916,9 +916,6 @@ struct elf_or1k_link_hash_table
{
struct elf_link_hash_table root;
- /* Small local sym to section mapping cache. */
- struct sym_cache sym_sec;
-
bfd_boolean saw_plta;
};
@@ -2151,7 +2148,7 @@ or1k_elf_check_relocs (bfd *abfd,
Elf_Internal_Sym *isym;
void *vpp;
- isym = bfd_sym_from_r_symndx (&htab->sym_sec,
+ isym = bfd_sym_from_r_symndx (&htab->root.sym_cache,
abfd, r_symndx);
if (isym == NULL)
return FALSE;
diff -rup binutils.orig/bfd/elf32-ppc.c binutils-2.35/bfd/elf32-ppc.c
--- binutils.orig/bfd/elf32-ppc.c 2020-07-30 08:41:25.054236309 +0100
+++ binutils-2.35/bfd/elf32-ppc.c 2020-07-30 09:06:39.398533840 +0100
@@ -2212,9 +2212,6 @@ struct ppc_elf_link_hash_table
int plt_slot_size;
/* The size of the first PLT entry. */
int plt_initial_entry_size;
-
- /* Small local sym cache. */
- struct sym_cache sym_cache;
};
/* Rename some of the generic section flags to better document how they
@@ -2952,7 +2949,7 @@ ppc_elf_check_relocs (bfd *abfd,
ifunc = NULL;
if (h == NULL && htab->elf.target_os != is_vxworks)
{
- Elf_Internal_Sym *isym = bfd_sym_from_r_symndx (&htab->sym_cache,
+ Elf_Internal_Sym *isym = bfd_sym_from_r_symndx (&htab->elf.sym_cache,
abfd, r_symndx);
if (isym == NULL)
return FALSE;
@@ -3335,7 +3332,7 @@ ppc_elf_check_relocs (bfd *abfd,
asection *s;
Elf_Internal_Sym *isym;
- isym = bfd_sym_from_r_symndx (&htab->sym_cache,
+ isym = bfd_sym_from_r_symndx (&htab->elf.sym_cache,
abfd, r_symndx);
if (isym == NULL)
return FALSE;
@@ -3495,7 +3492,7 @@ ppc_elf_check_relocs (bfd *abfd,
void *vpp;
Elf_Internal_Sym *isym;
- isym = bfd_sym_from_r_symndx (&htab->sym_cache,
+ isym = bfd_sym_from_r_symndx (&htab->elf.sym_cache,
abfd, r_symndx);
if (isym == NULL)
return FALSE;
diff -rup binutils.orig/bfd/elf32-s390.c binutils-2.35/bfd/elf32-s390.c
--- binutils.orig/bfd/elf32-s390.c 2020-07-30 08:41:25.051236329 +0100
+++ binutils-2.35/bfd/elf32-s390.c 2020-07-30 09:06:39.398533840 +0100
@@ -746,9 +746,6 @@ struct elf_s390_link_hash_table
bfd_signed_vma refcount;
bfd_vma offset;
} tls_ldm_got;
-
- /* Small local sym cache. */
- struct sym_cache sym_cache;
};
/* Get the s390 ELF linker hash table from a link_info structure. */
@@ -930,7 +927,7 @@ elf_s390_check_relocs (bfd *abfd,
if (r_symndx < symtab_hdr->sh_info)
{
/* A local symbol. */
- isym = bfd_sym_from_r_symndx (&htab->sym_cache,
+ isym = bfd_sym_from_r_symndx (&htab->elf.sym_cache,
abfd, r_symndx);
if (isym == NULL)
return FALSE;
@@ -1281,7 +1278,7 @@ elf_s390_check_relocs (bfd *abfd,
asection *s;
void *vpp;
- isym = bfd_sym_from_r_symndx (&htab->sym_cache,
+ isym = bfd_sym_from_r_symndx (&htab->elf.sym_cache,
abfd, r_symndx);
if (isym == NULL)
return FALSE;
@@ -3722,7 +3719,7 @@ elf_s390_finish_dynamic_sections (bfd *o
if (local_plt[i].plt.offset != (bfd_vma) -1)
{
asection *sec = local_plt[i].sec;
- isym = bfd_sym_from_r_symndx (&htab->sym_cache, ibfd, i);
+ isym = bfd_sym_from_r_symndx (&htab->elf.sym_cache, ibfd, i);
if (isym == NULL)
return FALSE;
diff -rup binutils.orig/bfd/elf32-sh.c binutils-2.35/bfd/elf32-sh.c
--- binutils.orig/bfd/elf32-sh.c 2020-07-30 08:41:25.050236336 +0100
+++ binutils-2.35/bfd/elf32-sh.c 2020-07-30 09:06:39.398533840 +0100
@@ -2160,8 +2160,6 @@ struct elf_sh_link_hash_table
struct elf_link_hash_table root;
/* Short-cuts to get to dynamic linker sections. */
- asection *sdynbss;
- asection *srelbss;
asection *sfuncdesc;
asection *srelfuncdesc;
asection *srofixup;
@@ -2169,9 +2167,6 @@ struct elf_sh_link_hash_table
/* The (unloaded but important) VxWorks .rela.plt.unloaded section. */
asection *srelplt2;
- /* Small local sym cache. */
- struct sym_cache sym_cache;
-
/* A counter or offset to track a TLS got entry. */
union
{
@@ -2439,7 +2434,7 @@ sh_elf_create_dynamic_sections (bfd *abf
section into the .bss section of the final image. */
s = bfd_make_section_anyway_with_flags (abfd, ".dynbss",
SEC_ALLOC | SEC_LINKER_CREATED);
- htab->sdynbss = s;
+ htab->root.sdynbss = s;
if (s == NULL)
return FALSE;
@@ -2460,7 +2455,7 @@ sh_elf_create_dynamic_sections (bfd *abf
(bed->default_use_rela_p
? ".rela.bss" : ".rel.bss"),
flags | SEC_READONLY);
- htab->srelbss = s;
+ htab->root.srelbss = s;
if (s == NULL
|| !bfd_set_section_alignment (s, ptralign))
return FALSE;
@@ -2580,7 +2575,7 @@ sh_elf_adjust_dynamic_symbol (struct bfd
both the dynamic object and the regular object will refer to the
same memory location for the variable. */
- s = htab->sdynbss;
+ s = htab->root.sdynbss;
BFD_ASSERT (s != NULL);
/* We must generate a R_SH_COPY reloc to tell the dynamic linker to
@@ -2591,7 +2586,7 @@ sh_elf_adjust_dynamic_symbol (struct bfd
{
asection *srel;
- srel = htab->srelbss;
+ srel = htab->root.srelbss;
BFD_ASSERT (srel != NULL);
srel->size += sizeof (Elf32_External_Rela);
h->needs_copy = 1;
@@ -3151,7 +3146,7 @@ sh_elf_size_dynamic_sections (bfd *outpu
|| s == htab->root.sgotplt
|| s == htab->sfuncdesc
|| s == htab->srofixup
- || s == htab->sdynbss)
+ || s == htab->root.sdynbss)
{
/* Strip this section if we don't need it; see the
comment below. */
@@ -5679,7 +5674,7 @@ sh_elf_check_relocs (bfd *abfd, struct b
void *vpp;
Elf_Internal_Sym *isym;
- isym = bfd_sym_from_r_symndx (&htab->sym_cache,
+ isym = bfd_sym_from_r_symndx (&htab->root.sym_cache,
abfd, r_symndx);
if (isym == NULL)
return FALSE;
diff -rup binutils.orig/bfd/elf32-tic6x.c binutils-2.35/bfd/elf32-tic6x.c
--- binutils.orig/bfd/elf32-tic6x.c 2020-07-30 08:41:25.041236395 +0100
+++ binutils-2.35/bfd/elf32-tic6x.c 2020-07-30 09:06:39.399533834 +0100
@@ -46,9 +46,6 @@ struct elf32_tic6x_link_hash_table
/* C6X specific command line arguments. */
struct elf32_tic6x_params params;
- /* Small local sym cache. */
- struct sym_cache sym_cache;
-
/* The output BFD, for convenience. */
bfd *obfd;
@@ -2729,7 +2726,7 @@ elf32_tic6x_check_relocs (bfd *abfd, str
if (r_symndx < symtab_hdr->sh_info)
{
/* A local symbol. */
- isym = bfd_sym_from_r_symndx (&htab->sym_cache,
+ isym = bfd_sym_from_r_symndx (&htab->elf.sym_cache,
abfd, r_symndx);
if (isym == NULL)
return FALSE;
diff -rup binutils.orig/bfd/elf32-tilepro.c binutils-2.35/bfd/elf32-tilepro.c
--- binutils.orig/bfd/elf32-tilepro.c 2020-07-30 08:41:25.039236408 +0100
+++ binutils-2.35/bfd/elf32-tilepro.c 2020-07-30 09:06:39.399533834 +0100
@@ -727,19 +727,11 @@ tilepro_elf_mkobject (bfd *abfd)
#include "elf/common.h"
#include "elf/internal.h"
-struct tilepro_elf_link_hash_table
-{
- struct elf_link_hash_table elf;
-
- /* Small local sym to section mapping cache. */
- struct sym_cache sym_cache;
-};
-
/* Get the Tilepro ELF linker hash table from a link_info structure. */
#define tilepro_elf_hash_table(p) \
(elf_hash_table_id ((struct elf_link_hash_table *) ((p)->hash)) \
== TILEPRO_ELF_DATA \
- ? ((struct tilepro_elf_link_hash_table *) ((p)->hash)) : NULL)
+ ? ((struct elf_link_hash_table *) ((p)->hash)) : NULL)
static reloc_howto_type *
tilepro_reloc_type_lookup (bfd * abfd ATTRIBUTE_UNUSED,
@@ -1184,14 +1176,14 @@ link_hash_newfunc (struct bfd_hash_entry
static struct bfd_link_hash_table *
tilepro_elf_link_hash_table_create (bfd *abfd)
{
- struct tilepro_elf_link_hash_table *ret;
- size_t amt = sizeof (struct tilepro_elf_link_hash_table);
+ struct elf_link_hash_table *ret;
+ size_t amt = sizeof (struct elf_link_hash_table);
- ret = (struct tilepro_elf_link_hash_table *) bfd_zmalloc (amt);
+ ret = (struct elf_link_hash_table *) bfd_zmalloc (amt);
if (ret == NULL)
return NULL;
- if (!_bfd_elf_link_hash_table_init (&ret->elf, abfd, link_hash_newfunc,
+ if (!_bfd_elf_link_hash_table_init (ret, abfd, link_hash_newfunc,
sizeof (struct tilepro_elf_link_hash_entry),
TILEPRO_ELF_DATA))
{
@@ -1199,7 +1191,7 @@ tilepro_elf_link_hash_table_create (bfd
return NULL;
}
- return &ret->elf.root;
+ return &ret->root;
}
/* Create the .got section. */
@@ -1402,7 +1394,7 @@ static bfd_boolean
tilepro_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
asection *sec, const Elf_Internal_Rela *relocs)
{
- struct tilepro_elf_link_hash_table *htab;
+ struct elf_link_hash_table *htab;
Elf_Internal_Shdr *symtab_hdr;
struct elf_link_hash_entry **sym_hashes;
const Elf_Internal_Rela *rel;
@@ -1423,8 +1415,8 @@ tilepro_elf_check_relocs (bfd *abfd, str
BFD_ASSERT (is_tilepro_elf (abfd) || num_relocs == 0);
- if (htab->elf.dynobj == NULL)
- htab->elf.dynobj = abfd;
+ if (htab->dynobj == NULL)
+ htab->dynobj = abfd;
rel_end = relocs + num_relocs;
for (rel = relocs; rel < rel_end; rel++)
@@ -1569,9 +1561,9 @@ tilepro_elf_check_relocs (bfd *abfd, str
}
}
- if (htab->elf.sgot == NULL)
+ if (htab->sgot == NULL)
{
- if (!tilepro_elf_create_got_section (htab->elf.dynobj, info))
+ if (!tilepro_elf_create_got_section (htab->dynobj, info))
return FALSE;
}
break;
@@ -1716,7 +1708,7 @@ tilepro_elf_check_relocs (bfd *abfd, str
if (sreloc == NULL)
{
sreloc = _bfd_elf_make_dynamic_reloc_section
- (sec, htab->elf.dynobj, 2, abfd, /*rela?*/ TRUE);
+ (sec, htab->dynobj, 2, abfd, /*rela?*/ TRUE);
if (sreloc == NULL)
return FALSE;
@@ -1754,7 +1746,7 @@ tilepro_elf_check_relocs (bfd *abfd, str
{
size_t amt = sizeof *p;
p = ((struct elf_dyn_relocs *)
- bfd_alloc (htab->elf.dynobj, amt));
+ bfd_alloc (htab->dynobj, amt));
if (p == NULL)
return FALSE;
p->next = *head;
@@ -1850,14 +1842,14 @@ static bfd_boolean
tilepro_elf_adjust_dynamic_symbol (struct bfd_link_info *info,
struct elf_link_hash_entry *h)
{
- struct tilepro_elf_link_hash_table *htab;
+ struct elf_link_hash_table *htab;
asection *s, *srel;
htab = tilepro_elf_hash_table (info);
BFD_ASSERT (htab != NULL);
/* Make sure we know what is going on here. */
- BFD_ASSERT (htab->elf.dynobj != NULL
+ BFD_ASSERT (htab->dynobj != NULL
&& (h->needs_plt
|| h->is_weakalias
|| (h->def_dynamic
@@ -1947,13 +1939,13 @@ tilepro_elf_adjust_dynamic_symbol (struc
.rel.bss section we are going to use. */
if ((h->root.u.def.section->flags & SEC_READONLY) != 0)
{
- s = htab->elf.sdynrelro;
- srel = htab->elf.sreldynrelro;
+ s = htab->sdynrelro;
+ srel = htab->sreldynrelro;
}
else
{
- s = htab->elf.sdynbss;
- srel = htab->elf.srelbss;
+ s = htab->sdynbss;
+ srel = htab->srelbss;
}
if ((h->root.u.def.section->flags & SEC_ALLOC) != 0 && h->size != 0)
{
@@ -1971,7 +1963,7 @@ static bfd_boolean
allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf)
{
struct bfd_link_info *info;
- struct tilepro_elf_link_hash_table *htab;
+ struct elf_link_hash_table *htab;
struct elf_dyn_relocs *p;
if (h->root.type == bfd_link_hash_indirect)
@@ -1981,7 +1973,7 @@ allocate_dynrelocs (struct elf_link_hash
htab = tilepro_elf_hash_table (info);
BFD_ASSERT (htab != NULL);
- if (htab->elf.dynamic_sections_created
+ if (htab->dynamic_sections_created
&& h->plt.refcount > 0)
{
/* Make sure this symbol is output as a dynamic symbol.
@@ -1995,7 +1987,7 @@ allocate_dynrelocs (struct elf_link_hash
if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, bfd_link_pic (info), h))
{
- asection *s = htab->elf.splt;
+ asection *s = htab->splt;
/* Allocate room for the header. */
if (s->size == 0)
@@ -2021,10 +2013,10 @@ allocate_dynrelocs (struct elf_link_hash
s->size += PLT_ENTRY_SIZE;
/* We also need to make an entry in the .got.plt section. */
- htab->elf.sgotplt->size += GOT_ENTRY_SIZE;
+ htab->sgotplt->size += GOT_ENTRY_SIZE;
/* We also need to make an entry in the .rela.plt section. */
- htab->elf.srelplt->size += TILEPRO_ELF_RELA_BYTES;
+ htab->srelplt->size += TILEPRO_ELF_RELA_BYTES;
}
else
{
@@ -2060,22 +2052,22 @@ allocate_dynrelocs (struct elf_link_hash
return FALSE;
}
- s = htab->elf.sgot;
+ s = htab->sgot;
h->got.offset = s->size;
s->size += TILEPRO_BYTES_PER_WORD;
/* R_TILEPRO_IMM16_Xn_TLS_GD entries need 2 consecutive GOT slots. */
if (tls_type == GOT_TLS_GD)
s->size += TILEPRO_BYTES_PER_WORD;
- dyn = htab->elf.dynamic_sections_created;
+ dyn = htab->dynamic_sections_created;
/* R_TILEPRO_IMM16_Xn_TLS_IE_xxx needs one dynamic relocation,
R_TILEPRO_IMM16_Xn_TLS_GD_xxx needs two if local symbol and two if
global. */
if (tls_type == GOT_TLS_GD || tls_type == GOT_TLS_IE)
- htab->elf.srelgot->size += 2 * TILEPRO_ELF_RELA_BYTES;
+ htab->srelgot->size += 2 * TILEPRO_ELF_RELA_BYTES;
else if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn,
bfd_link_pic (info),
h))
- htab->elf.srelgot->size += TILEPRO_ELF_RELA_BYTES;
+ htab->srelgot->size += TILEPRO_ELF_RELA_BYTES;
}
else
h->got.offset = (bfd_vma) -1;
@@ -2134,7 +2126,7 @@ allocate_dynrelocs (struct elf_link_hash
if (!h->non_got_ref
&& ((h->def_dynamic
&& !h->def_regular)
- || (htab->elf.dynamic_sections_created
+ || (htab->dynamic_sections_created
&& (h->root.type == bfd_link_hash_undefweak
|| h->root.type == bfd_link_hash_undefined))))
{
@@ -2195,14 +2187,14 @@ tilepro_elf_size_dynamic_sections (bfd *
{
(void)output_bfd;
- struct tilepro_elf_link_hash_table *htab;
+ struct elf_link_hash_table *htab;
bfd *dynobj;
asection *s;
bfd *ibfd;
htab = tilepro_elf_hash_table (info);
BFD_ASSERT (htab != NULL);
- dynobj = htab->elf.dynobj;
+ dynobj = htab->dynobj;
BFD_ASSERT (dynobj != NULL);
if (elf_hash_table (info)->dynamic_sections_created)
@@ -2268,8 +2260,8 @@ tilepro_elf_size_dynamic_sections (bfd *
locsymcount = symtab_hdr->sh_info;
end_local_got = local_got + locsymcount;
local_tls_type = _bfd_tilepro_elf_local_got_tls_type (ibfd);
- s = htab->elf.sgot;
- srel = htab->elf.srelgot;
+ s = htab->sgot;
+ srel = htab->srelgot;
for (; local_got < end_local_got; ++local_got, ++local_tls_type)
{
if (*local_got > 0)
@@ -2290,19 +2282,19 @@ tilepro_elf_size_dynamic_sections (bfd *
/* Allocate global sym .plt and .got entries, and space for global
sym dynamic relocs. */
- elf_link_hash_traverse (&htab->elf, allocate_dynrelocs, info);
+ elf_link_hash_traverse (htab, allocate_dynrelocs, info);
if (elf_hash_table (info)->dynamic_sections_created)
{
/* If the .got section is more than 0x8000 bytes, we add
0x8000 to the value of _GLOBAL_OFFSET_TABLE_, so that 16
bit relocations have a greater chance of working. */
- if (htab->elf.sgot->size >= 0x8000
+ if (htab->sgot->size >= 0x8000
&& elf_hash_table (info)->hgot->root.u.def.value == 0)
elf_hash_table (info)->hgot->root.u.def.value = 0x8000;
}
- if (htab->elf.sgotplt)
+ if (htab->sgotplt)
{
struct elf_link_hash_entry *got;
got = elf_link_hash_lookup (elf_hash_table (info),
@@ -2313,14 +2305,14 @@ tilepro_elf_size_dynamic_sections (bfd *
entries and there is no refeence to _GLOBAL_OFFSET_TABLE_. */
if ((got == NULL
|| !got->ref_regular_nonweak)
- && (htab->elf.sgotplt->size
+ && (htab->sgotplt->size
== GOTPLT_HEADER_SIZE)
- && (htab->elf.splt == NULL
- || htab->elf.splt->size == 0)
- && (htab->elf.sgot == NULL
- || (htab->elf.sgot->size
+ && (htab->splt == NULL
+ || htab->splt->size == 0)
+ && (htab->sgot == NULL
+ || (htab->sgot->size
== get_elf_backend_data (output_bfd)->got_header_size)))
- htab->elf.sgotplt->size = 0;
+ htab->sgotplt->size = 0;
}
/* The check_relocs and adjust_dynamic_symbol entry points have
@@ -2331,11 +2323,11 @@ tilepro_elf_size_dynamic_sections (bfd *
if ((s->flags & SEC_LINKER_CREATED) == 0)
continue;
- if (s == htab->elf.splt
- || s == htab->elf.sgot
- || s == htab->elf.sgotplt
- || s == htab->elf.sdynbss
- || s == htab->elf.sdynrelro)
+ if (s == htab->splt
+ || s == htab->sgot
+ || s == htab->sgotplt
+ || s == htab->sdynbss
+ || s == htab->sdynrelro)
{
/* Strip this section if we don't need it; see the
comment below. */
@@ -2527,7 +2519,7 @@ tilepro_elf_relocate_section (bfd *outpu
Elf_Internal_Sym *local_syms,
asection **local_sections)
{
- struct tilepro_elf_link_hash_table *htab;
+ struct elf_link_hash_table *htab;
Elf_Internal_Shdr *symtab_hdr;
struct elf_link_hash_entry **sym_hashes;
bfd_vma *local_got_offsets;
@@ -2758,7 +2750,7 @@ tilepro_elf_relocate_section (bfd *outpu
case R_TILEPRO_IMM16_X1_GOT_HA:
/* Relocation is to the entry for this symbol in the global
offset table. */
- if (htab->elf.sgot == NULL)
+ if (htab->sgot == NULL)
abort ();
if (h != NULL)
@@ -2792,7 +2784,7 @@ tilepro_elf_relocate_section (bfd *outpu
else
{
bfd_put_32 (output_bfd, relocation,
- htab->elf.sgot->contents + off);
+ htab->sgot->contents + off);
h->got.offset |= 1;
}
}
@@ -2820,11 +2812,11 @@ tilepro_elf_relocate_section (bfd *outpu
/* We need to generate a R_TILEPRO_RELATIVE reloc
for the dynamic linker. */
- s = htab->elf.srelgot;
+ s = htab->srelgot;
BFD_ASSERT (s != NULL);
- outrel.r_offset = (htab->elf.sgot->output_section->vma
- + htab->elf.sgot->output_offset
+ outrel.r_offset = (htab->sgot->output_section->vma
+ + htab->sgot->output_offset
+ off);
outrel.r_info = ELF32_R_INFO (0, R_TILEPRO_RELATIVE);
outrel.r_addend = relocation;
@@ -2833,7 +2825,7 @@ tilepro_elf_relocate_section (bfd *outpu
}
bfd_put_32 (output_bfd, relocation,
- htab->elf.sgot->contents + off);
+ htab->sgot->contents + off);
local_got_offsets[r_symndx] |= 1;
}
}
@@ -2845,7 +2837,7 @@ tilepro_elf_relocate_section (bfd *outpu
procedure linkage table. */
BFD_ASSERT (h != NULL);
- if (h->plt.offset == (bfd_vma) -1 || htab->elf.splt == NULL)
+ if (h->plt.offset == (bfd_vma) -1 || htab->splt == NULL)
{
/* We didn't make a PLT entry for this symbol. This
happens when statically linking PIC code, or when
@@ -2853,8 +2845,8 @@ tilepro_elf_relocate_section (bfd *outpu
break;
}
- relocation = (htab->elf.splt->output_section->vma
- + htab->elf.splt->output_offset
+ relocation = (htab->splt->output_section->vma
+ + htab->splt->output_offset
+ h->plt.offset);
unresolved_reloc = FALSE;
break;
@@ -2993,7 +2985,7 @@ tilepro_elf_relocate_section (bfd *outpu
outrel.r_addend = relocation + rel->r_addend;
if (is_plt)
- sec = htab->elf.splt;
+ sec = htab->splt;
if (bfd_is_abs_section (sec))
indx = 0;
@@ -3016,7 +3008,7 @@ tilepro_elf_relocate_section (bfd *outpu
if (indx == 0)
{
- osec = htab->elf.text_index_section;
+ osec = htab->text_index_section;
indx = elf_section_data (osec)->dynindx;
}
@@ -3142,7 +3134,7 @@ tilepro_elf_relocate_section (bfd *outpu
local_got_offsets[r_symndx] |= 1;
}
- if (htab->elf.sgot == NULL)
+ if (htab->sgot == NULL)
abort ();
if ((off & 1) != 0)
@@ -3153,13 +3145,13 @@ tilepro_elf_relocate_section (bfd *outpu
int indx = 0;
bfd_boolean need_relocs = FALSE;
- if (htab->elf.srelgot == NULL)
+ if (htab->srelgot == NULL)
abort ();
if (h != NULL)
{
bfd_boolean dyn;
- dyn = htab->elf.dynamic_sections_created;
+ dyn = htab->dynamic_sections_created;
if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn,
bfd_link_pic (info),
@@ -3190,18 +3182,18 @@ tilepro_elf_relocate_section (bfd *outpu
case R_TILEPRO_IMM16_X0_TLS_IE_HA:
case R_TILEPRO_IMM16_X1_TLS_IE_HA:
if (need_relocs) {
- bfd_put_32 (output_bfd, 0, htab->elf.sgot->contents + off);
- outrel.r_offset = (htab->elf.sgot->output_section->vma
- + htab->elf.sgot->output_offset + off);
+ bfd_put_32 (output_bfd, 0, htab->sgot->contents + off);
+ outrel.r_offset = (htab->sgot->output_section->vma
+ + htab->sgot->output_offset + off);
outrel.r_addend = 0;
if (indx == 0)
outrel.r_addend = relocation - dtpoff_base (info);
outrel.r_info = ELF32_R_INFO (indx, R_TILEPRO_TLS_TPOFF32);
- tilepro_elf_append_rela_32 (output_bfd, htab->elf.srelgot,
+ tilepro_elf_append_rela_32 (output_bfd, htab->srelgot,
&outrel);
} else {
bfd_put_32 (output_bfd, tpoff (info, relocation),
- htab->elf.sgot->contents + off);
+ htab->sgot->contents + off);
}
break;
@@ -3214,31 +3206,31 @@ tilepro_elf_relocate_section (bfd *outpu
case R_TILEPRO_IMM16_X0_TLS_GD_HA:
case R_TILEPRO_IMM16_X1_TLS_GD_HA:
if (need_relocs) {
- outrel.r_offset = (htab->elf.sgot->output_section->vma
- + htab->elf.sgot->output_offset + off);
+ outrel.r_offset = (htab->sgot->output_section->vma
+ + htab->sgot->output_offset + off);
outrel.r_addend = 0;
outrel.r_info = ELF32_R_INFO (indx, R_TILEPRO_TLS_DTPMOD32);
- bfd_put_32 (output_bfd, 0, htab->elf.sgot->contents + off);
- tilepro_elf_append_rela_32 (output_bfd, htab->elf.srelgot,
+ bfd_put_32 (output_bfd, 0, htab->sgot->contents + off);
+ tilepro_elf_append_rela_32 (output_bfd, htab->srelgot,
&outrel);
if (indx == 0)
{
BFD_ASSERT (! unresolved_reloc);
bfd_put_32 (output_bfd,
relocation - dtpoff_base (info),
- (htab->elf.sgot->contents + off +
+ (htab->sgot->contents + off +
TILEPRO_BYTES_PER_WORD));
}
else
{
bfd_put_32 (output_bfd, 0,
- (htab->elf.sgot->contents + off +
+ (htab->sgot->contents + off +
TILEPRO_BYTES_PER_WORD));
outrel.r_info = ELF32_R_INFO (indx,
R_TILEPRO_TLS_DTPOFF32);
outrel.r_offset += TILEPRO_BYTES_PER_WORD;
tilepro_elf_append_rela_32 (output_bfd,
- htab->elf.srelgot, &outrel);
+ htab->srelgot, &outrel);
}
}
@@ -3249,9 +3241,9 @@ tilepro_elf_relocate_section (bfd *outpu
symbol binding locally. Mark it as belonging
to module 1, the executable. */
bfd_put_32 (output_bfd, 1,
- htab->elf.sgot->contents + off );
+ htab->sgot->contents + off );
bfd_put_32 (output_bfd, relocation - dtpoff_base (info),
- htab->elf.sgot->contents + off +
+ htab->sgot->contents + off +
TILEPRO_BYTES_PER_WORD);
}
break;
@@ -3411,7 +3403,7 @@ tilepro_elf_finish_dynamic_symbol (bfd *
struct elf_link_hash_entry *h,
Elf_Internal_Sym *sym)
{
- struct tilepro_elf_link_hash_table *htab;
+ struct elf_link_hash_table *htab;
htab = tilepro_elf_hash_table (info);
BFD_ASSERT (htab != NULL);
@@ -3431,9 +3423,9 @@ tilepro_elf_finish_dynamic_symbol (bfd *
BFD_ASSERT (h->dynindx != -1);
- splt = htab->elf.splt;
- srela = htab->elf.srelplt;
- sgotplt = htab->elf.sgotplt;
+ splt = htab->splt;
+ srela = htab->srelplt;
+ sgotplt = htab->sgotplt;
if (splt == NULL || srela == NULL)
abort ();
@@ -3481,8 +3473,8 @@ tilepro_elf_finish_dynamic_symbol (bfd *
/* This symbol has an entry in the GOT. Set it up. */
- sgot = htab->elf.sgot;
- srela = htab->elf.srelgot;
+ sgot = htab->sgot;
+ srela = htab->srelgot;
BFD_ASSERT (sgot != NULL && srela != NULL);
rela.r_offset = (sgot->output_section->vma
@@ -3528,16 +3520,16 @@ tilepro_elf_finish_dynamic_symbol (bfd *
+ h->root.u.def.section->output_offset);
rela.r_info = ELF32_R_INFO (h->dynindx, R_TILEPRO_COPY);
rela.r_addend = 0;
- if (h->root.u.def.section == htab->elf.sdynrelro)
- s = htab->elf.sreldynrelro;
+ if (h->root.u.def.section == htab->sdynrelro)
+ s = htab->sreldynrelro;
else
- s = htab->elf.srelbss;
+ s = htab->srelbss;
tilepro_elf_append_rela_32 (output_bfd, s, &rela);
}
/* Mark some specially defined symbols as absolute. */
- if (h == htab->elf.hdynamic
- || (h == htab->elf.hgot || h == htab->elf.hplt))
+ if (h == htab->hdynamic
+ || (h == htab->hgot || h == htab->hplt))
sym->st_shndx = SHN_ABS;
return TRUE;
@@ -3551,7 +3543,7 @@ tilepro_finish_dyn (bfd *output_bfd, str
asection *splt ATTRIBUTE_UNUSED)
{
Elf32_External_Dyn *dyncon, *dynconend;
- struct tilepro_elf_link_hash_table *htab;
+ struct elf_link_hash_table *htab;
htab = tilepro_elf_hash_table (info);
BFD_ASSERT (htab != NULL);
@@ -3567,15 +3559,15 @@ tilepro_finish_dyn (bfd *output_bfd, str
switch (dyn.d_tag)
{
case DT_PLTGOT:
- s = htab->elf.sgotplt;
+ s = htab->sgotplt;
dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
break;
case DT_JMPREL:
- s = htab->elf.srelplt;
+ s = htab->srelplt;
dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
break;
case DT_PLTRELSZ:
- s = htab->elf.srelplt;
+ s = htab->srelplt;
dyn.d_un.d_val = s->size;
break;
default:
@@ -3593,11 +3585,11 @@ tilepro_elf_finish_dynamic_sections (bfd
{
bfd *dynobj;
asection *sdyn;
- struct tilepro_elf_link_hash_table *htab;
+ struct elf_link_hash_table *htab;
htab = tilepro_elf_hash_table (info);
BFD_ASSERT (htab != NULL);
- dynobj = htab->elf.dynobj;
+ dynobj = htab->dynobj;
sdyn = bfd_get_linker_section (dynobj, ".dynamic");
@@ -3606,7 +3598,7 @@ tilepro_elf_finish_dynamic_sections (bfd
asection *splt;
bfd_boolean ret;
- splt = htab->elf.splt;
+ splt = htab->splt;
BFD_ASSERT (splt != NULL && sdyn != NULL);
ret = tilepro_finish_dyn (output_bfd, info, dynobj, sdyn, splt);
@@ -3627,42 +3619,42 @@ tilepro_elf_finish_dynamic_sections (bfd
= PLT_ENTRY_SIZE;
}
- if (htab->elf.sgotplt)
+ if (htab->sgotplt)
{
- if (bfd_is_abs_section (htab->elf.sgotplt->output_section))
+ if (bfd_is_abs_section (htab->sgotplt->output_section))
{
_bfd_error_handler
- (_("discarded output section: `%pA'"), htab->elf.sgotplt);
+ (_("discarded output section: `%pA'"), htab->sgotplt);
return FALSE;
}
- if (htab->elf.sgotplt->size > 0)
+ if (htab->sgotplt->size > 0)
{
/* Write the first two entries in .got.plt, needed for the dynamic
linker. */
bfd_put_32 (output_bfd, (bfd_vma) -1,
- htab->elf.sgotplt->contents);
+ htab->sgotplt->contents);
bfd_put_32 (output_bfd, (bfd_vma) 0,
- htab->elf.sgotplt->contents + GOT_ENTRY_SIZE);
+ htab->sgotplt->contents + GOT_ENTRY_SIZE);
}
- elf_section_data (htab->elf.sgotplt->output_section)->this_hdr.sh_entsize
+ elf_section_data (htab->sgotplt->output_section)->this_hdr.sh_entsize
= GOT_ENTRY_SIZE;
}
- if (htab->elf.sgot)
+ if (htab->sgot)
{
- if (htab->elf.sgot->size > 0)
+ if (htab->sgot->size > 0)
{
/* Set the first entry in the global offset table to the address of
the dynamic section. */
bfd_vma val = (sdyn ?
sdyn->output_section->vma + sdyn->output_offset :
0);
- bfd_put_32 (output_bfd, val, htab->elf.sgot->contents);
+ bfd_put_32 (output_bfd, val, htab->sgot->contents);
}
- elf_section_data (htab->elf.sgot->output_section)->this_hdr.sh_entsize
+ elf_section_data (htab->sgot->output_section)->this_hdr.sh_entsize
= GOT_ENTRY_SIZE;
}
diff -rup binutils.orig/bfd/elf64-ppc.c binutils-2.35/bfd/elf64-ppc.c
--- binutils.orig/bfd/elf64-ppc.c 2020-07-30 08:41:25.038236414 +0100
+++ binutils-2.35/bfd/elf64-ppc.c 2020-07-30 09:06:39.400533827 +0100
@@ -3250,9 +3250,6 @@ struct ppc_link_hash_table
/* Incremented every time we size stubs. */
unsigned int stub_iteration;
-
- /* Small local sym cache. */
- struct sym_cache sym_cache;
};
/* Rename some of the generic section flags to better document how they
@@ -4383,7 +4380,8 @@ ppc64_elf_before_check_relocs (bfd *ibfd
Elf_Internal_Sym *isym;
asection *s;
- isym = bfd_sym_from_r_symndx (&htab->sym_cache, ibfd, r_symndx);
+ isym = bfd_sym_from_r_symndx (&htab->elf.sym_cache, ibfd,
+ r_symndx);
if (isym == NULL)
{
if (elf_section_data (opd)->relocs != relocs)
@@ -4684,7 +4682,7 @@ ppc64_elf_check_relocs (bfd *abfd, struc
}
else
{
- Elf_Internal_Sym *isym = bfd_sym_from_r_symndx (&htab->sym_cache,
+ Elf_Internal_Sym *isym = bfd_sym_from_r_symndx (&htab->elf.sym_cache,
abfd, r_symndx);
if (isym == NULL)
return FALSE;
@@ -4955,7 +4953,7 @@ ppc64_elf_check_relocs (bfd *abfd, struc
{
Elf_Internal_Sym *isym;
- isym = bfd_sym_from_r_symndx (&htab->sym_cache,
+ isym = bfd_sym_from_r_symndx (&htab->elf.sym_cache,
abfd, r_symndx);
if (isym == NULL)
return FALSE;
@@ -5231,7 +5229,7 @@ ppc64_elf_check_relocs (bfd *abfd, struc
void *vpp;
Elf_Internal_Sym *isym;
- isym = bfd_sym_from_r_symndx (&htab->sym_cache,
+ isym = bfd_sym_from_r_symndx (&htab->elf.sym_cache,
abfd, r_symndx);
if (isym == NULL)
return FALSE;
diff -rup binutils.orig/bfd/elf64-s390.c binutils-2.35/bfd/elf64-s390.c
--- binutils.orig/bfd/elf64-s390.c 2020-07-30 08:41:25.044236375 +0100
+++ binutils-2.35/bfd/elf64-s390.c 2020-07-30 09:06:39.400533827 +0100
@@ -663,9 +663,6 @@ struct elf_s390_link_hash_table
bfd_vma offset;
} tls_ldm_got;
- /* Small local sym cache. */
- struct sym_cache sym_cache;
-
/* Options passed from the linker. */
struct s390_elf_params *params;
};
@@ -852,7 +849,7 @@ elf_s390_check_relocs (bfd *abfd,
if (r_symndx < symtab_hdr->sh_info)
{
/* A local symbol. */
- isym = bfd_sym_from_r_symndx (&htab->sym_cache,
+ isym = bfd_sym_from_r_symndx (&htab->elf.sym_cache,
abfd, r_symndx);
if (isym == NULL)
return FALSE;
@@ -1216,7 +1213,7 @@ elf_s390_check_relocs (bfd *abfd,
asection *s;
void *vpp;
- isym = bfd_sym_from_r_symndx (&htab->sym_cache,
+ isym = bfd_sym_from_r_symndx (&htab->elf.sym_cache,
abfd, r_symndx);
if (isym == NULL)
return FALSE;
@@ -2258,7 +2255,7 @@ elf_s390_relocate_section (bfd *output_b
& 0xff00f000) == 0xe300c000
&& bfd_get_8 (input_bfd,
contents + rel->r_offset + 3) == 0x04))
- && (isym = bfd_sym_from_r_symndx (&htab->sym_cache,
+ && (isym = bfd_sym_from_r_symndx (&htab->elf.sym_cache,
input_bfd, r_symndx))
&& isym->st_shndx != SHN_ABS
&& h != htab->elf.hdynamic
@@ -3572,7 +3569,7 @@ elf_s390_finish_dynamic_sections (bfd *o
if (local_plt[i].plt.offset != (bfd_vma) -1)
{
asection *sec = local_plt[i].sec;
- isym = bfd_sym_from_r_symndx (&htab->sym_cache, ibfd, i);
+ isym = bfd_sym_from_r_symndx (&htab->elf.sym_cache, ibfd, i);
if (isym == NULL)
return FALSE;
diff -rup binutils.orig/bfd/elf64-x86-64.c binutils-2.35/bfd/elf64-x86-64.c
--- binutils.orig/bfd/elf64-x86-64.c 2020-07-30 08:41:25.040236401 +0100
+++ binutils-2.35/bfd/elf64-x86-64.c 2020-07-30 09:06:39.401533821 +0100
@@ -1371,7 +1371,7 @@ elf_x86_64_tls_transition (struct bfd_li
{
Elf_Internal_Sym *isym;
- isym = bfd_sym_from_r_symndx (&htab->sym_cache,
+ isym = bfd_sym_from_r_symndx (&htab->elf.sym_cache,
abfd, r_symndx);
name = bfd_elf_sym_name (abfd, symtab_hdr, isym, NULL);
}
@@ -1559,7 +1559,7 @@ elf_x86_64_convert_load_reloc (bfd *abfd
if (h == NULL)
{
Elf_Internal_Sym *isym
- = bfd_sym_from_r_symndx (&htab->sym_cache, abfd, r_symndx);
+ = bfd_sym_from_r_symndx (&htab->elf.sym_cache, abfd, r_symndx);
/* Skip relocation against undefined symbols. */
if (isym->st_shndx == SHN_UNDEF)
@@ -1907,7 +1907,7 @@ elf_x86_64_check_relocs (bfd *abfd, stru
if (r_symndx < symtab_hdr->sh_info)
{
/* A local symbol. */
- isym = bfd_sym_from_r_symndx (&htab->sym_cache,
+ isym = bfd_sym_from_r_symndx (&htab->elf.sym_cache,
abfd, r_symndx);
if (isym == NULL)
goto error_return;
@@ -2308,7 +2308,7 @@ elf_x86_64_check_relocs (bfd *abfd, stru
asection *s;
void **vpp;
- isym = bfd_sym_from_r_symndx (&htab->sym_cache,
+ isym = bfd_sym_from_r_symndx (&htab->elf.sym_cache,
abfd, r_symndx);
if (isym == NULL)
goto error_return;
diff -rup binutils.orig/bfd/elflink.c binutils-2.35/bfd/elflink.c
--- binutils.orig/bfd/elflink.c 2020-07-30 08:41:25.055236303 +0100
+++ binutils-2.35/bfd/elflink.c 2020-07-30 09:06:39.401533821 +0100
@@ -1228,6 +1228,17 @@ _bfd_elf_merge_symbol (bfd *abfd,
return TRUE;
}
+ /* After all LTO IR symbols have been read, skip all undefined
+ symbols without relocation. */
+ if (info->lto_all_symbols_read
+ && bfd_is_und_section (sec)
+ && (abfd->flags & DYNAMIC) == 0
+ && !h->has_reloc_after_lto_all_symbols_read)
+ {
+ *skip = TRUE;
+ return TRUE;
+ }
+
/* In cases involving weak versioned symbols, we may wind up trying
to merge a symbol with itself. Catch that here, to avoid the
confusion that results if we try to override a symbol with
@@ -4545,6 +4556,93 @@ elf_link_add_object_symbols (bfd *abfd,
(_("%pB: plugin needed to handle lto object"), abfd);
}
+ /* Normally an undefined symbol is treated as a reference. Linker
+ will try to satisfy the reference. This feature is used to bring
+ a symbol definition into output without explicit relocation. If
+ there is no definition nor relocation, linker will remove undefined
+ symbol from symbol table in output (PR ld/4317). But GCC 10 LTO
+ may generate separate debug info files which contain undefined
+ symbols without relocations:
+
+ https://gcc.gnu.org/bugzilla/show_bug.cgi?id=96385
+
+ After all LTO IR symbols have been read, if there is a dinition in
+ LTO IR object, there is no relocation, and there is a definition
+ in a shared object, linker may resolve the undefined symbol to the
+ discarded section in LTO IR object. To avoid it, after all LTO IR
+ symbols have been read, skip undefined symbols without relocation.
+ */
+ if (info->lto_all_symbols_read
+ && !bfd_link_relocatable (info)
+ && (abfd->flags & DYNAMIC) == 0
+ && !just_syms
+ && extsymcount)
+ {
+ int r_sym_shift;
+ struct elf_link_hash_entry *h;
+ const char *name;
+
+ if (bed->s->arch_size == 32)
+ r_sym_shift = 8;
+ else
+ r_sym_shift = 32;
+
+ for (s = abfd->sections; s != NULL; s = s->next)
+ {
+ Elf_Internal_Rela *internal_relocs;
+ Elf_Internal_Rela *rel, *relend;
+
+ /* Don't check relocations in excluded sections. */
+ if ((s->flags & SEC_RELOC) == 0
+ || s->reloc_count == 0
+ || (s->flags & SEC_EXCLUDE) != 0
+ || ((info->strip == strip_all
+ || info->strip == strip_debugger)
+ && (s->flags & SEC_DEBUGGING) != 0))
+ continue;
+
+ internal_relocs = _bfd_elf_link_read_relocs (abfd, s, NULL,
+ NULL,
+ info->keep_memory);
+ if (internal_relocs == NULL)
+ goto error_free_vers;
+
+ rel = internal_relocs;
+ relend = rel + s->reloc_count;
+ for ( ; rel < relend; rel++)
+ {
+ unsigned long r_symndx = rel->r_info >> r_sym_shift;
+
+ /* Skip local symbols. */
+ if (r_symndx < extsymoff)
+ continue;
+
+ isym = bfd_sym_from_r_symndx (&htab->sym_cache, abfd,
+ r_symndx);
+ if (isym->st_shndx == SHN_UNDEF)
+ {
+ name = bfd_elf_string_from_elf_section (abfd,
+ hdr->sh_link,
+ isym->st_name);
+ h = ((struct elf_link_hash_entry *)
+ bfd_wrapped_link_hash_lookup (abfd, info, name,
+ TRUE, FALSE,
+ FALSE));
+ if (h != NULL)
+ {
+ while (h->root.type == bfd_link_hash_indirect
+ || h->root.type == bfd_link_hash_warning)
+ h = (struct elf_link_hash_entry *) h->root.u.i.link;
+ h->has_reloc_after_lto_all_symbols_read = TRUE;
+ }
+ }
+ }
+
+ if (elf_section_data (s)->relocs != internal_relocs)
+ free (internal_relocs);
+ }
+ }
+
for (isym = isymbuf, isymend = isymbuf + extsymcount;
isym < isymend;
isym++, sym_hash++, ever = (ever != NULL ? ever + 1 : NULL))
diff -rup binutils.orig/bfd/elfnn-aarch64.c binutils-2.35/bfd/elfnn-aarch64.c
--- binutils.orig/bfd/elfnn-aarch64.c 2020-07-30 08:41:25.046236362 +0100
+++ binutils-2.35/bfd/elfnn-aarch64.c 2020-07-30 09:06:39.402533814 +0100
@@ -2643,9 +2643,6 @@ struct elf_aarch64_link_hash_table
/* The bytes of the subsequent PLT entry. */
const bfd_byte *plt_entry;
- /* Small local sym cache. */
- struct sym_cache sym_cache;
-
/* For convenience in allocate_dynrelocs. */
bfd *obfd;
@@ -7611,7 +7608,7 @@ elfNN_aarch64_check_relocs (bfd *abfd, s
if (r_symndx < symtab_hdr->sh_info)
{
/* A local symbol. */
- isym = bfd_sym_from_r_symndx (&htab->sym_cache,
+ isym = bfd_sym_from_r_symndx (&htab->root.sym_cache,
abfd, r_symndx);
if (isym == NULL)
return FALSE;
@@ -7838,7 +7835,7 @@ elfNN_aarch64_check_relocs (bfd *abfd, s
asection *s;
void **vpp;
- isym = bfd_sym_from_r_symndx (&htab->sym_cache,
+ isym = bfd_sym_from_r_symndx (&htab->root.sym_cache,
abfd, r_symndx);
if (isym == NULL)
return FALSE;
Only in binutils-2.35/bfd: elfnn-aarch64.c.orig
diff -rup binutils.orig/bfd/elfnn-riscv.c binutils-2.35/bfd/elfnn-riscv.c
--- binutils.orig/bfd/elfnn-riscv.c 2020-07-30 08:41:25.039236408 +0100
+++ binutils-2.35/bfd/elfnn-riscv.c 2020-07-30 09:06:39.402533814 +0100
@@ -113,9 +113,6 @@ struct riscv_elf_link_hash_table
/* Short-cuts to get to dynamic linker sections. */
asection *sdyntdata;
- /* Small local sym to section mapping cache. */
- struct sym_cache sym_cache;
-
/* The max alignment of output sections. */
bfd_vma max_alignment;
};
@@ -681,7 +678,7 @@ riscv_elf_check_relocs (bfd *abfd, struc
void *vpp;
Elf_Internal_Sym *isym;
- isym = bfd_sym_from_r_symndx (&htab->sym_cache,
+ isym = bfd_sym_from_r_symndx (&htab->elf.sym_cache,
abfd, r_symndx);
if (isym == NULL)
return FALSE;
diff -rup binutils.orig/bfd/elfxx-mips.c binutils-2.35/bfd/elfxx-mips.c
--- binutils.orig/bfd/elfxx-mips.c 2020-07-30 08:41:25.051236329 +0100
+++ binutils-2.35/bfd/elfxx-mips.c 2020-07-30 09:06:39.403533808 +0100
@@ -527,9 +527,6 @@ struct mips_elf_link_hash_table
returns null. */
asection *(*add_stub_section) (const char *, asection *, asection *);
- /* Small local sym cache. */
- struct sym_cache sym_cache;
-
/* Is the PLT header compressed? */
unsigned int plt_header_is_comp : 1;
};
@@ -4401,7 +4398,7 @@ mips_elf_resolve_got_page_ref (void **re
Elf_Internal_Sym *isym;
/* Read in the symbol. */
- isym = bfd_sym_from_r_symndx (&htab->sym_cache, ref->u.abfd,
+ isym = bfd_sym_from_r_symndx (&htab->root.sym_cache, ref->u.abfd,
ref->symndx);
if (isym == NULL)
{
diff -rup binutils.orig/bfd/elfxx-sparc.c binutils-2.35/bfd/elfxx-sparc.c
--- binutils.orig/bfd/elfxx-sparc.c 2020-07-30 08:41:25.035236434 +0100
+++ binutils-2.35/bfd/elfxx-sparc.c 2020-07-30 09:06:39.404533801 +0100
@@ -1391,7 +1391,8 @@ _bfd_sparc_elf_check_relocs (bfd *abfd,
if (r_symndx < symtab_hdr->sh_info)
{
/* A local symbol. */
- isym = bfd_sym_from_r_symndx (&htab->sym_cache, abfd, r_symndx);
+ isym = bfd_sym_from_r_symndx (&htab->elf.sym_cache, abfd,
+ r_symndx);
if (isym == NULL)
return FALSE;
diff -rup binutils.orig/bfd/elfxx-sparc.h binutils-2.35/bfd/elfxx-sparc.h
--- binutils.orig/bfd/elfxx-sparc.h 2020-07-30 08:41:25.042236388 +0100
+++ binutils-2.35/bfd/elfxx-sparc.h 2020-07-30 09:06:39.404533801 +0100
@@ -55,9 +55,6 @@ struct _bfd_sparc_elf_link_hash_table
bfd_vma offset;
} tls_ldm_got;
- /* Small local sym cache. */
- struct sym_cache sym_cache;
-
/* Used by local STT_GNU_IFUNC symbols. */
htab_t loc_hash_table;
void *loc_hash_memory;
diff -rup binutils.orig/bfd/elfxx-tilegx.c binutils-2.35/bfd/elfxx-tilegx.c
--- binutils.orig/bfd/elfxx-tilegx.c 2020-07-30 08:41:25.037236421 +0100
+++ binutils-2.35/bfd/elfxx-tilegx.c 2020-07-30 09:06:39.404533801 +0100
@@ -835,9 +835,6 @@ struct tilegx_elf_link_hash_table
/* Whether LE transition has been disabled for some of the
sections. */
bfd_boolean disable_le_transition;
-
- /* Small local sym to section mapping cache. */
- struct sym_cache sym_cache;
};
@@ -1979,7 +1976,7 @@ tilegx_elf_check_relocs (bfd *abfd, stru
void *vpp;
Elf_Internal_Sym *isym;
- isym = bfd_sym_from_r_symndx (&htab->sym_cache,
+ isym = bfd_sym_from_r_symndx (&htab->elf.sym_cache,
abfd, r_symndx);
if (isym == NULL)
return FALSE;
diff -rup binutils.orig/bfd/elfxx-x86.h binutils-2.35/bfd/elfxx-x86.h
--- binutils.orig/bfd/elfxx-x86.h 2020-07-30 08:41:25.052236322 +0100
+++ binutils-2.35/bfd/elfxx-x86.h 2020-07-30 09:06:39.404533801 +0100
@@ -468,9 +468,6 @@ struct elf_x86_link_hash_table
/* The amount of space used by the jump slots in the GOT. */
bfd_vma sgotplt_jump_table_size;
- /* Small local sym cache. */
- struct sym_cache sym_cache;
-
/* _TLS_MODULE_BASE_ symbol. */
struct bfd_link_hash_entry *tls_module_base;
Only in binutils.orig: binutils-2.35
diff -rup binutils.orig/gas/as.c binutils-2.35/gas/as.c
--- binutils.orig/gas/as.c 2020-07-30 08:41:25.034236441 +0100
+++ binutils-2.35/gas/as.c 2020-07-30 09:05:24.370019859 +0100
@@ -103,7 +103,7 @@ int verbose = 0;
int flag_dwarf_cie_version = -1;
/* The maximum level of DWARF DEBUG information we should manufacture. */
-unsigned int dwarf_level = 0;
+unsigned int dwarf_level = 4;
#if defined OBJ_ELF || defined OBJ_MAYBE_ELF
int flag_use_elf_stt_common = DEFAULT_GENERATE_ELF_STT_COMMON;