[binutils-gdb] readelf: Handle 0 sh_entsize of GOT sections

H.J. Lu hjl@sourceware.org
Fri Sep 5 11:56:51 GMT 2025


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

commit 3e1716c9fc203f5654d49c17b160a466c78a2a2c
Author: H.J. Lu <hjl.tools@gmail.com>
Date:   Thu Sep 4 06:05:33 2025 -0700

    readelf: Handle 0 sh_entsize of GOT sections
    
    Gold, lld and mold set sh_entsize to 0 on .got and .got.plt sections.
    If sh_entsize of GOT sections is 0, assume 8 for ELFCLASS64 and 4 for
    ELFCLASS32, except for x32 which uses 8.
    
            PR binutils/33368
            * readelf.c (process_got_section_contents): Handle 0 sh_entsize
            of GOT sections.
    
    Signed-off-by: H.J. Lu <hjl.tools@gmail.com>

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

diff --git a/binutils/readelf.c b/binutils/readelf.c
index 705b7761bc8..03c4520ff92 100644
--- a/binutils/readelf.c
+++ b/binutils/readelf.c
@@ -21075,6 +21075,25 @@ process_got_section_contents (Filedata * filedata)
 	  }
 
 	uint32_t entsz = section->sh_entsize;
+	/* NB: Gold, lld and mold set sh_entsize to 0 on .got and
+	   .got.plt sections.  */
+	if (entsz == 0)
+	  {
+	    if (is_32bit_elf)
+	      switch (filedata->file_header.e_machine)
+		{
+		default:
+		  entsz = 4;
+		  break;
+		case EM_X86_64:
+		  /* x32 uses 8 byte GOT sh_entsize.  */
+		  entsz = 8;
+		  break;
+		}
+	    else
+	      entsz = 8;
+	  }
+
 	entries = section->sh_size / entsz;
 	if (entries == 1)
 	  printf (_("\nGlobal Offset Table '%s' contains 1 entry:\n"),


More information about the Binutils-cvs mailing list