* 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.
This commit is contained in:
Alan Modra 2005-01-25 10:33:55 +00:00
parent 7e9f086769
commit 8615f3f213
4 changed files with 51 additions and 24 deletions

View file

@ -1,3 +1,10 @@
2005-01-25 Alan Modra <amodra@bigpond.net.au>
* 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.
2005-01-25 Alan Modra <amodra@bigpond.net.au> 2005-01-25 Alan Modra <amodra@bigpond.net.au>
* elflink.c (elf_link_add_object_symbols): Don't create link dynamic * elflink.c (elf_link_add_object_symbols): Don't create link dynamic

View file

@ -1,7 +1,7 @@
/* ELF executable support for BFD. /* ELF executable support for BFD.
Copyright 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, Copyright 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001,
2002, 2003, 2004 Free Software Foundation, Inc. 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
This file is part of BFD, the Binary File Descriptor library. This file is part of BFD, the Binary File Descriptor library.
@ -5977,10 +5977,10 @@ _bfd_elf_canonicalize_dynamic_symtab (bfd *abfd,
return symcount; return symcount;
} }
/* Return the size required for the dynamic reloc entries. Any /* Return the size required for the dynamic reloc entries. Any loadable
section that was actually installed in the BFD, and has type section that was actually installed in the BFD, and has type SHT_REL
SHT_REL or SHT_RELA, and uses the dynamic symbol table, is or SHT_RELA, and uses the dynamic symbol table, is considered to be a
considered to be a dynamic reloc section. */ dynamic reloc section. */
long long
_bfd_elf_get_dynamic_reloc_upper_bound (bfd *abfd) _bfd_elf_get_dynamic_reloc_upper_bound (bfd *abfd)
@ -5996,7 +5996,8 @@ _bfd_elf_get_dynamic_reloc_upper_bound (bfd *abfd)
ret = sizeof (arelent *); ret = sizeof (arelent *);
for (s = abfd->sections; s != NULL; s = s->next) 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_REL
|| elf_section_data (s)->this_hdr.sh_type == SHT_RELA)) || elf_section_data (s)->this_hdr.sh_type == SHT_RELA))
ret += ((s->size / elf_section_data (s)->this_hdr.sh_entsize) ret += ((s->size / elf_section_data (s)->this_hdr.sh_entsize)
@ -6005,14 +6006,13 @@ _bfd_elf_get_dynamic_reloc_upper_bound (bfd *abfd)
return ret; return ret;
} }
/* Canonicalize the dynamic relocation entries. Note that we return /* Canonicalize the dynamic relocation entries. Note that we return the
the dynamic relocations as a single block, although they are dynamic relocations as a single block, although they are actually
actually associated with particular sections; the interface, which associated with particular sections; the interface, which was
was designed for SunOS style shared libraries, expects that there designed for SunOS style shared libraries, expects that there is only
is only one set of dynamic relocs. Any section that was actually 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 installed in the BFD, and has type SHT_REL or SHT_RELA, and uses the
the dynamic symbol table, is considered to be a dynamic reloc dynamic symbol table, is considered to be a dynamic reloc section. */
section. */
long long
_bfd_elf_canonicalize_dynamic_reloc (bfd *abfd, _bfd_elf_canonicalize_dynamic_reloc (bfd *abfd,
@ -6033,7 +6033,8 @@ _bfd_elf_canonicalize_dynamic_reloc (bfd *abfd,
ret = 0; ret = 0;
for (s = abfd->sections; s != NULL; s = s->next) 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_REL
|| elf_section_data (s)->this_hdr.sh_type == SHT_RELA)) || elf_section_data (s)->this_hdr.sh_type == SHT_RELA))
{ {
@ -7908,7 +7909,7 @@ long
_bfd_elf_get_synthetic_symtab (bfd *abfd, _bfd_elf_get_synthetic_symtab (bfd *abfd,
long symcount ATTRIBUTE_UNUSED, long symcount ATTRIBUTE_UNUSED,
asymbol **syms ATTRIBUTE_UNUSED, asymbol **syms ATTRIBUTE_UNUSED,
long dynsymcount ATTRIBUTE_UNUSED, long dynsymcount,
asymbol **dynsyms, asymbol **dynsyms,
asymbol **ret) asymbol **ret)
{ {
@ -7924,10 +7925,14 @@ _bfd_elf_get_synthetic_symtab (bfd *abfd,
char *names; char *names;
asection *plt; asection *plt;
*ret = NULL;
if ((abfd->flags & (DYNAMIC | EXEC_P)) == 0) if ((abfd->flags & (DYNAMIC | EXEC_P)) == 0)
return 0; return 0;
*ret = NULL; if (dynsymcount <= 0)
return 0;
if (!bed->plt_sym_val) if (!bed->plt_sym_val)
return 0; return 0;

View file

@ -1,3 +1,8 @@
2005-01-25 Alan Modra <amodra@bigpond.net.au>
* nm.c (display_rel_file): Read dynamic syms before calling
bfd_get_synthetic_symtab.
2005-01-21 Ben Elliston <bje@au.ibm.com> 2005-01-21 Ben Elliston <bje@au.ibm.com>
* dlltool.c (dump_iat): Remove unused function. * dlltool.c (dump_iat): Remove unused function.

View file

@ -1,6 +1,6 @@
/* nm.c -- Describe symbol table of a rel file. /* nm.c -- Describe symbol table of a rel file.
Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
2001, 2002, 2003, 2004 2001, 2002, 2003, 2004, 2005
Free Software Foundation, Inc. Free Software Foundation, Inc.
This file is part of GNU Binutils. This file is part of GNU Binutils.
@ -1026,8 +1026,18 @@ display_rel_file (bfd *abfd, bfd *archive_bfd)
} }
else else
{ {
long storage = bfd_get_dynamic_symtab_upper_bound (abfd);
static_count = symcount; static_count = symcount;
static_syms = minisyms; 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, synth_count = bfd_get_synthetic_symtab (abfd, static_count, static_syms,
dyn_count, dyn_syms, &synthsyms); dyn_count, dyn_syms, &synthsyms);