- vna_off += ivna.vna_next;
- }
- while (ivna.vna_other != vers_data && ivna.vna_next != 0);
-
- if (ivna.vna_other == vers_data)
- break;
-
- offset += ivn.vn_next;
- }
- while (ivn.vn_next != 0);
-
- if (ivna.vna_other == vers_data)
- {
- *sym_info = symbol_undefined;
- *vna_other = ivna.vna_other;
- return (ivna.vna_name < strtab_size
- ? strtab + ivna.vna_name : _("<corrupt>"));
- }
- else if ((max_vd_ndx || (vers_data & VERSYM_VERSION) != 1)
- && (vers_data & VERSYM_VERSION) > max_vd_ndx)
- return _("<corrupt>");
- }
- return NULL;
-}
-
-/* Dump the symbol table. */
-static bfd_boolean
-process_symbol_table (Filedata * filedata)
-{
- Elf_Internal_Shdr * section;
- bfd_size_type nbuckets = 0;
- bfd_size_type nchains = 0;
- bfd_vma * buckets = NULL;
- bfd_vma * chains = NULL;
- bfd_vma ngnubuckets = 0;
- bfd_vma * gnubuckets = NULL;
- bfd_vma * gnuchains = NULL;
- bfd_vma * mipsxlat = NULL;
- bfd_vma gnusymidx = 0;
- bfd_size_type ngnuchains = 0;
-
- if (!do_syms && !do_dyn_syms && !do_histogram)
- return TRUE;
-
- if (dynamic_info[DT_HASH]
- && (do_histogram
- || (do_using_dynamic
- && !do_dyn_syms
- && dynamic_strings != NULL)))
- {
- unsigned char nb[8];
- unsigned char nc[8];
- unsigned int hash_ent_size = 4;
-
- if ((filedata->file_header.e_machine == EM_ALPHA
- || filedata->file_header.e_machine == EM_S390
- || filedata->file_header.e_machine == EM_S390_OLD)
- && filedata->file_header.e_ident[EI_CLASS] == ELFCLASS64)
- hash_ent_size = 8;
-
- if (fseek (filedata->handle,
- (archive_file_offset
- + offset_from_vma (filedata, dynamic_info[DT_HASH],
- sizeof nb + sizeof nc)),
- SEEK_SET))
- {
- error (_("Unable to seek to start of dynamic information\n"));
- goto no_hash;
- }
-
- if (fread (nb, hash_ent_size, 1, filedata->handle) != 1)
- {
- error (_("Failed to read in number of buckets\n"));
- goto no_hash;
- }
-
- if (fread (nc, hash_ent_size, 1, filedata->handle) != 1)
- {
- error (_("Failed to read in number of chains\n"));
- goto no_hash;
- }
-
- nbuckets = byte_get (nb, hash_ent_size);
- nchains = byte_get (nc, hash_ent_size);
-
- buckets = get_dynamic_data (filedata, nbuckets, hash_ent_size);
- chains = get_dynamic_data (filedata, nchains, hash_ent_size);
-
- no_hash:
- if (buckets == NULL || chains == NULL)
- {
- if (do_using_dynamic)
- return FALSE;
- free (buckets);
- free (chains);
- buckets = NULL;
- chains = NULL;
- nbuckets = 0;
- nchains = 0;
- }
- }
-
- if (dynamic_info_DT_GNU_HASH
- && (do_histogram
- || (do_using_dynamic
- && !do_dyn_syms
- && dynamic_strings != NULL)))
- {
- unsigned char nb[16];
- bfd_vma i, maxchain = 0xffffffff, bitmaskwords;
- bfd_vma buckets_vma;
-
- if (fseek (filedata->handle,
- (archive_file_offset
- + offset_from_vma (filedata, dynamic_info_DT_GNU_HASH,
- sizeof nb)),
- SEEK_SET))
- {
- error (_("Unable to seek to start of dynamic information\n"));
- goto no_gnu_hash;
- }
-
- if (fread (nb, 16, 1, filedata->handle) != 1)
- {
- error (_("Failed to read in number of buckets\n"));
- goto no_gnu_hash;
- }
-
- ngnubuckets = byte_get (nb, 4);
- gnusymidx = byte_get (nb + 4, 4);
- bitmaskwords = byte_get (nb + 8, 4);
- buckets_vma = dynamic_info_DT_GNU_HASH + 16;
- if (is_32bit_elf)
- buckets_vma += bitmaskwords * 4;
- else
- buckets_vma += bitmaskwords * 8;
-
- if (fseek (filedata->handle,
- (archive_file_offset
- + offset_from_vma (filedata, buckets_vma, 4)),
- SEEK_SET))
- {
- error (_("Unable to seek to start of dynamic information\n"));
- goto no_gnu_hash;
- }
-
- gnubuckets = get_dynamic_data (filedata, ngnubuckets, 4);
-
- if (gnubuckets == NULL)
- goto no_gnu_hash;
-
- for (i = 0; i < ngnubuckets; i++)
- if (gnubuckets[i] != 0)
- {
- if (gnubuckets[i] < gnusymidx)
- return FALSE;
-
- if (maxchain == 0xffffffff || gnubuckets[i] > maxchain)
- maxchain = gnubuckets[i];
- }
-
- if (maxchain == 0xffffffff)
- goto no_gnu_hash;
-
- maxchain -= gnusymidx;
-
- if (fseek (filedata->handle,
- (archive_file_offset
- + offset_from_vma (filedata, buckets_vma
- + 4 * (ngnubuckets + maxchain), 4)),
- SEEK_SET))
- {
- error (_("Unable to seek to start of dynamic information\n"));
- goto no_gnu_hash;
- }
-
- do
- {
- if (fread (nb, 4, 1, filedata->handle) != 1)
- {
- error (_("Failed to determine last chain length\n"));
- goto no_gnu_hash;
- }
-
- if (maxchain + 1 == 0)
- goto no_gnu_hash;
-
- ++maxchain;
- }
- while ((byte_get (nb, 4) & 1) == 0);
-
- if (fseek (filedata->handle,
- (archive_file_offset
- + offset_from_vma (filedata, buckets_vma + 4 * ngnubuckets, 4)),
- SEEK_SET))
- {
- error (_("Unable to seek to start of dynamic information\n"));
- goto no_gnu_hash;
- }
-
- gnuchains = get_dynamic_data (filedata, maxchain, 4);
- ngnuchains = maxchain;
-
- if (gnuchains == NULL)
- goto no_gnu_hash;
-
- if (dynamic_info_DT_MIPS_XHASH)
- {
- if (fseek (filedata->handle,
- (archive_file_offset
- + offset_from_vma (filedata, (buckets_vma
- + 4 * (ngnubuckets
- + maxchain)), 4)),
- SEEK_SET))
- {
- error (_("Unable to seek to start of dynamic information\n"));
- goto no_gnu_hash;