diff options
Diffstat (limited to 'zig-elf')
| -rw-r--r-- | zig-elf/.clang-format | 4 | ||||
| -rw-r--r-- | zig-elf/Makefile | 5 | ||||
| -rwxr-xr-x | zig-elf/elf | bin | 0 -> 16048 bytes | |||
| -rw-r--r-- | zig-elf/elf-64-gen.pdf | bin | 0 -> 172444 bytes | |||
| -rw-r--r-- | zig-elf/elf.c | 6 | ||||
| -rw-r--r-- | zig-elf/elf.png | bin | 0 -> 326086 bytes | |||
| -rw-r--r-- | zig-elf/main.zig | 51 |
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 Binary files differnew file mode 100755 index 0000000..7178622 --- /dev/null +++ b/zig-elf/elf diff --git a/zig-elf/elf-64-gen.pdf b/zig-elf/elf-64-gen.pdf Binary files differnew file mode 100644 index 0000000..d80b546 --- /dev/null +++ b/zig-elf/elf-64-gen.pdf 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 Binary files differnew file mode 100644 index 0000000..22685f5 --- /dev/null +++ b/zig-elf/elf.png 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}); +} |
