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

PackMachFat for MH_DYLIB, too.

This commit is contained in:
John Reiser 2009-06-01 16:23:13 -07:00
parent 472ba8c1fd
commit 20dcbc593c

View File

@ -979,6 +979,7 @@ bool PackMachBase<T>::canPack()
ptr += (unsigned) ((Mach_segment_command *)ptr)->cmdsize; ptr += (unsigned) ((Mach_segment_command *)ptr)->cmdsize;
} }
if (Mach_header::MH_DYLIB==my_filetype && 0==o_routines_cmd) { if (Mach_header::MH_DYLIB==my_filetype && 0==o_routines_cmd) {
infoWarning("missing -init function");
return false; return false;
} }
@ -1055,18 +1056,42 @@ void PackMachFat::pack(OutputFile *fo)
fi->set_extent(fat_head.arch[j].offset, fat_head.arch[j].size); fi->set_extent(fat_head.arch[j].offset, fat_head.arch[j].size);
switch (fat_head.arch[j].cputype) { switch (fat_head.arch[j].cputype) {
case PackMachFat::CPU_TYPE_I386: { case PackMachFat::CPU_TYPE_I386: {
PackMachI386 packer(fi); N_Mach::Mach_header<MachClass_LE32::MachITypes> hdr;
packer.initPackHeader(); typedef N_Mach::Mach_header<MachClass_LE32::MachITypes> Mach_header;
packer.canPack(); fi->readx(&hdr, sizeof(hdr));
packer.updatePackHeader(); if (hdr.filetype==Mach_header::MH_EXECUTE) {
packer.pack(fo); PackMachI386 packer(fi);
packer.initPackHeader();
packer.canPack();
packer.updatePackHeader();
packer.pack(fo);
}
else if (hdr.filetype==Mach_header::MH_DYLIB) {
PackDylibI386 packer(fi);
packer.initPackHeader();
packer.canPack();
packer.updatePackHeader();
packer.pack(fo);
}
} break; } break;
case PackMachFat::CPU_TYPE_POWERPC: { case PackMachFat::CPU_TYPE_POWERPC: {
PackMachPPC32 packer(fi); N_Mach::Mach_header<MachClass_BE32::MachITypes> hdr;
packer.initPackHeader(); typedef N_Mach::Mach_header<MachClass_BE32::MachITypes> Mach_header;
packer.canPack(); fi->readx(&hdr, sizeof(hdr));
packer.updatePackHeader(); if (hdr.filetype==Mach_header::MH_EXECUTE) {
packer.pack(fo); PackMachPPC32 packer(fi);
packer.initPackHeader();
packer.canPack();
packer.updatePackHeader();
packer.pack(fo);
}
else if (hdr.filetype==Mach_header::MH_DYLIB) {
PackDylibPPC32 packer(fi);
packer.initPackHeader();
packer.canPack();
packer.updatePackHeader();
packer.pack(fo);
}
} break; } break;
} // switch cputype } // switch cputype
fat_head.arch[j].offset = base; fat_head.arch[j].offset = base;
@ -1098,16 +1123,38 @@ void PackMachFat::unpack(OutputFile *fo)
fi->set_extent(fat_head.arch[j].offset, fat_head.arch[j].size); fi->set_extent(fat_head.arch[j].offset, fat_head.arch[j].size);
switch (fat_head.arch[j].cputype) { switch (fat_head.arch[j].cputype) {
case PackMachFat::CPU_TYPE_I386: { case PackMachFat::CPU_TYPE_I386: {
PackMachI386 packer(fi); N_Mach::Mach_header<MachClass_LE32::MachITypes> hdr;
packer.initPackHeader(); typedef N_Mach::Mach_header<MachClass_LE32::MachITypes> Mach_header;
packer.canUnpack(); fi->readx(&hdr, sizeof(hdr));
packer.unpack(fo); if (hdr.filetype==Mach_header::MH_EXECUTE) {
PackMachI386 packer(fi);
packer.initPackHeader();
packer.canUnpack();
packer.unpack(fo);
}
else if (hdr.filetype==Mach_header::MH_DYLIB) {
PackDylibI386 packer(fi);
packer.initPackHeader();
packer.canUnpack();
packer.unpack(fo);
}
} break; } break;
case PackMachFat::CPU_TYPE_POWERPC: { case PackMachFat::CPU_TYPE_POWERPC: {
PackMachPPC32 packer(fi); N_Mach::Mach_header<MachClass_BE32::MachITypes> hdr;
packer.initPackHeader(); typedef N_Mach::Mach_header<MachClass_BE32::MachITypes> Mach_header;
packer.canUnpack(); fi->readx(&hdr, sizeof(hdr));
packer.unpack(fo); if (hdr.filetype==Mach_header::MH_EXECUTE) {
PackMachPPC32 packer(fi);
packer.initPackHeader();
packer.canUnpack();
packer.unpack(fo);
}
else if (hdr.filetype==Mach_header::MH_DYLIB) {
PackDylibPPC32 packer(fi);
packer.initPackHeader();
packer.canUnpack();
packer.unpack(fo);
}
} break; } break;
} // switch cputype } // switch cputype
fat_head.arch[j].offset = base; fat_head.arch[j].offset = base;
@ -1135,13 +1182,19 @@ bool PackMachFat::canPack()
default: return false; default: return false;
case PackMachFat::CPU_TYPE_I386: { case PackMachFat::CPU_TYPE_I386: {
PackMachI386 packer(fi); PackMachI386 packer(fi);
if (!packer.canPack()) if (!packer.canPack()) {
return false; PackDylibI386 pack2r(fi);
if (!pack2r.canPack())
return false;
}
} break; } break;
case PackMachFat::CPU_TYPE_POWERPC: { case PackMachFat::CPU_TYPE_POWERPC: {
PackMachPPC32 packer(fi); PackMachPPC32 packer(fi);
if (!packer.canPack()) if (!packer.canPack()) {
return false; PackDylibPPC32 pack2r(fi);
if (!pack2r.canPack())
return false;
}
} break; } break;
} // switch cputype } // switch cputype
} }
@ -1170,15 +1223,27 @@ int PackMachFat::canUnpack()
default: return false; default: return false;
case PackMachFat::CPU_TYPE_I386: { case PackMachFat::CPU_TYPE_I386: {
PackMachI386 packer(fi); PackMachI386 packer(fi);
if (!packer.canUnpack()) if (!packer.canUnpack()) {
return 0; PackDylibI386 pack2r(fi);
ph.format = packer.getFormat(); // FIXME: copy entire PackHeader if (!pack2r.canUnpack())
return 0;
else
ph.format = pack2r.getFormat(); // FIXME: copy entire PackHeader
}
else
ph.format = packer.getFormat(); // FIXME: copy entire PackHeader
} break; } break;
case PackMachFat::CPU_TYPE_POWERPC: { case PackMachFat::CPU_TYPE_POWERPC: {
PackMachPPC32 packer(fi); PackMachPPC32 packer(fi);
if (!packer.canUnpack()) if (!packer.canUnpack()) {
return 0; PackDylibPPC32 pack2r(fi);
ph.format = packer.getFormat(); // FIXME: copy entire PackHeader if (!pack2r.canUnpack())
return 0;
else
ph.format = pack2r.getFormat(); // FIXME: copy entire PackHeader
}
else
ph.format = packer.getFormat(); // FIXME: copy entire PackHeader
} break; } break;
} // switch cputype } // switch cputype
} }