diff --git a/src/p_mach.cpp b/src/p_mach.cpp index f58ea38a..52f7a78c 100644 --- a/src/p_mach.cpp +++ b/src/p_mach.cpp @@ -396,9 +396,13 @@ void PackMachARMEL::pack4(OutputFile *fo, Filter &ft) // append PackHeader #define PAGE_MASK (~0u<<12) #define PAGE_SIZE -PAGE_MASK -void PackDylibI386::pack4(OutputFile *fo, Filter &ft) // append PackHeader +template +void PackMachBase::pack4dylib( // append PackHeader + OutputFile *const fo, + Filter &ft, + Addr init_address +) { - rcmd.init_address = threado.state.eip; unsigned opos = sizeof(mhdro); 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_ID_DYLIB: 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_RPATH: case Mach_segment_command::LC_CODE_SIGNATURE: case Mach_segment_command::LC_REEXPORT_DYLIB: hdrpos += seg->cmdsize; break; // contain no file offset fields + case Mach_segment_command::LC_ROUTINES_64: case Mach_segment_command::LC_ROUTINES: { Mach_routines_command cmd = *(Mach_routines_command const *)seg; cmd.reserved1 = cmd.init_address; - cmd.init_address = threado.state.eip; + cmd.init_address = init_address; fo->seek(hdrpos, SEEK_SET); fo->rewrite(&cmd, sizeof(cmd)); hdrpos += sizeof(cmd); } break; + case Mach_segment_command::LC_SEGMENT_64: case Mach_segment_command::LC_SEGMENT: { // non-__TEXT might be observed and relocated by dyld before us. 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 overlay_offset = sizeof(mhdro) + mhdro.sizeofcmds + sizeof(linfo); - PackMachBase::pack4(fo, ft); + PackMachBase::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 diff --git a/src/p_mach.h b/src/p_mach.h index cfb0edc1..6158facf 100644 --- a/src/p_mach.h +++ b/src/p_mach.h @@ -468,6 +468,8 @@ public: virtual void pack3(OutputFile *, Filter &) = 0; // append loader 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 unpack(OutputFile *fo); @@ -506,7 +508,6 @@ protected: Mach_header mhdro; Mach_segment_command segcmdo; - Mach_routines_command rcmd; __packed_struct(b_info) // 12-byte header before each compressed block TE32 sz_unc; // uncompressed_size