[PATCH 5/5] readelf: Consolidate get_[32|64]bit_dynamic_section
H.J. Lu
hjl.tools@gmail.com
Thu Jul 9 12:40:52 GMT 2026
Consolidate get_32bit_elf_symbols and get_64bit_dynamic_section into
get_dynamic_section. Use BYTE_GET_SIZE to retrieve external dynamic
tags.
PR binutils/34356
* readelf.c (get_32bit_dynamic_section): Renamed to ...
(get_dynamic_section): This. Updated to support 64-bit dynamic
section.
(get_64bit_dynamic_section): Removed.
Signed-off-by: H.J. Lu <hjl.tools@gmail.com>
---
binutils/readelf.c | 91 +++++++++-------------------------------------
1 file changed, 18 insertions(+), 73 deletions(-)
diff --git a/binutils/readelf.c b/binutils/readelf.c
index fe87467a032..bcf7c4cfac7 100644
--- a/binutils/readelf.c
+++ b/binutils/readelf.c
@@ -12406,79 +12406,35 @@ dynamic_section_ia64_val (Elf_Internal_Dyn * entry)
}
static bool
-get_32bit_dynamic_section (Filedata * filedata)
+get_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;
-}
+ if (filedata->dynamic_section)
+ return true;
-static bool
-get_64bit_dynamic_section (Filedata * filedata)
-{
- Elf64_External_Dyn * edyn;
- Elf64_External_Dyn * ext;
+ void * edyn;
+ void * 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;
+ unsigned int elf_class_size = is_32bit_elf ? 4 : 8;
+
/* 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++)
+ ext += elf_class_size)
{
+ bfd_vma d_tag;
filedata->dynamic_nent++;
- if (BYTE_GET (ext->d_tag) == DT_NULL)
+ BYTE_GET_SIZE (d_tag, ext, elf_class_size);
+ if (d_tag == DT_NULL)
break;
}
@@ -12493,12 +12449,13 @@ get_64bit_dynamic_section (Filedata * filedata)
}
/* Convert from external to internal formats. */
- for (ext = edyn, entry = filedata->dynamic_section;
+ ext = edyn;
+ for (entry = filedata->dynamic_section;
entry < filedata->dynamic_section + filedata->dynamic_nent;
- ext++, entry++)
+ entry++)
{
- entry->d_tag = BYTE_GET (ext->d_tag);
- entry->d_un.d_val = BYTE_GET (ext->d_un.d_val);
+ BYTE_GET_SIZE (entry->d_tag, ext, elf_class_size);
+ BYTE_GET_SIZE (entry->d_un.d_val, ext, elf_class_size);
}
free (edyn);
@@ -12506,18 +12463,6 @@ get_64bit_dynamic_section (Filedata * filedata)
return true;
}
-static bool
-get_dynamic_section (Filedata *filedata)
-{
- if (filedata->dynamic_section)
- return true;
-
- if (is_32bit_elf)
- return get_32bit_dynamic_section (filedata);
- else
- return get_64bit_dynamic_section (filedata);
-}
-
static void
print_dynamic_flags (uint64_t flags)
{
--
2.55.0
More information about the Binutils
mailing list