1
0
mirror of https://github.com/upx/upx synced 2025-10-05 19:20:23 +08:00

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
This commit is contained in:
John Reiser 2022-09-03 12:39:50 -07:00 committed by Markus F.X.J. Oberhumer
parent eb68ab91cd
commit aeb04d97c8
3 changed files with 43 additions and 63 deletions

View File

@ -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<T>::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<T>::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<MachClass_LE64::MachITypes> 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<MachClass_LE64::MachITypes> hdr;
typedef N_Mach::Mach_header<MachClass_LE64::MachITypes> 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

View File

@ -478,26 +478,6 @@ __packed_struct(Mach_ppc_thread_state64)
Word vrsave; /* Vector Save Register */
__packed_struct_end()
template <class TMachITypes>
__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 <class TMachITypes> __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<MachITypes> Mach_source_version_command;
typedef N_Mach::Mach_main_command<MachITypes> Mach_main_command;
typedef N_Mach64::Mach_ppcle_thread_state64<MachITypes> Mach_ppcle_thread_state64;
typedef N_Mach64::Mach_ppc_thread_state64<MachITypes> Mach_ppc_thread_state64;
typedef N_Mach64::Mach_AMD64_thread_state<MachITypes> Mach_AMD64_thread_state;
typedef N_Mach64::Mach_ARM64_thread_state<MachITypes> 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<MachClass_LE64>
class PackMachPPC64 : public PackMachBase<MachClass_BE64>
{
typedef PackMachBase<MachClass_LE64> super;
typedef PackMachBase<MachClass_BE64> 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

View File

@ -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);