From aeb04d97c86512fd8628371d306a6778bde8905b Mon Sep 17 00:00:00 2001 From: John Reiser Date: Sat, 3 Sep 2022 12:39:50 -0700 Subject: [PATCH] powerpc64-darwin.macho (not powerpc64le-darwin.macho) All Apple PowerPC are BigEndian only. https://github.com/upx/upx/issues/596 modified: p_mach.cpp modified: p_mach.h modified: packmast.cpp --- src/p_mach.cpp | 46 +++++++++++++++++++------------------- src/p_mach.h | 58 ++++++++++++++++-------------------------------- src/packmast.cpp | 2 +- 3 files changed, 43 insertions(+), 63 deletions(-) diff --git a/src/p_mach.cpp b/src/p_mach.cpp index 03c2797a..a36b70b1 100644 --- a/src/p_mach.cpp +++ b/src/p_mach.cpp @@ -237,7 +237,7 @@ PackDylibPPC32::PackDylibPPC32(InputFile *f) : super(f) { my_filetype = Mach_header::MH_DYLIB; } -PackDylibPPC64LE::PackDylibPPC64LE(InputFile *f) : super(f) +PackDylibPPC64::PackDylibPPC64(InputFile *f) : super(f) { my_filetype = Mach_header::MH_DYLIB; } @@ -260,9 +260,9 @@ PackMachPPC32::PackMachPPC32(InputFile *f) : super(f, Mach_header::CPU_TYPE_POWE sizeof(Mach_ppc_thread_state)>>2, sizeof(threado), 12) { } -PackMachPPC64LE::PackMachPPC64LE(InputFile *f) : super(f, Mach_header::CPU_TYPE_POWERPC64LE, +PackMachPPC64::PackMachPPC64(InputFile *f) : super(f, Mach_header::CPU_TYPE_POWERPC64, Mach_header::MH_EXECUTE, Mach_thread_command::PPC_THREAD_STATE64, - sizeof(Mach_ppcle_thread_state64)>>2, sizeof(threado), 16) + sizeof(Mach_ppc_thread_state64)>>2, sizeof(threado), 16) { } const int *PackMachPPC32::getFilters() const @@ -271,7 +271,7 @@ const int *PackMachPPC32::getFilters() const return filters; } -const int *PackMachPPC64LE::getFilters() const +const int *PackMachPPC64::getFilters() const { static const int filters[] = { 0xd0, FT_END }; return filters; @@ -326,9 +326,9 @@ Linker *PackMachPPC32::newLinker() const return new ElfLinkerPpc32; } -Linker *PackMachPPC64LE::newLinker() const +Linker *PackMachPPC64::newLinker() const { - return new ElfLinkerPpc64le; + return new ElfLinkerPpc64; } Linker *PackMachI386::newLinker() const @@ -954,7 +954,7 @@ void PackDylibPPC32::pack4(OutputFile *fo, Filter &ft) // append PackHeader pack4dylib(fo, ft, threado.state.srr0); } -void PackDylibPPC64LE::pack4(OutputFile *fo, Filter &ft) // append PackHeader +void PackDylibPPC64::pack4(OutputFile *fo, Filter &ft) // append PackHeader { pack4dylib(fo, ft, threado.state64.srr0); } @@ -1055,7 +1055,7 @@ off_t PackDylibPPC32::pack3(OutputFile *fo, Filter &ft) // append loader return len; } -off_t PackDylibPPC64LE::pack3(OutputFile *fo, Filter &ft) // append loader +off_t PackDylibPPC64::pack3(OutputFile *fo, Filter &ft) // append loader { TE64 disp; upx_uint64_t const zero = 0; @@ -1223,7 +1223,7 @@ void PackMachPPC32::pack1_setup_threado(OutputFile *const fo) fo->write(&threado, sizeof(threado)); } -void PackMachPPC64LE::pack1_setup_threado(OutputFile *const fo) +void PackMachPPC64::pack1_setup_threado(OutputFile *const fo) { threado.cmd = Mach_command::LC_UNIXTHREAD; threado.cmdsize = sizeof(threado); @@ -2103,7 +2103,7 @@ bool PackMachBase::canPack() sizeof(stub_powerpc_darwin_dylib_entry), 0, 0, stub_powerpc_darwin_dylib_entry, nullptr, nullptr }, - {CPU_TYPE_POWERPC64LE, MH_EXECUTE, + {CPU_TYPE_POWERPC64, MH_EXECUTE, sizeof(stub_powerpc64le_darwin_macho_entry), sizeof(stub_powerpc64le_darwin_macho_fold), 0, @@ -2111,7 +2111,7 @@ bool PackMachBase::canPack() stub_powerpc64le_darwin_macho_fold, nullptr }, - {CPU_TYPE_POWERPC64LE, MH_DYLIB, + {CPU_TYPE_POWERPC64, MH_DYLIB, sizeof(stub_powerpc64le_darwin_dylib_entry), 0, 0, stub_powerpc64le_darwin_dylib_entry, nullptr, nullptr }, @@ -2339,19 +2339,19 @@ void PackMachFat::pack(OutputFile *fo) packer.pack(fo); } } break; - case PackMachFat::CPU_TYPE_POWERPC64LE: { + case PackMachFat::CPU_TYPE_POWERPC64: { typedef N_Mach::Mach_header Mach_header; Mach_header hdr; fi->readx(&hdr, sizeof(hdr)); if (hdr.filetype==Mach_header::MH_EXECUTE) { - PackMachPPC64LE packer(fi); + PackMachPPC64 packer(fi); packer.initPackHeader(); packer.canPack(); packer.updatePackHeader(); packer.pack(fo); } else if (hdr.filetype==Mach_header::MH_DYLIB) { - PackDylibPPC64LE packer(fi); + PackDylibPPC64 packer(fi); packer.initPackHeader(); packer.canPack(); packer.updatePackHeader(); @@ -2444,18 +2444,18 @@ void PackMachFat::unpack(OutputFile *fo) packer.unpack(fo); } } break; - case PackMachFat::CPU_TYPE_POWERPC64LE: { + case PackMachFat::CPU_TYPE_POWERPC64: { N_Mach::Mach_header hdr; typedef N_Mach::Mach_header Mach_header; fi->readx(&hdr, sizeof(hdr)); if (hdr.filetype==Mach_header::MH_EXECUTE) { - PackMachPPC64LE packer(fi); + PackMachPPC64 packer(fi); packer.initPackHeader(); packer.canUnpack(); packer.unpack(fo); } else if (hdr.filetype==Mach_header::MH_DYLIB) { - PackDylibPPC64LE packer(fi); + PackDylibPPC64 packer(fi); packer.initPackHeader(); packer.canUnpack(); packer.unpack(fo); @@ -2522,10 +2522,10 @@ bool PackMachFat::canPack() return false; } } break; - case PackMachFat::CPU_TYPE_POWERPC64LE: { - PackMachPPC64LE packer(fi); + case PackMachFat::CPU_TYPE_POWERPC64: { + PackMachPPC64 packer(fi); if (!packer.canPack()) { - PackDylibPPC64LE pack2r(fi); + PackDylibPPC64 pack2r(fi); if (!pack2r.canPack()) return false; } @@ -2592,10 +2592,10 @@ int PackMachFat::canUnpack() else ph.format = packer.getFormat(); // FIXME: copy entire PackHeader } break; - case PackMachFat::CPU_TYPE_POWERPC64LE: { - PackMachPPC64LE packer(fi); + case PackMachFat::CPU_TYPE_POWERPC64: { + PackMachPPC64 packer(fi); if (!packer.canUnpack()) { - PackDylibPPC64LE pack2r(fi); + PackDylibPPC64 pack2r(fi); if (!pack2r.canUnpack()) return 0; else diff --git a/src/p_mach.h b/src/p_mach.h index bf25ee10..e2b9ba18 100644 --- a/src/p_mach.h +++ b/src/p_mach.h @@ -478,26 +478,6 @@ __packed_struct(Mach_ppc_thread_state64) Word vrsave; /* Vector Save Register */ __packed_struct_end() -template -__packed_struct(Mach_ppcle_thread_state64) - typedef typename TMachITypes::Word Word; - typedef typename TMachITypes::Xword Xword; - - Xword srr0; /* Instruction address register (PC; entry addr) */ - Xword srr1; /* Machine state register (supervisor) */ - Xword r0, r1, r2, r3, r4, r5, r6, r7; - Xword r8, r9,r10,r11,r12,r13,r14,r15; - Xword r16,r17,r18,r19,r20,r21,r22,r23; - Xword r24,r25,r26,r27,r28,r29,r30,r31; - - Word cr; /* Condition register */ // FIXME: Xword? - Xword xer; /* User's integer exception register */ - Xword lr; /* Link register */ - Xword ctr; /* Count register */ - - Word vrsave; /* Vector Save Register */ -__packed_struct_end() - template __packed_struct(Mach_ARM64_thread_state) typedef typename TMachITypes::Xword Xword; typedef typename TMachITypes::Word Word; @@ -593,7 +573,7 @@ struct MachClass_64 typedef N_Mach::Mach_source_version_command Mach_source_version_command; typedef N_Mach::Mach_main_command Mach_main_command; - typedef N_Mach64::Mach_ppcle_thread_state64 Mach_ppcle_thread_state64; + typedef N_Mach64::Mach_ppc_thread_state64 Mach_ppc_thread_state64; typedef N_Mach64::Mach_AMD64_thread_state Mach_AMD64_thread_state; typedef N_Mach64::Mach_ARM64_thread_state Mach_ARM64_thread_state; @@ -716,7 +696,7 @@ typedef MachClass_LE64::Mach_version_min_command MachLE64_version_min_command; typedef MachClass_LE64::Mach_source_version_command MachLE64_source_version_command; typedef MachClass_BE32::Mach_ppc_thread_state Mach_ppc_thread_state; -typedef MachClass_LE64::Mach_ppcle_thread_state64 Mach_ppcle_thread_state64; +typedef MachClass_BE64::Mach_ppc_thread_state64 Mach_ppc_thread_state64; typedef MachClass_LE32::Mach_i386_thread_state Mach_i386_thread_state; typedef MachClass_LE64::Mach_AMD64_thread_state Mach_AMD64_thread_state; typedef MachClass_LE64::Mach_ARM64_thread_state Mach_ARM64_thread_state; @@ -937,16 +917,16 @@ protected: } }; -class PackMachPPC64LE : public PackMachBase +class PackMachPPC64 : public PackMachBase { - typedef PackMachBase super; + typedef PackMachBase super; public: - PackMachPPC64LE(InputFile *f); + PackMachPPC64(InputFile *f); - virtual int getFormat() const { return UPX_F_MACH_PPC64LE; } - virtual const char *getName() const { return "macho/ppc64le"; } - virtual const char *getFullName(const options_t *) const { return "powerpc64le-darwin.macho"; } + virtual int getFormat() const { return UPX_F_MACH_PPC64; } + virtual const char *getName() const { return "macho/ppc64"; } + virtual const char *getFullName(const options_t *) const { return "powerpc64-darwin.macho"; } protected: virtual const int *getFilters() const; @@ -955,11 +935,11 @@ protected: virtual Linker* newLinker() const; __packed_struct(Mach_thread_command) - LE32 cmd; /* LC_THREAD or LC_UNIXTHREAD */ - LE32 cmdsize; /* total size of this command */ - LE32 flavor; - LE32 count; /* sizeof(following_thread_state)/4 */ - Mach_ppcle_thread_state64 state64; + BE32 cmd; /* LC_THREAD or LC_UNIXTHREAD */ + BE32 cmdsize; /* total size of this command */ + BE32 flavor; + BE32 count; /* sizeof(following_thread_state)/4 */ + Mach_ppc_thread_state64 state64; #define WANT_MACH_THREAD_ENUM 1 #include "p_mach_enum.h" __packed_struct_end() @@ -1004,16 +984,16 @@ protected: virtual void pack4(OutputFile *, Filter &); // append PackHeader }; -class PackDylibPPC64LE : public PackMachPPC64LE +class PackDylibPPC64 : public PackMachPPC64 { - typedef PackMachPPC64LE super; + typedef PackMachPPC64 super; public: - PackDylibPPC64LE(InputFile *f); + PackDylibPPC64(InputFile *f); - virtual int getFormat() const { return UPX_F_DYLIB_PPC64LE; } - virtual const char *getName() const { return "dylib/ppc64le"; } - virtual const char *getFullName(const options_t *) const { return "powerpc64le-darwin.dylib"; } + virtual int getFormat() const { return UPX_F_DYLIB_PPC64; } + virtual const char *getName() const { return "dylib/ppc64"; } + virtual const char *getFullName(const options_t *) const { return "powerpc64-darwin.dylib"; } protected: virtual off_t pack3(OutputFile *, Filter &); // append loader virtual void pack4(OutputFile *, Filter &); // append PackHeader diff --git a/src/packmast.cpp b/src/packmast.cpp index 0961db2a..5840c212 100644 --- a/src/packmast.cpp +++ b/src/packmast.cpp @@ -220,7 +220,7 @@ Packer *PackMaster::visitAllPackers(visit_func_t func, InputFile *f, const optio // Mach (MacOS X PowerPC) D(PackDylibAMD64); D(PackMachPPC32); - D(PackMachPPC64LE); + D(PackMachPPC64); D(PackMachI386); D(PackMachAMD64); D(PackMachARMEL);