This is the mail archive of the binutils@sources.redhat.com mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: BFD: /home/cagney/tmp/a.out(.rela.plt): relocation 0 has invalid symbol index 1


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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]