[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