[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,
 						       &section,
@@ -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