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:
parent
3728b2208f
commit
bde43fbdfb
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue
Block a user