diff --git a/doc/elf-to-mem.txt b/doc/elf-to-mem.txt index c588d0ba..843883f1 100644 --- a/doc/elf-to-mem.txt +++ b/doc/elf-to-mem.txt @@ -69,11 +69,13 @@ from the address space, then the Linux kernel erases the symlink /proc/self/exe. Linux stores the pathname argument that was specified to execve() immediately after the '\0' which terminates the character string of the last environment variable [as of execve()]. This is true -for at least all Linux 2.6, 2.4, and 2.2 kernels. The pathname is not -"bound" to the file as strongly as /proc/self/exe (the file may be changed -without affecting the pathname), but the pathname does provide some -information. The pathname may be relative to the working directory, -so look before any chdir(). +for at least all Linux 2.6, 2.4, and 2.2 kernels. Linux kernel 2.6.29 +and later records a pointer to that character string in +Elf32_auxv[AT_EXECFN]. The pathname is not "bound" to the file as +strongly as /proc/self/exe (the file may be changed without affecting +the pathname), but the pathname does provide some information. +The pathname may be relative to the working directory, so look before +any chdir(). The Elf formats for Linux add an environment variable named " " [three spaces] which saves the results of readlink("/proc/self/exe",,) before diff --git a/src/compress_lzma.cpp b/src/compress_lzma.cpp index 3e91e0df..c0e5cdc3 100644 --- a/src/compress_lzma.cpp +++ b/src/compress_lzma.cpp @@ -51,6 +51,7 @@ void lzma_compress_config_t::reset() extern int compress_lzma_dummy; int compress_lzma_dummy = 0; #else +#define opt compress_lzma_opt #undef USE_LZMA_PROPERTIES @@ -312,7 +313,7 @@ int upx_lzma_compress ( const upx_bytep src, unsigned src_len, *dst_len += x_len; if (rh == SZ_OK) { #if defined(USE_LZMA_PROPERTIES) - dst[-1] = probs_buf[0]; + dst[-1] = props_buf[0]; #endif r = UPX_E_OK; } diff --git a/src/miniacc.h b/src/miniacc.h index b484cba0..961cca11 100644 --- a/src/miniacc.h +++ b/src/miniacc.h @@ -2,6 +2,8 @@ This file is part of the UPX executable compressor. + Copyright (C) 2010 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 2009 Markus Franz Xaver Johannes Oberhumer Copyright (C) 2008 Markus Franz Xaver Johannes Oberhumer Copyright (C) 2007 Markus Franz Xaver Johannes Oberhumer Copyright (C) 2006 Markus Franz Xaver Johannes Oberhumer @@ -39,7 +41,7 @@ #ifndef __ACC_H_INCLUDED #define __ACC_H_INCLUDED 1 -#define ACC_VERSION 20081229L +#define ACC_VERSION 20100205L #if defined(__CYGWIN32__) && !defined(__CYGWIN__) # define __CYGWIN__ __CYGWIN32__ #endif @@ -1561,7 +1563,7 @@ extern "C" { # define __acc_nothrow __attribute__((__nothrow__)) #elif (ACC_CC_INTELC && (__INTEL_COMPILER >= 450) && ACC_CC_SYNTAX_MSC) && defined(__cplusplus) # define __acc_nothrow __declspec(nothrow) -#elif (ACC_CC_INTELC && (__INTEL_COMPILER >= 800) && ACC_CC_SYNTAX_GNUC) +#elif (ACC_CC_INTELC && (__INTEL_COMPILER >= 900) && ACC_CC_SYNTAX_GNUC) # define __acc_nothrow __attribute__((__nothrow__)) #elif (ACC_CC_LLVM || ACC_CC_PATHSCALE) # define __acc_nothrow __attribute__((__nothrow__)) @@ -1666,6 +1668,15 @@ extern "C" { # define ACC_DEFINE_UNINITIALIZED_VAR(type,var,init) type var = init # endif #endif +#if !defined(ACC_UNCONST_CAST) +# if 1 && defined(__cplusplus) +# define ACC_UNCONST_CAST(t,e) (const_cast (e)) +# elif (ACC_CC_GNUC || ACC_CC_LLVM || ACC_CC_PATHSCALE) +# define ACC_UNCONST_CAST(t,e) ((t) ((void *) ((char *) ((acc_uintptr_t) ((const void *) (e)))))) +# else +# define ACC_UNCONST_CAST(t,e) ((t) ((void *) ((char *) ((const void *) (e))))) +# 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)]; @@ -3941,11 +3952,10 @@ typedef struct acc_pclock_t acc_pclock_t; #define ACC_PCLOCK_MONOTONIC 1 #define ACC_PCLOCK_PROCESS_CPUTIME_ID 2 #define ACC_PCLOCK_THREAD_CPUTIME_ID 3 -#define ACC_PCLOCK_REALTIME_HR 4 -#define ACC_PCLOCK_MONOTONIC_HR 5 struct acc_pclock_handle_t { acclib_handle_t h; int mode; + int read_error; const char* name; int (*gettime) (acc_pclock_handle_p, acc_pclock_p); #if defined(acc_int64l_t) @@ -3982,6 +3992,7 @@ ACCLIB_EXTERN(int, acc_pclock_flush_cpu_cache) (acc_pclock_handle_p, unsigned); typedef struct { acclib_handle_t h; int mode; + int read_error; const char* name; #if defined(__ACCLIB_UCLOCK_USE_PERFCTR) acc_perfctr_handle_t pch; @@ -5598,6 +5609,42 @@ ACCLIB_PUBLIC(long, acc_safe_hwrite) (int fd, const acc_hvoid_p buf, long size) #if !defined(ACCLIB_PUBLIC) # define ACCLIB_PUBLIC(r,f) r __ACCLIB_FUNCNAME(f) #endif +#if 0 && (ACC_OS_POSIX_LINUX && ACC_ARCH_AMD64 && ACC_ASM_SYNTAX_GNUC) +#ifndef acc_pclock_syscall_clock_gettime +#define acc_pclock_syscall_clock_gettime acc_pclock_syscall_clock_gettime +#endif +static __acc_noinline long acc_pclock_syscall_clock_gettime(long clockid, struct timespec *ts) +{ + long r; + __asm__ __volatile__("syscall\n" : "=a" (r) : "0" (228), "D" (clockid), "S" (ts) : __ACC_ASM_CLOBBER); + return r; +} +#endif +#if 0 && (ACC_OS_POSIX_LINUX && ACC_ARCH_I386 && ACC_ASM_SYNTAX_GNUC) +#ifndef acc_pclock_syscall_clock_gettime +#define acc_pclock_syscall_clock_gettime acc_pclock_syscall_clock_gettime +#endif +static __acc_noinline long acc_pclock_syscall_clock_gettime(long clockid, struct timespec *ts) +{ + long r; + __asm__ __volatile__("int $0x80\n" : "=a" (r) : "0" (265), "b" (clockid), "c" (ts) : __ACC_ASM_CLOBBER); + return r; +} +#endif +#if 0 && defined(acc_pclock_syscall_clock_gettime) +#ifndef acc_pclock_read_clock_gettime_r_syscall +#define acc_pclock_read_clock_gettime_r_syscall acc_pclock_read_clock_gettime_r_syscall +#endif +static int acc_pclock_read_clock_gettime_r_syscall(acc_pclock_handle_p h, acc_pclock_p c) +{ + struct timespec ts; + if (acc_pclock_syscall_clock_gettime(0, &ts) != 0) + return -1; + c->tv_sec = ts.tv_sec; + c->tv_nsec = ts.tv_nsec; + ACC_UNUSED(h); return 0; +} +#endif #if defined(HAVE_GETTIMEOFDAY) #ifndef acc_pclock_read_gettimeofday #define acc_pclock_read_gettimeofday acc_pclock_read_gettimeofday @@ -5642,6 +5689,20 @@ static int acc_pclock_read_clock(acc_pclock_handle_p h, acc_pclock_p c) ACC_UNUSED(h); return 0; } #endif +#if 1 && defined(acc_pclock_syscall_clock_gettime) +#ifndef acc_pclock_read_clock_gettime_m_syscall +#define acc_pclock_read_clock_gettime_m_syscall acc_pclock_read_clock_gettime_m_syscall +#endif +static int acc_pclock_read_clock_gettime_m_syscall(acc_pclock_handle_p h, acc_pclock_p c) +{ + struct timespec ts; + if (acc_pclock_syscall_clock_gettime(1, &ts) != 0) + return -1; + c->tv_sec = ts.tv_sec; + c->tv_nsec = ts.tv_nsec; + ACC_UNUSED(h); return 0; +} +#endif #if (ACC_OS_DOS32 && ACC_CC_GNUC) && defined(__DJGPP__) && defined(UCLOCKS_PER_SEC) #ifndef acc_pclock_read_uclock #define acc_pclock_read_uclock acc_pclock_read_uclock @@ -5660,10 +5721,10 @@ static int acc_pclock_read_uclock(acc_pclock_handle_p h, acc_pclock_p c) } #endif #if 0 && defined(HAVE_CLOCK_GETTIME) && defined(CLOCK_PROCESS_CPUTIME_ID) && defined(acc_int64l_t) -#ifndef acc_pclock_read_clock_gettime_p -#define acc_pclock_read_clock_gettime_p acc_pclock_read_clock_gettime_p +#ifndef acc_pclock_read_clock_gettime_p_libc +#define acc_pclock_read_clock_gettime_p_libc acc_pclock_read_clock_gettime_p_libc #endif -static int acc_pclock_read_clock_gettime_p(acc_pclock_handle_p h, acc_pclock_p c) +static int acc_pclock_read_clock_gettime_p_libc(acc_pclock_handle_p h, acc_pclock_p c) { struct timespec ts; if (clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &ts) != 0) @@ -5673,6 +5734,20 @@ static int acc_pclock_read_clock_gettime_p(acc_pclock_handle_p h, acc_pclock_p c ACC_UNUSED(h); return 0; } #endif +#if 1 && defined(acc_pclock_syscall_clock_gettime) +#ifndef acc_pclock_read_clock_gettime_p_syscall +#define acc_pclock_read_clock_gettime_p_syscall acc_pclock_read_clock_gettime_p_syscall +#endif +static int acc_pclock_read_clock_gettime_p_syscall(acc_pclock_handle_p h, acc_pclock_p c) +{ + struct timespec ts; + if (acc_pclock_syscall_clock_gettime(2, &ts) != 0) + return -1; + c->tv_sec = ts.tv_sec; + c->tv_nsec = ts.tv_nsec; + ACC_UNUSED(h); return 0; +} +#endif #if (ACC_OS_CYGWIN || ACC_OS_WIN32 || ACC_OS_WIN64) && (ACC_HAVE_WINDOWS_H) && defined(acc_int64l_t) #ifndef acc_pclock_read_getprocesstimes #define acc_pclock_read_getprocesstimes acc_pclock_read_getprocesstimes @@ -5734,10 +5809,10 @@ static int acc_pclock_read_perfctr(acc_pclock_handle_p h, acc_pclock_p c) } #endif #if 0 && defined(HAVE_CLOCK_GETTIME) && defined(CLOCK_THREAD_CPUTIME_ID) && defined(acc_int64l_t) -#ifndef acc_pclock_read_clock_gettime_t -#define acc_pclock_read_clock_gettime_t acc_pclock_read_clock_gettime_t +#ifndef acc_pclock_read_clock_gettime_t_libc +#define acc_pclock_read_clock_gettime_t_libc acc_pclock_read_clock_gettime_t_libc #endif -static int acc_pclock_read_clock_gettime_t(acc_pclock_handle_p h, acc_pclock_p c) +static int acc_pclock_read_clock_gettime_t_libc(acc_pclock_handle_p h, acc_pclock_p c) { struct timespec ts; if (clock_gettime(CLOCK_THREAD_CPUTIME_ID, &ts) != 0) @@ -5747,6 +5822,20 @@ static int acc_pclock_read_clock_gettime_t(acc_pclock_handle_p h, acc_pclock_p c ACC_UNUSED(h); return 0; } #endif +#if 1 && defined(acc_pclock_syscall_clock_gettime) +#ifndef acc_pclock_read_clock_gettime_t_syscall +#define acc_pclock_read_clock_gettime_t_syscall acc_pclock_read_clock_gettime_t_syscall +#endif +static int acc_pclock_read_clock_gettime_t_syscall(acc_pclock_handle_p h, acc_pclock_p c) +{ + struct timespec ts; + if (acc_pclock_syscall_clock_gettime(3, &ts) != 0) + return -1; + c->tv_sec = ts.tv_sec; + c->tv_nsec = ts.tv_nsec; + ACC_UNUSED(h); return 0; +} +#endif #if (ACC_OS_CYGWIN || ACC_OS_WIN32 || ACC_OS_WIN64) && (ACC_HAVE_WINDOWS_H) && defined(acc_int64l_t) #ifndef acc_pclock_read_getthreadtimes #define acc_pclock_read_getthreadtimes acc_pclock_read_getthreadtimes @@ -5773,6 +5862,7 @@ ACCLIB_PUBLIC(int, acc_pclock_open) (acc_pclock_handle_p h, int mode) int i; h->h = (acclib_handle_t) 0; h->mode = -1; + h->read_error = 2; h->name = NULL; h->gettime = 0; #if defined(acc_int64l_t) @@ -5780,29 +5870,42 @@ ACCLIB_PUBLIC(int, acc_pclock_open) (acc_pclock_handle_p h, int mode) #endif switch (mode) { - case ACC_PCLOCK_REALTIME_HR: -# if defined(acc_pclock_read_gettimeofday) - h->gettime = acc_pclock_read_gettimeofday; - h->name = "gettimeofday"; -# endif - break; case ACC_PCLOCK_REALTIME: -# if defined(acc_pclock_read_gettimeofday) - h->gettime = acc_pclock_read_gettimeofday; - h->name = "gettimeofday"; +# if defined(acc_pclock_read_clock_gettime_r_syscall) + if (acc_pclock_read_clock_gettime_r_syscall(h, &c) == 0) { + h->gettime = acc_pclock_read_clock_gettime_r_syscall; + h->name = "CLOCK_REALTIME/syscall"; + break; + } # endif - break; - case ACC_PCLOCK_MONOTONIC_HR: -# if defined(acc_pclock_read_uclock) - h->gettime = acc_pclock_read_uclock; - h->name = "uclock"; +# if defined(acc_pclock_read_gettimeofday) + if (acc_pclock_read_gettimeofday(h, &c) == 0) { + h->gettime = acc_pclock_read_gettimeofday; + h->name = "gettimeofday"; + break; + } # endif break; case ACC_PCLOCK_MONOTONIC: +# if defined(acc_pclock_read_clock_gettime_m_syscall) + if (acc_pclock_read_clock_gettime_m_syscall(h, &c) == 0) { + h->gettime = acc_pclock_read_clock_gettime_m_syscall; + h->name = "CLOCK_MONOTONIC/syscall"; + break; + } +# endif +# if defined(acc_pclock_read_uclock) + if (acc_pclock_read_uclock(h, &c) == 0) { + h->gettime = acc_pclock_read_uclock; + h->name = "uclock"; + break; + } +# endif # if defined(acc_pclock_read_clock) - if (!h->gettime) { + if (acc_pclock_read_clock(h, &c) == 0) { h->gettime = acc_pclock_read_clock; h->name = "clock"; + break; } # endif break; @@ -5815,35 +5918,52 @@ ACCLIB_PUBLIC(int, acc_pclock_open) (acc_pclock_handle_p h, int mode) } # endif # if defined(acc_pclock_read_getprocesstimes) - if (!h->gettime && acc_pclock_read_getprocesstimes(h, &c) == 0) { + if (acc_pclock_read_getprocesstimes(h, &c) == 0) { h->gettime = acc_pclock_read_getprocesstimes; h->name = "GetProcessTimes"; break; } # endif -# if defined(acc_pclock_read_clock_gettime_p) - if (!h->gettime && acc_pclock_read_clock_gettime_p(h, &c) == 0) { - h->gettime = acc_pclock_read_clock_gettime_p; - h->name = "CLOCK_PROCESS_CPUTIME_ID"; +# if defined(acc_pclock_read_clock_gettime_p_syscall) + if (acc_pclock_read_clock_gettime_p_syscall(h, &c) == 0) { + h->gettime = acc_pclock_read_clock_gettime_p_syscall; + h->name = "CLOCK_PROCESS_CPUTIME_ID/syscall"; + break; + } +# endif +# if defined(acc_pclock_read_clock_gettime_p_libc) + if (acc_pclock_read_clock_gettime_p_libc(h, &c) == 0) { + h->gettime = acc_pclock_read_clock_gettime_p_libc; + h->name = "CLOCK_PROCESS_CPUTIME_ID/libc"; break; } # endif # if defined(acc_pclock_read_getrusage) - h->gettime = acc_pclock_read_getrusage; - h->name = "getrusage"; + if (acc_pclock_read_getrusage(h, &c) == 0) { + h->gettime = acc_pclock_read_getrusage; + h->name = "getrusage"; + break; + } # endif break; case ACC_PCLOCK_THREAD_CPUTIME_ID: # if defined(acc_pclock_read_getthreadtimes) - if (!h->gettime && acc_pclock_read_getthreadtimes(h, &c) == 0) { + if (acc_pclock_read_getthreadtimes(h, &c) == 0) { h->gettime = acc_pclock_read_getthreadtimes; h->name = "GetThreadTimes"; } # endif -# if defined(acc_pclock_read_clock_gettime_t) - if (!h->gettime && acc_pclock_read_clock_gettime_t(h, &c) == 0) { - h->gettime = acc_pclock_read_clock_gettime_t; - h->name = "CLOCK_THREAD_CPUTIME_ID"; +# if defined(acc_pclock_read_clock_gettime_t_syscall) + if (acc_pclock_read_clock_gettime_t_syscall(h, &c) == 0) { + h->gettime = acc_pclock_read_clock_gettime_t_syscall; + h->name = "CLOCK_THREAD_CPUTIME_ID/syscall"; + break; + } +# endif +# if defined(acc_pclock_read_clock_gettime_t_libc) + if (acc_pclock_read_clock_gettime_t_libc(h, &c) == 0) { + h->gettime = acc_pclock_read_clock_gettime_t_libc; + h->name = "CLOCK_THREAD_CPUTIME_ID/libc"; break; } # endif @@ -5854,6 +5974,7 @@ ACCLIB_PUBLIC(int, acc_pclock_open) (acc_pclock_handle_p h, int mode) if (!h->h) h->h = (acclib_handle_t) 1; h->mode = mode; + h->read_error = 0; if (!h->name) h->name = "unknown"; for (i = 0; i < 10; i++) { @@ -5865,10 +5986,6 @@ ACCLIB_PUBLIC(int, acc_pclock_open_default) (acc_pclock_handle_p h) { if (acc_pclock_open(h, ACC_PCLOCK_PROCESS_CPUTIME_ID) == 0) return 0; - if (acc_pclock_open(h, ACC_PCLOCK_MONOTONIC_HR) == 0) - return 0; - if (acc_pclock_open(h, ACC_PCLOCK_REALTIME_HR) == 0) - return 0; if (acc_pclock_open(h, ACC_PCLOCK_MONOTONIC) == 0) return 0; if (acc_pclock_open(h, ACC_PCLOCK_REALTIME) == 0) @@ -5894,6 +6011,7 @@ ACCLIB_PUBLIC(void, acc_pclock_read) (acc_pclock_handle_p h, acc_pclock_p c) if (h->gettime(h, c) == 0) return; } + h->read_error = 1; #if defined(acc_int64l_t) c->tv_sec = 0; #else @@ -6009,6 +6127,7 @@ ACCLIB_PUBLIC(int, acc_uclock_open) (acc_uclock_handle_p h) #endif h->h = (acclib_handle_t) 1; h->mode = 0; + h->read_error = 0; h->name = NULL; #if (__ACCLIB_UCLOCK_USE_PERFCTR) h->pch.h = 0; @@ -6062,6 +6181,7 @@ ACCLIB_PUBLIC(void, acc_uclock_read) (acc_uclock_handle_p h, acc_uclock_p c) return; } else { h->mode = 0; h->qpf = 0.0; c->qpc = 0; + h->read_error = 1; } } #endif @@ -6354,6 +6474,8 @@ ACCLIB_PUBLIC(int, acc_mkdir) (const char* name, unsigned mode) # else return mkdir(name); # endif +#elif (ACC_CC_WATCOMC) + return mkdir(name, (mode_t) mode); #else return mkdir(name, mode); #endif diff --git a/src/msg.cpp b/src/msg.cpp index 8f002bed..e8acb223 100644 --- a/src/msg.cpp +++ b/src/msg.cpp @@ -57,7 +57,7 @@ void printClearLine(FILE *f) fflush(stdout); fflush(stderr); if (f == NULL) f = stdout; - con_fprintf(f,clear_line_msg); + con_fprintf(f, "%s", clear_line_msg); fflush(f); printSetNl(0); }