summaryrefslogtreecommitdiff
path: root/zig-elf
diff options
context:
space:
mode:
authorMitja Felicijan <mitja.felicijan@gmail.com>2024-09-19 14:13:59 +0200
committerMitja Felicijan <mitja.felicijan@gmail.com>2024-09-19 14:13:59 +0200
commit9eb604113b9a531331897e14fafe0bef7f62d236 (patch)
tree71f4fb84168d65bff6153b5841dc2c94b8515438 /zig-elf
parentc7cd286be9d4ede3129a309e2668686be4646f07 (diff)
downloadprobe-9eb604113b9a531331897e14fafe0bef7f62d236.tar.gz
Added reading of ELF binaries in Zig
Diffstat (limited to 'zig-elf')
-rw-r--r--zig-elf/.clang-format4
-rw-r--r--zig-elf/Makefile5
-rwxr-xr-xzig-elf/elfbin0 -> 16048 bytes
-rw-r--r--zig-elf/elf-64-gen.pdfbin0 -> 172444 bytes
-rw-r--r--zig-elf/elf.c6
-rw-r--r--zig-elf/elf.pngbin0 -> 326086 bytes
-rw-r--r--zig-elf/main.zig51
7 files changed, 66 insertions, 0 deletions
diff --git a/zig-elf/.clang-format b/zig-elf/.clang-format
new file mode 100644
index 0000000..84ac618
--- /dev/null
+++ b/zig-elf/.clang-format
@@ -0,0 +1,4 @@
+BasedOnStyle: LLVM
+ColumnLimit: 120
+IndentWidth: 4
+
diff --git a/zig-elf/Makefile b/zig-elf/Makefile
new file mode 100644
index 0000000..52899e3
--- /dev/null
+++ b/zig-elf/Makefile
@@ -0,0 +1,5 @@
+default:
+ zig run main.zig
+
+elf:
+ clang -o elf elf.c
diff --git a/zig-elf/elf b/zig-elf/elf
new file mode 100755
index 0000000..7178622
--- /dev/null
+++ b/zig-elf/elf
Binary files differ
diff --git a/zig-elf/elf-64-gen.pdf b/zig-elf/elf-64-gen.pdf
new file mode 100644
index 0000000..d80b546
--- /dev/null
+++ b/zig-elf/elf-64-gen.pdf
Binary files differ
diff --git a/zig-elf/elf.c b/zig-elf/elf.c
new file mode 100644
index 0000000..c038330
--- /dev/null
+++ b/zig-elf/elf.c
@@ -0,0 +1,6 @@
+#include <stdio.h>
+
+int main(void) {
+ printf("Oh, hi Mark!\n");
+ return 0;
+}
diff --git a/zig-elf/elf.png b/zig-elf/elf.png
new file mode 100644
index 0000000..22685f5
--- /dev/null
+++ b/zig-elf/elf.png
Binary files differ
diff --git a/zig-elf/main.zig b/zig-elf/main.zig
new file mode 100644
index 0000000..3b4e116
--- /dev/null
+++ b/zig-elf/main.zig
@@ -0,0 +1,51 @@
+// $ readelf -h ./elf
+// https://github.com/bminor/binutils-gdb/blob/master/binutils/readelf.c
+
+// There is still a problem with packed structs and aligment padding
+// better referenced in these two threads (sometime struct is not aligned
+// properly or even has 1 byte more than its C alternative):
+// - https://ziggit.dev/t/mapping-64-u8-buffer-to-a-struct/6052/19
+// - https://ziggit.dev/t/wrong-sizes-of-extern-packed-structs/6053/6
+
+const std = @import("std");
+
+const Elf64ExecutionHeader = packed struct {
+ ident: u128,
+ type: u16,
+ machine: u16,
+ version: u32,
+ entry: u64,
+ phoff: u64,
+ shoff: u64,
+ flags: u32,
+ ehsize: u16,
+ phentsize: u16,
+ phnum: u16,
+ shentsize: u16,
+ shnum: u16,
+ shstrndx: u16,
+};
+
+pub fn main() !void {
+ var file = try std.fs.cwd().openFile("./elf", .{});
+ defer file.close();
+
+ var buffer: [64]u8 = undefined;
+ _ = try file.read(buffer[0..]);
+
+ const header: *Elf64ExecutionHeader = @ptrCast(@alignCast(&buffer));
+
+ std.debug.print("Object file type: {}\n", .{header.type});
+ std.debug.print("Architecture: {}\n", .{header.machine});
+ std.debug.print("Object file version: 0x{X:0>2}\n", .{header.version});
+ std.debug.print("Entry point virtual address: 0x{X:0>2}\n", .{header.entry});
+ std.debug.print("Program header table file offset: {}\n", .{header.phoff});
+ std.debug.print("Section header table file offset: {}\n", .{header.shoff});
+ std.debug.print("Processor-specific flags: 0x{X:0>2}\n", .{header.flags});
+ std.debug.print("ELF header size in bytes: {}\n", .{header.ehsize});
+ std.debug.print("Program header table entry size: {}\n", .{header.phentsize});
+ // std.debug.print("Program header table entry count: {}\n", .{header.phnum});
+ // std.debug.print("Section header table entry size: {}\n", .{header.shentsize});
+ // std.debug.print("Section header table entry count: {}\n", .{header.shnum});
+ // std.debug.print("Section header string table index: {}\n", .{header.shstrndx});
+}