[binutils-gdb] readelf: fold get_{32,64}bit_dynamic_section()
Jan Beulich
jbeulich@sourceware.org
Fri Aug 14 08:58:59 GMT 2026
https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=e200cc751e1d796cb5473742bb14590a51210ef2
commit e200cc751e1d796cb5473742bb14590a51210ef2
Author: Jan Beulich <jbeulich@suse.com>
Date: Fri Aug 14 10:55:36 2026 +0200
readelf: fold get_{32,64}bit_dynamic_section()
PR binutils/34356
They're identical except for the types used, which can be addressed by
compiling the same code twice.
Diff:
---
binutils/readelf-nn.c | 48 +++++++++++++++++++++++
binutils/readelf.c | 105 +-------------------------------------------------
2 files changed, 50 insertions(+), 103 deletions(-)
diff --git a/binutils/readelf-nn.c b/binutils/readelf-nn.c
index 50d9605892e..071fd80cc46 100644
--- a/binutils/readelf-nn.c
+++ b/binutils/readelf-nn.c
@@ -280,4 +280,52 @@ ElfXX(_get_symbols) (Filedata *filedata, const Elf_Internal_Shdr *section,
return isyms;
}
+static bool
+ElfXX(_get_dynamic_section) (Filedata * filedata)
+{
+ ElfXX(_External_Dyn) * edyn, * ext;
+ Elf_Internal_Dyn * entry;
+
+ edyn = 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;
+ /* PR 17533 file: 033-67080-0.004 - do not read past end of buffer. */
+ (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;
+ }
+
+ /* Convert from external to internal formats. */
+ 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;
+}
+
#undef ElfXX
diff --git a/binutils/readelf.c b/binutils/readelf.c
index 4560dc55c5e..0a8659fca93 100644
--- a/binutils/readelf.c
+++ b/binutils/readelf.c
@@ -12132,107 +12132,6 @@ dynamic_section_ia64_val (Elf_Internal_Dyn * entry)
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;
-}
-
-static bool
-get_64bit_dynamic_section (Filedata * filedata)
-{
- Elf64_External_Dyn * edyn;
- Elf64_External_Dyn * 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"));
- 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;
- /* PR 17533 file: 033-67080-0.004 - do not read past end of buffer. */
- (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;
- }
-
- /* Convert from external to internal formats. */
- 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;
-}
-
static bool
get_dynamic_section (Filedata *filedata)
{
@@ -12240,9 +12139,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
More information about the Binutils-cvs
mailing list