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:
parent
472ba8c1fd
commit
20dcbc593c
121
src/p_mach.cpp
121
src/p_mach.cpp
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user