From 77377195aa6f99a9d4c11216f193ed011a3668e8 Mon Sep 17 00:00:00 2001 From: John Reiser Date: Tue, 9 Mar 2010 13:35:06 -0800 Subject: [PATCH] Allow CPU_TYPE_X86_64 for MH_EXECUTE in fat (universal) binaries, but no MH_DYLIB yet. infoWarning() for unsupported cputype. --- src/p_mach.cpp | 33 ++++++++++++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/src/p_mach.cpp b/src/p_mach.cpp index eb7a806c..122f16b2 100644 --- a/src/p_mach.cpp +++ b/src/p_mach.cpp @@ -1191,6 +1191,25 @@ void PackMachFat::pack(OutputFile *fo) packer.pack(fo); } } break; + case PackMachFat::CPU_TYPE_X86_64: { + typedef N_Mach::Mach_header Mach_header; + Mach_header hdr; + fi->readx(&hdr, sizeof(hdr)); + if (hdr.filetype==Mach_header::MH_EXECUTE) { + PackMachAMD64 packer(fi); + packer.initPackHeader(); + packer.canPack(); + packer.updatePackHeader(); + packer.pack(fo); + } + //else if (hdr.filetype==Mach_header::MH_DYLIB) { + // PackDylibAMD64 packer(fi); + // packer.initPackHeader(); + // packer.canPack(); + // packer.updatePackHeader(); + // packer.pack(fo); + //} + } break; case PackMachFat::CPU_TYPE_POWERPC: { typedef N_Mach::Mach_header Mach_header; Mach_header hdr; @@ -1298,7 +1317,11 @@ bool PackMachFat::canPack() fi->set_extent(fat_head.arch[j].offset, fat_head.arch[j].size); fi->seek(0, SEEK_SET); switch (arch[j].cputype) { - default: return false; + default: { + infoWarning("unknown cputype 0x%x: %s", + (unsigned)arch[j].cputype, fi->getName()); + return false; + } break; case PackMachFat::CPU_TYPE_I386: { PackMachI386 packer(fi); if (!packer.canPack()) { @@ -1307,6 +1330,14 @@ bool PackMachFat::canPack() return false; } } break; + case PackMachFat::CPU_TYPE_X86_64: { + PackMachAMD64 packer(fi); + if (!packer.canPack()) { + //PackDylibI386 pack2r(fi); + //if (!pack2r.canPack()) + return false; + } + } break; case PackMachFat::CPU_TYPE_POWERPC: { PackMachPPC32 packer(fi); if (!packer.canPack()) {