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

PackMachBase<T>::pack4dylib to prepare for more architectures

This commit is contained in:
John Reiser 2009-05-23 21:13:44 -07:00
parent 3728b2208f
commit bde43fbdfb
2 changed files with 17 additions and 7 deletions

View File

@ -396,9 +396,13 @@ void PackMachARMEL::pack4(OutputFile *fo, Filter &ft) // append PackHeader
#define PAGE_MASK (~0u<<12) #define PAGE_MASK (~0u<<12)
#define PAGE_SIZE -PAGE_MASK #define PAGE_SIZE -PAGE_MASK
void PackDylibI386::pack4(OutputFile *fo, Filter &ft) // append PackHeader template <class T>
void PackMachBase<T>::pack4dylib( // append PackHeader
OutputFile *const fo,
Filter &ft,
Addr init_address
)
{ {
rcmd.init_address = threado.state.eip;
unsigned opos = sizeof(mhdro); unsigned opos = sizeof(mhdro);
fo->seek(opos, SEEK_SET); fo->seek(opos, SEEK_SET);
@ -420,22 +424,22 @@ void PackDylibI386::pack4(OutputFile *fo, Filter &ft) // append PackHeader
case Mach_segment_command::LC_LOAD_DYLIB: case Mach_segment_command::LC_LOAD_DYLIB:
case Mach_segment_command::LC_ID_DYLIB: case Mach_segment_command::LC_ID_DYLIB:
case Mach_segment_command::LC_LOAD_DYLINKER: case Mach_segment_command::LC_LOAD_DYLINKER:
case Mach_segment_command::LC_SEGMENT_64:
case Mach_segment_command::LC_ROUTINES_64:
case Mach_segment_command::LC_UUID: case Mach_segment_command::LC_UUID:
case Mach_segment_command::LC_RPATH: case Mach_segment_command::LC_RPATH:
case Mach_segment_command::LC_CODE_SIGNATURE: case Mach_segment_command::LC_CODE_SIGNATURE:
case Mach_segment_command::LC_REEXPORT_DYLIB: case Mach_segment_command::LC_REEXPORT_DYLIB:
hdrpos += seg->cmdsize; hdrpos += seg->cmdsize;
break; // contain no file offset fields break; // contain no file offset fields
case Mach_segment_command::LC_ROUTINES_64:
case Mach_segment_command::LC_ROUTINES: { case Mach_segment_command::LC_ROUTINES: {
Mach_routines_command cmd = *(Mach_routines_command const *)seg; Mach_routines_command cmd = *(Mach_routines_command const *)seg;
cmd.reserved1 = cmd.init_address; cmd.reserved1 = cmd.init_address;
cmd.init_address = threado.state.eip; cmd.init_address = init_address;
fo->seek(hdrpos, SEEK_SET); fo->seek(hdrpos, SEEK_SET);
fo->rewrite(&cmd, sizeof(cmd)); fo->rewrite(&cmd, sizeof(cmd));
hdrpos += sizeof(cmd); hdrpos += sizeof(cmd);
} break; } break;
case Mach_segment_command::LC_SEGMENT_64:
case Mach_segment_command::LC_SEGMENT: { case Mach_segment_command::LC_SEGMENT: {
// non-__TEXT might be observed and relocated by dyld before us. // non-__TEXT might be observed and relocated by dyld before us.
Mach_segment_command segcmdtmp = *seg; Mach_segment_command segcmdtmp = *seg;
@ -515,7 +519,12 @@ void PackDylibI386::pack4(OutputFile *fo, Filter &ft) // append PackHeader
// offset of p_info in compressed file // offset of p_info in compressed file
overlay_offset = sizeof(mhdro) + mhdro.sizeofcmds + sizeof(linfo); overlay_offset = sizeof(mhdro) + mhdro.sizeofcmds + sizeof(linfo);
PackMachBase<MachClass_LE32>::pack4(fo, ft); PackMachBase<T>::pack4(fo, ft);
}
void PackDylibI386::pack4(OutputFile *fo, Filter &ft) // append PackHeader
{
pack4dylib(fo, ft, threado.state.eip);
} }
void PackMachPPC32::pack3(OutputFile *fo, Filter &ft) // append loader void PackMachPPC32::pack3(OutputFile *fo, Filter &ft) // append loader

View File

@ -468,6 +468,8 @@ public:
virtual void pack3(OutputFile *, Filter &) = 0; // append loader virtual void pack3(OutputFile *, Filter &) = 0; // append loader
virtual void pack4(OutputFile *, Filter &) = 0; // append PackHeader virtual void pack4(OutputFile *, Filter &) = 0; // append PackHeader
virtual void pack4dylib(OutputFile *, Filter &, Addr init_address);
virtual void pack1_setup_threado(OutputFile *const fo) = 0; virtual void pack1_setup_threado(OutputFile *const fo) = 0;
virtual void unpack(OutputFile *fo); virtual void unpack(OutputFile *fo);
@ -506,7 +508,6 @@ protected:
Mach_header mhdro; Mach_header mhdro;
Mach_segment_command segcmdo; Mach_segment_command segcmdo;
Mach_routines_command rcmd;
__packed_struct(b_info) // 12-byte header before each compressed block __packed_struct(b_info) // 12-byte header before each compressed block
TE32 sz_unc; // uncompressed_size TE32 sz_unc; // uncompressed_size