diff --git a/src/bele.h b/src/bele.h index e78cce78..1a6d670d 100644 --- a/src/bele.h +++ b/src/bele.h @@ -186,14 +186,18 @@ inline void set_le64(void *p, acc_uint64l_t v) inline int sign_extend(unsigned v, unsigned bits) { const unsigned sign_bit = 1u << (bits - 1); - v |= 0u - (v & sign_bit); + v &= sign_bit | (sign_bit - 1); + //v = (v ^ sign_bit) - sign_bit; + v |= 0 - (v & sign_bit); return (int) v; } inline acc_int64l_t sign_extend(acc_uint64l_t v, unsigned bits) { const acc_uint64l_t sign_bit = ACC_UINT64_C(1) << (bits - 1); - v |= ACC_UINT64_C(0) - (v & sign_bit); + v &= sign_bit | (sign_bit - 1); + //v = (v ^ sign_bit) - sign_bit; + v |= 0 - (v & sign_bit); return (acc_int64l_t) v; } @@ -530,6 +534,7 @@ inline unsigned UPX_MIN(const LE32& a, unsigned b) { return UPX_MIN((unsigned **************************************************************************/ // for use with qsort() +extern "C" { int __acc_cdecl_qsort be16_compare(const void *, const void *); int __acc_cdecl_qsort be24_compare(const void *, const void *); int __acc_cdecl_qsort be32_compare(const void *, const void *); @@ -546,6 +551,7 @@ int __acc_cdecl_qsort le16_compare_signed(const void *, const void *); int __acc_cdecl_qsort le24_compare_signed(const void *, const void *); int __acc_cdecl_qsort le32_compare_signed(const void *, const void *); int __acc_cdecl_qsort le64_compare_signed(const void *, const void *); +} // extern "C" // just for testing... diff --git a/src/compress_ucl.cpp b/src/compress_ucl.cpp index 2ec8c056..38fad860 100644 --- a/src/compress_ucl.cpp +++ b/src/compress_ucl.cpp @@ -84,13 +84,14 @@ static int convert_errno_from_ucl(int r) } +extern "C" { static void wrap_nprogress_ucl(ucl_uint a, ucl_uint b, int state, ucl_voidp user) { if (state != -1 && state != 3) return; upx_callback_p cb = (upx_callback_p) user; if (cb && cb->nprogress) cb->nprogress(cb, a, b); -} +}} /************************************************************************* diff --git a/src/conf.h b/src/conf.h index 93b37ea3..017c77d2 100644 --- a/src/conf.h +++ b/src/conf.h @@ -104,6 +104,8 @@ # if (_MSC_VER >= 1400) # pragma warning(disable: 4996) // W1: 'function': was declared deprecated # endif +#elif (ACC_CC_SUNPROC) +//# pragma error_messages(off,"badargtype2w") // FIXME #elif (ACC_CC_WATCOMC) # if (__WATCOMC__ < 1100) # error "need Watcom C++ 11.0c or newer" @@ -566,15 +568,15 @@ struct OptVar // optional assignments -template void oassign(T& self, const T& other) { +template inline void oassign(T& self, const T& other) { if (other.is_set) { self.v = other.v; self.is_set += 1; } } #if 0 -template void oassign(V& v, const T& other) { +template inline void oassign(V& v, const T& other) { if (other.is_set) { v = other.v; } } #else -template void oassign(unsigned& v, const T& other) { +template inline void oassign(unsigned& v, const T& other) { if (other.is_set) { v = other.v; } } #endif diff --git a/src/main.cpp b/src/main.cpp index a3b66d0a..b3a724bc 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1321,6 +1321,7 @@ void upx_sanity_check(void) assert(get_le24_signed(d) == -131329); assert(get_le32(d) == 0xfcfdfeff); assert(get_le32_signed(d) == -50462977); + assert(get_le64_signed(d) == ACC_INT64_C(-506097522914230529)); assert(find_be16(d, 2, 0xfffe) == 0); assert(find_le16(d, 2, 0xfeff) == 0); assert(find_be32(d, 4, 0xfffefdfc) == 0); @@ -1329,6 +1330,7 @@ void upx_sanity_check(void) assert(get_be16_signed(d) == 32638); assert(get_be24_signed(d) == 8355453); assert(get_be32_signed(d) == 2138996092); + assert(get_be64_signed(d) == ACC_INT64_C(9186918263483431288)); } #endif } diff --git a/src/miniacc.h b/src/miniacc.h index 1996e9c2..55c3180d 100644 --- a/src/miniacc.h +++ b/src/miniacc.h @@ -2,6 +2,7 @@ This file is part of the UPX executable compressor. + Copyright (C) 2007 Markus Franz Xaver Johannes Oberhumer Copyright (C) 2006 Markus Franz Xaver Johannes Oberhumer Copyright (C) 2005 Markus Franz Xaver Johannes Oberhumer Copyright (C) 2004 Markus Franz Xaver Johannes Oberhumer @@ -37,7 +38,7 @@ #ifndef __ACC_H_INCLUDED #define __ACC_H_INCLUDED 1 -#define ACC_VERSION 20060823L +#define ACC_VERSION 20070112L #if defined(__CYGWIN32__) && !defined(__CYGWIN__) # define __CYGWIN__ __CYGWIN32__ #endif @@ -1169,7 +1170,7 @@ extern "C" { # define ACC_SIZEOF_LONG_LONG 8 #elif (ACC_ARCH_I386 && (ACC_CC_INTELC && defined(__linux__))) # define ACC_SIZEOF_LONG_LONG 8 -#elif (ACC_ARCH_I386 && (ACC_CC_MWERKS || ACC_CC_PELLESC || ACC_CC_PGI)) +#elif (ACC_ARCH_I386 && (ACC_CC_MWERKS || ACC_CC_PELLESC || ACC_CC_PGI || ACC_CC_SUNPROC)) # define ACC_SIZEOF_LONG_LONG 8 #elif (ACC_ARCH_I386 && (ACC_CC_INTELC || ACC_CC_MSC)) # define ACC_SIZEOF___INT64 8 @@ -1634,6 +1635,15 @@ extern "C" { # define ACC_UNUSED_LABEL(l) switch(0) case 1:goto l # endif #endif +#if !defined(ACC_DEFINE_UNINITIALIZED_VAR) +# if 0 +# define ACC_DEFINE_UNINITIALIZED_VAR(type,var,init) type var +# elif 0 && (ACC_CC_GNUC) +# define ACC_DEFINE_UNINITIALIZED_VAR(type,var,init) type var = var +# else +# define ACC_DEFINE_UNINITIALIZED_VAR(type,var,init) type var = init +# endif +#endif #if !defined(ACC_COMPILE_TIME_ASSERT_HEADER) # if (ACC_CC_AZTECC || ACC_CC_ZORTECHC) # define ACC_COMPILE_TIME_ASSERT_HEADER(e) extern int __acc_cta[1-!(e)]; @@ -2745,6 +2755,9 @@ __acc_gnuc_extension__ typedef unsigned long long acc_ullong_t; #if !defined(acc_signo_t) # define acc_signo_t int #endif +#if defined(__cplusplus) +extern "C" { +#endif #if (ACC_BROKEN_CDECL_ALT_SYNTAX) typedef void __acc_cdecl_sighandler (*acc_sighandler_t)(acc_signo_t); #elif defined(RETSIGTYPE) @@ -2752,6 +2765,9 @@ typedef RETSIGTYPE (__acc_cdecl_sighandler *acc_sighandler_t)(acc_signo_t); #else typedef void (__acc_cdecl_sighandler *acc_sighandler_t)(acc_signo_t); #endif +#if defined(__cplusplus) +} +#endif # if defined(ACC_CFG_NO_ACC_UA_H) # else #if (ACC_CC_GNUC && (ACC_CC_GNUC < 0x020700ul)) @@ -3164,6 +3180,9 @@ __acc_gnuc_extension__ typedef unsigned long long acc_ullong_t; #if !defined(acc_signo_t) # define acc_signo_t int #endif +#if defined(__cplusplus) +extern "C" { +#endif #if (ACC_BROKEN_CDECL_ALT_SYNTAX) typedef void __acc_cdecl_sighandler (*acc_sighandler_t)(acc_signo_t); #elif defined(RETSIGTYPE) @@ -3171,6 +3190,9 @@ typedef RETSIGTYPE (__acc_cdecl_sighandler *acc_sighandler_t)(acc_signo_t); #else typedef void (__acc_cdecl_sighandler *acc_sighandler_t)(acc_signo_t); #endif +#if defined(__cplusplus) +} +#endif # if !defined(ACC_CFG_NO_ACC_UA_H) #if (ACC_CC_GNUC && (ACC_CC_GNUC < 0x020700ul)) #elif (ACC_CC_GNUC && (ACC_CC_GNUC < 0x020800ul)) && defined(__cplusplus) @@ -3968,32 +3990,42 @@ ACCLIB_EXTERN(void, acc_uclock_read) (acc_uclock_handle_p, acc_uclock_p); ACCLIB_EXTERN(double, acc_uclock_get_elapsed) (acc_uclock_handle_p, const acc_uclock_p, const acc_uclock_p); #endif ACCLIB_EXTERN(int, acc_uclock_flush_cpu_cache) (acc_uclock_handle_p, unsigned); -typedef struct { +struct acc_getopt_t; +typedef struct acc_getopt_t acc_getopt_t; +#ifndef acc_getopt_p +#define acc_getopt_p acc_getopt_t * +#endif +struct acc_getopt_longopt_t; +typedef struct acc_getopt_longopt_t acc_getopt_longopt_t; +#ifndef acc_getopt_longopt_p +#define acc_getopt_longopt_p acc_getopt_longopt_t * +#endif +struct acc_getopt_longopt_t { const char* name; int has_arg; int* flag; int val; -} acc_getopt_longopt_t; -#ifndef acc_getopt_longopt_p -#define acc_getopt_longopt_p acc_getopt_longopt_t * -#endif -typedef struct { - int go_argc; - char** go_argv; - const char* go_shortopts; - const acc_getopt_longopt_p longopts; -#if (ACC_BROKEN_CDECL_ALT_SYNTAX) - int __acc_cdecl_va (*go_error)(const char *, ...); -#else - int (__acc_cdecl_va *go_error)(const char *, ...); -#endif -} acc_getopt_t; -#ifndef acc_getopt_p -#define acc_getopt_p acc_getopt_t * -#endif -ACCLIB_EXTERN(void, acc_getopt_init) (acc_getopt_p); -ACCLIB_EXTERN(int, acc_getopt) (acc_getopt_p); -ACCLIB_EXTERN(void, acc_getopt_close)(acc_getopt_p); +}; +struct acc_getopt_t { + void *user; + char *optarg; + void (*opterr)(acc_getopt_p, const char*, void *); + int optind; + int optopt; + int errcount; + const char* progname; + int argc; char** argv; + int eof; int shortpos; + int pending_rotate_first, pending_rotate_middle; +}; +enum { ACC_GETOPT_NO_ARG, ACC_GETOPT_REQUIRED_ARG, ACC_GETOPT_OPTIONAL_ARG, ACC_GETOPT_EXACT_ARG = 0x10 }; +enum { ACC_GETOPT_PERMUTE, ACC_GETOPT_RETURN_IN_ORDER, ACC_GETOPT_REQUIRE_ORDER }; +ACCLIB_EXTERN(void, acc_getopt_init) (acc_getopt_p g, + int start_argc, int argc, char** argv); +ACCLIB_EXTERN(int, acc_getopt) (acc_getopt_p g, + const char* shortopts, + const acc_getopt_longopt_p longopts, + int* longind); typedef struct { acc_uint32l_t seed; } acc_rand31_t; @@ -5245,6 +5277,213 @@ ACCLIB_PUBLIC(int, acc_dos_free) (void __far* p) } #endif #endif +#if defined(ACC_WANT_ACCLIB_GETOPT) +# undef ACC_WANT_ACCLIB_GETOPT +#define __ACCLIB_GETOPT_CH_INCLUDED 1 +#if !defined(ACCLIB_PUBLIC) +# define ACCLIB_PUBLIC(r,f) r __ACCLIB_FUNCNAME(f) +#endif +ACCLIB_PUBLIC(void, acc_getopt_init) (acc_getopt_p g, + int start_argc, int argc, char** argv) +{ + memset(g, 0, sizeof(*g)); + g->argc = argc; + g->argv = argv; + g->pending_rotate_first = g->pending_rotate_middle = g->optind = start_argc; +} +static int __ACCLIB_FUNCNAME(acc_getopt_rotate) (char **p, int first, int middle, int last) +{ + char** a; char** b; + if (first >= middle || middle >= last) return 0; + for (a = p + first, b = p + middle - 1; a < b; ++a, --b) { + char* t = *a; *a = *b; *b = t; + } + for (a = p + middle, b = p + last - 1; a < b; ++a, --b) { + char* t = *a; *a = *b; *b = t; + } + for (a = p + first, b = p + last - 1; a < b; ++a, --b) { + char* t = *a; *a = *b; *b = t; + } + return middle - first; +} +static int __acc_getopt_x(acc_getopt_p g, int ret, int oo, int flags, const char *f, ...) +{ + if (oo >= 0) + g->optopt = oo; + if (flags & 1) + { + if (g->shortpos == 0) + g->optind++; + else if (!g->argv[g->optind][++g->shortpos]) + g->optind++, g->shortpos = 0; + } + if (f == NULL) + return ret; + if (g->opterr) + { +#if !defined(HAVE_STDARG_H) + g->opterr(g, f, NULL); +#else + va_list ap; + va_start(ap, f); + g->opterr(g, f, &ap); + va_end(ap); +#endif + } + g->errcount++; + return ret; +} +ACCLIB_PUBLIC(int, acc_getopt) (acc_getopt_p g, + const char* shortopts, + const acc_getopt_longopt_p longopts, + int* longind) +{ + int ordering = ACC_GETOPT_PERMUTE; + char *a; + int has_arg = 0; + char *arg; + unsigned char sc; + int i; + if (shortopts && (*shortopts == '-' || *shortopts == '+')) + ordering = *shortopts++ == '-' ? ACC_GETOPT_RETURN_IN_ORDER : ACC_GETOPT_REQUIRE_ORDER; + g->optarg = NULL; + g->optopt = '?'; + if (longind != NULL) + *longind = -1; + if (g->eof || g->optind >= g->argc || g->argv == NULL) + goto acc_label_eof; + if (g->shortpos) + goto acc_label_next_shortopt; + g->optind -= __ACCLIB_FUNCNAME(acc_getopt_rotate)(g->argv, g->pending_rotate_first, g->pending_rotate_middle, g->optind); + g->pending_rotate_first = g->pending_rotate_middle = g->optind; + if (ordering == ACC_GETOPT_PERMUTE) + { + while (g->optind < g->argc && !(g->argv[g->optind][0] == '-' && g->argv[g->optind][1])) + g->optind++; + g->pending_rotate_middle = g->optind; + } + if (g->optind >= g->argc) + { + g->optind = g->pending_rotate_first; + acc_label_eof: + g->optind -= __ACCLIB_FUNCNAME(acc_getopt_rotate)(g->argv, g->pending_rotate_first, g->pending_rotate_middle, g->optind); + g->pending_rotate_first = g->pending_rotate_middle = g->optind; + g->eof = 1; + return -1; + } + a = g->argv[g->optind]; + if (strcmp(a, "--") == 0) + { + g->optind++; + goto acc_label_eof; + } + if (!(a[0] == '-' && a[1])) + { + if (ordering == ACC_GETOPT_REQUIRE_ORDER) + goto acc_label_eof; + if (ordering == ACC_GETOPT_RETURN_IN_ORDER) + { + g->optarg = a; + g->optind++; + return 1; + } + __acc_getopt_x(g, -1, -1, 0, "invalid ordering %d", ordering); + goto acc_label_eof; + } + if (a[1] == '-') + { + const acc_getopt_longopt_p lo = NULL; + size_t match_chars; + for (arg = a + 2; *arg && *arg != '=' && *arg != '#'; ) + ++arg; + match_chars = (size_t) (arg - (a + 2)); + for (i = 0; longopts && longopts[i].name; ++i) + { + size_t n = match_chars; + size_t l = strlen(longopts[i].name); + if (longopts[i].has_arg & ACC_GETOPT_EXACT_ARG) n = l; + if (strncmp(a, longopts[i].name, n) != 0) + continue; + if (match_chars == l) + { + lo = &longopts[i]; + break; + } + else if (lo == NULL) + lo = &longopts[i]; + else + return __acc_getopt_x(g, '?', 0, 1, "option '%s' is ambiguous (could be '--%s' or '--%s')", + a, lo->name, longopts[i].name); + } + if (lo == NULL) + return __acc_getopt_x(g, '?', 0, 1, "unrecognized option '%s'", a); + switch (lo->has_arg & 0x2f) + { + case ACC_GETOPT_OPTIONAL_ARG: + break; + case ACC_GETOPT_REQUIRED_ARG: + if (*arg) + g->optarg = arg + 1; + else if (g->optind + 1 < g->argc) + g->optarg = g->argv[++g->optind]; + else + return __acc_getopt_x(g, '?', 0, 1, "option '%s' requires an argument", lo->name); + g->optind++; + break; + case ACC_GETOPT_REQUIRED_ARG | 0x20: + break; + default: + if (*arg) + return __acc_getopt_x(g, '?', lo->val, 1, "option '%s' doesn't allow an argument", lo->name); + g->optind++; + break; + } + if (longind != NULL) + *longind = (int) (lo - longopts); + if (lo->flag != NULL) + { + *lo->flag = lo->val; + return 0; + } + return lo->val; + } + else + { + const char *sp; + g->shortpos = 1; + acc_label_next_shortopt: + a = g->argv[g->optind] + g->shortpos; + sp = NULL; sc = (unsigned char) *a; + if (shortopts) + sp = strchr(shortopts, sc); + if (!sp) + return __acc_getopt_x(g, '?', sc, 1, "invalid option '-%c'", sc); + if (sp[1] == ':') { has_arg++; if (sp[2] == ':') has_arg++; } + arg = a + 1; + switch (has_arg) + { + case ACC_GETOPT_OPTIONAL_ARG: + if (*arg) + g->optarg = arg + 1; + g->optind++, g->shortpos = 0; + break; + case ACC_GETOPT_REQUIRED_ARG: + if (*arg) + g->optarg = arg + 1; + else if (g->optind + 1 < g->argc) + g->optarg = g->argv[++g->optind]; + else + return __acc_getopt_x(g, '?', 0, 1, "option '-%c' requires an argument", sc); + g->optind++, g->shortpos = 0; + break; + default: + __acc_getopt_x(g, 0, -1, 1, NULL); + break; + } + return sc; + } +} +#endif #if defined(ACC_WANT_ACCLIB_HALLOC) # undef ACC_WANT_ACCLIB_HALLOC #define __ACCLIB_HALLOC_CH_INCLUDED 1 @@ -6161,7 +6400,7 @@ ACCLIB_PUBLIC(acclib_handle_t, acc_get_osfhandle) (int fd) } ACCLIB_PUBLIC(int, acc_set_binmode) (int fd, int binary) { -#if (ACC_ARCH_M68K && ACC_OS_TOS && defined(__MINT__)) +#if (ACC_ARCH_M68K && ACC_OS_TOS && ACC_CC_GNUC) && defined(__MINT__) FILE* fp; int old_binary; if (fd == STDIN_FILENO) fp = stdin; else if (fd == STDOUT_FILENO) fp = stdout; diff --git a/src/p_elf_enum.h b/src/p_elf_enum.h index 2864603f..1cf5f33b 100644 --- a/src/p_elf_enum.h +++ b/src/p_elf_enum.h @@ -41,15 +41,15 @@ EI_DATA = 5, /* Data encoding */ EI_VERSION = 6, EI_OSABI = 7, - EI_ABIVERSION = 8, + EI_ABIVERSION = 8 }; enum { // e_ident[EI_CLASS] ELFCLASS32 = 1, /* 32-bit objects */ - ELFCLASS64 = 2, /* 64-bit objects */ + ELFCLASS64 = 2 /* 64-bit objects */ }; enum { // e_ident[EI_DATA] ELFDATA2LSB = 1, /* 2's complement, little endian */ - ELFDATA2MSB = 2, /* 2's complement, big endian */ + ELFDATA2MSB = 2 /* 2's complement, big endian */ }; enum { // e_ident[EI_OSABI] ELFOSABI_NONE = 0, // == ELFOSABI_SYSV @@ -57,24 +57,24 @@ ELFOSABI_LINUX = 3, ELFOSABI_FREEBSD = 9, ELFOSABI_OPENBSD = 12, - ELFOSABI_ARM = 97, + ELFOSABI_ARM = 97 }; enum { // e_type ET_NONE = 0, /* No file type */ ET_REL = 1, /* Relocatable file */ ET_EXEC = 2, /* Executable file */ ET_DYN = 3, /* Shared object file */ - ET_CORE = 4, /* Core file */ + ET_CORE = 4 /* Core file */ }; enum { // e_machine EM_386 = 3, EM_PPC = 20, EM_PPC64 = 21, EM_ARM = 40, - EM_X86_64 = 62, + EM_X86_64 = 62 }; enum { // e_version - EV_CURRENT = 1, + EV_CURRENT = 1 }; #endif @@ -86,13 +86,13 @@ PT_DYNAMIC = 2, /* Dynamic linking information */ PT_INTERP = 3, /* Name of program interpreter */ PT_NOTE = 4, /* Auxiliary information (esp. OpenBSD) */ - PT_PHDR = 6, /* Entry for header table itself */ + PT_PHDR = 6 /* Entry for header table itself */ }; enum { // p_flags PF_X = 1, /* Segment is executable */ PF_W = 2, /* Segment is writable */ - PF_R = 4, /* Segment is readable */ + PF_R = 4 /* Segment is readable */ }; #endif @@ -118,7 +118,7 @@ SHT_PREINIT_ARRAY = 16, /* Array of pre-constructors */ SHT_GROUP = 17, /* Section group */ SHT_SYMTAB_SHNDX = 18, /* Extended section indeces */ - SHT_GNU_LIBLIST = 0x6ffffff7, /* Prelink library list */ + SHT_GNU_LIBLIST = 0x6ffffff7 /* Prelink library list */ }; enum { // sh_flags @@ -128,7 +128,7 @@ SHF_MERGE = (1 << 4), /* Might be merged */ SHF_STRINGS = (1 << 5), /* Contains nul-terminated strings */ SHF_INFO_LINK = (1 << 6), /* 'sh_info' contains SHT index */ - SHF_LINK_ORDER = (1 << 7), /* Preserve order after combining */ + SHF_LINK_ORDER = (1 << 7) /* Preserve order after combining */ }; #endif @@ -141,7 +141,7 @@ DT_HASH = 4, /* Hash table of symbol names */ DT_STRTAB = 5, /* String table */ DT_SYMTAB = 6, /* Symbol table */ - DT_STRSZ = 10, /* Sizeof string table */ + DT_STRSZ = 10 /* Sizeof string table */ }; #endif @@ -151,7 +151,7 @@ enum { // st_bind (high 4 bits of st_info) STB_LOCAL = 0, /* Local symbol */ STB_GLOBAL = 1, /* Global symbol */ - STB_WEAK = 2, /* Weak symbol */ + STB_WEAK = 2 /* Weak symbol */ }; enum { // st_type (low 4 bits of st_info) @@ -161,20 +161,20 @@ STT_SECTION = 3, /* Symbol associated with a section */ STT_FILE = 4, /* Symbol's name is file name */ STT_COMMON = 5, /* Symbol is a common data object */ - STT_TLS = 6, /* Symbol is thread-local data object*/ + STT_TLS = 6 /* Symbol is thread-local data object*/ }; enum { // st_other (visibility) STV_DEFAULT = 0, /* Default symbol visibility rules */ STV_INTERNAL = 1, /* Processor specific hidden class */ STV_HIDDEN = 2, /* Sym unavailable in other modules */ - STV_PROTECTED= 3, /* Not preemptible, not exported */ + STV_PROTECTED= 3 /* Not preemptible, not exported */ }; enum { // st_shndx SHN_UNDEF = 0, /* Undefined section */ SHN_ABS = 0xfff1, /* Associated symbol is absolute */ - SHN_COMMON = 0xfff2, /* Associated symbol is common */ + SHN_COMMON = 0xfff2 /* Associated symbol is common */ }; #endif diff --git a/src/p_vmlinx.cpp b/src/p_vmlinx.cpp index edd92cc5..a6f7c042 100644 --- a/src/p_vmlinx.cpp +++ b/src/p_vmlinx.cpp @@ -1056,7 +1056,6 @@ Linker* PackVmlinuxAMD64::newLinker() const - // instantiate instances template class PackVmlinuxBase; template class PackVmlinuxBase; diff --git a/src/p_vmlinx.h b/src/p_vmlinx.h index f1c7ecee..4526f178 100644 --- a/src/p_vmlinx.h +++ b/src/p_vmlinx.h @@ -127,7 +127,7 @@ public: Ehdr::ELFCLASS32, Ehdr::ELFDATA2LSB, "decompress_kernel") { } virtual int getFormat() const { return UPX_F_VMLINUX_ARM; } virtual const char *getName() const { return "vmlinux/ARM"; } - virtual const char *getFullName(const options_t *) const { return "ARM-linux.kernel.vmlinux"; } + virtual const char *getFullName(const options_t *) const { return "arm-linux.kernel.vmlinux"; } virtual const int *getCompressionMethods(int method, int level) const; virtual const int *getFilters() const; diff --git a/src/packer.cpp b/src/packer.cpp index a854ca80..45c90436 100644 --- a/src/packer.cpp +++ b/src/packer.cpp @@ -1055,30 +1055,40 @@ void Packer::initLoader(const void *pdata, int plen, int small) linker->addSection("IDENTSTR", ident, size, 0); } -#if 1 && (ACC_CC_BORLANDC) -#else -void Packer::addLoader(const char *s) -{ - if (s) - linker->addLoader(s); -} -#endif -#if 1 && (ACC_CC_BORLANDC) -void __acc_cdecl_va Packer::addLoader(const char *s, ...) -#else -// provide specialization for [T = const char *] -template <> -void __acc_cdecl_va Packer::addLoader(const char *s, ...) -#endif +#define C const char * +void Packer::addLoader(C a) +{ addLoaderVA(a, NULL); } +void Packer::addLoader(C a, C b) +{ addLoaderVA(a, b, NULL); } +void Packer::addLoader(C a, C b, C c) +{ addLoaderVA(a, b, c, NULL); } +void Packer::addLoader(C a, C b, C c, C d) +{ addLoaderVA(a, b, c, d, NULL); } +void Packer::addLoader(C a, C b, C c, C d, C e) +{ addLoaderVA(a, b, c, d, e, NULL); } +void Packer::addLoader(C a, C b, C c, C d, C e, C f) +{ addLoaderVA(a, b, c, d, e, f, NULL); } +void Packer::addLoader(C a, C b, C c, C d, C e, C f, C g) +{ addLoaderVA(a, b, c, d, e, f, g, NULL); } +void Packer::addLoader(C a, C b, C c, C d, C e, C f, C g, C h) +{ addLoaderVA(a, b, c, d, e, f, g, h, NULL); } +void Packer::addLoader(C a, C b, C c, C d, C e, C f, C g, C h, C i) +{ addLoaderVA(a, b, c, d, e, f, g, h, i, NULL); } +void Packer::addLoader(C a, C b, C c, C d, C e, C f, C g, C h, C i, C j) +{ addLoaderVA(a, b, c, d, e, f, g, h, i, j, NULL); } +#undef C + +void __acc_cdecl_va Packer::addLoaderVA(const char *s, ...) { va_list ap; + const char *t = s; va_start(ap, s); - while (s != NULL) + while (t != NULL) { - linker->addLoader(s); - s = va_arg(ap, const char *); + linker->addLoader(t); + t = va_arg(ap, const char *); } va_end(ap); } diff --git a/src/packer.h b/src/packer.h index c6609bb5..f0714afa 100644 --- a/src/packer.h +++ b/src/packer.h @@ -226,14 +226,17 @@ protected: virtual upx_byte *getLoader() const; virtual int getLoaderSize() const; virtual void initLoader(const void *pdata, int plen, int small=-1); -#if 1 && (ACC_CC_BORLANDC) - void __acc_cdecl_va addLoader(const char *, ...); -#elif 1 && (ACC_CC_GNUC >= 0x040100) - void addLoader(const char *); - template void __acc_cdecl_va addLoader(const T *, ...) __attribute__((__sentinel__)); +#define C const char * + void addLoader(C); void addLoader(C,C); void addLoader(C,C,C); + void addLoader(C,C,C,C); void addLoader(C,C,C,C,C); + void addLoader(C,C,C,C,C,C); void addLoader(C,C,C,C,C,C,C); + void addLoader(C,C,C,C,C,C,C,C); void addLoader(C,C,C,C,C,C,C,C,C); + void addLoader(C,C,C,C,C,C,C,C,C,C); +#undef C +#if 1 && (ACC_CC_GNUC >= 0x040100) + void __acc_cdecl_va addLoaderVA(const char *s, ...) __attribute__((__sentinel__)); #else - void addLoader(const char *); - template void __acc_cdecl_va addLoader(const T *, ...); + void __acc_cdecl_va addLoaderVA(const char *s, ...); #endif virtual int getLoaderSection(const char *name, int *slen=NULL) const; virtual int getLoaderSectionStart(const char *name, int *slen=NULL) const; @@ -309,13 +312,6 @@ private: }; -#if 1 && (ACC_CC_BORLANDC) -#else -template <> -void __acc_cdecl_va Packer::addLoader(const char *, ...); -#endif - - #endif /* already included */ diff --git a/src/snprintf.cpp b/src/snprintf.cpp index 41b73a14..9c9c3465 100644 --- a/src/snprintf.cpp +++ b/src/snprintf.cpp @@ -83,9 +83,12 @@ #undef NO_FLOAT #undef LDOUBLE #if 1 -# define NO_FLOAT -# define float error_no_float -# define double error_no_float +# define NO_FLOAT 1 +# if (ACC_CC_SUNPROC) +# else +# define float error no_float +# define double error no_float +# endif #elif 0 || defined(HAVE_LONG_DOUBLE) # define LDOUBLE long double #else diff --git a/src/work.cpp b/src/work.cpp index 1326b79b..a4019dfb 100644 --- a/src/work.cpp +++ b/src/work.cpp @@ -271,24 +271,24 @@ void do_files(int i, int argc, char *argv[]) unlink_ofile(oname); printErr(iname,&e); e_exit(EXIT_ERROR); + } catch (std::bad_alloc *e) { + unlink_ofile(oname); + printErr(iname,"out of memory"); + //delete e; + e_exit(EXIT_ERROR); } catch (const std::bad_alloc &) { unlink_ofile(oname); printErr(iname,"out of memory"); e_exit(EXIT_ERROR); - } catch (std::bad_alloc *e) { + } catch (std::exception *e) { unlink_ofile(oname); - printErr(iname,"out of memory"); - delete e; + printUnhandledException(iname,e); + //delete e; e_exit(EXIT_ERROR); } catch (const std::exception &e) { unlink_ofile(oname); printUnhandledException(iname,&e); e_exit(EXIT_ERROR); - } catch (std::exception *e) { - unlink_ofile(oname); - printUnhandledException(iname,e); - delete e; - e_exit(EXIT_ERROR); } catch (...) { unlink_ofile(oname); printUnhandledException(iname,NULL);