* bfd.c (bfd_get_synthetic_symtab): Pass counts and both symbol tables.
	* elf-bfd.h (_bfd_elf_get_synthetic_symtab): Adjust.
	* elf.c (_bfd_elf_get_synthetic_symtab): Adjust.
	* libbfd-in.h (_bfd_nodynamic_get_synthetic_symtab): Adjust.
	* targets.c (struct bfd_target <_bfd_get_synthetic_symtab>): Adjust.
	* elf64-ppc.c (ppc64_elf_get_synthetic_symtab): Don't read symbols.
	Use both symbol tables on non-relocatable objects.  Use a common
	error exit.  Fix "mid" warning.
	* libbfd.h: Regenerate.
	* bfd-in2.h: Regenerate.
binutils/
	* objdump.c (dump_bfd): Pass both symbol tables to
	bfd_get_synthetic_symtab.
This commit is contained in:
Alan Modra 2004-08-28 03:05:18 +00:00
parent 0756fc5506
commit c9727e01b5
11 changed files with 98 additions and 96 deletions

View file

@ -1,3 +1,16 @@
2004-08-28 Alan Modra <amodra@bigpond.net.au>
* targets.c (struct bfd_target <_bfd_get_synthetic_symtab>): Pass
symbol counts and both symbol tables.
* bfd.c (bfd_get_synthetic_symtab): Adjust.
* elf-bfd.h (_bfd_elf_get_synthetic_symtab): Adjust.
* elf.c (_bfd_elf_get_synthetic_symtab): Adjust.
* libbfd-in.h (_bfd_nodynamic_get_synthetic_symtab): Adjust.
* elf64-ppc.c (ppc64_elf_get_synthetic_symtab): Adjust. Use both
symbol tables on non-relocatable objects.
* libbfd.h: Regenerate.
* bfd-in2.h: Regenerate.
2004-08-28 Alan Modra <amodra@bigpond.net.au> 2004-08-28 Alan Modra <amodra@bigpond.net.au>
* elf64-ppc.c (ppc64_elf_branch_reloc): Check .opd is in a regular * elf64-ppc.c (ppc64_elf_branch_reloc): Check .opd is in a regular

View file

@ -4111,8 +4111,9 @@ bfd_boolean bfd_set_private_flags (bfd *abfd, flagword flags);
#define bfd_canonicalize_dynamic_symtab(abfd, asymbols) \ #define bfd_canonicalize_dynamic_symtab(abfd, asymbols) \
BFD_SEND (abfd, _bfd_canonicalize_dynamic_symtab, (abfd, asymbols)) BFD_SEND (abfd, _bfd_canonicalize_dynamic_symtab, (abfd, asymbols))
#define bfd_get_synthetic_symtab(abfd, relsyms, ret) \ #define bfd_get_synthetic_symtab(abfd, count, syms, dyncount, dynsyms, ret) \
BFD_SEND (abfd, _bfd_get_synthetic_symtab, (abfd, relsyms, ret)) BFD_SEND (abfd, _bfd_get_synthetic_symtab, (abfd, count, syms, \
dyncount, dynsyms, ret))
#define bfd_get_dynamic_reloc_upper_bound(abfd) \ #define bfd_get_dynamic_reloc_upper_bound(abfd) \
BFD_SEND (abfd, _bfd_get_dynamic_reloc_upper_bound, (abfd)) BFD_SEND (abfd, _bfd_get_dynamic_reloc_upper_bound, (abfd))
@ -4520,7 +4521,8 @@ typedef struct bfd_target
(bfd *, struct bfd_symbol **); (bfd *, struct bfd_symbol **);
/* Create synthetized symbols. */ /* Create synthetized symbols. */
long (*_bfd_get_synthetic_symtab) long (*_bfd_get_synthetic_symtab)
(bfd *, struct bfd_symbol **, struct bfd_symbol **); (bfd *, long, struct bfd_symbol **, long, struct bfd_symbol **,
struct bfd_symbol **);
/* Get the amount of memory required to hold the dynamic relocs. */ /* Get the amount of memory required to hold the dynamic relocs. */
long (*_bfd_get_dynamic_reloc_upper_bound) (bfd *); long (*_bfd_get_dynamic_reloc_upper_bound) (bfd *);
/* Read in the dynamic relocs. */ /* Read in the dynamic relocs. */

