diff options
author | Johannes Stoelp <johannes.stoelp@gmail.com> | 2025-01-27 01:20:19 +0100 |
---|---|---|
committer | Johannes Stoelp <johannes.stoelp@gmail.com> | 2025-01-27 01:33:00 +0100 |
commit | 2a26c1506192468be6c4cd06465bee861d87db51 (patch) | |
tree | 9ae5fc333e61c2478dfc57842daeacbf1dc78867 /test/elf_parser.cc | |
parent | 3f62112e3a1b180a9b931d6f43b3cdc74e7ba3b9 (diff) | |
download | cpp-utils-2a26c1506192468be6c4cd06465bee861d87db51.tar.gz cpp-utils-2a26c1506192468be6c4cd06465bee861d87db51.zip |
Diffstat (limited to 'test/elf_parser.cc')
-rw-r--r-- | test/elf_parser.cc | 59 |
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); +} |