aboutsummaryrefslogtreecommitdiff
path: root/binutils/readelf.c
diff options
context:
space:
mode:
authorAlan Modra <amodra@gmail.com>2001-06-25 03:30:26 +0000
committerAlan Modra <amodra@gmail.com>2001-06-25 03:30:26 +0000
commitaf3fc3bcb36dd23998c22fce820ba7f1c2a024de (patch)
treed8a00bea62e6a804ac7024fb84d5ccfba064e8a4 /binutils/readelf.c
parent866b34001a0fa34cd47f17bcf5ddf76945033d03 (diff)
downloadgdb-af3fc3bcb36dd23998c22fce820ba7f1c2a024de.zip
gdb-af3fc3bcb36dd23998c22fce820ba7f1c2a024de.tar.gz
gdb-af3fc3bcb36dd23998c22fce820ba7f1c2a024de.tar.bz2
* readelf.c (dump_relocations): Print "bad symbol index" if
symtab == NULL with non-zero symtab_index. (process_relocs): Don't bomb if reloc section has no symsec.
Diffstat (limited to 'binutils/readelf.c')
-rw-r--r--binutils/readelf.c71
1 files changed, 38 insertions, 33 deletions
diff --git a/binutils/readelf.c b/binutils/readelf.c
index 39e90d1..53ca41a 100644
--- a/binutils/readelf.c
+++ b/binutils/readelf.c
@@ -964,31 +964,28 @@ dump_relocations (file, rel_offset, rel_size, symtab, nsyms, strtab, is_rela)
if (symtab_index)
{
- if (symtab != NULL)
+ if (symtab == NULL || symtab_index >= nsyms)
+ printf (" bad symbol index: %08lx", (unsigned long) symtab_index);
+ else
{
- if (symtab_index >= nsyms)
- printf (" bad symbol index: %08lx", (unsigned long) symtab_index);
- else
- {
- Elf_Internal_Sym * psym;
+ Elf_Internal_Sym * psym;
- psym = symtab + symtab_index;
+ psym = symtab + symtab_index;
- printf (" ");
- print_vma (psym->st_value, LONG_HEX);
- printf (" ");
+ printf (" ");
+ print_vma (psym->st_value, LONG_HEX);
+ printf (" ");
- 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 (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);
- }
+ if (is_rela)
+ printf (" + %lx", (unsigned long) relas [i].r_addend);
}
}
else if (is_rela)
@@ -3073,7 +3070,6 @@ process_relocs (file)
if (rel_size)
{
Elf32_Internal_Shdr * strsec;
- Elf32_Internal_Shdr * symsec;
Elf_Internal_Sym * symtab;
char * strtab;
int is_rela;
@@ -3089,25 +3085,34 @@ process_relocs (file)
printf (_(" at offset 0x%lx contains %lu entries:\n"),
rel_offset, (unsigned long) (rel_size / section->sh_entsize));
- symsec = section_headers + section->sh_link;
-
- nsyms = symsec->sh_size / symsec->sh_entsize;
- symtab = GET_ELF_SYMBOLS (file, symsec->sh_offset, nsyms);
+ symtab = NULL;
+ strtab = NULL;
+ nsyms = 0;
+ if (section->sh_link)
+ {
+ Elf32_Internal_Shdr * symsec;
- if (symtab == NULL)
- continue;
+ symsec = section_headers + section->sh_link;
+ nsyms = symsec->sh_size / symsec->sh_entsize;
+ symtab = GET_ELF_SYMBOLS (file, symsec->sh_offset, nsyms);
- strsec = section_headers + symsec->sh_link;
+ if (symtab == NULL)
+ continue;
- GET_DATA_ALLOC (strsec->sh_offset, strsec->sh_size, strtab,
- char *, "string table");
+ strsec = section_headers + symsec->sh_link;
+ GET_DATA_ALLOC (strsec->sh_offset, strsec->sh_size, strtab,
+ char *, "string table");
+ }
is_rela = section->sh_type == SHT_RELA;
- dump_relocations (file, rel_offset, rel_size, symtab, nsyms, strtab, is_rela);
+ dump_relocations (file, rel_offset, rel_size,
+ symtab, nsyms, strtab, is_rela);
- free (strtab);
- free (symtab);
+ if (strtab)
+ free (strtab);
+ if (symtab)
+ free (symtab);
found = 1;
}