30 #define __UPX_CONF_H 1 34 #if !defined(_FILE_OFFSET_BITS) 35 # define _FILE_OFFSET_BITS 64 43 #ifndef ACC_CFG_USE_NEW_STYLE_CASTS 44 #define ACC_CFG_USE_NEW_STYLE_CASTS 1 47 #if !(ACC_CC_CLANG || ACC_CC_GNUC || ACC_CC_MSC) 49 # error "only clang and gcc are officially supported" 52 #if !defined(UINT_MAX) || (UINT_MAX != 0xffffffffL) 55 ACC_COMPILE_TIME_ASSERT_HEADER(
sizeof(
int) == 4)
56 ACC_COMPILE_TIME_ASSERT_HEADER((1u << 31) << 1 == 0)
57 ACC_COMPILE_TIME_ASSERT_HEADER(((
int)(1u << 31)) >> 31 == -1)
58 ACC_COMPILE_TIME_ASSERT_HEADER(CHAR_MAX == 255)
59 ACC_COMPILE_TIME_ASSERT_HEADER((
char)(-1) > 0)
62 # pragma warning(error: 4319) 66 #if 1 && (ACC_ARCH_ARM) && defined(__pe__) && !defined(__CEGCC__) && !defined(_WIN32) 74 #define ACC_WANT_ACC_INCD_H 1 75 #define ACC_WANT_ACC_INCE_H 1 76 #define ACC_WANT_ACC_LIB_H 1 77 #define ACC_WANT_ACC_CXX_H 1 81 typedef acc_int8_t upx_int8_t;
82 typedef acc_uint8_t upx_uint8_t;
83 typedef acc_int16_t upx_int16_t;
84 typedef acc_uint16_t upx_uint16_t;
85 typedef acc_int32_t upx_int32_t;
86 typedef acc_uint32_t upx_uint32_t;
87 typedef acc_int64_t upx_int64_t;
88 typedef acc_uint64_t upx_uint64_t;
89 typedef acc_uintptr_t upx_uintptr_t;
90 #define UPX_INT16_C ACC_INT16_C 91 #define UPX_UINT16_C ACC_UINT16_C 92 #define UPX_INT32_C ACC_INT32_C 93 #define UPX_UINT32_C ACC_UINT32_C 94 #define UPX_INT64_C ACC_INT64_C 95 #define UPX_UINT64_C ACC_UINT64_C 97 typedef unsigned char upx_byte;
98 #define upx_bytep upx_byte * 105 #if defined(__linux__) && !defined(__unix__) 118 #if defined(__DJGPP__) 126 #if !defined(WITH_LZMA) || (WITH_LZMA+0 == 0) 127 # error "WITH_LZMA is missing" 128 #elif (WITH_LZMA != 0x443) 129 # error "invalid WITH_LZMA version" 131 #if defined(UPX_OFFICIAL_BUILD) 132 # if !(WITH_LZMA && WITH_NRV && WITH_UCL && WITH_ZLIB) 137 # define ucl_compress_config_t REAL_ucl_compress_config_t 138 # include <ucl/uclconf.h> 139 # include <ucl/ucl.h> 140 # if !defined(UCL_VERSION) || (UCL_VERSION < 0x010300L) 141 # error "please upgrade your UCL installation" 143 # undef ucl_compress_config_t 144 # undef ucl_compress_config_p 154 # include <valgrind/memcheck.h> 156 #if !defined(VALGRIND_MAKE_MEM_DEFINED) 157 # define VALGRIND_MAKE_MEM_DEFINED(addr,len) 0 159 #if !defined(VALGRIND_MAKE_MEM_NOACCESS) 160 # define VALGRIND_MAKE_MEM_NOACCESS(addr,len) 0 162 #if !defined(VALGRIND_MAKE_MEM_UNDEFINED) 163 # define VALGRIND_MAKE_MEM_UNDEFINED(addr,len) 0 173 typedef size_t upx_rsize_t;
174 #define UPX_RSIZE_MAX UPX_RSIZE_MAX_MEM 175 #define UPX_RSIZE_MAX_MEM (768 * 1024 * 1024) // DO NOT CHANGE 176 #define UPX_RSIZE_MAX_STR (1024 * 1024) 184 # define STDIN_FILENO (fileno(stdin)) 186 #ifndef STDOUT_FILENO 187 # define STDOUT_FILENO (fileno(stdout)) 189 #ifndef STDERR_FILENO 190 # define STDERR_FILENO (fileno(stderr)) 194 #if !(HAVE_STRCASECMP) && (HAVE_STRICMP) 195 # define strcasecmp stricmp 197 #if !(HAVE_STRNCASECMP) && (HAVE_STRNICMP) 198 # define strncasecmp strnicmp 202 #if !defined(S_IWUSR) && defined(_S_IWUSR) 203 # define S_IWUSR _S_IWUSR 204 #elif !defined(S_IWUSR) && defined(_S_IWRITE) 205 # define S_IWUSR _S_IWRITE 208 #if !defined(S_IFMT) && defined(_S_IFMT) 209 # define S_IFMT _S_IFMT 211 #if !defined(S_IFREG) && defined(_S_IFREG) 212 # define S_IFREG _S_IFREG 214 #if !defined(S_IFDIR) && defined(_S_IFDIR) 215 # define S_IFDIR _S_IFDIR 217 #if !defined(S_IFCHR) && defined(_S_IFCHR) 218 # define S_IFCHR _S_IFCHR 221 #if !defined(S_ISREG) 222 # if defined(S_IFMT) && defined(S_IFREG) 223 # define S_ISREG(m) (((m) & S_IFMT) == S_IFREG) 228 #if !defined(S_ISDIR) 229 # if defined(S_IFMT) && defined(S_IFDIR) 230 # define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR) 235 #if !defined(S_ISCHR) 236 # if defined(S_IFMT) && defined(S_IFCHR) 237 # define S_ISCHR(m) (((m) & S_IFMT) == S_IFCHR) 244 #define basename upx_basename 245 #define index upx_index 246 #define outp upx_outp 251 #if !defined(O_BINARY) || (O_BINARY+0 == 0) 252 # if (ACC_OS_CYGWIN || ACC_OS_DOS16 || ACC_OS_DOS32 || ACC_OS_EMX || ACC_OS_OS2 || ACC_OS_OS216 || ACC_OS_WIN16 || ACC_OS_WIN32 || ACC_OS_WIN64) 253 # error "missing O_BINARY" 256 #if !defined(O_BINARY) 261 # define OPTIONS_VAR "UPX" 270 #define __packed_struct(s) struct s { 271 #define __packed_struct_end() }; 273 #define __packed_struct(s) __acc_struct_packed(s) 274 #define __packed_struct_end() __acc_struct_packed_end() 277 #define UNUSED(var) ACC_UNUSED(var) 278 #define COMPILE_TIME_ASSERT(e) ACC_COMPILE_TIME_ASSERT(e) 280 #define __COMPILE_TIME_ASSERT_ALIGNOF_SIZEOF(a,b) { \ 281 typedef a acc_tmp_a_t; typedef b acc_tmp_b_t; \ 282 __packed_struct(acc_tmp_t) acc_tmp_b_t x; acc_tmp_a_t y; acc_tmp_b_t z; __packed_struct_end() \ 283 COMPILE_TIME_ASSERT(sizeof(struct acc_tmp_t) == 2*sizeof(b)+sizeof(a)) \ 284 COMPILE_TIME_ASSERT(sizeof(((acc_tmp_t*)0)->x)+sizeof(((acc_tmp_t*)0)->y)+sizeof(((acc_tmp_t*)0)->z) == 2*sizeof(b)+sizeof(a)) \ 286 #if defined(__acc_alignof) 287 # define __COMPILE_TIME_ASSERT_ALIGNOF(a,b) \ 288 __COMPILE_TIME_ASSERT_ALIGNOF_SIZEOF(a,b) \ 289 COMPILE_TIME_ASSERT(__acc_alignof(a) == sizeof(b)) 291 # define __COMPILE_TIME_ASSERT_ALIGNOF(a,b) \ 292 __COMPILE_TIME_ASSERT_ALIGNOF_SIZEOF(a,b) 294 #define COMPILE_TIME_ASSERT_ALIGNED1(a) __COMPILE_TIME_ASSERT_ALIGNOF(a,char) 296 #define TABLESIZE(table) ((sizeof(table)/sizeof((table)[0]))) 300 inline T ALIGN_DOWN(
const T& a,
const T& b) { T r; r = (a / b) * b;
return r; }
302 inline T ALIGN_UP (
const T& a,
const T& b) { T r; r = ((a + b - 1) / b) * b;
return r; }
304 inline T ALIGN_GAP (
const T& a,
const T& b) { T r; r = ALIGN_UP(a, b) - a;
return r; }
307 inline const T& UPX_MAX(
const T& a,
const T& b) {
if (a < b)
return b;
return a; }
309 inline const T& UPX_MIN(
const T& a,
const T& b) {
if (a < b)
return a;
return b; }
314 #define Array(type, var, size) \ 315 MemBuffer var ## _membuf(mem_size(sizeof(type), size)); \ 316 type * const var = ACC_STATIC_CAST(type *, var ## _membuf.getVoidPtr()) 318 #define ByteArray(var, size) Array(unsigned char, var, size) 341 #define EXIT_FILE_READ 1 342 #define EXIT_FILE_WRITE 1 343 #define EXIT_MEMORY 1 344 #define EXIT_CHECKSUM 1 346 #define EXIT_INTERNAL 1 350 #define UPX_MAGIC_LE32 0x21585055 351 #define UPX_MAGIC2_LE32 0xD5D0D8A1 352 #define UPX_MAGIC3_LE32 0x21464C45 353 #define UPX_MAGIC4_LE32 0xB5A496F5 358 #define UPX_E_ERROR (-1) 359 #define UPX_E_OUT_OF_MEMORY (-2) 360 #define UPX_E_NOT_COMPRESSIBLE (-3) 361 #define UPX_E_INPUT_OVERRUN (-4) 362 #define UPX_E_OUTPUT_OVERRUN (-5) 363 #define UPX_E_LOOKBEHIND_OVERRUN (-6) 364 #define UPX_E_EOF_NOT_FOUND (-7) 365 #define UPX_E_INPUT_NOT_CONSUMED (-8) 366 #define UPX_E_NOT_YET_IMPLEMENTED (-9) 367 #define UPX_E_INVALID_ARGUMENT (-10) 371 #define UPX_F_DOS_COM 1 372 #define UPX_F_DOS_SYS 2 373 #define UPX_F_DOS_EXE 3 374 #define UPX_F_DJGPP2_COFF 4 375 #define UPX_F_WATCOM_LE 5 376 #define UPX_F_VXD_LE 6 377 #define UPX_F_DOS_EXEH 7 378 #define UPX_F_TMT_ADAM 8 379 #define UPX_F_WIN32_PE 9 380 #define UPX_F_LINUX_i386 10 381 #define UPX_F_WIN16_NE 11 382 #define UPX_F_LINUX_ELF_i386 12 383 #define UPX_F_LINUX_SEP_i386 13 384 #define UPX_F_LINUX_SH_i386 14 385 #define UPX_F_VMLINUZ_i386 15 386 #define UPX_F_BVMLINUZ_i386 16 387 #define UPX_F_ELKS_8086 17 388 #define UPX_F_PS1_EXE 18 389 #define UPX_F_VMLINUX_i386 19 390 #define UPX_F_LINUX_ELFI_i386 20 391 #define UPX_F_WINCE_ARM_PE 21 392 #define UPX_F_LINUX_ELF64_AMD 22 393 #define UPX_F_LINUX_ELF32_ARMEL 23 394 #define UPX_F_BSD_i386 24 395 #define UPX_F_BSD_ELF_i386 25 396 #define UPX_F_BSD_SH_i386 26 398 #define UPX_F_VMLINUX_AMD64 27 399 #define UPX_F_VMLINUX_ARMEL 28 400 #define UPX_F_MACH_i386 29 401 #define UPX_F_LINUX_ELF32_MIPSEL 30 402 #define UPX_F_VMLINUZ_ARMEL 31 403 #define UPX_F_MACH_ARMEL 32 405 #define UPX_F_DYLIB_i386 33 406 #define UPX_F_MACH_AMD64 34 407 #define UPX_F_DYLIB_AMD64 35 409 #define UPX_F_WIN64_PEP 36 411 #define UPX_F_MACH_ARM64EL 37 413 #define UPX_F_MACH_PPC64LE 38 414 #define UPX_F_LINUX_ELFPPC64LE 39 415 #define UPX_F_VMLINUX_PPC64LE 40 416 #define UPX_F_DYLIB_PPC64LE 41 418 #define UPX_F_PLAIN_TEXT 127 // FIXME: what is this ?? 420 #define UPX_F_ATARI_TOS 129 421 #define UPX_F_SOLARIS_SPARC 130 422 #define UPX_F_MACH_PPC32 131 423 #define UPX_F_LINUX_ELFPPC32 132 424 #define UPX_F_LINUX_ELF32_ARMEB 133 425 #define UPX_F_MACH_FAT 134 426 #define UPX_F_VMLINUX_ARMEB 135 427 #define UPX_F_VMLINUX_PPC32 136 428 #define UPX_F_LINUX_ELF32_MIPSEB 137 429 #define UPX_F_DYLIB_PPC32 138 437 #define M_ULTRA_BRUTE (-5) 439 #define M_NRV2B_LE32 2 441 #define M_NRV2B_LE16 4 442 #define M_NRV2D_LE32 5 444 #define M_NRV2D_LE16 7 445 #define M_NRV2E_LE32 8 447 #define M_NRV2E_LE16 10 454 #define M_IS_NRV2B(x) ((x) >= M_NRV2B_LE32 && (x) <= M_NRV2B_LE16) 455 #define M_IS_NRV2D(x) ((x) >= M_NRV2D_LE32 && (x) <= M_NRV2D_LE16) 456 #define M_IS_NRV2E(x) ((x) >= M_NRV2E_LE32 && (x) <= M_NRV2E_LE16) 458 #define M_IS_LZMA(x) (((x) & 255) == M_LZMA) 459 #define M_IS_DEFLATE(x) ((x) == M_DEFLATE) 466 #define FT_ULTRA_BRUTE (-4) 475 typedef void (__acc_cdecl *upx_progress_func_t)
476 (upx_callback_p, unsigned, unsigned);
480 upx_progress_func_t nprogress;
483 void reset() { memset(
this, 0,
sizeof(*
this)); }
491 template <
class T, T default_value, T min_value, T max_value>
494 typedef T value_type;
495 static const T default_value_c = default_value;
496 static const T min_value_c = min_value;
497 static const T max_value_c = max_value;
499 void assertValue()
const {
502 assert(v == min_value_c || v >= min_value_c + 1);
503 assert(v <= max_value_c);
506 OptVar() : v(default_value), is_set(0) { }
507 OptVar& operator= (
const T other) {
508 v = other; is_set += 1;
513 void reset() { v = default_value; is_set = 0; }
514 operator T ()
const {
return v; }
522 template <
class T, T a, T b, T c>
524 if (other.is_set) {
self.v = other.v;
self.is_set += 1; }
526 template <
class T, T a, T b, T c>
528 if (other.is_set) { v = other.v; }
541 lit_pos_bits_t lit_pos_bits;
542 lit_context_bits_t lit_context_bits;
543 dict_size_t dict_size;
545 num_fast_bytes_t num_fast_bytes;
546 unsigned match_finder_cycles;
548 unsigned max_num_probs;
556 void reset() { memset(
this, 0xff,
sizeof(*
this)); }
566 mem_level_t mem_level;
567 window_bits_t window_bits;
579 void reset() { conf_lzma.reset(); conf_ucl.reset(); conf_zlib.reset(); }
582 #define NULL_cconf ((upx_compress_config_t *) NULL) 592 unsigned lit_pos_bits;
593 unsigned lit_context_bits;
596 unsigned num_fast_bytes;
597 unsigned match_finder_cycles;
600 void reset() { memset(
this, 0,
sizeof(*
this)); }
608 void reset() { memset(
this, 0,
sizeof(*
this)); }
616 void reset() { memset(
this, 0,
sizeof(*
this)); }
624 unsigned u_len, c_len;
631 memset(
this, 0,
sizeof(*
this));
632 result_lzma.reset(); result_ucl.reset(); result_zlib.reset();
641 #include "snprintf.h" 656 extern const char *progname;
657 bool set_exit_code(
int ec);
658 #if (ACC_CC_CLANG || ACC_CC_GNUC || ACC_CC_LLVM || ACC_CC_PATHSCALE) 659 void e_exit(
int ec) __attribute__((__noreturn__));
666 void printSetNl(
int need_nl);
667 void printClearLine(FILE *f = NULL);
668 void printErr(
const char *iname,
const Throwable *e);
669 void printUnhandledException(
const char *iname,
const std::exception *e);
670 #if (ACC_CC_CLANG || ACC_CC_GNUC || ACC_CC_LLVM || ACC_CC_PATHSCALE) 671 void __acc_cdecl_va printErr(
const char *iname,
const char *format, ...)
672 __attribute__((__format__(__printf__,2,3)));
673 void __acc_cdecl_va printWarn(
const char *iname,
const char *format, ...)
674 __attribute__((__format__(__printf__,2,3)));
676 void __acc_cdecl_va printErr(
const char *iname,
const char *format, ...);
677 void __acc_cdecl_va printWarn(
const char *iname,
const char *format, ...);
680 #if (ACC_CC_CLANG || ACC_CC_GNUC || ACC_CC_LLVM || ACC_CC_PATHSCALE) 681 void __acc_cdecl_va infoWarning(
const char *format, ...)
682 __attribute__((__format__(__printf__,1,2)));
683 void __acc_cdecl_va infoHeader(
const char *format, ...)
684 __attribute__((__format__(__printf__,1,2)));
685 void __acc_cdecl_va info(
const char *format, ...)
686 __attribute__((__format__(__printf__,1,2)));
688 void __acc_cdecl_va infoWarning(
const char *format, ...);
689 void __acc_cdecl_va infoHeader(
const char *format, ...);
690 void __acc_cdecl_va info(
const char *format, ...);
693 void infoWriting(
const char *what,
long size);
697 void do_one_file(
const char *iname,
char *oname);
698 void do_files(
int i,
int argc,
char *argv[]);
702 extern const char gitrev[];
703 void show_head(
void);
704 void show_help(
int verbose=0);
705 void show_license(
void);
706 void show_usage(
void);
707 void show_version(
int);
711 unsigned upx_adler32(
const void *buf,
unsigned len,
unsigned adler=1);
712 unsigned upx_crc32(
const void *buf,
unsigned len,
unsigned crc=0);
714 int upx_compress (
const upx_bytep src,
unsigned src_len,
715 upx_bytep dst,
unsigned* dst_len,
717 int method,
int level,
720 int upx_decompress (
const upx_bytep src,
unsigned src_len,
721 upx_bytep dst,
unsigned* dst_len,
724 int upx_test_overlap (
const upx_bytep buf,
725 const upx_bytep tbuf,
726 unsigned src_off,
unsigned src_len,
732 #if (ACC_OS_CYGWIN || ACC_OS_DOS16 || ACC_OS_DOS32 || ACC_OS_EMX || ACC_OS_OS2 || ACC_OS_OS216 || ACC_OS_WIN16 || ACC_OS_WIN32 || ACC_OS_WIN64) 733 # if defined(INVALID_HANDLE_VALUE) || defined(MAKEWORD) || defined(RT_CURSOR) 734 # error "something pulled in <windows.h>"