[PATCH RFC 5/5] readelf: move code around

Jan Beulich <[email protected]> Mon, 27 Jul 2026 11:20:56 +0200
Newsgroups gmane.comp.gnu.binutils
Message-ID <[email protected]>
Try to limit recently introduced #ifdef-ary at least a little.
---
I was hoping for the overall effect to be better, yet I also didn't want
to go too far with the re-arrangement. One aspect I noticed: Instead of
the trivial get_elf_symbols() wrapper we could use a function pointer
instead. That, however, already wouldn't quite extend to
get_section_headers() and get_dynamic_section(), let alone
get_program_headers(), so would - overalll - be of little help.

--- a/binutils/readelf.c
+++ b/binutils/readelf.c
@@ -3471,8 +3471,92 @@ get_dynamic_type (Filedata * filedata, u
     }
 }
 
-static bool get_program_headers (Filedata *);
-static bool get_dynamic_section (Filedata *);
+static void
+validate_section_info (Elf_Internal_Shdr *, Elf_Internal_Shdr **,
+		       unsigned int, Filedata *);
+
+#define ElfXX(n) Elf32 ## n
+#include "readelf.c"
+#define ElfXX(n) Elf64 ## n
+#include "readelf.c"
+
+/* Returns TRUE if the program headers were read into `program_headers'.  */
+
+static bool
+get_program_headers (Filedata * filedata)
+{
+  Elf_Internal_Phdr * phdrs;
+
+  /* Check cache of prior read.  */
+  if (filedata->program_headers != NULL)
+    return true;
+
+  /* Be kind to memory checkers by looking for
+     e_phnum values which we know must be invalid.  */
+  if (filedata->file_header.e_phnum
+      * (is_32bit_elf ? sizeof (Elf32_External_Phdr) : sizeof (Elf64_External_Phdr))
+      >= filedata->file_size)
+    {
+      error (_("Too many program headers - %#x - the file is not that big\n"),
+	     filedata->file_header.e_phnum);
+      return false;
+    }
+
+  phdrs = (Elf_Internal_Phdr *) cmalloc (filedata->file_header.e_phnum,
+					 sizeof (Elf_Internal_Phdr));
+  if (phdrs == NULL)
+    {
+      error (_("Out of memory reading %u program headers\n"),
+	     filedata->file_header.e_phnum);
+      return false;
+    }
+
+  if (is_32bit_elf
+      ? Elf32_get_program_headers (filedata, phdrs)
+      : Elf64_get_program_headers (filedata, phdrs))
+    {
+      filedata->program_headers = phdrs;
+      return true;
+    }
+
+  free (phdrs);
+  return false;
+}
+
+static bool
+get_section_headers (Filedata *filedata, bool probe)
+{
+  if (filedata->section_headers != NULL)
+    return true;
+
+  if (is_32bit_elf)
+    return Elf32_get_section_headers (filedata, probe);
+  else
+    return Elf64_get_section_headers (filedata, probe);
+}
+
+static Elf_Internal_Sym *
+get_elf_symbols (Filedata *filedata,
+		 Elf_Internal_Shdr *section,
+		 uint64_t *num_syms_return)
+{
+  if (is_32bit_elf)
+    return Elf32_get_symbols (filedata, section, num_syms_return);
+  else
+    return Elf64_get_symbols (filedata, section, num_syms_return);
+}
+
+static bool
+get_dynamic_section (Filedata *filedata)
+{
+  if (filedata->dynamic_section)
+    return true;
+
+  if (is_32bit_elf)
+    return Elf32_get_dynamic_section (filedata);
+  else
+    return Elf64_get_dynamic_section (filedata);
+}
 
 static void
 locate_dynamic_section (Filedata *filedata)
@@ -7368,15 +7452,6 @@ process_file_header (Filedata * filedata
   return true;
 }
 
-static void
-validate_section_info (Elf_Internal_Shdr *, Elf_Internal_Shdr **,
-		       unsigned int, Filedata *);
-
-#define ElfXX(n) Elf32 ## n
-#include "readelf.c"
-#define ElfXX(n) Elf64 ## n
-#include "readelf.c"
-
 #else /* ElfXX */
 
 /* Read in the program headers from FILEDATA and store them in PHEADERS.
@@ -7430,49 +7505,6 @@ ElfXX(_get_program_headers) (Filedata *
 
 #ifndef ElfXX
 
-/* Returns TRUE if the program headers were read into `program_headers'.  */
-
-static bool
-get_program_headers (Filedata * filedata)
-{
-  Elf_Internal_Phdr * phdrs;
-
-  /* Check cache of prior read.  */
-  if (filedata->program_headers != NULL)
-    return true;
-
-  /* Be kind to memory checkers by looking for
-     e_phnum values which we know must be invalid.  */
-  if (filedata->file_header.e_phnum
-      * (is_32bit_elf ? sizeof (Elf32_External_Phdr) : sizeof (Elf64_External_Phdr))
-      >= filedata->file_size)
-    {
-      error (_("Too many program headers - %#x - the file is not that big\n"),
-	     filedata->file_header.e_phnum);
-      return false;
-    }
-
-  phdrs = (Elf_Internal_Phdr *) cmalloc (filedata->file_header.e_phnum,
-					 sizeof (Elf_Internal_Phdr));
-  if (phdrs == NULL)
-    {
-      error (_("Out of memory reading %u program headers\n"),
-	     filedata->file_header.e_phnum);
-      return false;
-    }
-
-  if (is_32bit_elf
-      ? Elf32_get_program_headers (filedata, phdrs)
-      : Elf64_get_program_headers (filedata, phdrs))
-    {
-      filedata->program_headers = phdrs;
-      return true;
-    }
-
-  free (phdrs);
-  return false;
-}
-
 /* Print program header info and locate dynamic section.  */
 
 static void
@@ -7990,24 +8022,6 @@ ElfXX(_get_section_headers) (Filedata *
   return true;
 }
 
-#endif /* ElfXX */
-
-#ifndef ElfXX
-
-static bool
-get_section_headers (Filedata *filedata, bool probe)
-{
-  if (filedata->section_headers != NULL)
-    return true;
-
-  if (is_32bit_elf)
-    return Elf32_get_section_headers (filedata, probe);
-  else
-    return Elf64_get_section_headers (filedata, probe);
-}
-
-#else /* ElfXX */
-
 static Elf_Internal_Sym *
 ElfXX(_get_symbols) (Filedata *filedata, const Elf_Internal_Shdr *section,
 		     uint64_t *num_syms_return)
@@ -8130,17 +8144,6 @@ ElfXX(_get_symbols) (Filedata *filedata,
 
 #ifndef ElfXX
 
-static Elf_Internal_Sym *
-get_elf_symbols (Filedata *filedata,
-		 Elf_Internal_Shdr *section,
-		 uint64_t *num_syms_return)
-{
-  if (is_32bit_elf)
-    return Elf32_get_symbols (filedata, section, num_syms_return);
-  else
-    return Elf64_get_symbols (filedata, section, num_syms_return);
-}
-
 static const char *
 get_elf_section_flags (Filedata * filedata, uint64_t sh_flags)
 {
@@ -12445,18 +12448,6 @@ ElfXX(_get_dynamic_section) (Filedata *
 
 #ifndef ElfXX
 
-static bool
-get_dynamic_section (Filedata *filedata)
-{
-  if (filedata->dynamic_section)
-    return true;
-
-  if (is_32bit_elf)
-    return Elf32_get_dynamic_section (filedata);
-  else
-    return Elf64_get_dynamic_section (filedata);
-}
-
 static void
 print_dynamic_flags (uint64_t flags)
 {