diff options
| author | Jakub Konka <kubkon@jakubkonka.com> | 2023-07-13 14:33:33 +0200 |
|---|---|---|
| committer | Jakub Konka <kubkon@jakubkonka.com> | 2023-07-13 14:33:33 +0200 |
| commit | 4c3625d74546e22e1bd4695cc7bdde09f645bf30 (patch) | |
| tree | fcdfb89bfc48889acce463caeaaa8c3173a18e82 /lib/std/Build/Step/CheckObject.zig | |
| parent | 2896266a038cde4b64743534df7ccdd3f5b9347f (diff) | |
| download | zig-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.zig | 35 |
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"; |
