[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)
{