aboutsummaryrefslogtreecommitdiff
path: root/lib/std/Build/Step/CheckObject.zig
diff options
context:
space:
mode:
authorJakub Konka <kubkon@jakubkonka.com>2023-07-13 14:33:33 +0200
committerJakub Konka <kubkon@jakubkonka.com>2023-07-13 14:33:33 +0200
commit4c3625d74546e22e1bd4695cc7bdde09f645bf30 (patch)
treefcdfb89bfc48889acce463caeaaa8c3173a18e82 /lib/std/Build/Step/CheckObject.zig
parent2896266a038cde4b64743534df7ccdd3f5b9347f (diff)
downloadzig-4c3625d74546e22e1bd4695cc7bdde09f645bf30.tar.gz
zig-4c3625d74546e22e1bd4695cc7bdde09f645bf30.zip
check-object: dump ELF header
Diffstat (limited to 'lib/std/Build/Step/CheckObject.zig')
-rw-r--r--lib/std/Build/Step/CheckObject.zig35
1 files changed, 34 insertions, 1 deletions
diff --git a/lib/std/Build/Step/CheckObject.zig b/lib/std/Build/Step/CheckObject.zig
index 171734c450..d53352af80 100644
--- a/lib/std/Build/Step/CheckObject.zig
+++ b/lib/std/Build/Step/CheckObject.zig
@@ -1,5 +1,6 @@
const std = @import("std");
const assert = std.debug.assert;
+const elf = std.elf;
const fs = std.fs;
const macho = std.macho;
const math = std.math;
@@ -338,7 +339,9 @@ fn make(step: *Step, prog_node: *std.Progress.Node) !void {
.macho => try MachODumper.parseAndDump(step, contents, .{
.dump_symtab = self.dump_symtab,
}),
- .elf => @panic("TODO elf parser"),
+ .elf => try ElfDumper.parseAndDump(step, contents, .{
+ .dump_symtab = self.dump_symtab,
+ }),
.coff => @panic("TODO coff parser"),
.wasm => try WasmDumper.parseAndDump(step, contents, .{
.dump_symtab = self.dump_symtab,
@@ -695,6 +698,36 @@ const MachODumper = struct {
}
};
+const ElfDumper = struct {
+ const symtab_label = "symtab";
+
+ fn parseAndDump(step: *Step, bytes: []const u8, opts: Opts) ![]const u8 {
+ _ = opts;
+
+ const gpa = step.owner.allocator;
+ var stream = std.io.fixedBufferStream(bytes);
+ const reader = stream.reader();
+
+ const hdr = try reader.readStruct(elf.Elf64_Ehdr);
+ if (!mem.eql(u8, hdr.e_ident[0..4], "\x7fELF")) {
+ return error.InvalidMagicNumber;
+ }
+
+ var output = std.ArrayList(u8).init(gpa);
+ const writer = output.writer();
+
+ try dumpHeader(hdr, writer);
+
+ return output.toOwnedSlice();
+ }
+
+ fn dumpHeader(hdr: elf.Elf64_Ehdr, writer: anytype) !void {
+ try writer.writeAll("header\n");
+ try writer.print("type {s}\n", .{@tagName(hdr.e_type)});
+ try writer.print("entry {x}\n", .{hdr.e_entry});
+ }
+};
+
const WasmDumper = struct {
const symtab_label = "symbols";