check-object: dump ELF header

This commit is contained in:
Jakub Konka 2023-07-13 14:33:33 +02:00
parent 2896266a03
commit 4c3625d745

View File

@ -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";