[PATCH 4/5] readelf: fold get_{32,64}bit_dynamic_section()

Jan Beulich <[email protected]> Mon, 27 Jul 2026 11:20:32 +0200
Newsgroups gmane.comp.gnu.binutils
Message-ID <[email protected]>
PR binutils/34356

They're identical except for the types used, which can be addressed by
compiling the same code twice.

--- a/binutils/readelf.c
+++ b/binutils/readelf.c
@@ -12391,67 +12391,16 @@ dynamic_section_ia64_val (Elf_Internal_D
   putchar ('\n');
 }
 
-static bool
-get_32bit_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;
-}
+#else /* ElfXX */
 
 static bool
-get_64bit_dynamic_section (Filedata * filedata)
+ElfXX(_get_dynamic_section) (Filedata * filedata)
 {
-  Elf64_External_Dyn * edyn;
-  Elf64_External_Dyn * ext;
+  ElfXX(_External_Dyn) * edyn, * 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;
 
@@ -12492,6 +12441,10 @@ get_64bit_dynamic_section (Filedata * fi
   return true;
 }
 
+#endif /* ElfXX */
+
+#ifndef ElfXX
+
 static bool
 get_dynamic_section (Filedata *filedata)
 {
@@ -12499,9 +12452,9 @@ get_dynamic_section (Filedata *filedata)
     return true;
 
   if (is_32bit_elf)
-    return get_32bit_dynamic_section (filedata);
+    return Elf32_get_dynamic_section (filedata);
   else
-    return get_64bit_dynamic_section (filedata);
+    return Elf64_get_dynamic_section (filedata);
 }
 
 static void