diff options
author | Mark Wielaard <mjw@redhat.com> | 2016-11-17 15:19:54 +0100 |
---|---|---|
committer | Mark Wielaard <mjw@redhat.com> | 2016-11-17 15:19:54 +0100 |
commit | 507e7e28f0f58cb711a7b3e5bb320c5f30b0e6ea (patch) | |
tree | 0bd25d12b919aebfd90b13604f913e27849da6ab | |
parent | d5afff85e22b38949f3e7936231c67de16e180e8 (diff) | |
download | elfutils-507e7e28f0f58cb711a7b3e5bb320c5f30b0e6ea.tar.gz |
readelf: Add optional --symbols[=SECTION] argument to select section name.
Make it possible to display just the symbols from a named symbol section
instead of always displaying all symbol sections.
https://bugzilla.redhat.com/show_bug.cgi?id=1396092
Signed-off-by: Mark Wielaard <mjw@redhat.com>
-rw-r--r-- | src/ChangeLog | 7 | ||||
-rw-r--r-- | src/readelf.c | 20 | ||||
-rw-r--r-- | tests/ChangeLog | 4 | ||||
-rwxr-xr-x | tests/run-readelf-s.sh | 11 |
4 files changed, 41 insertions, 1 deletions
diff --git a/src/ChangeLog b/src/ChangeLog index 33147066..fe95ecb1 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,10 @@ +2016-11-17 Mark Wielaard <mjw@redhat.com> + + * readelf.c (options): Add optional arg SECTION for symbols. + (symbol_table_section): New static variable. + (parse_opt): Set symbol_table_section on 's'. + (print_symtab): Filter on symbol_table_section name is set. + 2016-11-10 Mark Wielaard <mjw@redhat.com> * ar.c (write_member): Make sure tmpbuf is large enough to contain diff --git a/src/readelf.c b/src/readelf.c index 204aeecb..a47b056a 100644 --- a/src/readelf.c +++ b/src/readelf.c @@ -85,7 +85,8 @@ static const struct argp_option options[] = { "relocs", 'r', NULL, 0, N_("Display relocations"), 0 }, { "section-headers", 'S', NULL, 0, N_("Display the sections' headers"), 0 }, { "sections", 'S', NULL, OPTION_ALIAS | OPTION_HIDDEN, NULL, 0 }, - { "symbols", 's', NULL, 0, N_("Display the symbol table"), 0 }, + { "symbols", 's', "SECTION", OPTION_ARG_OPTIONAL, + N_("Display the symbol table sections"), 0 }, { "version-info", 'V', NULL, 0, N_("Display versioning information"), 0 }, { "notes", 'n', NULL, 0, N_("Display the ELF notes"), 0 }, { "arch-specific", 'A', NULL, 0, @@ -157,6 +158,9 @@ static bool print_section_header; /* True if the symbol table should be printed. */ static bool print_symbol_table; +/* A specific section name, or NULL to print all symbol tables. */ +static char *symbol_table_section; + /* True if the version information should be printed. */ static bool print_version_info; @@ -389,6 +393,7 @@ parse_opt (int key, char *arg, case 's': print_symbol_table = true; any_control_option = true; + symbol_table_section = arg; break; case 'V': print_version_info = true; @@ -2236,6 +2241,19 @@ print_symtab (Ebl *ebl, int type) if (shdr != NULL && shdr->sh_type == (GElf_Word) type) { + if (symbol_table_section != NULL) + { + /* Get the section header string table index. */ + size_t shstrndx; + const char *sname; + if (unlikely (elf_getshdrstrndx (ebl->elf, &shstrndx) < 0)) + error (EXIT_FAILURE, 0, + gettext ("cannot get section header string table index")); + sname = elf_strptr (ebl->elf, shstrndx, shdr->sh_name); + if (sname == NULL || strcmp (sname, symbol_table_section) != 0) + continue; + } + if ((shdr->sh_flags & SHF_COMPRESSED) != 0) { if (elf_compress (scn, 0, 0) < 0) diff --git a/tests/ChangeLog b/tests/ChangeLog index 5a9d5372..7031cf57 100644 --- a/tests/ChangeLog +++ b/tests/ChangeLog @@ -1,3 +1,7 @@ +2016-11-17 Mark Wielaard <mjw@redhat.com> + + * run-readelf-s.sh: Add --symbols=.dynsym and --symbols=.symtab tests. + 2016-11-02 Mark Wielaard <mjw@redhat.com> * backtrace-data.c (thread_callback): Add explicit break after error. diff --git a/tests/run-readelf-s.sh b/tests/run-readelf-s.sh index 59407d14..82c3417e 100755 --- a/tests/run-readelf-s.sh +++ b/tests/run-readelf-s.sh @@ -273,9 +273,20 @@ Symbol table [28] '.symtab' contains 40 entries: 39: 0000000000000680 0 FUNC GLOBAL DEFAULT 11 _init EOF +# Display all symbol tables. cat testfile.dynsym.in testfile.symtab.in \ | testrun_compare ${abs_top_builddir}/src/readelf -s testfilebaztab +# Display just .dynsym +cat testfile.dynsym.in \ + | testrun_compare ${abs_top_builddir}/src/readelf \ + --symbols=.dynsym testfilebaztab + +# Display just .symtab +cat testfile.symtab.in \ + | testrun_compare ${abs_top_builddir}/src/readelf \ + --symbols=.symtab testfilebaztab + cat testfile.dynsym.in \ | testrun_compare ${abs_top_builddir}/src/readelf -s testfilebazdbg |