summaryrefslogtreecommitdiff
path: root/src/elfo-pretty.zig
diff options
context:
space:
mode:
Diffstat (limited to 'src/elfo-pretty.zig')
-rw-r--r--src/elfo-pretty.zig103
1 files changed, 57 insertions, 46 deletions
diff --git a/src/elfo-pretty.zig b/src/elfo-pretty.zig
index ea0b246..1482670 100644
--- a/src/elfo-pretty.zig
+++ b/src/elfo-pretty.zig
@@ -1,58 +1,29 @@
const std = @import("std");
const cs = @import("capstone");
-const SymbolRange = struct {
- start: u64,
- end: u64,
- name: []u8,
- kind: u8,
-};
-
-fn iterateSymbols(
- h: std.elf.Header,
- file_reader: *std.Io.File.Reader,
- symtab: std.elf.Elf64_Shdr,
-) SymbolIterator {
- return .{
- .elf_header = h,
- .file_reader = file_reader,
- .symtab = symtab,
- };
-}
-
-const SymbolIterator = struct {
- elf_header: std.elf.Header,
- file_reader: *std.Io.File.Reader,
- symtab: std.elf.Elf64_Shdr,
- index: usize = 0,
-
- pub fn next(it: *SymbolIterator) !?std.elf.Elf64_Sym {
- defer it.index += 1;
-
- const size: u64 = if (it.elf_header.is_64) @sizeOf(std.elf.Elf64_Sym) else @sizeOf(std.elf.Elf64_Sym);
- const offset = it.symtab.sh_offset + size * it.index;
-
- if (offset >= (it.symtab.sh_size + it.symtab.sh_offset))
- return null;
-
- try it.file_reader.seekTo(offset);
- return try it.file_reader.interface.takeStruct(std.elf.Elf64_Sym, it.elf_header.endian);
- }
-};
-
pub fn main(init: std.process.Init) !void {
- // var args = init.environ_map.iterator();
- // _ = args.next(); // skip argv[0]
+ var args = try init.minimal.args.iterateAllocator(init.gpa);
+ defer args.deinit();
+ _ = args.next(); // skip argv[0]
var buffer: [64]u8 = undefined;
const stderr = try init.io.lockStderr(&buffer, .escape_codes);
+ // TODO: finish passing custom alloc operations here
+ // const mem_config: cs.cs_opt_mem = undefined;
+ // std.debug.assert(cs.cs_option(0, cs.CS_OPT_MEM, @intFromPtr(&mem_config)) == cs.CS_ERR_OK);
+
+ var handle: usize = undefined;
+ defer _ = cs.cs_close(@ptrCast(&handle));
+ // TODO: read the arch from the elf so we open the equivalent capstone handle
+ std.debug.assert(cs.cs_open(cs.CS_ARCH_X86, cs.CS_MODE_64, @ptrCast(&handle)) == cs.CS_ERR_OK);
+
try printElf(
init.gpa,
init.io,
- // args.next() orelse "./study-samples/split",
- "./study-samples/split",
+ args.next() orelse "./study-samples/split",
stderr.terminal(),
+ handle,
.{
// .show_unaddressable_sections = true,
// .skip_sections_content = true,
@@ -65,6 +36,7 @@ pub fn printElf(
io: std.Io,
path: []const u8,
term: std.Io.Terminal,
+ handle: usize,
options: struct {
show_unaddressable_sections: bool = false,
skip_sections_content: bool = false,
@@ -79,9 +51,6 @@ pub fn printElf(
var reader = f.reader(io, buffer);
const header = try std.elf.Header.read(&reader.interface);
- var handle: usize = undefined;
- std.debug.assert(cs.cs_open(cs.CS_ARCH_X86, cs.CS_MODE_64, @ptrCast(&handle)) == cs.CS_ERR_OK);
-
const shstrtab = blk: {
var section_it = header.iterateSectionHeaders(&reader);
var section_idx: u32 = 0;
@@ -282,6 +251,9 @@ pub fn printElf(
if (section.sh_type == std.elf.SHT_PROGBITS and (section.sh_flags & (std.elf.SHF_ALLOC | std.elf.SHF_EXECINSTR)) != 0) {
const instrs: []cs.cs_insn = blk: {
var insn: [*]cs.cs_insn = undefined;
+ // TODO: use iter API
+ // https://www.capstone-engine.org/iteration.html
+ // const count = cs.cs_disasm_iter(handle, section_slice.?.ptr, section_slice.?.len, section.sh_addr, @ptrCast(&insn));
const count = cs.cs_disasm(handle, section_slice.?.ptr, section_slice.?.len, section.sh_addr, 0, @ptrCast(&insn));
break :blk insn[0..count];
};
@@ -467,3 +439,42 @@ pub fn dumpHexFallible(
try bw.writeByte('\n');
}
}
+
+const SymbolRange = struct {
+ start: u64,
+ end: u64,
+ name: []u8,
+ kind: u8,
+};
+
+fn iterateSymbols(
+ h: std.elf.Header,
+ file_reader: *std.Io.File.Reader,
+ symtab: std.elf.Elf64_Shdr,
+) SymbolIterator {
+ return .{
+ .elf_header = h,
+ .file_reader = file_reader,
+ .symtab = symtab,
+ };
+}
+
+const SymbolIterator = struct {
+ elf_header: std.elf.Header,
+ file_reader: *std.Io.File.Reader,
+ symtab: std.elf.Elf64_Shdr,
+ index: usize = 0,
+
+ pub fn next(it: *SymbolIterator) !?std.elf.Elf64_Sym {
+ defer it.index += 1;
+
+ const size: u64 = if (it.elf_header.is_64) @sizeOf(std.elf.Elf64_Sym) else @sizeOf(std.elf.Elf64_Sym);
+ const offset = it.symtab.sh_offset + size * it.index;
+
+ if (offset >= (it.symtab.sh_size + it.symtab.sh_offset))
+ return null;
+
+ try it.file_reader.seekTo(offset);
+ return try it.file_reader.interface.takeStruct(std.elf.Elf64_Sym, it.elf_header.endian);
+ }
+};