[PATCH 2/2] readelf: Warn if DT_XXX don't match .dynsym/.dynstr sections
H.J. Lu
hjl.tools@gmail.com
Tue Apr 14 13:28:56 GMT 2020
DT_SYMTAB, DT_SYMENT, DT_STRTAB and DT_STRSZ, which are used by the
run-time loader, must match the .dynsym and .dynstr sections.
PR binutils/25809
* readelf.c (dynamic_symtab_section): New.
(dynamic_strtab_section): Likewise.
(process_section_headers): Set dynamic_symtab_section to the
.dynsym section. Set dynamic_strtab_section to the .dynstr
section.
(process_dynamic_section): Warn if the .dynsym section doesn't
match DT_SYMTAB and DT_SYMENT or the .dynstr section doesn't
DT_STRTAB and DT_STRSZ.
---
binutils/readelf.c | 20 ++++++++++++++++++++
1 file changed, 20 insertions(+)
diff --git a/binutils/readelf.c b/binutils/readelf.c
index 91e47887e7..fc1749e862 100644
--- a/binutils/readelf.c
+++ b/binutils/readelf.c
@@ -246,6 +246,8 @@ static bfd_vma dynamic_info_DT_GNU_HASH;
static bfd_vma dynamic_info_DT_MIPS_XHASH;
static bfd_vma version_info[16];
static Elf_Internal_Dyn * dynamic_section;
+static Elf_Internal_Shdr * dynamic_symtab_section;
+static Elf_Internal_Shdr * dynamic_strtab_section;
static elf_section_list * symtab_shndx_list;
static bfd_boolean show_name = FALSE;
static bfd_boolean do_dynamic = FALSE;
@@ -6286,6 +6288,7 @@ process_section_headers (Filedata * filedata)
CHECK_ENTSIZE (section, i, Sym);
dynamic_symbols = GET_ELF_SYMBOLS (filedata, section, & num_dynamic_syms);
+ dynamic_symtab_section = section;
}
else if (section->sh_type == SHT_STRTAB
&& streq (name, ".dynstr"))
@@ -6300,6 +6303,7 @@ process_section_headers (Filedata * filedata)
1, section->sh_size,
_("dynamic strings"));
dynamic_strings_length = dynamic_strings == NULL ? 0 : section->sh_size;
+ dynamic_strtab_section = section;
}
else if (section->sh_type == SHT_SYMTAB_SHNDX)
{
@@ -10291,6 +10295,15 @@ process_dynamic_section (Filedata * filedata)
section.sh_size = (num_of_syms
* dynamic_info[DT_SYMENT]);
section.sh_entsize = dynamic_info[DT_SYMENT];
+ if (dynamic_symtab_section
+ && ((dynamic_symtab_section->sh_offset
+ != section.sh_offset)
+ || (dynamic_symtab_section->sh_size
+ != section.sh_size)
+ || (dynamic_symtab_section->sh_entsize
+ != section.sh_entsize)))
+ warn (_("the .dynsym section doesn't match "
+ "DT_SYMTAB and DT_SYMENT\n"));
section.sh_name = filedata->string_table_length;
dynamic_symbols = GET_ELF_SYMBOLS (filedata,
§ion,
@@ -10326,6 +10339,13 @@ process_dynamic_section (Filedata * filedata)
offset = offset_from_vma (filedata,
dynamic_info[DT_STRTAB],
str_tab_len);
+ if (dynamic_strtab_section
+ && ((dynamic_strtab_section->sh_offset
+ != (file_ptr) offset)
+ || (dynamic_strtab_section->sh_size
+ != str_tab_len)))
+ warn (_("the .dynstr section doesn't match DT_STRTAB "
+ "and DT_STRSZ\n"));
dynamic_strings = (char *) get_data (NULL, filedata, offset, 1,
str_tab_len,
_("dynamic string table"));
--
2.25.2
More information about the Binutils
mailing list