summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Bertalan <dani@danielbertalan.dev>2022-01-19 22:50:58 +0100
committerBrian Gianforcaro <b.gianfo@gmail.com>2022-01-24 10:41:47 +0000
commitb509d8a2f7ac91bbbecd39f1f9ca2b0a4bd7a2fe (patch)
treeccbe070a6114d0d85f110b0aed24cd9c9eeadfa7
parent4055c393fc996cf087bda3683b206594bb32bcb6 (diff)
Utilities/readelf: Add support for printing the content of sections
-rw-r--r--Base/usr/share/man/man1/readelf.md3
-rw-r--r--Userland/Utilities/readelf.cpp18
2 files changed, 19 insertions, 2 deletions
diff --git a/Base/usr/share/man/man1/readelf.md b/Base/usr/share/man/man1/readelf.md
index 6f2e59e60f..08effd75ac 100644
--- a/Base/usr/share/man/man1/readelf.md
+++ b/Base/usr/share/man/man1/readelf.md
@@ -5,7 +5,7 @@ readelf
## Synopsis
```sh
-$ readelf [--all] [--file-header] [--program-headers] [--section-headers] [--headers] [--syms] [--dyn-syms] [--dynamic] [--notes] [--relocs] [--unwind] [--checksec] <path>
+$ readelf [--all] [--file-header] [--program-headers] [--section-headers] [--headers] [--syms] [--dyn-syms] [--dynamic] [--notes] [--relocs] [--unwind] [--checksec] [--string-dump section-name] <path>
```
## Options:
@@ -24,6 +24,7 @@ $ readelf [--all] [--file-header] [--program-headers] [--section-headers] [--hea
* `-r`, `--relocs`: Display relocations
* `-u`, `--unwind`: Display unwind info
* `-c`, `--checksec`: Display security hardening info
+* `-p section-name`, `--string-dump section-name`: Display the contents of a section as strings
## Arguments:
diff --git a/Userland/Utilities/readelf.cpp b/Userland/Utilities/readelf.cpp
index 5aae35b4d0..1946ee3c47 100644
--- a/Userland/Utilities/readelf.cpp
+++ b/Userland/Utilities/readelf.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2020, the SerenityOS developers.
+ * Copyright (c) 2020-2022, the SerenityOS developers.
*
* SPDX-License-Identifier: BSD-2-Clause
*/
@@ -242,6 +242,7 @@ int main(int argc, char** argv)
static bool display_unwind_info = false;
static bool display_dynamic_section = false;
static bool display_hardening = false;
+ StringView string_dump_section {};
Core::ArgsParser args_parser;
args_parser.add_option(display_all, "Display all", "all", 'a');
@@ -256,6 +257,7 @@ int main(int argc, char** argv)
args_parser.add_option(display_relocations, "Display relocations", "relocs", 'r');
args_parser.add_option(display_unwind_info, "Display unwind info", "unwind", 'u');
args_parser.add_option(display_hardening, "Display security hardening info", "checksec", 'c');
+ args_parser.add_option(string_dump_section, "Display the contents of a section as strings", "string-dump", 'p', "section-name");
args_parser.add_positional_argument(path, "ELF path", "path");
args_parser.parse(argc, argv);
@@ -717,5 +719,19 @@ int main(int argc, char** argv)
outln();
}
+ if (!string_dump_section.is_null()) {
+ auto maybe_section = elf_image.lookup_section(string_dump_section);
+ if (maybe_section.has_value()) {
+ outln("String dump of section \'{}\':", string_dump_section);
+ StringView data(maybe_section->raw_data(), maybe_section->size());
+ data.for_each_split_view('\0', false, [&data](auto string) {
+ auto offset = string.characters_without_null_termination() - data.characters_without_null_termination();
+ outln("[{:6x}] {}", offset, string);
+ });
+ } else {
+ warnln("Could not find section \'{}\'", string_dump_section);
+ return 1;
+ }
+ }
return 0;
}