[PATCH 5/5] readelf: Consolidate get_[32|64]bit_dynamic_section

H.J. Lu hjl.tools@gmail.com
Thu Jul 9 12:40:52 GMT 2026


Consolidate get_32bit_elf_symbols and get_64bit_dynamic_section into
get_dynamic_section.  Use BYTE_GET_SIZE to retrieve external dynamic
tags.

	PR binutils/34356
	* readelf.c (get_32bit_dynamic_section): Renamed to ...
	(get_dynamic_section): This.  Updated to support 64-bit dynamic
	section.
	(get_64bit_dynamic_section): Removed.

Signed-off-by: H.J. Lu <hjl.tools@gmail.com>
---
 binutils/readelf.c | 91 +++++++++-------------------------------------
 1 file changed, 18 insertions(+), 73 deletions(-)

diff --git a/binutils/readelf.c b/binutils/readelf.c
index fe87467a032..bcf7c4cfac7 100644
--- a/binutils/readelf.c
+++ b/binutils/readelf.c
@@ -12406,79 +12406,35 @@ dynamic_section_ia64_val (Elf_Internal_Dyn * entry)
 }
 
 static bool
-get_32bit_dynamic_section (Filedata * filedata)
+get_dynamic_section (Filedata *filedata)
 {
-  Elf32_External_Dyn * edyn;
-  Elf32_External_Dyn * ext;
-  Elf_Internal_Dyn * entry;
-
-  edyn = (Elf32_External_Dyn *) get_data (NULL, filedata,
-					  filedata->dynamic_addr, 1,
-					  filedata->dynamic_size,
-					  _("dynamic section"));
-  if (!edyn)
-    return false;
-
-  /* SGI's ELF has more than one section in the DYNAMIC segment, and we
-     might not have the luxury of section headers.  Look for the DT_NULL
-     terminator to determine the number of entries.  */
-  for (ext = edyn, filedata->dynamic_nent = 0;
-       (char *) (ext + 1) <= (char *) edyn + filedata->dynamic_size;
-       ext++)
-    {
-      filedata->dynamic_nent++;
-      if (BYTE_GET (ext->d_tag) == DT_NULL)
-	break;
-    }
-
-  filedata->dynamic_section
-    = (Elf_Internal_Dyn *) cmalloc (filedata->dynamic_nent, sizeof (* entry));
-  if (filedata->dynamic_section == NULL)
-    {
-      error (_("Out of memory allocating space for %" PRIu64 " dynamic entries\n"),
-	     filedata->dynamic_nent);
-      free (edyn);
-      return false;
-    }
-
-  for (ext = edyn, entry = filedata->dynamic_section;
-       entry < filedata->dynamic_section + filedata->dynamic_nent;
-       ext++, entry++)
-    {
-      entry->d_tag      = BYTE_GET (ext->d_tag);
-      entry->d_un.d_val = BYTE_GET (ext->d_un.d_val);
-    }
-
-  free (edyn);
-
-  return true;
-}
+  if (filedata->dynamic_section)
+    return true;
 
-static bool
-get_64bit_dynamic_section (Filedata * filedata)
-{
-  Elf64_External_Dyn * edyn;
-  Elf64_External_Dyn * ext;
+  void * edyn;
+  void * ext;
   Elf_Internal_Dyn * entry;
 
   /* Read in the data.  */
-  edyn = (Elf64_External_Dyn *) get_data (NULL, filedata,
-					  filedata->dynamic_addr, 1,
-					  filedata->dynamic_size,
-					  _("dynamic section"));
+  edyn = get_data (NULL, filedata, filedata->dynamic_addr, 1,
+		   filedata->dynamic_size, _("dynamic section"));
   if (!edyn)
     return false;
 
+  unsigned int elf_class_size = is_32bit_elf ? 4 : 8;
+
   /* SGI's ELF has more than one section in the DYNAMIC segment, and we
      might not have the luxury of section headers.  Look for the DT_NULL
      terminator to determine the number of entries.  */
   for (ext = edyn, filedata->dynamic_nent = 0;
        /* PR 17533 file: 033-67080-0.004 - do not read past end of buffer.  */
        (char *) (ext + 1) <= (char *) edyn + filedata->dynamic_size;
-       ext++)
+       ext += elf_class_size)
     {
+      bfd_vma d_tag;
       filedata->dynamic_nent++;
-      if (BYTE_GET (ext->d_tag) == DT_NULL)
+      BYTE_GET_SIZE (d_tag, ext, elf_class_size);
+      if (d_tag == DT_NULL)
 	break;
     }
 
@@ -12493,12 +12449,13 @@ get_64bit_dynamic_section (Filedata * filedata)
     }
 
   /* Convert from external to internal formats.  */
-  for (ext = edyn, entry = filedata->dynamic_section;
+  ext = edyn;
+  for (entry = filedata->dynamic_section;
        entry < filedata->dynamic_section + filedata->dynamic_nent;
-       ext++, entry++)
+       entry++)
     {
-      entry->d_tag      = BYTE_GET (ext->d_tag);
-      entry->d_un.d_val = BYTE_GET (ext->d_un.d_val);
+      BYTE_GET_SIZE (entry->d_tag, ext, elf_class_size);
+      BYTE_GET_SIZE (entry->d_un.d_val, ext, elf_class_size);
     }
 
   free (edyn);
@@ -12506,18 +12463,6 @@ get_64bit_dynamic_section (Filedata * filedata)
   return true;
 }
 
-static bool
-get_dynamic_section (Filedata *filedata)
-{
-  if (filedata->dynamic_section)
-    return true;
-
-  if (is_32bit_elf)
-    return get_32bit_dynamic_section (filedata);
-  else
-    return get_64bit_dynamic_section (filedata);
-}
-
 static void
 print_dynamic_flags (uint64_t flags)
 {
-- 
2.55.0



More information about the Binutils mailing list