aboutsummaryrefslogtreecommitdiff
path: root/test/elf_parser.cc
diff options
context:
space:
mode:
authorJohannes Stoelp <johannes.stoelp@gmail.com>2025-01-27 01:20:19 +0100
committerJohannes Stoelp <johannes.stoelp@gmail.com>2025-01-27 01:33:00 +0100
commit2a26c1506192468be6c4cd06465bee861d87db51 (patch)
tree9ae5fc333e61c2478dfc57842daeacbf1dc78867 /test/elf_parser.cc
parent3f62112e3a1b180a9b931d6f43b3cdc74e7ba3b9 (diff)
downloadcpp-utils-2a26c1506192468be6c4cd06465bee861d87db51.tar.gz
cpp-utils-2a26c1506192468be6c4cd06465bee861d87db51.zip
elf: simple elf-parser for dynamic symbolsHEADmain
Diffstat (limited to 'test/elf_parser.cc')
-rw-r--r--test/elf_parser.cc59
1 files changed, 59 insertions, 0 deletions
diff --git a/test/elf_parser.cc b/test/elf_parser.cc
new file mode 100644
index 0000000..6f16639
--- /dev/null
+++ b/test/elf_parser.cc
@@ -0,0 +1,59 @@
+#include "elf_parser.h"
+
+#include <cstddef>
+#include <cstdio>
+
+#include <elf.h>
+
+#include "elf_parser/libtest-32.h"
+#include "elf_parser/libtest-64.h"
+
+void dump_dynsyms(const unsigned char* bytes, size_t len) {
+ auto elf = elf::parse(bytes, len);
+
+ elf->dynsyms([](const char* name, char type, char bind) { // NOLINT
+ const char* bind_str = "<unnown>";
+ switch (bind) {
+ case STB_GLOBAL:
+ bind_str = "GLOBAL";
+ break;
+ case STB_LOCAL:
+ bind_str = "LOCAL";
+ break;
+ case STB_WEAK:
+ bind_str = "WEAK";
+ break;
+ default:
+ break;
+ }
+
+ const char* type_str = "<unknown>";
+ switch (type) {
+ case STT_NOTYPE:
+ type_str = "NOTYPE";
+ break;
+ case STT_FUNC:
+ type_str = "FUNC";
+ break;
+ case STT_OBJECT:
+ type_str = "OBJECT";
+ break;
+ case STT_SECTION:
+ type_str = "SECTION";
+ break;
+ case STT_FILE:
+ type_str = "FILE";
+ break;
+ default:
+ break;
+ }
+
+ printf("syms type: %10s bind: %10s name: %s\n", type_str, bind_str, name);
+ return true;
+ });
+}
+
+int main() {
+ dump_dynsyms(libtest_32_so, libtest_32_so_len);
+ dump_dynsyms(libtest_64_so, libtest_64_so_len);
+}