2022-01-29 02:29:34 +00:00
|
|
|
/*! otorp (C) 2013-present SheetJS -- http://sheetjs.com */
|
|
|
|
|
2022-03-14 06:51:33 +00:00
|
|
|
import { u8_to_dataview } from "./util";
|
2022-01-29 02:29:34 +00:00
|
|
|
|
|
|
|
interface MachOEntry {
|
|
|
|
type: number;
|
|
|
|
subtype: number;
|
|
|
|
offset: number;
|
|
|
|
size: number;
|
|
|
|
align?: number;
|
|
|
|
data: Uint8Array;
|
|
|
|
}
|
|
|
|
var parse_fat = (buf: Uint8Array): MachOEntry[] => {
|
|
|
|
var dv = u8_to_dataview(buf);
|
|
|
|
if(dv.getUint32(0, false) !== 0xCAFEBABE) throw new Error("Unsupported file");
|
|
|
|
var nfat_arch = dv.getUint32(4, false);
|
|
|
|
var out: MachOEntry[] = [];
|
|
|
|
for(var i = 0; i < nfat_arch; ++i) {
|
|
|
|
var start = i * 20 + 8;
|
|
|
|
|
|
|
|
var cputype = dv.getUint32(start, false);
|
|
|
|
var cpusubtype = dv.getUint32(start+4, false);
|
|
|
|
var offset = dv.getUint32(start+8, false);
|
|
|
|
var size = dv.getUint32(start+12, false);
|
|
|
|
var align = dv.getUint32(start+16, false);
|
|
|
|
|
|
|
|
out.push({
|
|
|
|
type: cputype,
|
|
|
|
subtype: cpusubtype,
|
|
|
|
offset,
|
|
|
|
size,
|
|
|
|
align,
|
|
|
|
data: buf.slice(offset, offset + size)
|
|
|
|
});
|
|
|
|
}
|
|
|
|
return out;
|
|
|
|
};
|
|
|
|
var parse_macho = (buf: Uint8Array): MachOEntry[] => {
|
|
|
|
var dv = u8_to_dataview(buf);
|
|
|
|
var magic = dv.getUint32(0, false);
|
|
|
|
switch(magic) {
|
|
|
|
// fat binary (x86_64 / aarch64)
|
|
|
|
case 0xCAFEBABE: return parse_fat(buf);
|
|
|
|
// x86_64
|
|
|
|
case 0xCFFAEDFE: return [{
|
|
|
|
type: dv.getUint32(4, false),
|
|
|
|
subtype: dv.getUint32(8, false),
|
|
|
|
offset: 0,
|
|
|
|
size: buf.length,
|
|
|
|
data: buf
|
|
|
|
}];
|
|
|
|
}
|
|
|
|
throw new Error("Unsupported file");
|
|
|
|
};
|
|
|
|
export { MachOEntry, parse_macho };
|