elfinspect

ELF and DWARF Binary Inspector
git clone anongit@rnpnr.xyz:elfinspect.git
Log | Files | Refs | Feed | README | LICENSE

Commit: 550fc79ab344fe3e953d229906a08c148bb2d5f7
Parent: dfc435bc1331b31eb57d7e15d3317c5ec07ff732
Author: Randy Palamar
Date:   Mon, 19 May 2025 09:52:02 -0600

pass file name in on command line

Diffstat:
Melfinspect.c | 49+++++++++++++++++++++++++++++++++++++++++++++++--
Mmain_posix.c | 5++---
2 files changed, 49 insertions(+), 5 deletions(-)

diff --git a/elfinspect.c b/elfinspect.c @@ -30,6 +30,16 @@ typedef struct { b32 errors; } str8_reader; +typedef struct { + u8 *argv0; + + struct { + u8 **data; + s16 capacity; + s16 count; + } file_names; +} Options; + /* NOTE: platform api; defined here so that other platform symbols are not visible to this TU */ function str8 os_map_file(u8 *); @@ -1000,11 +1010,29 @@ dwarf_lookup_abbreviation(Arena *a, str8 table, u64 key) return result; } +function Options +parse_command_line(Arena *arena, s32 argc, char *argv[]) +{ + Options result = {0}; + + #define shift(c, v) ((c)--, *(v)++) + + char *c_arg = shift(argc, argv); + result.argv0 = (u8 *)c_arg; + while (argc) { + c_arg = shift(argc, argv); + *da_push(arena, &result.file_names) = (u8 *)c_arg; + } + + #undef shift + + return result; +} + function b32 -elfinspect(Arena arena, str8 file) +elf_inspect_file(Arena arena, str8 file) { b32 result = is_elf(file); - if (result) { ELFHeader header = {0}; if (!elf_header_from_file(&header, file)) { @@ -1078,3 +1106,20 @@ elfinspect(Arena arena, str8 file) return result; } + + +function b32 +elfinspect(Arena arena, s32 argc, char *argv[]) +{ + Options options = parse_command_line(&arena, argc, argv); + + b32 result = 1; + for (s32 file_index = 0; file_index < options.file_names.count; file_index++) { + u8 *file_name = options.file_names.data[file_index]; + str8 file = os_map_file(file_name); + printf("-----<%s>-----\n", file_name); + result &= elf_inspect_file(arena, file); + } + + return result; +} diff --git a/main_posix.c b/main_posix.c @@ -51,11 +51,10 @@ os_map_file(u8 *name) return result; } -s32 +extern s32 main(s32 argc, char *argv[]) { Arena arena = os_arena_new(MB(32)); - str8 file = os_map_file((u8 *)argv[0]); - elfinspect(arena, file); + elfinspect(arena, argc, argv); return 0; }