This is the mail archive of the
binutils@sources.redhat.com
mailing list for the binutils project.
check before accessing powerpc64-linux tdata
- From: Alan Modra <amodra at bigpond dot net dot au>
- To: binutils at sources dot redhat dot com
- Cc: Segher Boessenkool <segher at kernel dot crashing dot org>
- Date: Mon, 6 Sep 2004 22:06:07 +0930
- Subject: check before accessing powerpc64-linux tdata
Fixes problems found when attempting to link binary input files into
a powerpc64-linux output.
* elf64-ppc.c (is_ppc64_target): New function, extracted from..
(ppc64_elf_check_directives): ..here.
(ppc64_elf_size_dynamic_sections): Use it here to check bfd type
before accessing ppc64_elf_tdata.
(ppc64_elf_finish_dynamic_sections): And here too.
Index: bfd/elf64-ppc.c
===================================================================
RCS file: /cvs/src/src/bfd/elf64-ppc.c,v
retrieving revision 1.171
diff -u -p -r1.171 elf64-ppc.c
--- bfd/elf64-ppc.c 2 Sep 2004 04:43:36 -0000 1.171
+++ bfd/elf64-ppc.c 6 Sep 2004 12:26:03 -0000
@@ -2400,6 +2400,15 @@ ppc64_elf_mkobject (bfd *abfd)
return TRUE;
}
+static bfd_boolean
+is_ppc64_target (const struct bfd_target *targ)
+{
+ extern const bfd_target bfd_elf64_powerpc_vec;
+ extern const bfd_target bfd_elf64_powerpcle_vec;
+
+ return targ == &bfd_elf64_powerpc_vec || targ == &bfd_elf64_powerpcle_vec;
+}
+
/* Fix bad default arch selected for a 64 bit input bfd when the
default is 32 bit. */
@@ -4027,12 +4036,9 @@ ppc64_elf_check_directives (bfd *abfd AT
struct bfd_link_info *info)
{
struct ppc_link_hash_table *htab;
- extern const bfd_target bfd_elf64_powerpc_vec;
- extern const bfd_target bfd_elf64_powerpcle_vec;
htab = ppc_hash_table (info);
- if (htab->elf.root.creator != &bfd_elf64_powerpc_vec
- && htab->elf.root.creator != &bfd_elf64_powerpcle_vec)
+ if (!is_ppc64_target (htab->elf.root.creator))
return TRUE;
elf_link_hash_traverse (&htab->elf, add_symbol_adjust, info);
@@ -6892,7 +6898,7 @@ ppc64_elf_size_dynamic_sections (bfd *ou
Elf_Internal_Shdr *symtab_hdr;
asection *srel;
- if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour)
+ if (!is_ppc64_target (ibfd->xvec))
continue;
if (ppc64_tlsld_got (ibfd)->refcount > 0)
@@ -7062,6 +7068,9 @@ ppc64_elf_size_dynamic_sections (bfd *ou
for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
{
+ if (!is_ppc64_target (ibfd->xvec))
+ continue;
+
s = ppc64_elf_tdata (ibfd)->got;
if (s != NULL && s != htab->got)
{
@@ -10101,10 +10110,15 @@ ppc64_elf_finish_dynamic_sections (bfd *
}
/* We need to handle writing out multiple GOT sections ourselves,
- since we didn't add them to DYNOBJ. */
+ since we didn't add them to DYNOBJ. We know dynobj is the first
+ bfd. */
while ((dynobj = dynobj->link_next) != NULL)
{
asection *s;
+
+ if (!is_ppc64_target (dynobj->xvec))
+ continue;
+
s = ppc64_elf_tdata (dynobj)->got;
if (s != NULL
&& s->size != 0
--
Alan Modra
IBM OzLabs - Linux Technology Centre