diff options
author | Alan Modra <amodra@gmail.com> | 2001-06-25 03:30:26 +0000 |
---|---|---|
committer | Alan Modra <amodra@gmail.com> | 2001-06-25 03:30:26 +0000 |
commit | af3fc3bcb36dd23998c22fce820ba7f1c2a024de (patch) | |
tree | d8a00bea62e6a804ac7024fb84d5ccfba064e8a4 /binutils/readelf.c | |
parent | 866b34001a0fa34cd47f17bcf5ddf76945033d03 (diff) | |
download | gdb-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.c | 71 |
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; } |