From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 8321 invoked by alias); 25 Jan 2005 10:30:35 -0000 Mailing-List: contact binutils-help@sources.redhat.com; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: binutils-owner@sources.redhat.com Received: (qmail 8089 invoked from network); 25 Jan 2005 10:30:14 -0000 Received: from unknown (HELO gizmo01ps.bigpond.com) (144.140.71.11) by sourceware.org with SMTP; 25 Jan 2005 10:30:14 -0000 Received: (qmail 22059 invoked from network); 25 Jan 2005 10:30:12 -0000 Received: from unknown (HELO psmam12.bigpond.com) (144.135.25.103) by gizmo01ps.bigpond.com with SMTP; 25 Jan 2005 10:30:12 -0000 Received: from cpe-144-136-221-26.sa.bigpond.net.au ([144.136.221.26]) by psmam12.bigpond.com(MAM REL_3_4_2a 234/47883976) with SMTP id 47883976; Tue, 25 Jan 2005 20:30:12 +1000 Received: by bubble.modra.org (Postfix, from userid 500) id 118021070A7; Tue, 25 Jan 2005 21:00:12 +1030 Date: Tue, 25 Jan 2005 10:30:00 -0000 From: Alan Modra To: Andrew Cagney , binutils@sources.redhat.com Subject: Re: BFD: /home/cagney/tmp/a.out(.rela.plt): relocation 0 has invalid symbol index 1 Message-ID: <20050125103011.GC17250@bubble.modra.org> Mail-Followup-To: Andrew Cagney , binutils@sources.redhat.com References: <41F56DD0.5000807@gnu.org> <20050125095359.GA17250@bubble.modra.org> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20050125095359.GA17250@bubble.modra.org> User-Agent: Mutt/1.4i X-SW-Source: 2005-01/txt/msg00414.txt.bz2 On Tue, Jan 25, 2005 at 08:23:59PM +1030, Alan Modra wrote: > On Mon, Jan 24, 2005 at 04:51:12PM -0500, Andrew Cagney wrote: > > $ nm --synthetic ... > > BFD: /home/cagney/tmp/a.out(.rela.plt): relocation 0 has invalid symbol > > index 1 > > 10010900 ? *ABS*@plt > > 10010918 B bar > > It's a bug. _bfd_elf_get_synthetic_symtab is trying to slurp dynamic > relocs before the dynamic symbol table has been read. > > "nm -D --synthetic" works. It looks like "nm --synthetic" is supposed > to work too. Oh well, fixing. As well as fixing the above, I've restricted the relocs returned by _bfd_elf_canonicalize_dynamic_reloc to those for loadable sections. The idea is to exclude debug relocs, and any other weird stuff that generally isn't of interest for "objdump -dR". I see gdb makes calls to bfd_canonicalize_dynamic_reloc too, but I think gdb/dbxread.c and gdb/solib-frv.c aren't interested in debug relocs either. bfd/ * elf.c (_bfd_elf_get_dynamic_reloc_upper_bound): Only include loadable reloc sections. (_bfd_elf_canonicalize_dynamic_reloc): Likewise. (_bfd_elf_get_synthetic_symtab): Return 0 if no dynamic syms. binutils/ * nm.c (display_rel_file): Read dynamic syms before calling bfd_get_synthetic_symtab. Index: bfd/elf.c =================================================================== RCS file: /cvs/src/src/bfd/elf.c,v retrieving revision 1.260 diff -u -p -r1.260 elf.c --- bfd/elf.c 7 Jan 2005 09:52:00 -0000 1.260 +++ bfd/elf.c 25 Jan 2005 10:07:51 -0000 @@ -5977,10 +5977,10 @@ _bfd_elf_canonicalize_dynamic_symtab (bf return symcount; } -/* Return the size required for the dynamic reloc entries. Any - section that was actually installed in the BFD, and has type - SHT_REL or SHT_RELA, and uses the dynamic symbol table, is - considered to be a dynamic reloc section. */ +/* Return the size required for the dynamic reloc entries. Any loadable + section that was actually installed in the BFD, and has type SHT_REL + or SHT_RELA, and uses the dynamic symbol table, is considered to be a + dynamic reloc section. */ long _bfd_elf_get_dynamic_reloc_upper_bound (bfd *abfd) @@ -5996,7 +5996,8 @@ _bfd_elf_get_dynamic_reloc_upper_bound ( ret = sizeof (arelent *); for (s = abfd->sections; s != NULL; s = s->next) - if (elf_section_data (s)->this_hdr.sh_link == elf_dynsymtab (abfd) + if ((s->flags & SEC_LOAD) != 0 + && elf_section_data (s)->this_hdr.sh_link == elf_dynsymtab (abfd) && (elf_section_data (s)->this_hdr.sh_type == SHT_REL || elf_section_data (s)->this_hdr.sh_type == SHT_RELA)) ret += ((s->size / elf_section_data (s)->this_hdr.sh_entsize) @@ -6005,14 +6006,13 @@ _bfd_elf_get_dynamic_reloc_upper_bound ( return ret; } -/* Canonicalize the dynamic relocation entries. Note that we return - the dynamic relocations as a single block, although they are - actually associated with particular sections; the interface, which - was designed for SunOS style shared libraries, expects that there - is only one set of dynamic relocs. Any section that was actually - installed in the BFD, and has type SHT_REL or SHT_RELA, and uses - the dynamic symbol table, is considered to be a dynamic reloc - section. */ +/* Canonicalize the dynamic relocation entries. Note that we return the + dynamic relocations as a single block, although they are actually + associated with particular sections; the interface, which was + designed for SunOS style shared libraries, expects that there is only + one set of dynamic relocs. Any loadable section that was actually + installed in the BFD, and has type SHT_REL or SHT_RELA, and uses the + dynamic symbol table, is considered to be a dynamic reloc section. */ long _bfd_elf_canonicalize_dynamic_reloc (bfd *abfd, @@ -6033,7 +6033,8 @@ _bfd_elf_canonicalize_dynamic_reloc (bfd ret = 0; for (s = abfd->sections; s != NULL; s = s->next) { - if (elf_section_data (s)->this_hdr.sh_link == elf_dynsymtab (abfd) + if ((s->flags & SEC_LOAD) != 0 + && elf_section_data (s)->this_hdr.sh_link == elf_dynsymtab (abfd) && (elf_section_data (s)->this_hdr.sh_type == SHT_REL || elf_section_data (s)->this_hdr.sh_type == SHT_RELA)) { @@ -7908,7 +7909,7 @@ long _bfd_elf_get_synthetic_symtab (bfd *abfd, long symcount ATTRIBUTE_UNUSED, asymbol **syms ATTRIBUTE_UNUSED, - long dynsymcount ATTRIBUTE_UNUSED, + long dynsymcount, asymbol **dynsyms, asymbol **ret) { @@ -7924,10 +7925,14 @@ _bfd_elf_get_synthetic_symtab (bfd *abfd char *names; asection *plt; + *ret = NULL; + if ((abfd->flags & (DYNAMIC | EXEC_P)) == 0) return 0; - *ret = NULL; + if (dynsymcount <= 0) + return 0; + if (!bed->plt_sym_val) return 0; Index: binutils/nm.c =================================================================== RCS file: /cvs/src/src/binutils/nm.c,v retrieving revision 1.43 diff -u -p -r1.43 nm.c --- binutils/nm.c 14 Oct 2004 09:36:54 -0000 1.43 +++ binutils/nm.c 25 Jan 2005 10:07:56 -0000 @@ -1026,8 +1026,18 @@ display_rel_file (bfd *abfd, bfd *archiv } else { + long storage = bfd_get_dynamic_symtab_upper_bound (abfd); + static_count = symcount; static_syms = minisyms; + + if (storage > 0) + { + dyn_syms = xmalloc (storage); + dyn_count = bfd_canonicalize_dynamic_symtab (abfd, dyn_syms); + if (dyn_count < 0) + bfd_fatal (bfd_get_filename (abfd)); + } } synth_count = bfd_get_synthetic_symtab (abfd, static_count, static_syms, dyn_count, dyn_syms, &synthsyms); -- Alan Modra IBM OzLabs - Linux Technology Centre