summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMark Wielaard <mark@klomp.org>2019-08-21 12:28:56 +0200
committerMark Wielaard <mark@klomp.org>2019-08-26 11:28:17 +0200
commit347e6b7a38f78c758e9ab0d3372222ccd4a4f6d9 (patch)
tree854a35f63177d868c5b45f600f906e7068cac621
parent37fa94df1554aca83ec10ce50bc9bcb6957b204e (diff)
readelf: Add optional "SECTION" argument for --notes.
There are multiple sections that can contain ELF Notes. It is sometimes nice to just list the notes from a specific section. -n, --notes[=SECTION] Display the ELF notes Signed-off-by: Mark Wielaard <mark@klomp.org>
-rw-r--r--src/ChangeLog7
-rw-r--r--src/readelf.c13
2 files changed, 19 insertions, 1 deletions
diff --git a/src/ChangeLog b/src/ChangeLog
index c2102fcd..ad673c11 100644
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -1,3 +1,10 @@
+2019-08-26 Mark Wielaard <mark@klomp.org>
+
+ * readelf (options): Add OPTION_ARG_OPTIONAL "SECTION" for notes.
+ (notes_section): New global variable.
+ (parse_opt): Set notes_section.
+ (handle_notes): Check if notes_section is set.
+
2019-07-26 Florian Weimer <fweimer@redhat.com>
Mark Wielaard <mark@klomp.org>
diff --git a/src/readelf.c b/src/readelf.c
index 2084fb1f..24be7a9a 100644
--- a/src/readelf.c
+++ b/src/readelf.c
@@ -114,7 +114,7 @@ static const struct argp_option options[] =
{ "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 },
+ { "notes", 'n', "SECTION", OPTION_ARG_OPTIONAL, N_("Display the ELF notes"), 0 },
{ "arch-specific", 'A', NULL, 0,
N_("Display architecture specific information, if any"), 0 },
{ "exception", 'e', NULL, 0,
@@ -190,6 +190,9 @@ static bool print_symbol_table;
/* A specific section name, or NULL to print all symbol tables. */
static char *symbol_table_section;
+/* A specific section name, or NULL to print all ELF notes. */
+static char *notes_section;
+
/* True if the version information should be printed. */
static bool print_version_info;
@@ -439,6 +442,7 @@ parse_opt (int key, char *arg,
case 'n':
print_notes = true;
any_control_option = true;
+ notes_section = arg;
break;
case 'r':
print_relocations = true;
@@ -12408,6 +12412,13 @@ handle_notes (Ebl *ebl, GElf_Ehdr *ehdr)
/* Not what we are looking for. */
continue;
+ if (notes_section != NULL)
+ {
+ char *sname = elf_strptr (ebl->elf, shstrndx, shdr->sh_name);
+ if (sname == NULL || strcmp (sname, notes_section) != 0)
+ continue;
+ }
+
printf (gettext ("\
\nNote section [%2zu] '%s' of %" PRIu64 " bytes at offset %#0" PRIx64 ":\n"),
elf_ndxscn (scn),