summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPhil Blundell <pb@futuretv.com>2000-09-06 21:24:15 +0000
committerPhil Blundell <pb@futuretv.com>2000-09-06 21:24:15 +0000
commit3b3ef659ba3868dd62c4709fd30bba7a82734aa1 (patch)
tree38e4e3458c615c4d156071e76aa94ed69b5ed620
parentca7de0e5cb8a367b90b546d0bf1904fb772e4370 (diff)
downloadgdb-3b3ef659ba3868dd62c4709fd30bba7a82734aa1.tar.gz
2000-09-06 Philip Blundell <philb@gnu.org>
Merge from mainline: 2000-05-31 Ulrich Drepper <drepper@redhat.com> * elf.c (_bfd_elf_slurp_version_tables): Correct reading of version definitions. We must not assume they are sorted in the file according to their index numbers.
-rw-r--r--bfd/ChangeLog10
-rw-r--r--bfd/elf.c44
2 files changed, 43 insertions, 11 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index 0cde26aca87..ee30aaf1a82 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,5 +1,15 @@
2000-09-06 Philip Blundell <philb@gnu.org>
+ Merge from mainline:
+
+ 2000-05-31 Ulrich Drepper <drepper@redhat.com>
+
+ * elf.c (_bfd_elf_slurp_version_tables): Correct reading of version
+ definitions. We must not assume they are sorted in the file
+ according to their index numbers.
+
+2000-09-06 Philip Blundell <philb@gnu.org>
+
* config.bfd (arm*-*-uclinux*): New target.
(armeb-*-elf, arm*b-*-linux-gnu*): Likewise.
diff --git a/bfd/elf.c b/bfd/elf.c
index 39b823b9638..e8e7e3787ab 100644
--- a/bfd/elf.c
+++ b/bfd/elf.c
@@ -4488,18 +4488,13 @@ _bfd_elf_slurp_version_tables (abfd)
Elf_Internal_Shdr *hdr;
Elf_External_Verdef *everdef;
Elf_Internal_Verdef *iverdef;
+ Elf_Internal_Verdef *iverdefarr;
+ Elf_Internal_Verdef iverdefmem;
unsigned int i;
+ unsigned int maxidx;
hdr = &elf_tdata (abfd)->dynverdef_hdr;
- elf_tdata (abfd)->verdef =
- ((Elf_Internal_Verdef *)
- bfd_zalloc (abfd, hdr->sh_info * sizeof (Elf_Internal_Verdef)));
- if (elf_tdata (abfd)->verdef == NULL)
- goto error_return;
-
- elf_tdata (abfd)->cverdefs = hdr->sh_info;
-
contents = (bfd_byte *) bfd_malloc (hdr->sh_size);
if (contents == NULL)
goto error_return;
@@ -4507,15 +4502,42 @@ _bfd_elf_slurp_version_tables (abfd)
|| bfd_read ((PTR) contents, 1, hdr->sh_size, abfd) != hdr->sh_size)
goto error_return;
+ /* We know the number of entries in the section but not the maximum
+ index. Therefore we have to run through all entries and find
+ the maximum. */
+ everdef = (Elf_External_Verdef *) contents;
+ maxidx = 0;
+ for (i = 0; i < hdr->sh_info; ++i)
+ {
+ _bfd_elf_swap_verdef_in (abfd, everdef, &iverdefmem);
+
+ if ((iverdefmem.vd_ndx & VERSYM_VERSION) > maxidx)
+ maxidx = iverdefmem.vd_ndx & VERSYM_VERSION;
+
+ everdef = ((Elf_External_Verdef *)
+ ((bfd_byte *) everdef + iverdefmem.vd_next));
+ }
+
+ elf_tdata (abfd)->verdef =
+ ((Elf_Internal_Verdef *)
+ bfd_zalloc (abfd, maxidx * sizeof (Elf_Internal_Verdef)));
+ if (elf_tdata (abfd)->verdef == NULL)
+ goto error_return;
+
+ elf_tdata (abfd)->cverdefs = maxidx;
+
everdef = (Elf_External_Verdef *) contents;
- iverdef = elf_tdata (abfd)->verdef;
- for (i = 0; i < hdr->sh_info; i++, iverdef++)
+ iverdefarr = elf_tdata (abfd)->verdef;
+ for (i = 0; i < hdr->sh_info; i++)
{
Elf_External_Verdaux *everdaux;
Elf_Internal_Verdaux *iverdaux;
unsigned int j;
- _bfd_elf_swap_verdef_in (abfd, everdef, iverdef);
+ _bfd_elf_swap_verdef_in (abfd, everdef, &iverdefmem);
+
+ iverdef = &iverdefarr[(iverdefmem.vd_ndx & VERSYM_VERSION) - 1];
+ memcpy (iverdef, &iverdefmem, sizeof (Elf_Internal_Verdef));
iverdef->vd_bfd = abfd;