View file

@ -1218,8 +1218,9 @@ DESCRIPTION
.#define bfd_canonicalize_dynamic_symtab(abfd, asymbols) \ .#define bfd_canonicalize_dynamic_symtab(abfd, asymbols) \
. BFD_SEND (abfd, _bfd_canonicalize_dynamic_symtab, (abfd, asymbols)) . BFD_SEND (abfd, _bfd_canonicalize_dynamic_symtab, (abfd, asymbols))
. .
.#define bfd_get_synthetic_symtab(abfd, relsyms, ret) \ .#define bfd_get_synthetic_symtab(abfd, count, syms, dyncount, dynsyms, ret) \
. BFD_SEND (abfd, _bfd_get_synthetic_symtab, (abfd, relsyms, ret)) . BFD_SEND (abfd, _bfd_get_synthetic_symtab, (abfd, count, syms, \
. dyncount, dynsyms, ret))
. .
.#define bfd_get_dynamic_reloc_upper_bound(abfd) \ .#define bfd_get_dynamic_reloc_upper_bound(abfd) \
. BFD_SEND (abfd, _bfd_get_dynamic_reloc_upper_bound, (abfd)) . BFD_SEND (abfd, _bfd_get_dynamic_reloc_upper_bound, (abfd))

View file

@ -1438,7 +1438,7 @@ extern long _bfd_elf_get_dynamic_symtab_upper_bound
extern long _bfd_elf_canonicalize_dynamic_symtab extern long _bfd_elf_canonicalize_dynamic_symtab
(bfd *, asymbol **); (bfd *, asymbol **);
extern long _bfd_elf_get_synthetic_symtab extern long _bfd_elf_get_synthetic_symtab
(bfd *, asymbol **, asymbol **); (bfd *, long, asymbol **, long, asymbol **, asymbol **);
extern long _bfd_elf_get_reloc_upper_bound extern long _bfd_elf_get_reloc_upper_bound
(bfd *, sec_ptr); (bfd *, sec_ptr);
extern long _bfd_elf_canonicalize_reloc extern long _bfd_elf_canonicalize_reloc

View file

