Use 64bit wide values in internal fields.

Check symbol index against number of symbols when displaying relocations
This commit is contained in:
Nick Clifton 1999-06-04 11:33:32 +00:00
parent 398e8c258a
commit 1993627733
2 changed files with 54 additions and 38 deletions

View file

@ -1,3 +1,10 @@
1999-06-04 Nick Clifton <nickc@cygnus.com>
* readelf.c: Use 64bit wide fields in internal strcutures even if
targetting a 32bit architecture.
(dump_relocations): Take a new parameter - the number of symbols
in the symbol table.
1999-06-04 Nick Clifton <nickc@cygnus.com>
* readelf.c: Add support for 64bit ELF files.

View file

@ -27,6 +27,9 @@
#include <stdio.h>
#include <time.h>
/* Define BFD64 here, even if our default architecture is 32 bit ELF
as this will allow us to read in and parse 64bit and 32bit ELF files. */
#define BFD64
#include "bfd.h"
#include "elf/common.h"
@ -76,6 +79,7 @@ unsigned int rela_addr;
unsigned int rela_size;
char * dynamic_strings;
char * string_table;
unsigned long num_dynamic_syms;
Elf_Internal_Sym * dynamic_symbols;
Elf_Internal_Syminfo * dynamic_syminfo;
unsigned long dynamic_syminfo_offset;
@ -120,7 +124,7 @@ static bfd_vma byte_get_little_endian PARAMS ((unsigned char *,
static bfd_vma byte_get_big_endian PARAMS ((unsigned char *, int));
static const char * get_mips_dynamic_type PARAMS ((unsigned long));
static const char * get_dynamic_type PARAMS ((unsigned long));
static int dump_relocations PARAMS ((FILE *, unsigned long, unsigned long, Elf_Internal_Sym *, char *, int));
static int dump_relocations PARAMS ((FILE *, unsigned long, unsigned long, Elf_Internal_Sym *, unsigned long, char *, int));
static char * get_file_type PARAMS ((unsigned));
static char * get_machine_name PARAMS ((unsigned));
static char * get_machine_flags PARAMS ((unsigned, unsigned));
@ -430,11 +434,12 @@ guess_is_rela (e_machine)
/* Display the contents of the relocation data found at the specified offset. */
static int
dump_relocations (file, rel_offset, rel_size, symtab, strtab, is_rela)
dump_relocations (file, rel_offset, rel_size, symtab, nsyms, strtab, is_rela)
FILE * file;
unsigned long rel_offset;
unsigned long rel_size;
Elf_Internal_Sym * symtab;
unsigned long nsyms;
char * strtab;
int is_rela;
{
@ -592,7 +597,6 @@ dump_relocations (file, rel_offset, rel_size, symtab, strtab, is_rela)
offset = rels [i].r_offset;
info = rels [i].r_info;
}
if (is_32bit_elf)
{
@ -708,24 +712,32 @@ dump_relocations (file, rel_offset, rel_size, symtab, strtab, is_rela)
else
printf ("%-21.21s", rtype);
if (symtab_index && symtab != NULL)
if (symtab_index)
{
Elf_Internal_Sym * psym;
if (symtab != NULL)
{
if (symtab_index >= nsyms)
printf (" bad symbol index: %08lx", (unsigned long) symtab_index);
else
{
Elf_Internal_Sym * psym;
psym = symtab + symtab_index;
printf (" %08lx ", (unsigned long) psym->st_value);
if (psym->st_name == 0)
printf ("%-25.25s",
SECTION_NAME (section_headers + psym->st_shndx));
else if (strtab == NULL)
printf (_("<string table index %3ld>"), psym->st_name);
else
printf ("%-25.25s", strtab + psym->st_name);
if (is_rela)
printf (" + %lx", (unsigned long) relas [i].r_addend);
psym = symtab + symtab_index;
printf (" %08lx ", (unsigned long) psym->st_value);
if (psym->st_name == 0)
printf ("%-25.25s",
SECTION_NAME (section_headers + psym->st_shndx));
else if (strtab == NULL)
printf (_("<string table index %3ld>"), psym->st_name);
else
printf ("%-25.25s", strtab + psym->st_name);
if (is_rela)
printf (" + %lx", (unsigned long) relas [i].r_addend);
}
}
}
else if (is_rela)
printf ("%34c%lx", ' ', (unsigned long) relas[i].r_addend);
@ -2042,9 +2054,9 @@ process_section_headers (file)
continue;
}
num_dynamic_syms = section->sh_size / section->sh_entsize;
dynamic_symbols =
GET_ELF_SYMBOLS (file, section->sh_offset,
section->sh_size / section->sh_entsize);
GET_ELF_SYMBOLS (file, section->sh_offset, num_dynamic_syms);
}
else if (section->sh_type == SHT_STRTAB
&& strcmp (name, ".dynstr") == 0)
@ -2144,6 +2156,7 @@ process_relocs (file)
{
rel_offset = dynamic_info[DT_JMPREL];
rel_size = dynamic_info[DT_PLTRELSZ];
switch (dynamic_info[DT_PLTREL])
{
case DT_REL:
@ -2165,7 +2178,7 @@ process_relocs (file)
rel_offset, rel_size);
dump_relocations (file, rel_offset - loadaddr, rel_size,
dynamic_symbols, dynamic_strings, is_rela);
dynamic_symbols, num_dynamic_syms, dynamic_strings, is_rela);
}
else
printf (_("\nThere are no dynamic relocations in this file.\n"));
@ -2194,26 +2207,22 @@ process_relocs (file)
Elf_Internal_Sym * symtab;
char * strtab;
int is_rela;
unsigned long nsyms;
printf (_("\nRelocation section "));
if (string_table == NULL)
{
printf ("%d", section->sh_name);
}
printf ("%d", section->sh_name);
else
{
printf ("'%s'", SECTION_NAME (section));
}
printf ("'%s'", SECTION_NAME (section));
printf (_(" at offset 0x%lx contains %lu entries:\n"),
rel_offset, (unsigned long) (rel_size / section->sh_entsize));
symsec = section_headers + section->sh_link;
symtab =
GET_ELF_SYMBOLS (file, symsec->sh_offset,
symsec->sh_size / symsec->sh_entsize);
nsyms = symsec->sh_size / symsec->sh_entsize;
symtab = GET_ELF_SYMBOLS (file, symsec->sh_offset, nsyms);
if (symtab == NULL)
continue;
@ -2225,7 +2234,7 @@ process_relocs (file)
is_rela = section->sh_type == SHT_RELA;
dump_relocations (file, rel_offset, rel_size, symtab, strtab, is_rela);
dump_relocations (file, rel_offset, rel_size, symtab, nsyms, strtab, is_rela);
free (strtab);
free (symtab);
@ -2425,7 +2434,6 @@ process_dynamic_segment (file)
++i, ++ entry)
{
unsigned long offset;
long num_syms;
if (entry->d_tag != DT_SYMTAB)
continue;
@ -2442,17 +2450,17 @@ process_dynamic_segment (file)
error (_("Unable to seek to end of file!"));
if (is_32bit_elf)
num_syms = (ftell (file) - offset) / sizeof (Elf32_External_Sym);
num_dynamic_syms = (ftell (file) - offset) / sizeof (Elf32_External_Sym);
else
num_syms = (ftell (file) - offset) / sizeof (Elf64_External_Sym);
num_dynamic_syms = (ftell (file) - offset) / sizeof (Elf64_External_Sym);
if (num_syms < 1)
if (num_dynamic_syms < 1)
{
error (_("Unable to determine the number of symbols to load\n"));
continue;
}
dynamic_symbols = GET_ELF_SYMBOLS (file, offset, num_syms);
dynamic_symbols = GET_ELF_SYMBOLS (file, offset, num_dynamic_syms);
}
}
@ -5866,7 +5874,7 @@ process_mips_specific (file)
for (cnt = 0; cnt < conflictsno; ++cnt)
{
Elf_Internal_Sym *psym = &dynamic_symbols[iconf[cnt]];
Elf_Internal_Sym * psym = &dynamic_symbols[iconf[cnt]];
printf ("%5u: %8lu %#10lx %s\n",
cnt, iconf[cnt], (unsigned long) psym->st_value,
@ -6050,6 +6058,7 @@ process_file (file_name)
{
free (dynamic_symbols);
dynamic_symbols = NULL;
num_dynamic_syms = 0;
}
if (dynamic_syminfo)