From c6d8cab4ac5c906937dcd4f884e65fb4d1052381 Mon Sep 17 00:00:00 2001 From: "H.J. Lu" Date: Tue, 4 Sep 2012 12:35:35 +0000 Subject: [PATCH] Ignore section symbols without a BFD section bfd/ PR binutils/14493 * elf.c (ignore_section_sym): Also ignore section symbols without a BFD section. binutils/ PR binutils/14493 * readelf.c (get_symbol_index_type): Check bad section index. --- bfd/ChangeLog | 6 ++++++ bfd/elf.c | 14 +++++++++++--- binutils/ChangeLog | 39 ++++++++++++++++++++++----------------- binutils/readelf.c | 2 ++ 4 files changed, 41 insertions(+), 20 deletions(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 189d52d1a65..a7165020e43 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,9 @@ +2012-09-04 H.J. Lu + + PR binutils/14493 + * elf.c (ignore_section_sym): Also ignore section symbols without + a BFD section. + 2012-09-03 Andreas Krebbel * elf32-s390.c (elf_s390_relocate_section): Handle PLTOFF for diff --git a/bfd/elf.c b/bfd/elf.c index 0208e05ec1f..b4043b12928 100644 --- a/bfd/elf.c +++ b/bfd/elf.c @@ -3264,13 +3264,21 @@ sym_is_global (bfd *abfd, asymbol *sym) } /* Don't output section symbols for sections that are not going to be - output, or that are duplicates. */ + output, that are duplicates or there is no BFD section. */ static bfd_boolean ignore_section_sym (bfd *abfd, asymbol *sym) { - return ((sym->flags & BSF_SECTION_SYM) != 0 - && !(sym->section->owner == abfd + elf_symbol_type *type_ptr; + + if ((sym->flags & BSF_SECTION_SYM) == 0) + return FALSE; + + type_ptr = elf_symbol_from (abfd, sym); + return ((type_ptr != NULL + && type_ptr->internal_elf_sym.st_shndx != 0 + && bfd_is_abs_section (sym->section)) + || !(sym->section->owner == abfd || (sym->section->output_section->owner == abfd && sym->section->output_offset == 0) || bfd_is_abs_section (sym->section))); diff --git a/binutils/ChangeLog b/binutils/ChangeLog index 922396acf7b..5c6fcb7f70b 100644 --- a/binutils/ChangeLog +++ b/binutils/ChangeLog @@ -1,3 +1,8 @@ +2012-09-04 H.J. Lu + + PR binutils/14493 + * readelf.c (get_symbol_index_type): Check bad section index. + 2012-08-24 Matthew Gretton-Dann * readelf.c (arm_attr_tag_CPU_arch): Update for ARMv8. @@ -20,15 +25,15 @@ * bfdtest1.c: New file. 2012-08-13 Ian Bolton - Laurent Desnogues - Jim MacArthur - Marcus Shawcroft - Nigel Stephens - Ramana Radhakrishnan - Richard Earnshaw - Sofiane Naci - Tejas Belagod - Yufeng Zhang + Laurent Desnogues + Jim MacArthur + Marcus Shawcroft + Nigel Stephens + Ramana Radhakrishnan + Richard Earnshaw + Sofiane Naci + Tejas Belagod + Yufeng Zhang * readelf.c (guess_is_rela): Handle EM_AARCH64. (get_machine_name): Likewise. @@ -88,17 +93,17 @@ 2012-07-24 Teresa Johnson * addr2line.c (find_address_in_section): Invoke - bfd_find_nearest_line_discriminator to get the discriminator. + bfd_find_nearest_line_discriminator to get the discriminator. (find_offset_in_section): Likewise. (translate_addresses): Print discriminator if it is non-zero. * objdump.c (show_line): Invoke - bfd_find_nearest_line_discriminator to get the discriminator, - and keep track of prev_discriminator. Print discriminator - if it is non-zero. + bfd_find_nearest_line_discriminator to get the discriminator, + and keep track of prev_discriminator. Print discriminator + if it is non-zero. (disassemble_data): Initialize prev_discriminator. (dump_reloc_set): Invoke bfd_find_nearest_line_discriminator - to get the discriminator, and keep track of last_discriminator. - Print discriminator if it is non-zero. + to get the discriminator, and keep track of last_discriminator. + Print discriminator if it is non-zero. 2012-07-17 Nick Clifton @@ -360,8 +365,8 @@ 2012-04-11 Ryan Mansfield - * objdump.c (dump_bfd): If defaulting to dwarf call - dwarf_select_sections_all to enable displays. + * objdump.c (dump_bfd): If defaulting to dwarf call + dwarf_select_sections_all to enable displays. 2012-04-06 Roland McGrath diff --git a/binutils/readelf.c b/binutils/readelf.c index 89cff2477eb..2fbf2ae6e85 100644 --- a/binutils/readelf.c +++ b/binutils/readelf.c @@ -8974,6 +8974,8 @@ get_symbol_index_type (unsigned int type) sprintf (buff, "OS [0x%04x]", type & 0xffff); else if (type >= SHN_LORESERVE) sprintf (buff, "RSV[0x%04x]", type & 0xffff); + else if (type >= elf_header.e_shnum) + sprintf (buff, "bad section index[%3d]", type); else sprintf (buff, "%3d", type); break; -- 2.30.2