@ -7744,7 +7744,12 @@ bfd_elf_bfd_from_remote_memory
} }
long long
_bfd_elf_get_synthetic_symtab (bfd *abfd, asymbol **relsyms, asymbol **ret) _bfd_elf_get_synthetic_symtab (bfd *abfd,
long symcount ATTRIBUTE_UNUSED,
asymbol **syms ATTRIBUTE_UNUSED,
long dynsymcount ATTRIBUTE_UNUSED,
asymbol **dynsyms,
asymbol **ret)
{ {
const struct elf_backend_data *bed = get_elf_backend_data (abfd); const struct elf_backend_data *bed = get_elf_backend_data (abfd);
asection *relplt; asection *relplt;
@ -7782,7 +7787,7 @@ _bfd_elf_get_synthetic_symtab (bfd *abfd, asymbol **relsyms, asymbol **ret)
return 0; return 0;
slurp_relocs = get_elf_backend_data (abfd)->s->slurp_reloc_table; slurp_relocs = get_elf_backend_data (abfd)->s->slurp_reloc_table;
if (! (*slurp_relocs) (abfd, relplt, relsyms, TRUE)) if (! (*slurp_relocs) (abfd, relplt, dynsyms, TRUE))
return -1; return -1;
count = relplt->size / hdr->sh_entsize; count = relplt->size / hdr->sh_entsize;

View file

@ -2645,16 +2645,18 @@ sym_exists_at (asymbol **syms, long lo, long hi, int id, bfd_vma value)
entry syms. */ entry syms. */
static long static long
ppc64_elf_get_synthetic_symtab (bfd *abfd, asymbol **relsyms, asymbol **ret) ppc64_elf_get_synthetic_symtab (bfd *abfd, long symcount, asymbol **syms,
long dynsymcount, asymbol **dynsyms,
asymbol **ret)
{ {
asymbol *s; asymbol *s;
long i; long i;
long count; long count;
char *names; char *names;
asymbol **syms = NULL; long codesecsym, codesecsymend, secsymend, opdsymend;
long symcount = 0, codesecsym, codesecsymend, secsymend, opdsymend;
asection *opd; asection *opd;
bfd_boolean relocatable = (abfd->flags & (EXEC_P | DYNAMIC)) == 0; bfd_boolean relocatable = (abfd->flags & (EXEC_P | DYNAMIC)) == 0;
asymbol **sy = NULL;
*ret = NULL; *ret = NULL;
@ -2662,61 +2664,46 @@ ppc64_elf_get_synthetic_symtab (bfd *abfd, asymbol **relsyms, asymbol **ret)
if (opd == NULL) if (opd == NULL)
return 0; return 0;
if ((bfd_get_file_flags (abfd) & HAS_SYMS)) if (!relocatable)
{ {
long storage; if (symcount != 0 && dynsymcount != 0)
storage = bfd_get_symtab_upper_bound (abfd);
if (storage < 0)
return 0;
if (storage)
{ {
syms = bfd_malloc (storage); /* Use both symbol tables. */
if (syms == NULL) sy = bfd_malloc ((symcount + dynsymcount + 1) * sizeof (*syms));
if (sy == NULL)
return 0; return 0;
memcpy (sy, syms, symcount * sizeof (*syms));
memcpy (sy + symcount, dynsyms, (dynsymcount + 1) * sizeof (*syms));
syms = sy;
symcount = symcount + dynsymcount;
} }
else if (symcount == 0)
symcount = bfd_canonicalize_symtab (abfd, syms);
if (symcount < 0)
{ {
free (syms); syms = dynsyms;
return 0; symcount = dynsymcount;
}
if (symcount == 0)
{
free (syms);
syms = NULL;
} }
} }
if (symcount == 0) if (symcount == 0)
{ return 0;
long storage;
storage = bfd_get_dynamic_symtab_upper_bound (abfd);
if (storage < 0)
return 0;
if (storage)
{
syms = bfd_malloc (storage);
if (syms == NULL)
return 0;
}
symcount = bfd_canonicalize_dynamic_symtab (abfd, syms);
if (symcount < 0)
{
free (syms);
return 0;
}
}
synthetic_opd = opd; synthetic_opd = opd;
synthetic_relocatable = relocatable; synthetic_relocatable = relocatable;
qsort (syms, symcount, sizeof (asymbol *), compare_symbols); qsort (syms, symcount, sizeof (asymbol *), compare_symbols);
if (!relocatable && symcount > 1)
{
long j;
/* Trim duplicate syms, since we may have merged the normal and
dynamic symbols. Actually, we only care about syms that have
different values, so trim any with the same value. */
for (i = 1, j = 1; i < symcount; ++i)
if (syms[i - 1]->value + syms[i - 1]->section->vma
!= syms[i]->value + syms[i]->section->vma)
syms[j++] = syms[i];
symcount = j;
}
i = 0; i = 0;
if (syms[i]->section == opd) if (syms[i]->section == opd)
++i; ++i;
@ -2745,13 +2732,10 @@ ppc64_elf_get_synthetic_symtab (bfd *abfd, asymbol **relsyms, asymbol **ret)
break; break;
symcount = i; symcount = i;
if (opdsymend == secsymend)
{
free (syms);
return 0;
}
count = 0; count = 0;
if (opdsymend == secsymend)
goto done;
if (relocatable) if (relocatable)
{ {
bfd_boolean (*slurp_relocs) (bfd *, asection *, asymbol **, bfd_boolean); bfd_boolean (*slurp_relocs) (bfd *, asection *, asymbol **, bfd_boolean);
@ -2765,11 +2749,8 @@ ppc64_elf_get_synthetic_symtab (bfd *abfd, asymbol **relsyms, asymbol **ret)
relcount = (opd->flags & SEC_RELOC) ? opd->reloc_count : 0; relcount = (opd->flags & SEC_RELOC) ? opd->reloc_count : 0;
if (! relcount if (! relcount
|| ! (*slurp_relocs) (abfd, relopd, relsyms, FALSE)) || ! (*slurp_relocs) (abfd, relopd, syms, FALSE))
{ goto done;
free (syms);
return 0;
}
size = 0; size = 0;
for (i = secsymend, r = relopd->relocation; i < opdsymend; ++i) for (i = secsymend, r = relopd->relocation; i < opdsymend; ++i)
@ -2802,8 +2783,8 @@ ppc64_elf_get_synthetic_symtab (bfd *abfd, asymbol **relsyms, asymbol **ret)
s = *ret = bfd_malloc (size); s = *ret = bfd_malloc (size);
if (s == NULL) if (s == NULL)
{ {
free (syms); count = 0;
return 0; goto done;
} }
names = (char *) (s + count); names = (char *) (s + count);
@ -2851,9 +2832,11 @@ ppc64_elf_get_synthetic_symtab (bfd *abfd, asymbol **relsyms, asymbol **ret)
if (!bfd_malloc_and_get_section (abfd, opd, &contents)) if (!bfd_malloc_and_get_section (abfd, opd, &contents))
{ {
if (contents) if (contents)
free (contents); {
free (syms); free_contents_and_exit:
return 0; free (contents);
}
goto done;
} }
size = 0; size = 0;
@ -2873,9 +2856,8 @@ ppc64_elf_get_synthetic_symtab (bfd *abfd, asymbol **relsyms, asymbol **ret)
s = *ret = bfd_malloc (size); s = *ret = bfd_malloc (size);
if (s == NULL) if (s == NULL)
{ {
free (contents); count = 0;
free (syms); goto free_contents_and_exit;
return 0;
} }
names = (char *) (s + count); names = (char *) (s + count);
@ -2887,30 +2869,29 @@ ppc64_elf_get_synthetic_symtab (bfd *abfd, asymbol **relsyms, asymbol **ret)
ent = bfd_get_64 (abfd, contents + syms[i]->value); ent = bfd_get_64 (abfd, contents + syms[i]->value);
if (!sym_exists_at (syms, opdsymend, symcount, -1, ent)) if (!sym_exists_at (syms, opdsymend, symcount, -1, ent))
{ {
long lo, hi, mid; long lo, hi;
size_t len; size_t len;
asection *sec; asection *sec = abfd->sections;
*s = *syms[i]; *s = *syms[i];
lo = codesecsym; lo = codesecsym;
hi = codesecsymend; hi = codesecsymend;
while (lo < hi) while (lo < hi)
{ {
mid = (lo + hi) >> 1; long mid = (lo + hi) >> 1;
if (syms[mid]->section->vma < ent) if (syms[mid]->section->vma < ent)
lo = mid + 1; lo = mid + 1;
else if (syms[mid]->section->vma > ent) else if (syms[mid]->section->vma > ent)
hi = mid; hi = mid;
else else
break; {
sec = syms[mid]->section;
break;
}
} }
if (lo < hi) if (lo >= hi && lo > codesecsym)
sec = syms[mid]->section;
else if (lo > codesecsym)
sec = syms[lo - 1]->section; sec = syms[lo - 1]->section;
else
sec = abfd->sections;
for (; sec != NULL; sec = sec->next) for (; sec != NULL; sec = sec->next)
{ {
@ -2934,7 +2915,9 @@ ppc64_elf_get_synthetic_symtab (bfd *abfd, asymbol **relsyms, asymbol **ret)
free (contents); free (contents);
} }
free (syms); done:
if (sy != NULL)
free (sy);
return count; return count;
} }

View file

@ -387,7 +387,7 @@ extern bfd_boolean _bfd_generic_set_section_contents
#define _bfd_nodynamic_canonicalize_dynamic_symtab \ #define _bfd_nodynamic_canonicalize_dynamic_symtab \
((long (*) (bfd *, asymbol **)) _bfd_n1) ((long (*) (bfd *, asymbol **)) _bfd_n1)
#define _bfd_nodynamic_get_synthetic_symtab \ #define _bfd_nodynamic_get_synthetic_symtab \
((long (*) (bfd *, asymbol **, asymbol **)) _bfd_n1) ((long (*) (bfd *, long, asymbol **, long, asymbol **, asymbol **)) _bfd_n1)
#define _bfd_nodynamic_get_dynamic_reloc_upper_bound _bfd_n1 #define _bfd_nodynamic_get_dynamic_reloc_upper_bound _bfd_n1
#define _bfd_nodynamic_canonicalize_dynamic_reloc \ #define _bfd_nodynamic_canonicalize_dynamic_reloc \
((long (*) (bfd *, arelent **, asymbol **)) _bfd_n1) ((long (*) (bfd *, arelent **, asymbol **)) _bfd_n1)

View file

@ -392,7 +392,7 @@ extern bfd_boolean _bfd_generic_set_section_contents
#define _bfd_nodynamic_canonicalize_dynamic_symtab \ #define _bfd_nodynamic_canonicalize_dynamic_symtab \
((long (*) (bfd *, asymbol **)) _bfd_n1) ((long (*) (bfd *, asymbol **)) _bfd_n1)
#define _bfd_nodynamic_get_synthetic_symtab \ #define _bfd_nodynamic_get_synthetic_symtab \
((long (*) (bfd *, asymbol **, asymbol **)) _bfd_n1) ((long (*) (bfd *, long, asymbol **, long, asymbol **, asymbol **)) _bfd_n1)
#define _bfd_nodynamic_get_dynamic_reloc_upper_bound _bfd_n1 #define _bfd_nodynamic_get_dynamic_reloc_upper_bound _bfd_n1
#define _bfd_nodynamic_canonicalize_dynamic_reloc \ #define _bfd_nodynamic_canonicalize_dynamic_reloc \
((long (*) (bfd *, arelent **, asymbol **)) _bfd_n1) ((long (*) (bfd *, arelent **, asymbol **)) _bfd_n1)

View file

@ -475,7 +475,8 @@ BFD_JUMP_TABLE macros.
. (bfd *, struct bfd_symbol **); . (bfd *, struct bfd_symbol **);
. {* Create synthetized symbols. *} . {* Create synthetized symbols. *}
. long (*_bfd_get_synthetic_symtab) . long (*_bfd_get_synthetic_symtab)
. (bfd *, struct bfd_symbol **, struct bfd_symbol **); . (bfd *, long, struct bfd_symbol **, long, struct bfd_symbol **,
. struct bfd_symbol **);
. {* Get the amount of memory required to hold the dynamic relocs. *} . {* Get the amount of memory required to hold the dynamic relocs. *}
. long (*_bfd_get_dynamic_reloc_upper_bound) (bfd *); . long (*_bfd_get_dynamic_reloc_upper_bound) (bfd *);
. {* Read in the dynamic relocs. *} . {* Read in the dynamic relocs. *}

View file

@ -1,3 +1,8 @@
2004-08-28 Alan Modra <amodra@bigpond.net.au>
* objdump.c (dump_bfd): Pass both symbol tables to
bfd_get_synthetic_symtab.
2004-08-17 Jakub Jelinek <jakub@redhat.com> 2004-08-17 Jakub Jelinek <jakub@redhat.com>
* objdump.c (dump_bfd): For relocatable objects, pass syms instead * objdump.c (dump_bfd): For relocatable objects, pass syms instead

View file

@ -2566,18 +2566,10 @@ dump_bfd (bfd *abfd)
dynsyms = slurp_dynamic_symtab (abfd); dynsyms = slurp_dynamic_symtab (abfd);
if (disassemble) if (disassemble)
{ {
synthcount = 0; synthcount = bfd_get_synthetic_symtab (abfd, symcount, syms,
if (bfd_get_file_flags (abfd) & (DYNAMIC | EXEC_P)) dynsymcount, dynsyms, &synthsyms);
{ if (synthcount < 0)
if (dynsymcount > 0) synthcount = 0;
synthcount = bfd_get_synthetic_symtab (abfd, dynsyms, &synthsyms);
}
else
{
if (symcount > 0)
synthcount = bfd_get_synthetic_symtab (abfd, syms, &synthsyms);
}
if (synthcount < 0) synthcount = 0;
} }
if (dump_symtab) if (dump_symtab)