[binutils-gdb] readelf: Don't dump GOT section after seeing error
H.J. Lu
hjl@sourceware.org
Thu Aug 6 06:40:38 GMT 2026
https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=f94273aeb37908c32aa26530ff56e862f0060daf
commit f94273aeb37908c32aa26530ff56e862f0060daf
Author: H.J. Lu <hjl.tools@gmail.com>
Date: Thu Aug 6 10:33:02 2026 +0800
readelf: Don't dump GOT section after seeing error
Don't dump GOT section contents after seeing errors in input:
readelf: Error: Section 10 has invalid sh_entsize of 0
readelf: Error: (Using the expected size of 18 for the rest of this dump)
readelf: Error: Too many program headers - 0x3030 - the file is not that big
PR binutils/34473
* elfcomm.c (seen_error): New.
(seen_elf_error): Likewise.
(clear_elf_error): Likewise.
(error): Set seen_error to true.
* elfcomm.h (seen_elf_error): New.
(clear_elf_error): Likewise.
* readelf.c (process_got_section_contents): Return false if
seen_elf_error returns true.
(main): Call clear_elf_error before calling process_file.
Signed-off-by: H.J. Lu <hjl.tools@gmail.com>
Diff:
---
binutils/elfcomm.c | 16 ++++++++++++++++
binutils/elfcomm.h | 3 +++
binutils/readelf.c | 10 ++++++++--
3 files changed, 27 insertions(+), 2 deletions(-)
diff --git a/binutils/elfcomm.c b/binutils/elfcomm.c
index 4a4f5368220..d54de39ecdd 100644
--- a/binutils/elfcomm.c
+++ b/binutils/elfcomm.c
@@ -35,11 +35,27 @@
extern char *program_name;
+static bool seen_error = false;
+
+bool
+seen_elf_error (void)
+{
+ return seen_error;
+}
+
+void
+clear_elf_error (void)
+{
+ seen_error = false;
+}
+
void
error (const char *message, ...)
{
va_list args;
+ seen_error = true;
+
/* Try to keep error messages in sync with the program's normal output. */
fflush (stdout);
diff --git a/binutils/elfcomm.h b/binutils/elfcomm.h
index 953bc3d1bc3..5bd61e9587d 100644
--- a/binutils/elfcomm.h
+++ b/binutils/elfcomm.h
@@ -30,6 +30,9 @@ extern void error (const char *, ...) ATTRIBUTE_PRINTF_1;
extern void warn (const char *, ...) ATTRIBUTE_PRINTF_1;
extern void inform (const char *, ...) ATTRIBUTE_PRINTF_1;
+extern bool seen_elf_error (void);
+extern void clear_elf_error (void);
+
extern void (*byte_put) (unsigned char *, uint64_t, unsigned int);
extern void byte_put_little_endian (unsigned char *, uint64_t, unsigned int);
extern void byte_put_big_endian (unsigned char *, uint64_t, unsigned int);
diff --git a/binutils/readelf.c b/binutils/readelf.c
index a52fe2b8d63..c7076d22e5c 100644
--- a/binutils/readelf.c
+++ b/binutils/readelf.c
@@ -21667,6 +21667,9 @@ process_got_section_contents (Filedata * filedata)
if (!do_got_section_contents || all_relocations_count == 0)
return res;
+ if (seen_elf_error ())
+ return false;
+
switch (filedata->file_header.e_type)
{
case ET_DYN:
@@ -25607,8 +25610,11 @@ main (int argc, char ** argv)
err = false;
while (optind < argc)
- if (! process_file (argv[optind++]))
- err = true;
+ {
+ clear_elf_error ();
+ if (! process_file (argv[optind++]))
+ err = true;
+ }
free (cmdline.dump_sects);
More information about the Binutils-cvs
mailing list