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

Message ID c3515d8f-c908-4561-b75b-9fb1a14689dc@suse.com
State New
Headers
Series readelf: reduce code duplication a little |

Checks

Context Check Description
linaro-tcwg-bot/tcwg_binutils_build--master-arm success Build passed
linaro-tcwg-bot/tcwg_binutils_build--master-aarch64 success Build passed

Commit Message

Jan Beulich July 27, 2026, 9:20 a.m. UTC
  PR binutils/34356

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

Patch

--- 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