diff --git a/src/p_mach.cpp b/src/p_mach.cpp index c8c7c83e..638d5031 100644 --- a/src/p_mach.cpp +++ b/src/p_mach.cpp @@ -1382,6 +1382,23 @@ void PackMachFat::unpack(OutputFile *fo) packer.unpack(fo); } } break; + case PackMachFat::CPU_TYPE_X86_64: { + N_Mach::Mach_header hdr; + typedef N_Mach::Mach_header Mach_header; + fi->readx(&hdr, sizeof(hdr)); + if (hdr.filetype==Mach_header::MH_EXECUTE) { + PackMachAMD64 packer(fi); + packer.initPackHeader(); + packer.canUnpack(); + packer.unpack(fo); + } + else if (hdr.filetype==Mach_header::MH_DYLIB) { + PackDylibAMD64 packer(fi); + packer.initPackHeader(); + packer.canUnpack(); + packer.unpack(fo); + } + } break; case PackMachFat::CPU_TYPE_POWERPC: { N_Mach::Mach_header hdr; typedef N_Mach::Mach_header Mach_header; @@ -1489,6 +1506,18 @@ int PackMachFat::canUnpack() else ph.format = packer.getFormat(); // FIXME: copy entire PackHeader } break; + case PackMachFat::CPU_TYPE_X86_64: { + PackMachAMD64 packer(fi); + if (!packer.canUnpack()) { + PackDylibAMD64 pack2r(fi); + if (!pack2r.canUnpack()) + return 0; + else + ph.format = pack2r.getFormat(); // FIXME: copy entire PackHeader + } + else + ph.format = packer.getFormat(); // FIXME: copy entire PackHeader + } break; case PackMachFat::CPU_TYPE_POWERPC: { PackMachPPC32 packer(fi); if (!packer.canUnpack()) {