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

Evade poratbility constraints of UPX build system

when building a tool to investigate "minimal" Mach-O executable
on Apple MacOS Big Sur using Apple M1 hardware (aarch64).
https://github.com/upx/upx/issues/567
	modified:   stub/tools/macho-snip/Makefile
	modified:   stub/tools/macho-snip/macho-snip.c
	modified:   stub/tools/macho-snip/udf.s
This commit is contained in:
John Reiser 2022-03-01 11:12:19 -08:00 committed by Markus F.X.J. Oberhumer
parent 972c76eb42
commit 480ab51650
3 changed files with 143 additions and 7 deletions

View File

@ -8,13 +8,13 @@
CFLAGS += -g
macho-snip: macho-snip.o udf
macho-snip: macho-snip.o
$(CC) $(CFLAGS) -o macho-snip macho-snip.o
udf.o: udf.s
gcc -c $<
# shortest main program; used as an example
# shortest main program; used as an example for Apple Mach-O
udf: udf.o
gcc --verbose -nostartfiles -o udf $<
codesign --remove-signature udf

View File

@ -11,9 +11,138 @@
#include <fcntl.h>
#include <sys/mman.h>
#ifdef __APPLE__ //{
// /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include/mach-o/loader.h
#include <mach-o/loader.h>
#include <mach-o/nlist.h>
#else //}{
enum { // cmd
LC_REQ_DYLD = 0x80000000, // OR'ed ==> must not ignore
LC_SEGMENT = 0x1,
LC_SYMTAB = 0x2,
LC_THREAD = 0x4,
LC_UNIXTHREAD = 0x5,
LC_DYSYMTAB = 0xb,
LC_LOAD_DYLIB = 0xc,
LC_ID_DYLIB = 0xd,
LC_LOAD_DYLINKER = 0xe,
LC_ID_DYLINKER = 0xf,
LC_ROUTINES = 0x11,
LC_TWOLEVEL_HINTS= 0x16,
LC_LOAD_WEAK_DYLIB= (0x18 | LC_REQ_DYLD),
LC_SEGMENT_64 = 0x19,
LC_ROUTINES_64 = 0x1a,
LC_UUID = 0x1b,
LC_RPATH = 0x1c,
LC_CODE_SIGNATURE = 0x1d,
LC_SEGMENT_SPLIT_INFO = 0x1e,
LC_REEXPORT_DYLIB = (0x1f | LC_REQ_DYLD),
LC_LAZY_LOAD_DYLIB= 0x20,
LC_ENCRYPTION_INFO= 0x21,
LC_DYLD_INFO = 0x22, // compressed dyld information (10.6.x)
LC_DYLD_INFO_ONLY = (0x22|LC_REQ_DYLD),
LC_VERSION_MIN_MACOSX= 0x24,
LC_VERSION_MIN_IPHONEOS= 0x25,
LC_FUNCTION_STARTS= 0x26,
LC_DYLD_ENVIRONMENT= 0x27, // string as environment variable
LC_MAIN = (0x28|LC_REQ_DYLD),
LC_DATA_IN_CODE = 0x29,
LC_SOURCE_VERSION = 0x2a,
LC_DYLIB_CODE_SIGN_DRS= 0x2B,
LC_ENCRYPTION_INFO_64= 0x2C,
LC_LINKER_OPTIMIZATION_HINT = 0x2E,
LC_VERSION_MIN_TVOS= 0x2F,
LC_VERSION_MIN_WATCHOS= 0x30,
LC_NOTE = 0x31,
LC_BUILD_VERSION = 0x32,
LC_DYLD_EXPORTS_TRIE = (0x33|LC_REQ_DYLD),
LC_DYLD_CHAINED_FIXUPS = (0x34|LC_REQ_DYLD),
LC_FILESET_ENTRY = (0x35|LC_REQ_DYLD),
};
#include <stdint.h>
struct mach_header_64 {
uint32_t magic;
uint32_t cputype;
uint32_t cpusubtype;
uint32_t filetype;
uint32_t ncmds;
uint32_t sizeofcmds;
uint32_t flags;
uint32_t reserved;
};
struct load_command {
uint32_t cmd;
uint32_t cmdsize;
};
struct segment_command_64 {
uint32_t cmd;
uint32_t cmdsize;
char segname[16];
uint64_t vmaddr;
uint64_t vmsize;
uint64_t fileoff;
uint64_t filesize;
uint32_t maxprot;
uint32_t initprot;
uint32_t nsects;
uint32_t flags;
};
struct linkedit_data_command {
uint32_t cmd;
uint32_t cmdsize;
uint32_t dataoff;
uint32_t datasize;
};
struct symtab_command {
uint32_t cmd;
uint32_t cmdsize;
uint32_t symoff;
uint32_t nsyms;
uint32_t stroff;
uint32_t strsize;
};
struct dysymtab_command {
uint32_t cmd;
uint32_t cmdsize;
uint32_t ilocalsym;
uint32_t nlocalsym;
uint32_t iextdefsym;
uint32_t nextdefsym;
uint32_t iundefsym;
uint32_t nundefsym;
uint32_t tocoff;
uint32_t ntoc;
uint32_t modtaboff;
uint32_t nmodtab;
uint32_t extrefsymoff;
uint32_t nextrefsyms;
uint32_t indirectsymoff;
uint32_t nindirectsyms;
uint32_t extreloff;
uint32_t nextrel;
uint32_t locreloff;
uint32_t nlocrel;
};
struct nlist_64 {
union {
uint32_t n_strx;
} n_un;
uint8_t n_type;
uint8_t n_sect;
uint16_t n_desc;
uint64_t n_value;
};
#endif //}
struct Cmd_names {
unsigned char val;
@ -64,7 +193,9 @@ struct Cmd_names {
// Try to enable success of running "codesign -s - file" afterwards.
// Note that LC_CODE_SIGNATURE should be removed before snipping:
// codesign --remove-signature file
//
// This is EXPERIMENTAL to aid in finding a "minimal" executable
// on Apple MacOS Big Sur, particularly Apple M1 hardware (aarch64).
int
main(int argc, char const * /*const*/ *const argv, char const *const *const envp)
{

View File

@ -1,4 +1,9 @@
.align 4
// start: .globl start // for standalone
_main: .globl _main // for -lc
udf 123
.align 4
// start: .globl start # for standalone
_main: .globl _main # for -lc
#ifdef __x86_64__
ud2
#endif
#ifdef __AARCH64EL__
.int 0x7b # udf 123
#endif