]> git.ipfire.org Git - thirdparty/elfutils.git/commitdiff
readelf: print warning for -sW
authorMartin Liska <mliska@suse.cz>
Fri, 25 Nov 2022 13:27:19 +0000 (14:27 +0100)
committerMartin Liska <mliska@suse.cz>
Mon, 28 Nov 2022 09:56:27 +0000 (10:56 +0100)
The option -s accepts in elfutils (compared to binutils) a positional
argument that is name of a symbol table section which should be printed.

Thus, print a reasonable warning if -sW is used:
./src/readelf -sW a.out
WARNING: cannot find section: 'W'

PR29719

src/ChangeLog:

* readelf.c (print_symtab): Change signature and return true if
something is printed.
(process_elf_file): Use it and print warning.

tests/ChangeLog:

* run-readelf-s.sh: Test -sW.

src/readelf.c
tests/run-readelf-s.sh

index 3dafb04136b76a6532169e37602ef1c61c26c316..cc3e0229f0f8752d844f07fc78ac4415b2b0e4e8 100644 (file)
@@ -306,7 +306,7 @@ static void handle_relocs_rel (Ebl *ebl, GElf_Ehdr *ehdr, Elf_Scn *scn,
                               GElf_Shdr *shdr);
 static void handle_relocs_rela (Ebl *ebl, GElf_Ehdr *ehdr, Elf_Scn *scn,
                                GElf_Shdr *shdr);
-static void print_symtab (Ebl *ebl, int type);
+static bool print_symtab (Ebl *ebl, int type);
 static void handle_symtab (Ebl *ebl, Elf_Scn *scn, GElf_Shdr *shdr);
 static void print_verinfo (Ebl *ebl);
 static void handle_verneed (Ebl *ebl, Elf_Scn *scn, GElf_Shdr *shdr);
@@ -1022,6 +1022,8 @@ process_elf_file (Dwfl_Module *dwflmod, int fd)
        goto ebl_error;
     }
 
+  bool symtab_printed = false;
+
   if (print_file_header)
     print_ehdr (ebl, ehdr);
   if (print_section_header)
@@ -1037,11 +1039,17 @@ process_elf_file (Dwfl_Module *dwflmod, int fd)
   if (print_histogram)
     handle_hash (ebl);
   if (print_symbol_table || print_dynsym_table)
-    print_symtab (ebl, SHT_DYNSYM);
+    symtab_printed |= print_symtab (ebl, SHT_DYNSYM);
   if (print_version_info)
     print_verinfo (ebl);
   if (print_symbol_table)
-    print_symtab (ebl, SHT_SYMTAB);
+    symtab_printed |= print_symtab (ebl, SHT_SYMTAB);
+
+  if ((print_symbol_table || print_dynsym_table)
+      && !symtab_printed && symbol_table_section != NULL)
+    printf ("WARNING: %s: '%s'\n", _("cannot find section"),
+        symbol_table_section);
+
   if (print_arch)
     print_liblist (ebl);
   if (print_arch)
@@ -2425,13 +2433,15 @@ handle_relocs_rela (Ebl *ebl, GElf_Ehdr *ehdr, Elf_Scn *scn, GElf_Shdr *shdr)
 }
 
 
-/* Print the program header.  */
-static void
+/* Print the program header.  Return true if a symtab is printed,
+   false otherwise.  */
+static bool
 print_symtab (Ebl *ebl, int type)
 {
   /* Find the symbol table(s).  For this we have to search through the
      section table.  */
   Elf_Scn *scn = NULL;
+  bool symtab_printed = false;
 
   while ((scn = elf_nextscn (ebl->elf, scn)) != NULL)
     {
@@ -2467,8 +2477,11 @@ print_symtab (Ebl *ebl, int type)
                            elf_ndxscn (scn), elf_errmsg (-1));
            }
          handle_symtab (ebl, scn, shdr);
+         symtab_printed = true;
        }
     }
+
+  return symtab_printed;
 }
 
 
index ee1c0e8278a97371df3ef1159aaa85207b328b6e..6b218f109bb8ff7299a49ec9662b00e33b6aa2f6 100755 (executable)
@@ -395,4 +395,7 @@ Symbol table [27] '.symtab' contains 42 entries:
    41: 00000000004003a8      0 FUNC    GLOBAL DEFAULT       11 _init
 EOF
 
+testrun ${abs_top_builddir}/src/readelf --elf-section -sW testfilebaxmin 2>&1 \
+  | grep "WARNING: cannot find section: 'W'" >/dev/null || exit 2
+
 exit 0