[binutils-gdb] Add warning message to readelf for local symbols that reference beyond the end of a mergeable sectio

Nick Clifton nickc@sourceware.org
Thu Dec 4 11:30:20 GMT 2025


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=a5818f278a3569f4f6ac6b6f703b9778f9a155a3

commit a5818f278a3569f4f6ac6b6f703b9778f9a155a3
Author: Nick Clifton <nickc@redhat.com>
Date:   Thu Dec 4 11:29:47 2025 +0000

    Add warning message to readelf for local symbols that reference beyond the end of a mergeable section.

Diff:
---
 binutils/readelf.c | 21 +++++++++++++++++++--
 1 file changed, 19 insertions(+), 2 deletions(-)

diff --git a/binutils/readelf.c b/binutils/readelf.c
index 425b7b78653..759c0367c72 100644
--- a/binutils/readelf.c
+++ b/binutils/readelf.c
@@ -14739,6 +14739,8 @@ print_symbol (Filedata *           filedata,
 	}
     }
 
+  bool is_valid = false;
+
   /* Get the symbol's name.  For section symbols without a
      specific name use the (already computed) section name.  */
   if (ELF_ST_TYPE (psym->st_info) == STT_SECTION
@@ -14749,8 +14751,6 @@ print_symbol (Filedata *           filedata,
     }
   else
     {
-      bool is_valid;
-
       is_valid = valid_symbol_name (strtab, strtab_size, psym->st_name);
       sstr = is_valid  ? strtab + psym->st_name : _("<corrupt>");
     }
@@ -14798,6 +14798,23 @@ print_symbol (Filedata *           filedata,
       && filedata->file_header.e_ident[EI_OSABI] != ELFOSABI_SOLARIS)
     warn (_("local symbol %" PRIu64 " found at index >= %s's sh_info value of %u\n"),
 	  symbol_index, printable_section_name (filedata, section), section->sh_info);
+
+  /* Local symbols whose value is larger than their section's size are suspicious
+     especially if that section is mergeable - and hence might change offsets of
+     the contents inside the section.  */
+  if (ELF_ST_BIND (psym->st_info) == STB_LOCAL
+      && ! is_special
+      && is_valid
+      && psym->st_shndx < filedata->file_header.e_shnum
+      && filedata->section_headers != NULL
+      /* FIXME: Should we warn for non-mergeable sections ? */
+      && (filedata->section_headers[psym->st_shndx].sh_flags & SHF_MERGE)
+      && psym->st_value > filedata->section_headers[psym->st_shndx].sh_size)
+    warn (_("local symbol %s has a value (%#" PRIx64 ") which is larger than mergeable section %s's size (%#" PRIx64 ")\n"),
+	  strtab + psym->st_name,
+	  psym->st_value,
+	  printable_section_name_from_index (filedata, psym->st_shndx, NULL),
+	  filedata->section_headers[psym->st_shndx].sh_size);
 }
 
 static const char *


More information about the Binutils-cvs mailing list