X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=binutils%2Freadelf.c;h=0bdabccc8eb140898254835309ecbb3482f4cc8d;hb=1424c35d071e7d49a4a219c7dee8c88ffd60ddca;hp=6bf6d5294ccfc746c9c0d66bfc058969b7f6571e;hpb=546cb2d85eddba4f56dfbcb0288db68243e3a0fd;p=deliverable%2Fbinutils-gdb.git diff --git a/binutils/readelf.c b/binutils/readelf.c index 6bf6d5294c..0bdabccc8e 100644 --- a/binutils/readelf.c +++ b/binutils/readelf.c @@ -267,8 +267,10 @@ typedef struct filedata bfd_size_type dynamic_size; size_t dynamic_nent; Elf_Internal_Dyn * dynamic_section; + Elf_Internal_Shdr * dynamic_strtab_section; char * dynamic_strings; unsigned long dynamic_strings_length; + Elf_Internal_Shdr * dynamic_symtab_section; unsigned long num_dynamic_syms; Elf_Internal_Sym * dynamic_symbols; bfd_vma version_info[16]; @@ -5363,13 +5365,13 @@ process_program_headers (Filedata * filedata) filedata->dynamic_addr = sec->sh_offset; filedata->dynamic_size = sec->sh_size; - if (filedata->dynamic_addr < segment->p_offset - || filedata->dynamic_addr > segment->p_offset + segment->p_filesz) - warn (_("the .dynamic section is not contained" - " within the dynamic segment\n")); - else if (filedata->dynamic_addr > segment->p_offset) - warn (_("the .dynamic section is not the first section" - " in the dynamic segment.\n")); + /* The PT_DYNAMIC segment, which is used by the run-time + loader, should exactly match the .dynamic section. */ + if (do_checks + && (filedata->dynamic_addr != segment->p_offset + || filedata->dynamic_size != segment->p_filesz)) + warn (_("\ +the .dynamic section is not the same as the dynamic segment\n")); } /* PR binutils/17512: Avoid corrupt dynamic section info in the @@ -6319,6 +6321,7 @@ process_section_headers (Filedata * filedata) CHECK_ENTSIZE (section, i, Sym); filedata->dynamic_symbols = GET_ELF_SYMBOLS (filedata, section, &filedata->num_dynamic_syms); + filedata->dynamic_symtab_section = section; break; case SHT_STRTAB: @@ -6335,6 +6338,7 @@ process_section_headers (Filedata * filedata) 1, section->sh_size, _("dynamic strings")); filedata->dynamic_strings_length = filedata->dynamic_strings == NULL ? 0 : section->sh_size; + filedata->dynamic_strtab_section = section; } break; @@ -7006,8 +7010,7 @@ process_section_groups (Filedata * filedata) if (symtab_sec != sec) { symtab_sec = sec; - if (symtab) - free (symtab); + free (symtab); symtab = GET_ELF_SYMBOLS (filedata, symtab_sec, & num_syms); } @@ -7036,8 +7039,7 @@ process_section_groups (Filedata * filedata) group_name = SECTION_NAME (filedata->section_headers + sym->st_shndx); strtab_sec = NULL; - if (strtab) - free (strtab); + free (strtab); strtab = NULL; strtab_size = 0; } @@ -7047,8 +7049,7 @@ process_section_groups (Filedata * filedata) if (symtab_sec->sh_link >= filedata->file_header.e_shnum) { strtab_sec = NULL; - if (strtab) - free (strtab); + free (strtab); strtab = NULL; strtab_size = 0; } @@ -7056,8 +7057,7 @@ process_section_groups (Filedata * filedata) != (sec = filedata->section_headers + symtab_sec->sh_link)) { strtab_sec = sec; - if (strtab) - free (strtab); + free (strtab); strtab = (char *) get_data (NULL, filedata, strtab_sec->sh_offset, 1, strtab_sec->sh_size, @@ -7165,17 +7165,14 @@ process_section_groups (Filedata * filedata) group->root = g; } - if (start) - free (start); + free (start); group++; } } - if (symtab) - free (symtab); - if (strtab) - free (strtab); + free (symtab); + free (strtab); return TRUE; } @@ -7363,8 +7360,7 @@ process_ia64_vms_dynamic_relocs (Filedata * filedata) } } - if (strtab != NULL) - free (strtab); + free (strtab); return res; } @@ -7510,8 +7506,7 @@ process_relocs (Filedata * filedata) symtab, nsyms, strtab, strtablen, is_rela, symsec->sh_type == SHT_DYNSYM); - if (strtab) - free (strtab); + free (strtab); free (symtab); } else @@ -8037,19 +8032,15 @@ ia64_process_unwind (Filedata * filedata) && aux.table_len > 0) dump_ia64_unwind (filedata, & aux); - if (aux.table) - free ((char *) aux.table); - if (aux.info) - free ((char *) aux.info); + free ((char *) aux.table); + free ((char *) aux.info); aux.table = NULL; aux.info = NULL; } } - if (aux.symtab) - free (aux.symtab); - if (aux.strtab) - free ((char *) aux.strtab); + free (aux.symtab); + free ((char *) aux.strtab); return res; } @@ -8419,16 +8410,13 @@ hppa_process_unwind (Filedata * filedata) res = FALSE; } - if (aux.table) - free ((char *) aux.table); + free ((char *) aux.table); aux.table = NULL; } } - if (aux.symtab) - free (aux.symtab); - if (aux.strtab) - free ((char *) aux.strtab); + free (aux.symtab); + free ((char *) aux.strtab); return res; } @@ -8488,11 +8476,8 @@ arm_print_vma_and_name (Filedata * filedata, static void arm_free_section (struct arm_section *arm_sec) { - if (arm_sec->data != NULL) - free (arm_sec->data); - - if (arm_sec->rela != NULL) - free (arm_sec->rela); + free (arm_sec->data); + free (arm_sec->rela); } /* 1) If SEC does not match the one cached in ARM_SEC, then free the current @@ -9526,10 +9511,8 @@ arm_process_unwind (Filedata * filedata) } } - if (aux.symtab) - free (aux.symtab); - if (aux.strtab) - free ((char *) aux.strtab); + free (aux.symtab); + free ((char *) aux.strtab); return res; } @@ -10058,16 +10041,10 @@ get_num_dynamic_syms (Filedata * filedata) no_hash: if (num_of_syms == 0) { - if (filedata->buckets) - { - free (filedata->buckets); - filedata->buckets = NULL; - } - if (filedata->chains) - { - free (filedata->chains); - filedata->chains = NULL; - } + free (filedata->buckets); + filedata->buckets = NULL; + free (filedata->chains); + filedata->chains = NULL; filedata->nbuckets = 0; } } @@ -10207,7 +10184,8 @@ get_num_dynamic_syms (Filedata * filedata) { if (filedata->dynamic_info_DT_MIPS_XHASH) { - if (filedata->mipsxlat[off] >= num_of_syms) + if (off < filedata->ngnuchains + && filedata->mipsxlat[off] >= num_of_syms) num_of_syms = filedata->mipsxlat[off] + 1; } else @@ -10224,21 +10202,12 @@ get_num_dynamic_syms (Filedata * filedata) if (num_of_syms == 0) { no_gnu_hash: - if (filedata->mipsxlat) - { - free (filedata->mipsxlat); - filedata->mipsxlat = NULL; - } - if (filedata->gnuchains) - { - free (filedata->gnuchains); - filedata->gnuchains = NULL; - } - if (filedata->gnubuckets) - { - free (filedata->gnubuckets); - filedata->gnubuckets = NULL; - } + free (filedata->mipsxlat); + filedata->mipsxlat = NULL; + free (filedata->gnuchains); + filedata->gnuchains = NULL; + free (filedata->gnubuckets); + filedata->gnubuckets = NULL; filedata->ngnubuckets = 0; filedata->ngnuchains = 0; } @@ -10341,6 +10310,18 @@ process_dynamic_section (Filedata * filedata) section.sh_size = (num_of_syms * filedata->dynamic_info[DT_SYMENT]); section.sh_entsize = filedata->dynamic_info[DT_SYMENT]; + + if (do_checks + && filedata->dynamic_symtab_section != NULL + && ((filedata->dynamic_symtab_section->sh_offset + != section.sh_offset) + || (filedata->dynamic_symtab_section->sh_size + != section.sh_size) + || (filedata->dynamic_symtab_section->sh_entsize + != section.sh_entsize))) + warn (_("\ +the .dynsym section doesn't match the DT_SYMTAB and DT_SYMENT tags\n")); + section.sh_name = filedata->string_table_length; filedata->dynamic_symbols = GET_ELF_SYMBOLS (filedata, §ion, @@ -10378,6 +10359,15 @@ process_dynamic_section (Filedata * filedata) offset = offset_from_vma (filedata, filedata->dynamic_info[DT_STRTAB], str_tab_len); + if (do_checks + && filedata->dynamic_strtab_section + && ((filedata->dynamic_strtab_section->sh_offset + != (file_ptr) offset) + || (filedata->dynamic_strtab_section->sh_size + != str_tab_len))) + warn (_("\ +the .dynstr section doesn't match the DT_STRTAB and DT_STRSZ tags\n")); + filedata->dynamic_strings = (char *) get_data (NULL, filedata, offset, 1, str_tab_len, _("dynamic string table")); @@ -14628,12 +14618,9 @@ free_debug_section (enum dwarf_section_display_enum debug) section->address = 0; section->size = 0; - if (section->reloc_info != NULL) - { - free (section->reloc_info); - section->reloc_info = NULL; - section->num_relocs = 0; - } + free (section->reloc_info); + section->reloc_info = NULL; + section->num_relocs = 0; } static bfd_boolean @@ -16737,8 +16724,7 @@ process_mips_specific (Filedata * filedata) } sgot_print_fail: - if (data) - free (data); + free (data); } return res; } @@ -17370,8 +17356,7 @@ process_mips_specific (Filedata * filedata) } got_print_fail: - if (data) - free (data); + free (data); } if (mips_pltgot != 0 && jmprel != 0 && pltrel != 0 && pltrelsz != 0) @@ -17448,8 +17433,7 @@ process_mips_specific (Filedata * filedata) } printf ("\n"); - if (data) - free (data); + free (data); free (rels); } @@ -19721,11 +19705,8 @@ process_notes_at (Filedata * filedata, if (! process_note (& inote, filedata)) res = FALSE; - if (temp != NULL) - { - free (temp); - temp = NULL; - } + free (temp); + temp = NULL; } free (pnotes); @@ -20279,38 +20260,23 @@ process_object (Filedata * filedata) filedata->string_table = NULL; filedata->string_table_length = 0; - if (filedata->dump.dump_sects != NULL) - { - free (filedata->dump.dump_sects); - filedata->dump.dump_sects = NULL; - filedata->dump.num_dump_sects = 0; - } + free (filedata->dump.dump_sects); + filedata->dump.dump_sects = NULL; + filedata->dump.num_dump_sects = 0; - if (filedata->dynamic_strings) - { - free (filedata->dynamic_strings); - filedata->dynamic_strings = NULL; - filedata->dynamic_strings_length = 0; - } + free (filedata->dynamic_strings); + filedata->dynamic_strings = NULL; + filedata->dynamic_strings_length = 0; - if (filedata->dynamic_symbols) - { - free (filedata->dynamic_symbols); - filedata->dynamic_symbols = NULL; - filedata->num_dynamic_syms = 0; - } + free (filedata->dynamic_symbols); + filedata->dynamic_symbols = NULL; + filedata->num_dynamic_syms = 0; - if (filedata->dynamic_syminfo) - { - free (filedata->dynamic_syminfo); - filedata->dynamic_syminfo = NULL; - } + free (filedata->dynamic_syminfo); + filedata->dynamic_syminfo = NULL; - if (filedata->dynamic_section) - { - free (filedata->dynamic_section); - filedata->dynamic_section = NULL; - } + free (filedata->dynamic_section); + filedata->dynamic_section = NULL; while (filedata->symtab_shndx_list != NULL) { @@ -20319,11 +20285,8 @@ process_object (Filedata * filedata) filedata->symtab_shndx_list = next; } - if (filedata->section_headers_groups) - { - free (filedata->section_headers_groups); - filedata->section_headers_groups = NULL; - } + free (filedata->section_headers_groups); + filedata->section_headers_groups = NULL; if (filedata->section_groups) { @@ -20784,8 +20747,7 @@ main (int argc, char ** argv) if (! process_file (argv[optind++])) err = TRUE; - if (cmdline.dump_sects != NULL) - free (cmdline.dump_sects); + free (cmdline.dump_sects); free (dump_ctf_symtab_name); free (dump_ctf_strtab_name);