From 82f2dbf73d32c8c82e62d2073a99da8b1ec03fa1 Mon Sep 17 00:00:00 2001 From: Nick Clifton Date: Tue, 8 Feb 2011 09:40:05 +0000 Subject: [PATCH] PR binutils/12467 * readelf.c (process_program_headers): Issue a warning if there are no program headers but the file header has a non-zero program header offset. (process_section_headers): Issue a warning if there are no section headers but the file header has a non-zero section header offset. (process_section_groups): Reword the no section message so that it can be distinguished from the one issued by process_section_headers. * elf.c (assign_file_positions_for_load_sections): Set the program header offset and entry size to zero if there are no program headers. --- bfd/ChangeLog | 7 +++++++ bfd/elf.c | 14 ++++++++++++-- binutils/ChangeLog | 11 +++++++++++ binutils/readelf.c | 14 +++++++++++--- 4 files changed, 41 insertions(+), 5 deletions(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 8a6c44f13c3..9935a841f5f 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,10 @@ +2011-02-08 Nick Clifton + + PR binutils/12467 + * elf.c (assign_file_positions_for_load_sections): Set the program + header offset and entry size to zero if there are no program + headers. + 2011-02-08 Alan Modra * elf64-ppc.c (ppc64_elf_edit_toc): Don't segfault on NULL diff --git a/bfd/elf.c b/bfd/elf.c index 257cc8c9ebf..c77dcedc569 100644 --- a/bfd/elf.c +++ b/bfd/elf.c @@ -4334,8 +4334,18 @@ assign_file_positions_for_load_sections (bfd *abfd, header_pad = m->header_size; } - elf_elfheader (abfd)->e_phoff = bed->s->sizeof_ehdr; - elf_elfheader (abfd)->e_phentsize = bed->s->sizeof_phdr; + if (alloc) + { + elf_elfheader (abfd)->e_phoff = bed->s->sizeof_ehdr; + elf_elfheader (abfd)->e_phentsize = bed->s->sizeof_phdr; + } + else + { + /* PR binutils/12467. */ + elf_elfheader (abfd)->e_phoff = 0; + elf_elfheader (abfd)->e_phentsize = 0; + } + elf_elfheader (abfd)->e_phnum = alloc; if (elf_tdata (abfd)->program_header_size == (bfd_size_type) -1) diff --git a/binutils/ChangeLog b/binutils/ChangeLog index bab47567481..4a72f3dac81 100644 --- a/binutils/ChangeLog +++ b/binutils/ChangeLog @@ -1,3 +1,14 @@ +2011-02-08 Nick Clifton + + PR binutils/12467 + * readelf.c (process_program_headers): Issue a warning if there + are no program headers but the file header has a non-zero program + header offset. + (process_section_headers): Issue a warning if there are no section + headers but the file header has a non-zero section header offset. + (process_section_groups): Reword the no section message so that it + can be distinguished from the one issued by process_section_headers. + 2011-01-26 Jan Kratochvil Doug Evans diff --git a/binutils/readelf.c b/binutils/readelf.c index af1a00208f2..0607d897fd8 100644 --- a/binutils/readelf.c +++ b/binutils/readelf.c @@ -3638,7 +3638,11 @@ process_program_headers (FILE * file) if (elf_header.e_phnum == 0) { - if (do_segments) + /* PR binutils/12467. */ + if (elf_header.e_phoff != 0) + warn (_("possibly corrupt ELF header - it has a non-zero program" + " header offset, but no program headers")); + else if (do_segments) printf (_("\nThere are no program headers in this file.\n")); return 0; } @@ -4377,7 +4381,11 @@ process_section_headers (FILE * file) if (elf_header.e_shnum == 0) { - if (do_sections) + /* PR binutils/12467. */ + if (elf_header.e_shoff != 0) + warn (_("possibly corrupt ELF file header - it has a non-zero" + " section header offset, but no section headers\n")); + else if (do_sections) printf (_("\nThere are no sections in this file.\n")); return 1; @@ -4860,7 +4868,7 @@ process_section_groups (FILE * file) if (elf_header.e_shnum == 0) { if (do_section_groups) - printf (_("\nThere are no sections in this file.\n")); + printf (_("\nThere are no sections to group in this file.\n")); return 1; } -- 2.30.2