1
0
mirror of https://github.com/upx/upx synced 2025-09-28 19:06:07 +08:00

Allow CPU_TYPE_X86_64 for MH_EXECUTE in fat (universal) binaries,

but no MH_DYLIB yet.  infoWarning() for unsupported cputype.
This commit is contained in:
John Reiser 2010-03-09 13:35:06 -08:00
parent 7e2e72bd40
commit 77377195aa

View File

@ -1191,6 +1191,25 @@ void PackMachFat::pack(OutputFile *fo)
packer.pack(fo);
}
} break;
case PackMachFat::CPU_TYPE_X86_64: {
typedef N_Mach::Mach_header<MachClass_LE64::MachITypes> 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<MachClass_BE32::MachITypes> 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()) {