1
0
mirror of https://github.com/upx/upx synced 2025-10-12 20:59:43 +08:00
upx/src/p_mach_enum.h

171 lines
5.8 KiB
C++

/* p_mach_enum.h --
This file is part of the UPX executable compressor.
Copyright (C) 2007-2022 John F. Reiser
All Rights Reserved.
UPX and the UCL library are free software; you can redistribute them
and/or modify them under the terms of the GNU General Public License as
published by the Free Software Foundation; either version 2 of
the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; see the file COPYING.
If not, write to the Free Software Foundation, Inc.,
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
John F. Reiser
<jreiser@users.sourceforge.net>
*/
/*************************************************************************
// Use the preprocessor to work around
// - that the types embedding these enums have to be PODs, and
// deriving from an empty base class (which is the usual C++ way
// of "importing" enums) does not yield a POD any more
// - that older compilers do not correctly perform EBCO
**************************************************************************/
#ifdef WANT_MACH_HEADER_ENUM /*{*/
#undef WANT_MACH_HEADER_ENUM
enum : unsigned { // magic
MH_MAGIC = 0xfeedface,
};
enum { // cputype
CPU_TYPE_I386 = 7,
CPU_TYPE_X86_64 = 0x01000007,
CPU_TYPE_ARM = 0x0000000c,
CPU_TYPE_ARM64 = 0x0100000c,
CPU_TYPE_POWERPC = 0x00000012,
CPU_TYPE_POWERPC64 = 0x01000012,
};
enum { // cpusubtype
CPU_SUBTYPE_ARM_ALL = 0,
CPU_SUBTYPE_ARM_V4T = 5,
CPU_SUBTYPE_ARM_V6 = 6,
};
enum { // filetype
MH_OBJECT = 1, /* relocatable object file */
MH_EXECUTE = 2,
MH_PRELOAD = 5, /* preloaded executable */
MH_DYLIB = 6, /* dynamically bound shared library */
MH_DYLINKER= 7, /* /usr/bin/dyld */
MH_BUNDLE = 8, /* dynamically bound bundle file */
};
enum { // flags
MH_NOUNDEFS = 1,
MH_DYLDLINK = 4, /* code signing demands this */
MH_BINDATLOAD = 0x8, // DT_BIND_NOW
MH_TWOLEVEL = 0x80,
MH_PIE = 0x200000, // ASLR
};
#endif /*}*/
#ifdef WANT_MACH_SEGMENT_ENUM /*{*/
#undef WANT_MACH_SEGMENT_ENUM
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_VERSION_MIN_TVOS= 0x2F,
LC_VERSION_MIN_WATCHOS= 0x30,
LC_NOTE = 0x31,
LC_BUILD_VERSION = 0x32, // minimum; size 6*4 + N*2*4
LC_DYLD_EXPORTS_TRIE = (0x33|LC_REQ_DYLD), // size 4*4
LC_DYLD_CHAINED_FIXUPS = (0x34|LC_REQ_DYLD), // size 4*4
LC_FILESET_ENTRY = (0x35|LC_REQ_DYLD), // size 6*4
};
enum { // maxprot
VM_PROT_READ = 1,
VM_PROT_WRITE = 2,
VM_PROT_EXECUTE = 4,
};
#endif /*}*/
#ifdef WANT_MACH_SECTION_ENUM /*{*/
#undef WANT_MACH_SECTION_ENUM
enum : unsigned {
// section type (low byte only)
S_REGULAR = 0,
S_ZEROFILL,
S_CSTRING_LITERALS,
S_4BYTE_LITERALS,
S_8BYTE_LITERALS,
S_LITERAL_POINTERS,
S_NON_LAZY_SYMBOL_POINTERS, // sectname __nl_symbol_ptr
S_LAZY_SYMBOL_POINTERS, // sectname __la_symbol_ptr
S_SYMBOL_STUBS,
S_MOD_INIT_FUNC_POINTERS, // sectname __mod_init_func
S_MOD_TERM_FUNC_POINTERS,
S_COALESCED,
S_GB_ZEROFILL,
S_INTERPOSING,
S_16BYTE_LITERALS,
S_DTRACE_DOF,
// section flags (high 24 bits)
S_ATTR_PURE_INSTRUCTIONS = 0x80000000,
S_ATTR_NO_TOC = 0x40000000,
S_ATTR_STRIP_STATIC_SYMS = 0x20000000,
S_ATTR_NO_DEAD_STRIP = 0x10000000,
S_ATTR_LIVE_SUPPORT = 0x08000000,
S_ATTR_SELF_MODIFYING_CODE = 0x04000000,
S_ATTR_DEBUG = 0x02000000,
S_ATTR_SOME_INSTRUCTIONS = 0x00000400,
S_ATTR_EXT_RELOC = 0x00000200,
S_ATTR_LOC_RELOC = 0x00000100,
};
#endif /*}*/
#ifdef WANT_MACH_THREAD_ENUM /*{*/
#undef WANT_MACH_THREAD_ENUM
enum { // thread flavor
PPC_THREAD_STATE = 1,
PPC_THREAD_STATE64 = 5,
x86_THREAD_STATE32 = 1,
x86_THREAD_STATE64 = 4,
i386_OLD_THREAD_STATE = -1,
ARM_THREAD_STATE = 1,
ARM_THREAD_STATE64 = 6, // also ARM_THREAD_STATE64_COUNT 68
};
#endif /*}*/
/* vim:set ts=4 sw=4 et: */