aboutsummaryrefslogtreecommitdiff
path: root/binutils
diff options
context:
space:
mode:
authorMark Wielaard <mark@klomp.org>2017-03-20 15:32:34 +0100
committerMark Wielaard <mark@klomp.org>2017-03-20 18:19:16 +0100
commit39e224f6f9ee3f6123d4c9ddb7c0955e0604c1b4 (patch)
tree8fb677251b5ca43ce7ca6339c51dab096163a78f /binutils
parente406e428dfe9d64e3be0b7a3c1c97c09edc5bdba (diff)
downloadfsf-binutils-gdb-39e224f6f9ee3f6123d4c9ddb7c0955e0604c1b4.zip
fsf-binutils-gdb-39e224f6f9ee3f6123d4c9ddb7c0955e0604c1b4.tar.gz
fsf-binutils-gdb-39e224f6f9ee3f6123d4c9ddb7c0955e0604c1b4.tar.bz2
readelf: Don't error on .debug files with NOBITS .dynamic section.
The fix for PR binutils/17512 added a check for the dynamic segment being inside the actual ELF file. If not an error message would be produced: readelf: Error: the dynamic segment offset + size exceeds the size of the file Unfortunately for separate debuginfo files it is common for the dynamic segment not being inside the file because the .dynamic section is NOBITS. Since the check is done unconditionally in process_program_headers and process_program_headers is always called (to setup dynamic_addr in case it is needed). The error is produced on any operations done on any .debug file (even if no program headers or the dynamic segment is used). If there are section headers then a cross check is done to see if the .dynamic section is NOBITS in which case dynamic_addr is set to zero without a warning or error (which is then checked first before any operation on the dynamic segement is done). Move the check for the dynamic segment being inside the actual ELF file after the cross check with the section headers to suppress the error for .debug files. binutils/ChangeLog: * readelf.c (process_program_headers): Move dynamic_addr check after .dynamic section cross check.
Diffstat (limited to 'binutils')
-rw-r--r--binutils/ChangeLog5
-rw-r--r--binutils/readelf.c16
2 files changed, 15 insertions, 6 deletions
diff --git a/binutils/ChangeLog b/binutils/ChangeLog
index 8fc5671..26a20d3 100644
--- a/binutils/ChangeLog
+++ b/binutils/ChangeLog
@@ -1,3 +1,8 @@
+2017-03-20 Mark Wielaard <mark@klomp.org>
+
+ * readelf.c (process_program_headers): Move dynamic_addr check
+ after .dynamic section cross check.
+
2017-03-17 Nick Clifton <nickc@redhat.com>
* readelf.c (print_gnu_build_attribute_name): Fix off by one error
diff --git a/binutils/readelf.c b/binutils/readelf.c
index ad65f07..8b1d924 100644
--- a/binutils/readelf.c
+++ b/binutils/readelf.c
@@ -4997,12 +4997,6 @@ process_program_headers (FILE * file)
section in the DYNAMIC segment. */
dynamic_addr = segment->p_offset;
dynamic_size = segment->p_filesz;
- /* PR binutils/17512: Avoid corrupt dynamic section info in the segment. */
- if (dynamic_addr + dynamic_size >= current_file_size)
- {
- error (_("the dynamic segment offset + size exceeds the size of the file\n"));
- dynamic_addr = dynamic_size = 0;
- }
/* Try to locate the .dynamic section. If there is
a section header table, we can easily locate it. */
@@ -5037,6 +5031,16 @@ process_program_headers (FILE * file)
warn (_("the .dynamic section is not the first section"
" in the dynamic segment.\n"));
}
+
+ /* PR binutils/17512: Avoid corrupt dynamic section info in the
+ segment. Check this after matching against the section headers
+ so we don't warn on debuginfo file (which have NOBITS .dynamic
+ sections). */
+ if (dynamic_addr + dynamic_size >= current_file_size)
+ {
+ error (_("the dynamic segment offset + size exceeds the size of the file\n"));
+ dynamic_addr = dynamic_size = 0;
+ }
break;
case PT_INTERP: