diff options
author | Nick Clifton <nickc@redhat.com> | 2016-08-19 09:16:30 +0100 |
---|---|---|
committer | Nick Clifton <nickc@redhat.com> | 2016-08-19 09:16:30 +0100 |
commit | dd90581873482f67922a4ace92dafdfdfed09f3c (patch) | |
tree | dab74dcd46561cd0fecc48bc788a3e4fc61e484c /binutils | |
parent | d311bc8bf85f8358df21301fe8a357aa1212f80c (diff) | |
download | gdb-dd90581873482f67922a4ace92dafdfdfed09f3c.zip gdb-dd90581873482f67922a4ace92dafdfdfed09f3c.tar.gz gdb-dd90581873482f67922a4ace92dafdfdfed09f3c.tar.bz2 |
Place .shstrtab section after .symtab and .strtab, thus restoring monotonically increasing section offsets.
bfd
* elf.c (assign_section_numbers): Assign number for the .shstrtab
section after the symbol table and string table sections.
binutils
* testsuite/binutils-all/readelf.s: Adjust expected ordering of
sections.
* testsuite/binutils-all/readelf.s-64: Likewise.
gas
* testsuite/gas/i386/ilp32/x86-64-unwind.d: Adjust expected ordering
of sections.
* testsuite/gas/i386/x86-64-unwind.d: Likewise.
* testsuite/gas/ia64/alias-ilp32.d: Likewise.
* testsuite/gas/ia64/alias.d: Likewise.
* testsuite/gas/ia64/group-1.d: Likewise.
* testsuite/gas/ia64/group-2.d: Likewise.
* testsuite/gas/ia64/secname-ilp32.d: Likewise.
* testsuite/gas/ia64/secname.d: Likewise.
* testsuite/gas/ia64/unwind-ilp32.d: Likewise.
* testsuite/gas/ia64/unwind.d: Likewise.
* testsuite/gas/ia64/xdata-ilp32.d: Likewise.
* testsuite/gas/ia64/xdata.d: Likewise.
* testsuite/gas/mmix/bspec-1.d: Likewise.
* testsuite/gas/mmix/bspec-2.d: Likewise.
* testsuite/gas/mmix/byte-1.d: Likewise.
* testsuite/gas/mmix/loc-1.d: Likewise.
* testsuite/gas/mmix/loc-2.d: Likewise.
* testsuite/gas/mmix/loc-3.d: Likewise.
* testsuite/gas/mmix/loc-4.d: Likewise.
* testsuite/gas/mmix/loc-5.d: Likewise.
* testsuite/gas/tic6x/scomm-directive-4.d: Likewise.
ld
* testsuite/ld-alpha/tlsbin.rd: Adjust expected ordering of sections.
* testsuite/ld-alpha/tlsbinr.rd: Likewise.
* testsuite/ld-alpha/tlspic.rd: Likewise.
* testsuite/ld-cris/libdso-2.d: Likewise.
* testsuite/ld-i386/nogot1.d: Likewise.
* testsuite/ld-i386/pr12718.d: Likewise.
* testsuite/ld-i386/pr12921.d: Likewise.
* testsuite/ld-i386/tlsbin-nacl.rd: Likewise.
* testsuite/ld-i386/tlsbin.rd: Likewise.
* testsuite/ld-i386/tlsbin2-nacl.rd: Likewise.
* testsuite/ld-i386/tlsbin2.rd: Likewise.
* testsuite/ld-i386/tlsbindesc-nacl.rd: Likewise.
* testsuite/ld-i386/tlsbindesc.rd: Likewise.
* testsuite/ld-i386/tlsdesc-nacl.rd: Likewise.
* testsuite/ld-i386/tlsdesc.rd: Likewise.
* testsuite/ld-i386/tlsgdesc-nacl.rd: Likewise.
* testsuite/ld-i386/tlsgdesc.rd: Likewise.
* testsuite/ld-i386/tlsnopic-nacl.rd: Likewise.
* testsuite/ld-i386/tlsnopic.rd: Likewise.
* testsuite/ld-i386/tlspic-nacl.rd: Likewise.
* testsuite/ld-i386/tlspic.rd: Likewise.
* testsuite/ld-i386/tlspic2-nacl.rd: Likewise.
* testsuite/ld-i386/tlspic2.rd: Likewise.
* testsuite/ld-ia64/tlsbin.rd: Likewise.
* testsuite/ld-ia64/tlspic.rd: Likewise.
* testsuite/ld-mips-elf/attr-gnu-4-10.d: Likewise.
* testsuite/ld-mips-elf/attr-gnu-4-50.d: Likewise.
* testsuite/ld-mips-elf/attr-gnu-4-60.d: Likewise.
* testsuite/ld-mips-elf/attr-gnu-4-70.d: Likewise.
* testsuite/ld-mmix/bspec1.d: Likewise.
* testsuite/ld-mmix/bspec2.d: Likewise.
* testsuite/ld-mmix/local1.d: Likewise.
* testsuite/ld-mmix/local3.d: Likewise.
* testsuite/ld-mmix/local5.d: Likewise.
* testsuite/ld-mmix/local7.d: Likewise.
* testsuite/ld-mmix/undef-3.d: Likewise.
* testsuite/ld-powerpc/tlsexe.r: Likewise.
* testsuite/ld-powerpc/tlsexe32.r: Likewise.
* testsuite/ld-powerpc/tlsexetoc.r: Likewise.
* testsuite/ld-powerpc/tlsso.r: Likewise.
* testsuite/ld-powerpc/tlsso32.r: Likewise.
* testsuite/ld-powerpc/tlstocso.r: Likewise.
* testsuite/ld-s390/tlsbin.rd: Likewise.
* testsuite/ld-s390/tlsbin_64.rd: Likewise.
* testsuite/ld-s390/tlspic.rd: Likewise.
* testsuite/ld-s390/tlspic_64.rd: Likewise.
* testsuite/ld-sh/sh64/crange1.rd: Likewise.
* testsuite/ld-sh/sh64/crange2.rd: Likewise.
* testsuite/ld-sh/sh64/crange3-cmpct.rd: Likewise.
* testsuite/ld-sh/sh64/crange3-media.rd: Likewise.
* testsuite/ld-sh/sh64/crange3.rd: Likewise.
* testsuite/ld-sh/sh64/crangerel1.rd: Likewise.
* testsuite/ld-sh/sh64/crangerel2.rd: Likewise.
* testsuite/ld-sh/tlsbin-2.d: Likewise.
* testsuite/ld-sh/tlspic-2.d: Likewise.
* testsuite/ld-sparc/gotop32.rd: Likewise.
* testsuite/ld-sparc/gotop64.rd: Likewise.
* testsuite/ld-sparc/tlssunbin32.rd: Likewise.
* testsuite/ld-sparc/tlssunbin64.rd: Likewise.
* testsuite/ld-sparc/tlssunnopic32.rd: Likewise.
* testsuite/ld-sparc/tlssunnopic64.rd: Likewise.
* testsuite/ld-sparc/tlssunpic32.rd: Likewise.
* testsuite/ld-sparc/tlssunpic64.rd: Likewise.
* testsuite/ld-tic6x/common.d: Likewise.
* testsuite/ld-tic6x/shlib-1.rd: Likewise.
* testsuite/ld-tic6x/shlib-1b.rd: Likewise.
* testsuite/ld-tic6x/shlib-1r.rd: Likewise.
* testsuite/ld-tic6x/shlib-1rb.rd: Likewise.
* testsuite/ld-tic6x/shlib-app-1.rd: Likewise.
* testsuite/ld-tic6x/shlib-app-1b.rd: Likewise.
* testsuite/ld-tic6x/shlib-app-1r.rd: Likewise.
* testsuite/ld-tic6x/shlib-app-1rb.rd: Likewise.
* testsuite/ld-tic6x/shlib-noindex.rd: Likewise.
* testsuite/ld-tic6x/static-app-1.rd: Likewise.
* testsuite/ld-tic6x/static-app-1b.rd: Likewise.
* testsuite/ld-tic6x/static-app-1r.rd: Likewise.
* testsuite/ld-tic6x/static-app-1rb.rd: Likewise.
* testsuite/ld-x86-64/ilp32-4-nacl.d: Likewise.
* testsuite/ld-x86-64/ilp32-4.d: Likewise.
* testsuite/ld-x86-64/nogot1.d: Likewise.
* testsuite/ld-x86-64/pr12718.d: Likewise.
* testsuite/ld-x86-64/pr12921.d: Likewise.
* testsuite/ld-x86-64/split-by-file-nacl.rd: Likewise.
* testsuite/ld-x86-64/split-by-file.rd: Likewise.
* testsuite/ld-x86-64/tlsbin-nacl.rd: Likewise.
* testsuite/ld-x86-64/tlsbin.rd: Likewise.
* testsuite/ld-x86-64/tlsbin2-nacl.rd: Likewise.
* testsuite/ld-x86-64/tlsbin2.rd: Likewise.
* testsuite/ld-x86-64/tlsbindesc-nacl.rd: Likewise.
* testsuite/ld-x86-64/tlsbindesc.rd: Likewise.
* testsuite/ld-x86-64/tlsdesc-nacl.rd: Likewise.
* testsuite/ld-x86-64/tlsdesc.rd: Likewise.
* testsuite/ld-x86-64/tlsgdesc-nacl.rd: Likewise.
* testsuite/ld-x86-64/tlsgdesc.rd: Likewise.
* testsuite/ld-x86-64/tlspic-nacl.rd: Likewise.
* testsuite/ld-x86-64/tlspic.rd: Likewise.
* testsuite/ld-x86-64/tlspic2-nacl.rd: Likewise.
* testsuite/ld-x86-64/tlspic2.rd: Likewise.
* testsuite/ld-xtensa/tlsbin.rd: Likewise.
* testsuite/ld-xtensa/tlspic.rd: Likewise.
Diffstat (limited to 'binutils')
-rw-r--r-- | binutils/ChangeLog | 6 | ||||
-rw-r--r-- | binutils/readelf.c | 123 | ||||
-rw-r--r-- | binutils/testsuite/binutils-all/readelf.s | 2 | ||||
-rw-r--r-- | binutils/testsuite/binutils-all/readelf.s-64 | 10 |
4 files changed, 134 insertions, 7 deletions
diff --git a/binutils/ChangeLog b/binutils/ChangeLog index 5018e43..e709a2d 100644 --- a/binutils/ChangeLog +++ b/binutils/ChangeLog @@ -1,3 +1,9 @@ +2016-08-19 Nick Clifton <nickc@redhat.com> + + * testsuite/binutils-all/readelf.s: Adjust expected ordering of + sections. + * testsuite/binutils-all/readelf.s-64: Likewise. + 2016-08-12 Nick Clifton <nickc@redhat.com> * readelf.c (process_symbol_table): Generate a warning if a local diff --git a/binutils/readelf.c b/binutils/readelf.c index 586d13c..adbee93 100644 --- a/binutils/readelf.c +++ b/binutils/readelf.c @@ -5922,6 +5922,122 @@ process_section_headers (FILE * file) i < elf_header.e_shnum; i++, section++) { + /* Run some sanity checks on the section header. */ + + /* Check the sh_link field. */ + switch (section->sh_type) + { + case SHT_SYMTAB_SHNDX: + case SHT_GROUP: + case SHT_HASH: + case SHT_GNU_HASH: + case SHT_GNU_versym: + case SHT_REL: + case SHT_RELA: + if (section->sh_link < 1 + || section->sh_link > elf_header.e_shnum + || (section_headers[section->sh_link].sh_type != SHT_SYMTAB + && section_headers[section->sh_link].sh_type != SHT_DYNSYM)) + warn (_("[%2u]: Link field (%u) should index a symtab section.\n"), + i, section->sh_link); + break; + + case SHT_DYNAMIC: + case SHT_SYMTAB: + case SHT_DYNSYM: + case SHT_GNU_verneed: + case SHT_GNU_verdef: + case SHT_GNU_LIBLIST: + if (section->sh_link < 1 + || section->sh_link > elf_header.e_shnum + || section_headers[section->sh_link].sh_type != SHT_STRTAB) + warn (_("[%2u]: Link field (%u) should index a string section.\n"), + i, section->sh_link); + break; + + case SHT_INIT_ARRAY: + case SHT_FINI_ARRAY: + case SHT_PREINIT_ARRAY: + if (section->sh_type < SHT_LOOS && section->sh_link != 0) + warn (_("[%2u]: Unexpected value (%u) in link field.\n"), + i, section->sh_link); + break; + + default: + /* FIXME: Add support for target specific section types. */ +#if 0 /* Currently we do not check other section types as there are too + many special cases. Stab sections for example have a type + of SHT_PROGBITS but an sh_link field that links to the .stabstr + section. */ + if (section->sh_type < SHT_LOOS && section->sh_link != 0) + warn (_("[%2u]: Unexpected value (%u) in link field.\n"), + i, section->sh_link); +#endif + break; + } + + /* Check the sh_info field. */ + switch (section->sh_type) + { + case SHT_REL: + case SHT_RELA: + if (section->sh_info < 1 + || section->sh_info > elf_header.e_shnum + || (section_headers[section->sh_info].sh_type != SHT_PROGBITS + && section_headers[section->sh_info].sh_type != SHT_NOBITS + && section_headers[section->sh_info].sh_type != SHT_NOTE + && section_headers[section->sh_info].sh_type != SHT_INIT_ARRAY + /* FIXME: Are other section types valid ? */ + && section_headers[section->sh_info].sh_type < SHT_LOOS)) + { + if (section->sh_info == 0 + && (streq (SECTION_NAME (section), ".rel.dyn") + || streq (SECTION_NAME (section), ".rela.dyn"))) + /* The .rel.dyn and .rela.dyn sections have an sh_info field + of zero. No idea why. I would have expected the index + of the .plt section. */ + ; + else + warn (_("[%2u]: Info field (%u) should index a relocatable section.\n"), + i, section->sh_info); + } + break; + + case SHT_DYNAMIC: + case SHT_HASH: + case SHT_SYMTAB_SHNDX: + case SHT_INIT_ARRAY: + case SHT_FINI_ARRAY: + case SHT_PREINIT_ARRAY: + if (section->sh_info != 0) + warn (_("[%2u]: Unexpected value (%u) in info field.\n"), + i, section->sh_info); + break; + + case SHT_GROUP: + case SHT_SYMTAB: + case SHT_DYNSYM: + /* A symbol index - we assume that it is valid. */ + break; + + default: + /* FIXME: Add support for target specific section types. */ + if (section->sh_type == SHT_NOBITS) + /* NOBITS section headers with non-zero sh_info fields can be + created when a binary is stripped of everything but its debug + information. The stripped sections have their headers preserved but their types set to SHT_NOBITS. so do not check this type of section. */ + ; + else if (section->sh_flags & SHF_INFO_LINK) + { + if (section->sh_info < 1 || section->sh_info > elf_header.e_shnum) + warn (_("[%2u]: Expected link to another section in info field"), i); + } + else if (section->sh_type < SHT_LOOS && section->sh_info != 0) + warn (_("[%2u]: Unexpected value (%u) in info field.\n"), + i, section->sh_info); + break; + } + printf (" [%2u] ", i); if (do_section_details) printf ("%s\n ", printable_section_name (section)); @@ -11116,7 +11232,12 @@ process_symbol_table (FILE * file) putchar ('\n'); if (ELF_ST_BIND (psym->st_info) == STB_LOCAL - && si >= section->sh_info) + && si >= section->sh_info + /* Irix 5 and 6 MIPS binaries are known to ignore this requirement. */ + && elf_header.e_machine != EM_MIPS + /* Solaris binaries have been found to violate this requirement as + well. Not sure if this is a bug or an ABI requirement. */ + && elf_header.e_ident[EI_OSABI] != ELFOSABI_SOLARIS) warn (_("local symbol %u found at index >= %s's sh_info value of %u\n"), si, printable_section_name (section), section->sh_info); } diff --git a/binutils/testsuite/binutils-all/readelf.s b/binutils/testsuite/binutils-all/readelf.s index fd62fda..5aae0ce 100644 --- a/binutils/testsuite/binutils-all/readelf.s +++ b/binutils/testsuite/binutils-all/readelf.s @@ -14,8 +14,8 @@ Section Headers: # MIPS targets put .reginfo, .mdebug, .MIPS.abiflags and .gnu.attributes here. # v850 targets put .call_table_data and .call_table_text here. #... - +\[ .\] .shstrtab +STRTAB +00000000 0+.* 0+.* 00 .* +0 +0 +. +\[..\] .symtab +SYMTAB +00000000 0+.* 0+.* 10 +.. +.+ +4 +\[..\] .strtab +STRTAB +00000000 0+.* 0+.* 00 .* +0 +0 +1 + +\[..\] .shstrtab +STRTAB +00000000 0+.* 0+.* 00 .* +0 +0 +. Key to Flags: #... diff --git a/binutils/testsuite/binutils-all/readelf.s-64 b/binutils/testsuite/binutils-all/readelf.s-64 index d198300..622b314 100644 --- a/binutils/testsuite/binutils-all/readelf.s-64 +++ b/binutils/testsuite/binutils-all/readelf.s-64 @@ -13,12 +13,12 @@ Section Headers: +000000000000000[48] +0000000000000000 +WA +0 +0 +.* +\[ 4\] .bss +NOBITS +0000000000000000 +000000(4c|50|54|58) +0000000000000000 +0000000000000000 +WA +0 +0 +.* - +\[ 5\] .shstrtab +STRTAB +0000000000000000 +[0-9a-f]+ - +00000000000000.. +0000000000000000 .* +0 +0 +.* - +\[ 6\] .symtab +SYMTAB +0000000000000000 +0+.* + +\[ 5\] .symtab +SYMTAB +0000000000000000 +0+.* # aarch64-elf targets have one more data symbol. - +0+.* +0000000000000018 +7 +(6|7) +8 - +\[ 7\] .strtab +STRTAB +0000000000000000 +0+.* + +0+.* +0000000000000018 +6 +(6|7) +8 + +\[ 6\] .strtab +STRTAB +0000000000000000 +0+.* +0+.* +0000000000000000 .* +0 +0 +1 + +\[ 7\] .shstrtab +STRTAB +0000000000000000 +[0-9a-f]+ + +00000000000000.. +0000000000000000 .* +0 +0 +.* Key to Flags: #... |