feature. See also
. The project being documented here (as the example) is the Zig library itself.
objdump.dump
fn dump(d: *const DumpContext) !void
File
Code
fn dump(d: *const DumpContext) !void {
const r = &d.fr.interface;
try r.fill(4);
elf: {
if (!mem.eql(u8, r.buffered()[0..4], std.elf.MAGIC)) break :elf;
return elf.dump(r, d.w);
}
macho: {
if (mem.readInt(u32, r.buffered()[0..4], .little) != std.macho.MH_MAGIC_64) break :macho;
return macho.dump(r, d.w);
}
wasm: {
comptime assert(std.wasm.magic.len == 4);
if (!mem.eql(u8, r.buffered()[0..4], &std.wasm.magic)) break :wasm;
return wasm.dump(r, d.w);
}
coff: {
const ext = std.fs.path.extension(d.opts.input_path);
const basename = std.fs.path.basename(d.opts.input_path);
if (std.mem.eql(u8, ext, ".exe") or std.mem.eql(u8, ext, ".dll")) {
if (!mem.eql(u8, r.buffered()[0..2], "MZ")) break :coff;
try r.discardAll(std.coff.pe_pointer_offset);
const sig_offset = try r.takeInt(u32, .little);
try d.fr.seekTo(sig_offset);
const sig = try r.take(4);
if (!std.mem.eql(u8, sig, std.coff.pe_signature)) {
try d.w.print("invalid PE signature: {x}", .{sig});
return error.ParseFailure;
}
if (d.element(.@"file-type")) {
try d.w.print("{s}: PE/COFF image\n\n", .{basename});
if (d.element(.newlines)) try d.w.writeByte('\n');
}
return coff.dumpObject(d, true, basename);
} else if (std.mem.eql(u8, ext, ".lib")) {
r.fill(std.coff.archive_signature.len) catch break :coff;
if (!mem.eql(u8, r.buffered()[0..std.coff.archive_signature.len], std.coff.archive_signature)) break :coff;
if (d.element(.@"file-type")) {
try d.w.print("{s}: COFF archive\n", .{basename});
if (d.element(.newlines)) try d.w.writeByte('\n');
}
return coff.dumpArchive(d);
} else if (std.mem.eql(u8, ext, ".obj")) {
if (d.element(.@"file-type")) {
try d.w.print("{s}: COFF object\n", .{basename});
if (d.element(.newlines)) try d.w.writeByte('\n');
}
return coff.dumpObject(d, false, basename);
}
}
return error.UnknownFile;
}