Big re-sync with UPX 1.2 branch.
committer: mfx <mfx> 1026835258 +0000
This commit is contained in:
@@ -1,5 +1,4 @@
|
|||||||
.cvsignore
|
.cvsignore
|
||||||
.mfxcvsup
|
|
||||||
ChangeLog.cvs*
|
ChangeLog.cvs*
|
||||||
build
|
build
|
||||||
maint
|
maint
|
||||||
|
|||||||
@@ -8,9 +8,8 @@
|
|||||||
|
|
||||||
|
|
||||||
The Ultimate Packer for eXecutables
|
The Ultimate Packer for eXecutables
|
||||||
Copyright (c) 1996-2001 Markus Oberhumer & Laszlo Molnar
|
Copyright (c) 1996-2002 Markus Oberhumer & Laszlo Molnar
|
||||||
http://wildsau.idv.uni-linz.ac.at/mfx/upx.html
|
http://upx.sourceforge.net
|
||||||
http://upx.tsx.org
|
|
||||||
|
|
||||||
|
|
||||||
Limitations and other things which are not (yet) supported:
|
Limitations and other things which are not (yet) supported:
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
User visible changes for UPX
|
User visible changes for UPX
|
||||||
==================================================================
|
==================================================================
|
||||||
|
|
||||||
Changes in 1.12 beta (XX Jan 2001):
|
Changes in 1.90 beta (XX Jul 2002):
|
||||||
* UNSTABLE BETA VERSION - DO NOT USE EXCEPT FOR TESTING
|
* UNSTABLE BETA VERSION - DO NOT USE EXCEPT FOR TESTING
|
||||||
* implemented several new options for finer compression control:
|
* implemented several new options for finer compression control:
|
||||||
`--all-methods', `--all-filters' and `--brute'
|
`--all-methods', `--all-filters' and `--brute'
|
||||||
@@ -20,6 +20,34 @@ Changes in 1.11 beta (20 Dec 2000):
|
|||||||
* reduced overall memory requirements during packing
|
* reduced overall memory requirements during packing
|
||||||
* quite a number of internal source code rearrangements
|
* quite a number of internal source code rearrangements
|
||||||
|
|
||||||
|
Changes in 1.22 (27 Jun 2002)
|
||||||
|
* atari/tos: the stub now flushes the CPU cache to avoid
|
||||||
|
problems on 68030+ machines
|
||||||
|
* source code: additional compiler support for Borland C++ 5.5.1,
|
||||||
|
Digital Mars C++ 8.28 and Watcom C++ 11.0c
|
||||||
|
|
||||||
|
Changes in 1.21 (01 Jun 2002)
|
||||||
|
* New option `--crp-ms=' for slightly better compression at the cost
|
||||||
|
of higher memory requirements during compression.
|
||||||
|
Try `upx --best --crp-ms=100000'. See the docs for more info.
|
||||||
|
* source code: portability fixes
|
||||||
|
* source code: compile fixes for g++ 3.0 and g++ 3.1
|
||||||
|
|
||||||
|
Changes in 1.20 (23 May 2001)
|
||||||
|
* slightly faster compression
|
||||||
|
* work around a gcc problem in the latest djgpp2 distribution
|
||||||
|
* watcom/le: fixed detection of already compressed files
|
||||||
|
* win32/pe: do not compress RT_MANIFEST resource types
|
||||||
|
* win32/pe: improved the error message for empty resource sections
|
||||||
|
* [NOTE: the jump from 1.08 to 1.20 is to avoid confusion with
|
||||||
|
our unstable development releases 1.1x and 1.9x]
|
||||||
|
|
||||||
|
Changes in 1.08 (30 Apr 2001)
|
||||||
|
* INFO: http://upx.sourceforge.net now is the new permanent UPX home page
|
||||||
|
* new native port to atari/tos
|
||||||
|
* win32/pe: shortened the identstring
|
||||||
|
* source code: portability fixes - UPX now builds cleanly under m68k CPUs
|
||||||
|
|
||||||
Changes in 1.07 (20 Feb 2001)
|
Changes in 1.07 (20 Feb 2001)
|
||||||
* win32/pe: corrected the TLS callback check
|
* win32/pe: corrected the TLS callback check
|
||||||
* win32/pe: really fixed that rare bug in relocation handling
|
* win32/pe: really fixed that rare bug in relocation handling
|
||||||
|
|||||||
@@ -8,9 +8,8 @@
|
|||||||
|
|
||||||
|
|
||||||
The Ultimate Packer for eXecutables
|
The Ultimate Packer for eXecutables
|
||||||
Copyright (c) 1996-2001 Markus Oberhumer & Laszlo Molnar
|
Copyright (c) 1996-2002 Markus Oberhumer & Laszlo Molnar
|
||||||
http://wildsau.idv.uni-linz.ac.at/mfx/upx.html
|
http://upx.sourceforge.net
|
||||||
http://upx.tsx.org
|
|
||||||
|
|
||||||
|
|
||||||
Here are some possible projects from which you can choose if you'd like to
|
Here are some possible projects from which you can choose if you'd like to
|
||||||
|
|||||||
@@ -8,23 +8,22 @@
|
|||||||
|
|
||||||
|
|
||||||
The Ultimate Packer for eXecutables
|
The Ultimate Packer for eXecutables
|
||||||
Copyright (c) 1996-2001 Markus Oberhumer & Laszlo Molnar
|
Copyright (c) 1996-2002 Markus Oberhumer & Laszlo Molnar
|
||||||
http://wildsau.idv.uni-linz.ac.at/mfx/upx.html
|
http://upx.sourceforge.net
|
||||||
http://upx.tsx.org
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
WARNING - UNSTABLE BETA VERSION
|
WARNING - UNSTABLE BETA VERSION
|
||||||
===============================
|
===============================
|
||||||
|
|
||||||
All versions 1.1x are unstable beta releases - use them only for testing,
|
All versions 1.9x are unstable beta releases - use them only for testing,
|
||||||
and never distribute a program that is packed with them !
|
and never distribute a program that is packed with them !
|
||||||
There will be hidden bugs. Really.
|
There will be hidden bugs. Really.
|
||||||
|
|
||||||
The current stable release is 1.06, and the next stable release
|
The current stable release is 1.22, and the next stable release
|
||||||
will be called version 1.20.
|
will be called version 2.00.
|
||||||
|
|
||||||
The main news since 1.06 are support for bootable Linux kernels ("vmlinuz/386")
|
The main news since 1.22 are support for bootable Linux kernels ("vmlinuz/386")
|
||||||
and direct Linux ELF-to-memory decompression ("linux/elf386"), so there's
|
and direct Linux ELF-to-memory decompression ("linux/elf386"), so there's
|
||||||
no reason to use the unstable versions unless you want to try the new formats.
|
no reason to use the unstable versions unless you want to try the new formats.
|
||||||
|
|
||||||
@@ -32,10 +31,9 @@ no reason to use the unstable versions unless you want to try the new formats.
|
|||||||
WELCOME
|
WELCOME
|
||||||
=======
|
=======
|
||||||
|
|
||||||
Welcome to UPX 1.0, the first production release after almost two years
|
Welcome to UPX !
|
||||||
of beta testing.
|
|
||||||
|
|
||||||
Please don't forget to read the new LICENSE - UPX is now distributed
|
Please don't forget to read the file LICENSE - UPX is distributed
|
||||||
under the GNU General Public License (GPL) with special exceptions
|
under the GNU General Public License (GPL) with special exceptions
|
||||||
allowing the distribution of all compressed executables, including
|
allowing the distribution of all compressed executables, including
|
||||||
commercial programs.
|
commercial programs.
|
||||||
@@ -54,8 +52,8 @@ and run exactly as before, with no runtime or memory penalty for most
|
|||||||
of the supported formats.
|
of the supported formats.
|
||||||
|
|
||||||
UPX supports a number of different executable formats, including
|
UPX supports a number of different executable formats, including
|
||||||
Win95/98/ME/NT/2000 programs and DLLs, DOS programs, and Linux
|
Windows 95/98/ME/NT/2000/XP programs and DLLs, DOS programs,
|
||||||
executables and kernels.
|
and Linux executables and kernels.
|
||||||
|
|
||||||
UPX is free software distributed under the term of the GNU General
|
UPX is free software distributed under the term of the GNU General
|
||||||
Public License. Full source code is available.
|
Public License. Full source code is available.
|
||||||
@@ -64,7 +62,7 @@ UPX may be distributed and used freely, even with commercial applications.
|
|||||||
See the UPX License Agreement for details.
|
See the UPX License Agreement for details.
|
||||||
|
|
||||||
UPX is rated number one in the well known Archive Comparison Test. Visit
|
UPX is rated number one in the well known Archive Comparison Test. Visit
|
||||||
http://web.act.by.net/~act/act-exepack.html
|
http://compression.ca/ .
|
||||||
|
|
||||||
UPX aims to be Commercial Quality Freeware.
|
UPX aims to be Commercial Quality Freeware.
|
||||||
|
|
||||||
@@ -87,7 +85,7 @@ UPX comes with ABSOLUTELY NO WARRANTY; for details see the file LICENSE.
|
|||||||
Having said that, we think that UPX is quite stable now. Indeed we
|
Having said that, we think that UPX is quite stable now. Indeed we
|
||||||
have compressed lots of files without any problems. Also, the
|
have compressed lots of files without any problems. Also, the
|
||||||
current version has undergone several months of beta testing -
|
current version has undergone several months of beta testing -
|
||||||
actually it's almost 2 years since our first public beta.
|
actually it's more than 4 years since our first public beta.
|
||||||
|
|
||||||
This is the first production quality release, and we plan that future
|
This is the first production quality release, and we plan that future
|
||||||
releases will be backward compatible with this version.
|
releases will be backward compatible with this version.
|
||||||
@@ -125,8 +123,8 @@ THE FUTURE
|
|||||||
COPYRIGHT
|
COPYRIGHT
|
||||||
=========
|
=========
|
||||||
|
|
||||||
Copyright (C) 1996-2001 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2002 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2001 Laszlo Molnar
|
Copyright (C) 1996-2002 Laszlo Molnar
|
||||||
|
|
||||||
This program may be used freely, and you are welcome to
|
This program may be used freely, and you are welcome to
|
||||||
redistribute it under certain conditions.
|
redistribute it under certain conditions.
|
||||||
|
|||||||
+15
-14
@@ -60,17 +60,17 @@ Prerequisites
|
|||||||
-------------
|
-------------
|
||||||
|
|
||||||
- first of all you need to build the UCL compression library
|
- first of all you need to build the UCL compression library
|
||||||
http://wildsau.idv.uni-linz.ac.at/mfx/ucl.html
|
http://www.oberhumer.com/opensource/ucl/
|
||||||
|
|
||||||
|
|
||||||
Tools needed to build/modify the UPX sources
|
Tools needed to build/modify the UPX sources
|
||||||
--------------------------------------------
|
--------------------------------------------
|
||||||
|
|
||||||
- A modern C++ compiler like gcc 2.95.2 or Visual C++ 6
|
- A modern C++ compiler like gcc 2.95.3 or Visual C++ 6
|
||||||
(egcs 1.1.x may work, half-baked implementations like Borland C++ 5.5 won't)
|
(egcs 1.1.x may work, half-baked implementations like Borland C++ 5.5 won't)
|
||||||
|
|
||||||
- GNU make for Win32
|
- GNU make for Win32
|
||||||
http://wildsau.idv.uni-linz.ac.at/mfx/download/upx/tools/
|
http://upx.sourceforge.net/download/tools/
|
||||||
|
|
||||||
- GNU make for DOS
|
- GNU make for DOS
|
||||||
ftp://ftp.simtel.net/pub/simtelnet/gnu/djgpp/v2gnu/
|
ftp://ftp.simtel.net/pub/simtelnet/gnu/djgpp/v2gnu/
|
||||||
@@ -81,34 +81,35 @@ To compile the packer sources
|
|||||||
|
|
||||||
set the environment variable UCLDIR to point to your UCL installation, e.g.
|
set the environment variable UCLDIR to point to your UCL installation, e.g.
|
||||||
|
|
||||||
set UCLDIR=c:\src\ucl-0.92 (DOS / Windows)
|
set UCLDIR=c:\src\ucl-1.01 (DOS / Windows)
|
||||||
export UCLDIR=$HOME/local/src/ucl-0.92 (Unix)
|
export UCLDIR=$HOME/local/src/ucl-1.01 (Unix)
|
||||||
|
|
||||||
then type
|
then type
|
||||||
|
|
||||||
make target=linux # on linux
|
make target=linux # on linux
|
||||||
make target=djgpp2 # for djgpp2
|
make target=djgpp2 # for djgpp2
|
||||||
make target=mingw32 # for mingw32
|
make target=mingw32 # for mingw32
|
||||||
|
make target=cygwin # cygwin 1.3.x
|
||||||
make target=no-cygwin # for mingw32 as included in cygwin
|
make target=no-cygwin # for mingw32 as included in cygwin
|
||||||
make target=msc # for Visual C++ 6.0
|
make target=vc6 # for Visual C++ 6.0
|
||||||
|
|
||||||
|
|
||||||
If you want to modify the stub sources you'll also need
|
If you want to modify the stub sources you'll also need
|
||||||
-------------------------------------------------------
|
-------------------------------------------------------
|
||||||
|
|
||||||
- Nasm - the Netwide Assembler
|
- Nasm 0.98.08 - the Netwide Assembler
|
||||||
http://www.cryogen.com/Nasm
|
http://upx.sourceforge.net/download/tools/
|
||||||
|
http://nasm.sourceforge.net/
|
||||||
- Perl 5.004 or better
|
|
||||||
ftp://ftp.simtel.net/pub/simtelnet/gnu/djgpp/v2gnu/perl*b.zip
|
|
||||||
|
|
||||||
- A68K - a 68000 macro assembler
|
- A68K - a 68000 macro assembler
|
||||||
http://wildsau.idv.uni-linz.ac.at/mfx/download/upx/tools/
|
http://upx.sourceforge.net/download/tools/
|
||||||
|
|
||||||
- djasm - an assembler for the djgpp stub
|
- djasm - an assembler for the djgpp stub
|
||||||
http://wildsau.idv.uni-linz.ac.at/mfx/download/upx/tools/
|
http://upx.sourceforge.net/download/tools/
|
||||||
|
|
||||||
- Linux (for the linux/i386 stubs)
|
- Perl 5.004 or better
|
||||||
|
|
||||||
|
- Linux (for the linux/386 stubs)
|
||||||
|
|
||||||
|
|
||||||
Misc. notes
|
Misc. notes
|
||||||
|
|||||||
@@ -8,9 +8,8 @@
|
|||||||
|
|
||||||
|
|
||||||
The Ultimate Packer for eXecutables
|
The Ultimate Packer for eXecutables
|
||||||
Copyright (c) 1996-2001 Markus Oberhumer & Laszlo Molnar
|
Copyright (c) 1996-2002 Markus Oberhumer & Laszlo Molnar
|
||||||
http://wildsau.idv.uni-linz.ac.at/mfx/upx.html
|
http://upx.sourceforge.net
|
||||||
http://upx.tsx.org
|
|
||||||
|
|
||||||
|
|
||||||
.___.. .
|
.___.. .
|
||||||
|
|||||||
@@ -2,12 +2,24 @@ UPX TODO list. Last updated 2002-07-16.
|
|||||||
|
|
||||||
|
|
||||||
- rotten code, bring back to life and resync with UPX 1.2 branch
|
- rotten code, bring back to life and resync with UPX 1.2 branch
|
||||||
|
[mostly done]
|
||||||
|
|
||||||
|
- resync stub with UPX 1.2 branch
|
||||||
|
|
||||||
- p_psx.cpp (psx/exe) needs some work
|
- p_psx.cpp (psx/exe) needs some work
|
||||||
|
|
||||||
- src/stub/l_lx_elf86.lds does not work with current binutils
|
- src/stub/l_lx_elf86.lds does not work with current binutils
|
||||||
(generates a several MB file)
|
(generates a several MB file)
|
||||||
|
|
||||||
|
- check all <const_cast> to make sure they are not invalid
|
||||||
|
|
||||||
|
|
||||||
|
TEST:
|
||||||
|
|
||||||
|
- test new linux formats
|
||||||
|
- test unpacking of old linux formats
|
||||||
|
- test new filters
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
IMPROVED COMPRESSION RATIO
|
IMPROVED COMPRESSION RATIO
|
||||||
|
|||||||
+306
-151
@@ -1,12 +1,19 @@
|
|||||||
# UPX Makefile (GNU make) - works with djgpp2/win32/unix
|
#
|
||||||
|
# UPX Makefile (GNU make) - works with unix/win32/djgpp2
|
||||||
#
|
#
|
||||||
# usage:
|
# usage:
|
||||||
# `make target=linux' # linux
|
# `make target=linux' # linux
|
||||||
# `make target=djggp2' # djggp2 2.03
|
# `make target=djggp2' # dos32 - djggp2 2.03
|
||||||
# `make target=cygwin' # cygwin 1.1.x
|
# `make target=cygwin' # win32 - cygwin 1.3.x
|
||||||
# `make target=mingw32' # mingw32
|
# `make target=mingw32' # win32 - mingw32
|
||||||
# `make target=no-cygwin' # mingw32 as included in cygwin 1.1.x
|
# `make target=no-cygwin' # win32 - mingw32 as included in cygwin 1.3.x
|
||||||
# `make target=vc6' # Visual C++ 6.0
|
# `make target=bcc' # win32 - Borland C++ 5.5.1
|
||||||
|
# `make target=dmc' # win32 - Digital Mars C++ 8.28
|
||||||
|
# `make target=vc6' # win32 - Visual C++ 6.0
|
||||||
|
# `make target=wcc' # win32 - Watcom C++ 11.0c
|
||||||
|
# `make target=cross-m68k-linux' # m68k-linux cross compiler
|
||||||
|
# `make target=cross-mingw32' # i586-mingw32msvc cross compiler
|
||||||
|
# `make target=cross-mint' # m68k-atari-mint cross compiler
|
||||||
#
|
#
|
||||||
|
|
||||||
|
|
||||||
@@ -14,7 +21,7 @@
|
|||||||
|
|
||||||
ifeq ($(strip $(UCLDIR)),)
|
ifeq ($(strip $(UCLDIR)),)
|
||||||
# change this to reflect where the UCL library is
|
# change this to reflect where the UCL library is
|
||||||
UCLDIR = $(HOME)/local/src/ucl-0.92
|
UCLDIR = $(HOME)/local/src/ucl-1.01
|
||||||
endif
|
endif
|
||||||
|
|
||||||
DEBUG = 0
|
DEBUG = 0
|
||||||
@@ -28,23 +35,28 @@ SHELL = /bin/sh
|
|||||||
|
|
||||||
|
|
||||||
.SUFFIXES:
|
.SUFFIXES:
|
||||||
.SUFFIXES: .a .c .cpp .exe .lib .o .obj
|
.SUFFIXES: .a .c .cpp .exe .lib .o .obj .rc .res .ttp
|
||||||
|
|
||||||
|
|
||||||
srcdir = .
|
srcdir = .
|
||||||
top_srcdir = ..
|
top_srcdir = ..
|
||||||
|
|
||||||
|
VPATH = $(srcdir)
|
||||||
|
|
||||||
|
|
||||||
# auto-detect the target unless given on the commandline
|
# auto-detect the target unless given on the commandline
|
||||||
target = djgpp2
|
ifeq ($(strip $(target)),)
|
||||||
|
##target = djgpp2
|
||||||
ifneq ($(strip $(wildcard /usr/include/linux)),)
|
ifneq ($(strip $(wildcard /usr/include/linux)),)
|
||||||
target = linux
|
target = linux
|
||||||
endif
|
endif
|
||||||
ifneq ($(strip $(wildcard /platform/sun4?/kernel/unix)),)
|
##ifneq ($(strip $(wildcard /platform/sun4?/kernel/unix)),)
|
||||||
target = sparc
|
##target = sparc
|
||||||
|
##endif
|
||||||
endif
|
endif
|
||||||
ifeq ($(target),msc)
|
|
||||||
override target = vc6
|
ifeq ($(strip $(target)),)
|
||||||
|
include please_specify_a_target
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
|
||||||
@@ -77,44 +89,55 @@ OBJECTS2 = \
|
|||||||
OBJECTS3 =
|
OBJECTS3 =
|
||||||
|
|
||||||
OBJECTS = $(OBJECTS1) $(OBJECTS2) $(OBJECTS3)
|
OBJECTS = $(OBJECTS1) $(OBJECTS2) $(OBJECTS3)
|
||||||
|
LIBS =
|
||||||
|
RESOURCES =
|
||||||
|
|
||||||
|
|
||||||
# /***********************************************************************
|
# /***********************************************************************
|
||||||
# // compiler settings
|
# // compiler settings
|
||||||
# ************************************************************************/
|
# ************************************************************************/
|
||||||
|
|
||||||
# default to a gcc unix-type compiler
|
###
|
||||||
|
### default compiler (gcc under unix)
|
||||||
|
###
|
||||||
|
|
||||||
|
o = .o
|
||||||
|
a = .a
|
||||||
|
e =
|
||||||
|
|
||||||
CC = gcc
|
CC = gcc
|
||||||
CXX = $(CC)
|
|
||||||
DEFS =
|
DEFS =
|
||||||
|
INCLUDES =
|
||||||
INCLUDES = -I. -I$(srcdir)
|
INCLUDES = -I. -I$(srcdir)
|
||||||
CFLAGS_OUTPUT = -o $@
|
CFLAGS_OUTPUT = -o $@
|
||||||
CXXFLAGS_OUTPUT = $(CFLAGS_OUTPUT)
|
|
||||||
|
|
||||||
LINK_EXE = $(CC) $(LDFLAGS) -o $@ $^ $(LDLIBS)
|
LINK_EXE = $(CXXLD) $(LDFLAGS) -o $@ $^ $(LDLIBS)
|
||||||
STUBEDIT_EXE =
|
STUBEDIT_EXE =
|
||||||
STUBIFY_EXE =
|
STUBIFY_EXE =
|
||||||
CHMOD_EXE =
|
CHMOD_EXE =
|
||||||
|
|
||||||
o = .o
|
# C++ defaults are set later
|
||||||
a = .a
|
CXX =
|
||||||
e = .exe
|
CXXLD =
|
||||||
|
CXXFLAGS_OUTPUT =
|
||||||
|
|
||||||
|
|
||||||
###
|
###
|
||||||
### gcc defaults
|
### gcc defaults
|
||||||
###
|
###
|
||||||
|
|
||||||
##CFLAGS_O = -Os
|
|
||||||
CFLAGS_O = -O2
|
|
||||||
##CFLAGS_WERROR = -Werror
|
##CFLAGS_WERROR = -Werror
|
||||||
|
CFLAGS_WERROR =
|
||||||
CFLAGS_W = $(CFLAGS_WERROR)
|
CFLAGS_W = $(CFLAGS_WERROR)
|
||||||
CFLAGS_W += -Wall -W -Wcast-align -Wcast-qual -Wmissing-declarations -Wmissing-prototypes -Wshadow -Wwrite-strings
|
CFLAGS_W += -Wall -W -Wcast-align -Wcast-qual -Wmissing-prototypes -Wpointer-arith -Wshadow -Wwrite-strings
|
||||||
##CFLAGS_M = -fno-builtin
|
CFLAGS_M =
|
||||||
## CFLAGS_M += -malign-functions=0 -malign-jumps=0 -malign-loops=0
|
##CFLAGS_M += -fno-builtin
|
||||||
|
##CFLAGS_M += -malign-functions=0 -malign-jumps=0 -malign-loops=0
|
||||||
|
##CFLAGS_O = -Os -fstrict-aliasing
|
||||||
|
##CFLAGS_O = -O2 -fstrict-aliasing
|
||||||
|
CFLAGS_O = -O2 -fno-strict-aliasing
|
||||||
|
|
||||||
CFLAGS = $(CFLAGS_W) $(CFLAGS_O) $(CFLAGS_M)
|
CFLAGS = $(CFLAGS_W) $(CFLAGS_M) $(CFLAGS_O)
|
||||||
CFLAGS += -Wp,-MMD,.deps/$(*F).pp
|
|
||||||
CXXFLAGS = $(CFLAGS) -Wsynth -fconserve-space
|
CXXFLAGS = $(CFLAGS) -Wsynth -fconserve-space
|
||||||
CXXFLAGS1 = $(CXXFLAGS)
|
CXXFLAGS1 = $(CXXFLAGS)
|
||||||
##CXXFLAGS1 += -fasynchronous-exceptions
|
##CXXFLAGS1 += -fasynchronous-exceptions
|
||||||
@@ -131,9 +154,9 @@ else
|
|||||||
LDFLAGS = -s
|
LDFLAGS = -s
|
||||||
endif
|
endif
|
||||||
LDFLAGS += -Wl,-Map,$T.map
|
LDFLAGS += -Wl,-Map,$T.map
|
||||||
LDLIBS =
|
|
||||||
LDLIBS = -lz
|
LDLIBS = -lz
|
||||||
LIBDIRS =
|
LIBDIRS =
|
||||||
|
DOS_LDLIBS =
|
||||||
DOS_LIBDIRS =
|
DOS_LIBDIRS =
|
||||||
|
|
||||||
|
|
||||||
@@ -154,7 +177,7 @@ ifneq ($(strip $(wildcard $(NRVDIR)/include/nrv)),)
|
|||||||
include $(srcdir)/Makefile.inc
|
include $(srcdir)/Makefile.inc
|
||||||
endif
|
endif
|
||||||
|
|
||||||
tmp := -Wl,--rpath,
|
override tmp := -Wl,--rpath,
|
||||||
LDRPATH := $(addprefix $(tmp),$(LIBDIRS))
|
LDRPATH := $(addprefix $(tmp),$(LIBDIRS))
|
||||||
LIBDIRS += .
|
LIBDIRS += .
|
||||||
LDLIBDIRS := $(addprefix -L,$(LIBDIRS))
|
LDLIBDIRS := $(addprefix -L,$(LIBDIRS))
|
||||||
@@ -164,17 +187,18 @@ LDFLAGS += $(LDLIBDIRS)
|
|||||||
|
|
||||||
|
|
||||||
###
|
###
|
||||||
### linux/i386
|
### Linux
|
||||||
###
|
###
|
||||||
|
|
||||||
ifeq ($(target),linux)
|
ifeq ($(target),linux)
|
||||||
e =
|
override arch := $(shell uname -m | sed -e 's/^i[3456789]86$$/i386/')
|
||||||
###CC = /usr/local/packages/gcc-cvs/bin/g++
|
|
||||||
DEFS += '-DUPX_CONFIG_H="config_h/linux.h"'
|
DEFS += '-DUPX_CONFIG_H="config_h/linux.h"'
|
||||||
##CFLAGS_M += -mno-schedule-prologue
|
|
||||||
CFLAGS_M += -march=i386 -mcpu=pentium
|
|
||||||
CFLAGS_WERROR = -Werror
|
|
||||||
LDLIBS += -lmcheck
|
LDLIBS += -lmcheck
|
||||||
|
ifeq ($(arch),i386)
|
||||||
|
CC += -march=i386 -mcpu=i586
|
||||||
|
##CFLAGS_M += -mno-schedule-prologue
|
||||||
|
endif
|
||||||
|
##CFLAGS_WERROR = -Werror
|
||||||
|
|
||||||
ifeq (1,2) # checkergcc
|
ifeq (1,2) # checkergcc
|
||||||
CC = checkergcc
|
CC = checkergcc
|
||||||
@@ -187,21 +211,83 @@ ifeq ($(DEBUG),1)
|
|||||||
else
|
else
|
||||||
##LDFLAGS += -static
|
##LDFLAGS += -static
|
||||||
STUBEDIT_EXE = objcopy -S -R .comment -R .note $@
|
STUBEDIT_EXE = objcopy -S -R .comment -R .note $@
|
||||||
|
ifeq ($(arch),i386)
|
||||||
STUBIFY_EXE = perl $(srcdir)/stub/scripts/brandelf.pl $@
|
STUBIFY_EXE = perl $(srcdir)/stub/scripts/brandelf.pl $@
|
||||||
|
CHMOD_EXE = chmod 755 $@
|
||||||
|
endif
|
||||||
endif
|
endif
|
||||||
CHMOD_EXE = chmod 755 $@
|
|
||||||
endif
|
endif
|
||||||
|
|
||||||
endif # linux
|
endif # linux
|
||||||
|
|
||||||
|
|
||||||
|
###
|
||||||
|
### Linux cross compilers
|
||||||
|
###
|
||||||
|
|
||||||
|
ifeq ($(target),cross-m68k-linux)
|
||||||
|
CC = m68k-linux-gcc
|
||||||
|
DEFS += '-DUPX_CONFIG_H="config_h/linux.h"'
|
||||||
|
##LDLIBS += -lmcheck
|
||||||
|
endif # cross-m68k-linux
|
||||||
|
|
||||||
|
|
||||||
|
###
|
||||||
|
### sparc-sun-solaris2.8
|
||||||
|
###
|
||||||
|
|
||||||
|
ifeq ($(target),sparc)
|
||||||
|
CC = gcc
|
||||||
|
DEFS += '-DUPX_CONFIG_H="config_h/sparc_sun_solaris28.h"'
|
||||||
|
endif # sparc
|
||||||
|
|
||||||
|
|
||||||
|
ifeq ($(target),XXX-sparc)
|
||||||
|
DEFS += '-DUPX_CONFIG_H="config_h/sparc_sun_solaris28.h"'
|
||||||
|
INCLUDES += -I/home/ethmola/local/include
|
||||||
|
|
||||||
|
ifeq (1,2) # native compiler
|
||||||
|
CFLAGS = -O0 -g
|
||||||
|
CXXFLAGS1 =
|
||||||
|
CXXFLAGS2 =
|
||||||
|
DEFS += -DUSE_STDNAMESPACE
|
||||||
|
else # gcc
|
||||||
|
CFLAGS += -O0 -gstabs+
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifeq (1,2) # purify
|
||||||
|
DEFS += -D__PURIFY__
|
||||||
|
CXXLD := purify $(CXXLD)
|
||||||
|
endif
|
||||||
|
|
||||||
|
endif # XXX-sparc
|
||||||
|
|
||||||
|
|
||||||
|
###
|
||||||
|
### Atari cross compiler
|
||||||
|
###
|
||||||
|
|
||||||
|
ifeq ($(target),cross-mint)
|
||||||
|
e = .ttp
|
||||||
|
CC = m68k-atari-mint-gcc
|
||||||
|
CC += -m68000
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifeq ($(target),cross-mint-m68040)
|
||||||
|
e = .ttp
|
||||||
|
CC = m68k-atari-mint-gcc
|
||||||
|
CC += -m68040
|
||||||
|
endif
|
||||||
|
|
||||||
|
|
||||||
###
|
###
|
||||||
### djgpp2
|
### djgpp2
|
||||||
###
|
###
|
||||||
|
|
||||||
ifeq ($(target),djgpp2)
|
ifeq ($(target),djgpp2)
|
||||||
CFLAGS_M += -mno-schedule-prologue
|
e = .exe
|
||||||
CFLAGS_M += -march=i386 -mcpu=pentium
|
CC += -march=i386 -mcpu=i586
|
||||||
|
##CFLAGS_M += -mno-schedule-prologue
|
||||||
CFLAGS_WERROR = -Werror
|
CFLAGS_WERROR = -Werror
|
||||||
STUBEDIT_EXE = stubedit $@ bufsize=0xfc00
|
STUBEDIT_EXE = stubedit $@ bufsize=0xfc00
|
||||||
ifneq ($(strip $(wildcard $(DJDIR)/bin/mfxdjstubify.exe)),)
|
ifneq ($(strip $(wildcard $(DJDIR)/bin/mfxdjstubify.exe)),)
|
||||||
@@ -217,113 +303,50 @@ endif # djgpp2
|
|||||||
###
|
###
|
||||||
|
|
||||||
ifeq ($(target),cygwin)
|
ifeq ($(target),cygwin)
|
||||||
CFLAGS_M += -mno-schedule-prologue
|
e = .exe
|
||||||
CFLAGS_M += -march=i386 -mcpu=pentium
|
CC += -march=i386 -mcpu=i586
|
||||||
CFLAGS_WERROR = -Werror
|
##CFLAGS_M += -mno-schedule-prologue
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifeq ($(target),mingw32)
|
ifeq ($(target),mingw32)
|
||||||
CFLAGS_M += -mno-schedule-prologue
|
e = .exe
|
||||||
CFLAGS_M += -march=i386 -mcpu=pentium
|
CC = gcc -mno-cygwin
|
||||||
|
CC += -march=i386 -mcpu=i586
|
||||||
|
##CFLAGS_M += -mno-schedule-prologue
|
||||||
endif
|
endif
|
||||||
|
|
||||||
# mingw32 as included in cygwin
|
# mingw32 as included in cygwin
|
||||||
ifeq ($(target),no-cygwin)
|
ifeq ($(target),no-cygwin)
|
||||||
|
e = .exe
|
||||||
CC = gcc -mno-cygwin
|
CC = gcc -mno-cygwin
|
||||||
CFLAGS_M += -mno-schedule-prologue
|
CC += -march=i386 -mcpu=i586
|
||||||
CFLAGS_M += -march=i386 -mcpu=pentium
|
##CFLAGS_M += -mno-schedule-prologue
|
||||||
CFLAGS_WERROR = -Werror
|
endif
|
||||||
|
|
||||||
|
# mingw32 cross compiler
|
||||||
|
ifeq ($(target),cross-mingw32)
|
||||||
|
e = .exe
|
||||||
|
CC = i586-mingw32msvc-gcc
|
||||||
|
CC += -march=i386 -mcpu=i586
|
||||||
|
##CFLAGS_M += -mno-schedule-prologue
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
|
||||||
###
|
###
|
||||||
### Microsoft 32-bit C/C++ Compiler 12.00 (aka Visual C++ 6)
|
### Borland C++ 5.5.1
|
||||||
###
|
|
||||||
|
|
||||||
ifeq ($(target),vc6)
|
|
||||||
o = .obj
|
|
||||||
a = .lib
|
|
||||||
CC = cl -nologo
|
|
||||||
CFLAGS = -W4 -WX
|
|
||||||
CXXFLAGS1 = $(CFLAGS) -GR -GX -EHa
|
|
||||||
CXXFLAGS2 = $(CFLAGS)
|
|
||||||
LDFLAGS =
|
|
||||||
LINK_LDFLAGS = /link /map:$T.map
|
|
||||||
|
|
||||||
ifneq ($(strip $(DOS_LIBDIRS)),)
|
|
||||||
LIB := $(DOS_LIBDIRS);$(LIB)
|
|
||||||
endif
|
|
||||||
export LIB
|
|
||||||
|
|
||||||
ifeq (1,2)
|
|
||||||
# statically link libc.lib
|
|
||||||
CC += -ML
|
|
||||||
##LDLIBS = $(u)_s.lib zlib_s.lib setargv.obj
|
|
||||||
LDLIBS = $(u)_s.lib setargv.obj
|
|
||||||
else
|
|
||||||
# link against msvcrt.dll
|
|
||||||
CC += -MD
|
|
||||||
LDLIBS = $(DOS_LDLIBS) zlib.lib setargv.obj
|
|
||||||
endif
|
|
||||||
ifeq ($(DEBUG),1)
|
|
||||||
CFLAGS += -Od -ZI
|
|
||||||
LINK_LDFLAGS += /debug
|
|
||||||
else
|
|
||||||
CFLAGS += -O2 -GF
|
|
||||||
LINK_LDFLAGS += /release
|
|
||||||
endif
|
|
||||||
|
|
||||||
##LINK_LDFLAGS += /verbose
|
|
||||||
LINK_EXE = $(CC) $(LDFLAGS) -Fe$@ $^ $(LDLIBS) $(LINK_LDFLAGS)
|
|
||||||
|
|
||||||
endif # vc6
|
|
||||||
|
|
||||||
|
|
||||||
###
|
|
||||||
### sparc
|
|
||||||
###
|
|
||||||
|
|
||||||
ifeq ($(target),sparc)
|
|
||||||
e =
|
|
||||||
DEFS += '-DUPX_CONFIG_H="config_h/sparc.h"'
|
|
||||||
INCLUDES += -I/home/ethmola/local/include
|
|
||||||
|
|
||||||
ifeq (1,2) # native compiler
|
|
||||||
CFLAGS = -O0 -g
|
|
||||||
CXXFLAGS1 =
|
|
||||||
CXXFLAGS2 =
|
|
||||||
CFLAGS_M =
|
|
||||||
DEFS += -DUSE_STDNAMESPACE
|
|
||||||
else # gcc
|
|
||||||
CFLAGS += -O0 -gstabs+
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifeq (1,2) # purify
|
|
||||||
DEFS += -D__PURIFY__
|
|
||||||
LDFLAGS = -g -L/home/ethmola/local/lib
|
|
||||||
LINK_EXE = purify $(CC) $(LDFLAGS) -o $@ $^ $(LDLIBS)
|
|
||||||
else
|
|
||||||
LDFLAGS += -g -L/home/ethmola/local/lib
|
|
||||||
LINK_EXE = $(CC) $(LDFLAGS) -o $@ $^ $(LDLIBS)
|
|
||||||
endif
|
|
||||||
|
|
||||||
endif # sparc
|
|
||||||
|
|
||||||
|
|
||||||
###
|
|
||||||
### Borland C++ 5.5 (DOES NOT WORK - INCOMPLETE C++ IMPLEMENTATION)
|
|
||||||
###
|
###
|
||||||
|
|
||||||
ifeq ($(target),bcc)
|
ifeq ($(target),bcc)
|
||||||
o = .obj
|
o = .obj
|
||||||
a = .lib
|
a = .lib
|
||||||
CC = bcc32
|
e = .exe
|
||||||
CFLAGS = -w -w-par
|
CC = bcc32 -q
|
||||||
|
CFLAGS = -w -w-aus -g1
|
||||||
CXXFLAGS1 = $(CFLAGS)
|
CXXFLAGS1 = $(CFLAGS)
|
||||||
CXXFLAGS2 = $(CFLAGS)
|
CXXFLAGS2 = $(CFLAGS) -x- -xd- -RT-
|
||||||
CFLAGS_OUTPUT = -o$@
|
CFLAGS_OUTPUT = -o$@
|
||||||
LDFLAGS =
|
LDFLAGS =
|
||||||
LDLIBS = $(DOS_LDLIBS) zlib.lib
|
LDLIBS = $(DOS_LDLIBS)
|
||||||
|
|
||||||
ifneq ($(strip $(DOS_LIBDIRS)),)
|
ifneq ($(strip $(DOS_LIBDIRS)),)
|
||||||
LIB := $(DOS_LIBDIRS);$(LIB)
|
LIB := $(DOS_LIBDIRS);$(LIB)
|
||||||
@@ -336,15 +359,131 @@ else
|
|||||||
CFLAGS += -O2 -d
|
CFLAGS += -O2 -d
|
||||||
endif
|
endif
|
||||||
|
|
||||||
LINK_EXE = $(CC) $(LDFLAGS) -e$@ $^ $(LDLIBS)
|
LINK_EXE = $(CXXLD) $(LDFLAGS) -e$@ $^ $(LDLIBS)
|
||||||
|
|
||||||
endif # bcc
|
endif # bcc
|
||||||
|
|
||||||
|
|
||||||
###
|
###
|
||||||
### malloc debuggers and memory checkers
|
### Digital Mars C++ 8.28
|
||||||
###
|
###
|
||||||
|
|
||||||
|
ifeq ($(target),dmc)
|
||||||
|
o = .obj
|
||||||
|
a = .lib
|
||||||
|
e = .exe
|
||||||
|
CC = sc -mn
|
||||||
|
CFLAGS = -w- -wx
|
||||||
|
CXXFLAGS1 = $(CFLAGS) -Aa -Ab -Ae -Ar
|
||||||
|
CXXFLAGS2 = $(CFLAGS) -Aa -Ab
|
||||||
|
CFLAGS_OUTPUT = -o$@
|
||||||
|
LDFLAGS =
|
||||||
|
LDLIBS = $(DOS_LDLIBS)
|
||||||
|
|
||||||
|
ifneq ($(strip $(DOS_LIBDIRS)),)
|
||||||
|
LIB := $(DOS_LIBDIRS);$(LIB)
|
||||||
|
endif
|
||||||
|
export LIB
|
||||||
|
|
||||||
|
ifeq ($(DEBUG),1)
|
||||||
|
CFLAGS += -o- -g -s
|
||||||
|
else
|
||||||
|
CFLAGS += -o
|
||||||
|
endif
|
||||||
|
|
||||||
|
LINK_EXE = $(CXXLD) $(LDFLAGS) -o$@ $^ $(LDLIBS)
|
||||||
|
|
||||||
|
endif # dmc
|
||||||
|
|
||||||
|
|
||||||
|
###
|
||||||
|
### Visual C++ 6 (aka Microsoft C/C++ Compiler 12.00)
|
||||||
|
###
|
||||||
|
|
||||||
|
ifeq ($(target),vc6)
|
||||||
|
o = .obj
|
||||||
|
a = .lib
|
||||||
|
e = .exe
|
||||||
|
CC = cl -nologo
|
||||||
|
CFLAGS = -W4 -WX
|
||||||
|
CXXFLAGS1 = $(CFLAGS) -EHac -GR
|
||||||
|
CXXFLAGS2 = $(CFLAGS)
|
||||||
|
LDFLAGS =
|
||||||
|
LINK_LDFLAGS = /link /map:$T.map
|
||||||
|
|
||||||
|
ifneq ($(strip $(DOS_LIBDIRS)),)
|
||||||
|
LIB := $(DOS_LIBDIRS);$(LIB)
|
||||||
|
endif
|
||||||
|
export LIB
|
||||||
|
|
||||||
|
ifeq (1,2)
|
||||||
|
# statically link libc.lib
|
||||||
|
CC += -ML
|
||||||
|
LDLIBS = $(u)_s.lib setargv.obj
|
||||||
|
else
|
||||||
|
# link against msvcrt.dll
|
||||||
|
CC += -MD
|
||||||
|
LDLIBS = $(DOS_LDLIBS) setargv.obj
|
||||||
|
endif
|
||||||
|
ifeq ($(DEBUG),1)
|
||||||
|
CFLAGS += -Od -ZI
|
||||||
|
LINK_LDFLAGS += /debug
|
||||||
|
else
|
||||||
|
CFLAGS += -O2 -GF
|
||||||
|
LINK_LDFLAGS += /release
|
||||||
|
endif
|
||||||
|
RESOURCES = upx.res
|
||||||
|
|
||||||
|
##LINK_LDFLAGS += /verbose
|
||||||
|
LINK_EXE = $(CXXLD) $(LDFLAGS) -Fe$@ $^ $(LDLIBS) $(LINK_LDFLAGS)
|
||||||
|
|
||||||
|
endif # vc6
|
||||||
|
|
||||||
|
|
||||||
|
###
|
||||||
|
### Watcom C++ 11.0c
|
||||||
|
###
|
||||||
|
|
||||||
|
ifeq ($(target),wcc)
|
||||||
|
o = .obj
|
||||||
|
a = .lib
|
||||||
|
e = .exe
|
||||||
|
CC = wcl386 -zq -bt=nt -mf -5r
|
||||||
|
CFLAGS = -zc -w5 -we
|
||||||
|
CXXFLAGS1 = $(CFLAGS) -xs -xr
|
||||||
|
CXXFLAGS2 = $(CFLAGS)
|
||||||
|
CFLAGS_OUTPUT = -fo=$@
|
||||||
|
LDFLAGS = -k0x100000 -fm
|
||||||
|
LDLIBS = $(DOS_LDLIBS)
|
||||||
|
|
||||||
|
INCLUDES:=$(strip $(subst /,\\,$(INCLUDES)))
|
||||||
|
ifeq (1,2)
|
||||||
|
WCL386:=$(INCLUDES)
|
||||||
|
export WCL386
|
||||||
|
INCLUDES:=
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifneq ($(strip $(DOS_LIBDIRS)),)
|
||||||
|
LIB := $(DOS_LIBDIRS);$(LIB)
|
||||||
|
endif
|
||||||
|
export LIB
|
||||||
|
|
||||||
|
ifeq ($(DEBUG),1)
|
||||||
|
CFLAGS +=
|
||||||
|
else
|
||||||
|
# note: it seems that the optimizer is generating bad code with `-ox'
|
||||||
|
CFLAGS += -olr
|
||||||
|
endif
|
||||||
|
|
||||||
|
LINK_EXE = $(CXXLD) $(LDFLAGS) -fe=$@ $^ $(LDLIBS)
|
||||||
|
|
||||||
|
endif # wcc
|
||||||
|
|
||||||
|
|
||||||
|
# /***********************************************************************
|
||||||
|
# // malloc debuggers and memory checkers
|
||||||
|
# ************************************************************************/
|
||||||
|
|
||||||
ifeq (1,2)
|
ifeq (1,2)
|
||||||
LDLIBS += -lefence
|
LDLIBS += -lefence
|
||||||
endif
|
endif
|
||||||
@@ -367,17 +506,44 @@ ifeq (1,2)
|
|||||||
endif
|
endif
|
||||||
|
|
||||||
|
|
||||||
###
|
# /***********************************************************************
|
||||||
### extra flags
|
# // finish settings
|
||||||
###
|
# ************************************************************************/
|
||||||
|
|
||||||
|
# C++ defaults
|
||||||
|
ifeq ($(strip $(CXX)),)
|
||||||
|
ifeq ($(strip $(CC)),gcc)
|
||||||
|
CXX = g++
|
||||||
|
else
|
||||||
|
CXX = $(CC)
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
ifeq ($(strip $(CXXLD)),)
|
||||||
|
CXXLD = $(CXX)
|
||||||
|
endif
|
||||||
|
ifeq ($(strip $(CXXFLAGS_OUTPUT)),)
|
||||||
|
CXXFLAGS_OUTPUT = $(CFLAGS_OUTPUT)
|
||||||
|
endif
|
||||||
|
|
||||||
|
|
||||||
|
# extra flags
|
||||||
|
DEFS += $(EXTRA_DEFS)
|
||||||
CFLAGS += $(EXTRA_CFLAGS)
|
CFLAGS += $(EXTRA_CFLAGS)
|
||||||
|
CFLAGS_W += $(EXTRA_CFLAGS_W)
|
||||||
|
CFLAGS_M += $(EXTRA_CFLAGS_M)
|
||||||
|
CFLAGS_O += $(EXTRA_CFLAGS_O)
|
||||||
CXXFLAGS1 += $(EXTRA_CXXFLAGS1)
|
CXXFLAGS1 += $(EXTRA_CXXFLAGS1)
|
||||||
CXXFLAGS2 += $(EXTRA_CXXFLAGS2)
|
CXXFLAGS2 += $(EXTRA_CXXFLAGS2)
|
||||||
LDFLAGS += $(EXTRA_LDFLAGS)
|
LDFLAGS += $(EXTRA_LDFLAGS)
|
||||||
LDLIBS += $(EXTRA_LDLIBS)
|
LDLIBS += $(EXTRA_LDLIBS)
|
||||||
|
|
||||||
|
|
||||||
|
# To better deal with asynchronous exceptions we compile all source
|
||||||
|
# files with exception handling and RTTI enabled - the size overhead
|
||||||
|
# is negligible.
|
||||||
|
CXXFLAGS2 = $(CXXFLAGS1)
|
||||||
|
|
||||||
|
|
||||||
# /***********************************************************************
|
# /***********************************************************************
|
||||||
# // main targets
|
# // main targets
|
||||||
# ************************************************************************/
|
# ************************************************************************/
|
||||||
@@ -386,7 +552,7 @@ all: $(upx_exe)
|
|||||||
|
|
||||||
.PHONY: all unupx mostlyclean clean distclean maintainer-clean untabify tags
|
.PHONY: all unupx mostlyclean clean distclean maintainer-clean untabify tags
|
||||||
|
|
||||||
$(upx_exe): $(OBJECTS) $(LIBS)
|
$(upx_exe): $(OBJECTS) $(LIBS) $(RESOURCES)
|
||||||
$(LINK_EXE)
|
$(LINK_EXE)
|
||||||
$(STUBEDIT_EXE)
|
$(STUBEDIT_EXE)
|
||||||
$(STUBIFY_EXE)
|
$(STUBIFY_EXE)
|
||||||
@@ -404,9 +570,9 @@ mostlyclean:
|
|||||||
-rm -f *.d *.err *.i *.log *.map *~ gdb-trans*
|
-rm -f *.d *.err *.i *.log *.map *~ gdb-trans*
|
||||||
|
|
||||||
clean: mostlyclean
|
clean: mostlyclean
|
||||||
-rm -f *.a *.lib *.o *.obj tags TAGS ID
|
-rm -f *.a *.lib *.o *.obj *.res *.tds tags TAGS ID
|
||||||
-rm -f *.idb *.pdb
|
-rm -f *.idb *.pdb
|
||||||
-rm -f upx upx.exe upx_nrv upx_nrv.exe upx_ucl upx_ucl.exe
|
-rm -f upx upx.exe upx.ttp upx_nrv upx_nrv.exe upx_nrv.ttp upx_ucl upx_ucl.exe upx_ucl.ttp
|
||||||
-rm -rf .deps
|
-rm -rf .deps
|
||||||
|
|
||||||
distclean: clean
|
distclean: clean
|
||||||
@@ -429,36 +595,25 @@ ID:
|
|||||||
# // rules
|
# // rules
|
||||||
# ************************************************************************/
|
# ************************************************************************/
|
||||||
|
|
||||||
.c$o:
|
%$o : %.c
|
||||||
$(CC) $(DEFS) $(INCLUDES) $(CFLAGS) $(CFLAGS_OUTPUT) -c $<
|
$(CC) $(DEFS) $(INCLUDES) $(CFLAGS) $(CFLAGS_OUTPUT) -c $<
|
||||||
|
|
||||||
.cpp$o:
|
%$o : %.cpp
|
||||||
$(CXX) $(DEFS) $(INCLUDES) $(CXXFLAGS1) $(CXXFLAGS_OUTPUT) -c $<
|
|
||||||
|
|
||||||
$(OBJECTS1): %$o : %.cpp
|
|
||||||
$(CXX) $(DEFS) $(INCLUDES) $(CXXFLAGS1) $(CXXFLAGS_OUTPUT) -c $<
|
$(CXX) $(DEFS) $(INCLUDES) $(CXXFLAGS1) $(CXXFLAGS_OUTPUT) -c $<
|
||||||
|
|
||||||
|
ifneq ($(strip $(OBJECTS2)),)
|
||||||
$(OBJECTS2): %$o : %.cpp
|
$(OBJECTS2): %$o : %.cpp
|
||||||
$(CXX) $(DEFS) $(INCLUDES) $(CXXFLAGS2) $(CXXFLAGS_OUTPUT) -c $<
|
$(CXX) $(DEFS) $(INCLUDES) $(CXXFLAGS2) $(CXXFLAGS_OUTPUT) -c $<
|
||||||
|
|
||||||
ifneq ($(strip $(OBJECTS3)),)
|
|
||||||
$(OBJECTS3): %$o : %.c
|
|
||||||
$(CC) $(DEFS) $(INCLUDES) $(CFLAGS) $(CFLAGS_OUTPUT) -c $<
|
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
%.res : %.rc
|
||||||
|
rc -l 0x409 -fo$@ $<
|
||||||
|
|
||||||
|
|
||||||
# /***********************************************************************
|
# /***********************************************************************
|
||||||
# // dependencies
|
# // dependencies
|
||||||
# ************************************************************************/
|
# ************************************************************************/
|
||||||
|
|
||||||
ifeq ($(strip $(wildcard .deps)),)
|
include $(srcdir)/Makefile.dep
|
||||||
DEPS_MAGIC := $(shell mkdir .deps > /dev/null 2>&1 || :)
|
|
||||||
else
|
|
||||||
DEP_FILES := $(wildcard .deps/*.pp)
|
|
||||||
ifneq ($(strip $(DEP_FILES)),)
|
|
||||||
include $(DEP_FILES)
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
|
|
||||||
|
|
||||||
# vi:nowrap
|
# vi:nowrap
|
||||||
|
|||||||
@@ -0,0 +1,16 @@
|
|||||||
|
|
||||||
|
# /***********************************************************************
|
||||||
|
# // automated dependencies
|
||||||
|
# ************************************************************************/
|
||||||
|
|
||||||
|
CFLAGS += -Wp,-MMD,.deps/$(*F).pp
|
||||||
|
|
||||||
|
ifeq ($(strip $(wildcard .deps)),)
|
||||||
|
DEPS_MAGIC := $(shell mkdir .deps > /dev/null 2>&1 || :)
|
||||||
|
else
|
||||||
|
DEP_FILES := $(wildcard .deps/*.pp)
|
||||||
|
ifneq ($(strip $(DEP_FILES)),)
|
||||||
|
include $(DEP_FILES)
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
+5
-3
@@ -1,11 +1,12 @@
|
|||||||
UDIR := $($(U)DIR)
|
UDIR := $($(U)DIR)
|
||||||
|
|
||||||
|
ifneq ($(strip $(wildcard $(UDIR)/include)),) # { include
|
||||||
DEFS += -DWITH_$(U)
|
DEFS += -DWITH_$(U)
|
||||||
|
|
||||||
ifneq ($(strip $(wildcard $(UDIR)/include)),)
|
|
||||||
INCLUDES += -I$(UDIR)/include
|
INCLUDES += -I$(UDIR)/include
|
||||||
endif
|
|
||||||
|
|
||||||
|
ifneq ($(strip $(wildcard $(UDIR)/build/$(target)/src/.libs)),)
|
||||||
|
LIBDIRS += $(UDIR)/build/$(target)/src/.libs
|
||||||
|
endif
|
||||||
ifneq ($(strip $(wildcard $(UDIR)/src/.libs)),)
|
ifneq ($(strip $(wildcard $(UDIR)/src/.libs)),)
|
||||||
LIBDIRS += $(UDIR)/src/.libs
|
LIBDIRS += $(UDIR)/src/.libs
|
||||||
endif
|
endif
|
||||||
@@ -35,3 +36,4 @@ LIBDIRS := $(LIBDIRS)
|
|||||||
LDLIBS := $(LDLIBS)
|
LDLIBS := $(LDLIBS)
|
||||||
DOS_LDLIBS := $(DOS_LDLIBS)
|
DOS_LDLIBS := $(DOS_LDLIBS)
|
||||||
|
|
||||||
|
endif # } include
|
||||||
|
|||||||
+50
-23
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2001 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2002 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2001 Laszlo Molnar
|
Copyright (C) 1996-2002 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
@@ -22,7 +22,7 @@
|
|||||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer Laszlo Molnar
|
Markus F.X.J. Oberhumer Laszlo Molnar
|
||||||
markus@oberhumer.com ml1050@cdata.tvnet.hu
|
<mfx@users.sourceforge.net> <ml1050@users.sourceforge.net>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
@@ -34,18 +34,18 @@
|
|||||||
// access memory in BigEndian and LittleEndian byte order
|
// access memory in BigEndian and LittleEndian byte order
|
||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
|
|
||||||
inline unsigned short get_be16(const void *bb)
|
inline unsigned get_be16(const void *bb)
|
||||||
{
|
{
|
||||||
const upx_bytep const b = reinterpret_cast<const upx_bytep>(bb);
|
const upx_bytep b = reinterpret_cast<const upx_bytep>(bb);
|
||||||
unsigned v;
|
unsigned v;
|
||||||
v = (unsigned) b[1] << 0;
|
v = (unsigned) b[1] << 0;
|
||||||
v |= (unsigned) b[0] << 8;
|
v |= (unsigned) b[0] << 8;
|
||||||
return (unsigned short) v;
|
return v;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline void set_be16(void *bb, unsigned v)
|
inline void set_be16(void *bb, unsigned v)
|
||||||
{
|
{
|
||||||
upx_bytep const b = reinterpret_cast<upx_bytep>(bb);
|
upx_bytep b = reinterpret_cast<upx_bytep>(bb);
|
||||||
b[1] = (unsigned char) (v >> 0);
|
b[1] = (unsigned char) (v >> 0);
|
||||||
b[0] = (unsigned char) (v >> 8);
|
b[0] = (unsigned char) (v >> 8);
|
||||||
}
|
}
|
||||||
@@ -53,7 +53,7 @@ inline void set_be16(void *bb, unsigned v)
|
|||||||
|
|
||||||
inline unsigned get_be32(const void *bb)
|
inline unsigned get_be32(const void *bb)
|
||||||
{
|
{
|
||||||
const upx_bytep const b = reinterpret_cast<const upx_bytep>(bb);
|
const upx_bytep b = reinterpret_cast<const upx_bytep>(bb);
|
||||||
unsigned v;
|
unsigned v;
|
||||||
v = (unsigned) b[3] << 0;
|
v = (unsigned) b[3] << 0;
|
||||||
v |= (unsigned) b[2] << 8;
|
v |= (unsigned) b[2] << 8;
|
||||||
@@ -64,7 +64,7 @@ inline unsigned get_be32(const void *bb)
|
|||||||
|
|
||||||
inline void set_be32(void *bb, unsigned v)
|
inline void set_be32(void *bb, unsigned v)
|
||||||
{
|
{
|
||||||
upx_bytep const b = reinterpret_cast<upx_bytep>(bb);
|
upx_bytep b = reinterpret_cast<upx_bytep>(bb);
|
||||||
b[3] = (unsigned char) (v >> 0);
|
b[3] = (unsigned char) (v >> 0);
|
||||||
b[2] = (unsigned char) (v >> 8);
|
b[2] = (unsigned char) (v >> 8);
|
||||||
b[1] = (unsigned char) (v >> 16);
|
b[1] = (unsigned char) (v >> 16);
|
||||||
@@ -72,9 +72,9 @@ inline void set_be32(void *bb, unsigned v)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
inline unsigned short get_le16(const void *bb)
|
inline unsigned get_le16(const void *bb)
|
||||||
{
|
{
|
||||||
const upx_bytep const b = reinterpret_cast<const upx_bytep>(bb);
|
const upx_bytep b = reinterpret_cast<const upx_bytep>(bb);
|
||||||
unsigned v;
|
unsigned v;
|
||||||
#if defined(__i386__)
|
#if defined(__i386__)
|
||||||
v = * (const unsigned short *) b;
|
v = * (const unsigned short *) b;
|
||||||
@@ -82,12 +82,12 @@ inline unsigned short get_le16(const void *bb)
|
|||||||
v = (unsigned) b[0] << 0;
|
v = (unsigned) b[0] << 0;
|
||||||
v |= (unsigned) b[1] << 8;
|
v |= (unsigned) b[1] << 8;
|
||||||
#endif
|
#endif
|
||||||
return (unsigned short) v;
|
return v;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline void set_le16(void *bb, unsigned v)
|
inline void set_le16(void *bb, unsigned v)
|
||||||
{
|
{
|
||||||
upx_bytep const b = reinterpret_cast<upx_bytep>(bb);
|
upx_bytep b = reinterpret_cast<upx_bytep>(bb);
|
||||||
#if defined(__i386__)
|
#if defined(__i386__)
|
||||||
(* (unsigned short *) b) = (unsigned short) v;
|
(* (unsigned short *) b) = (unsigned short) v;
|
||||||
#else
|
#else
|
||||||
@@ -99,7 +99,7 @@ inline void set_le16(void *bb, unsigned v)
|
|||||||
|
|
||||||
inline unsigned get_le24(const void *bb)
|
inline unsigned get_le24(const void *bb)
|
||||||
{
|
{
|
||||||
const upx_bytep const b = reinterpret_cast<const upx_bytep>(bb);
|
const upx_bytep b = reinterpret_cast<const upx_bytep>(bb);
|
||||||
unsigned v;
|
unsigned v;
|
||||||
v = (unsigned) b[0] << 0;
|
v = (unsigned) b[0] << 0;
|
||||||
v |= (unsigned) b[1] << 8;
|
v |= (unsigned) b[1] << 8;
|
||||||
@@ -109,7 +109,7 @@ inline unsigned get_le24(const void *bb)
|
|||||||
|
|
||||||
inline void set_le24(void *bb, unsigned v)
|
inline void set_le24(void *bb, unsigned v)
|
||||||
{
|
{
|
||||||
upx_bytep const b = reinterpret_cast<upx_bytep>(bb);
|
upx_bytep b = reinterpret_cast<upx_bytep>(bb);
|
||||||
b[0] = (unsigned char) (v >> 0);
|
b[0] = (unsigned char) (v >> 0);
|
||||||
b[1] = (unsigned char) (v >> 8);
|
b[1] = (unsigned char) (v >> 8);
|
||||||
b[2] = (unsigned char) (v >> 16);
|
b[2] = (unsigned char) (v >> 16);
|
||||||
@@ -118,7 +118,7 @@ inline void set_le24(void *bb, unsigned v)
|
|||||||
|
|
||||||
inline unsigned get_le32(const void *bb)
|
inline unsigned get_le32(const void *bb)
|
||||||
{
|
{
|
||||||
const upx_bytep const b = reinterpret_cast<const upx_bytep>(bb);
|
const upx_bytep b = reinterpret_cast<const upx_bytep>(bb);
|
||||||
unsigned v;
|
unsigned v;
|
||||||
#if defined(__i386__)
|
#if defined(__i386__)
|
||||||
v = * (const unsigned *) b;
|
v = * (const unsigned *) b;
|
||||||
@@ -133,7 +133,7 @@ inline unsigned get_le32(const void *bb)
|
|||||||
|
|
||||||
inline void set_le32(void *bb, unsigned v)
|
inline void set_le32(void *bb, unsigned v)
|
||||||
{
|
{
|
||||||
upx_bytep const b = reinterpret_cast<upx_bytep>(bb);
|
upx_bytep b = reinterpret_cast<upx_bytep>(bb);
|
||||||
#if defined(__i386__)
|
#if defined(__i386__)
|
||||||
(* (unsigned *) b) = v;
|
(* (unsigned *) b) = v;
|
||||||
#else
|
#else
|
||||||
@@ -163,7 +163,8 @@ public:
|
|||||||
BE16& operator |= (unsigned v) { set_be16(d, get_be16(d) | v); return *this; }
|
BE16& operator |= (unsigned v) { set_be16(d, get_be16(d) | v); return *this; }
|
||||||
|
|
||||||
operator const unsigned () const { return get_be16(d); }
|
operator const unsigned () const { return get_be16(d); }
|
||||||
};
|
}
|
||||||
|
__attribute_packed;
|
||||||
|
|
||||||
|
|
||||||
class BE32
|
class BE32
|
||||||
@@ -180,7 +181,8 @@ public:
|
|||||||
BE32& operator |= (unsigned v) { set_be32(d, get_be32(d) | v); return *this; }
|
BE32& operator |= (unsigned v) { set_be32(d, get_be32(d) | v); return *this; }
|
||||||
|
|
||||||
operator const unsigned () const { return get_be32(d); }
|
operator const unsigned () const { return get_be32(d); }
|
||||||
};
|
}
|
||||||
|
__attribute_packed;
|
||||||
|
|
||||||
|
|
||||||
class LE16
|
class LE16
|
||||||
@@ -197,7 +199,8 @@ public:
|
|||||||
LE16& operator |= (unsigned v) { set_le16(d, get_le16(d) | v); return *this; }
|
LE16& operator |= (unsigned v) { set_le16(d, get_le16(d) | v); return *this; }
|
||||||
|
|
||||||
operator const unsigned () const { return get_le16(d); }
|
operator const unsigned () const { return get_le16(d); }
|
||||||
};
|
}
|
||||||
|
__attribute_packed;
|
||||||
|
|
||||||
|
|
||||||
class LE32
|
class LE32
|
||||||
@@ -214,7 +217,8 @@ public:
|
|||||||
LE32& operator |= (unsigned v) { set_le32(d, get_le32(d) | v); return *this; }
|
LE32& operator |= (unsigned v) { set_le32(d, get_le32(d) | v); return *this; }
|
||||||
|
|
||||||
operator const unsigned () const { return get_le32(d); }
|
operator const unsigned () const { return get_le32(d); }
|
||||||
};
|
}
|
||||||
|
__attribute_packed;
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
@@ -242,6 +246,27 @@ inline bool operator < (const LE32& v1, const LE32& v2)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template <class T>
|
||||||
|
inline T* operator + (T* ptr, const BE16& v) { return ptr + (const unsigned) v; }
|
||||||
|
template <class T>
|
||||||
|
inline T* operator - (T* ptr, const BE16& v) { return ptr - (const unsigned) v; }
|
||||||
|
|
||||||
|
template <class T>
|
||||||
|
inline T* operator + (T* ptr, const BE32& v) { return ptr + (const unsigned) v; }
|
||||||
|
template <class T>
|
||||||
|
inline T* operator - (T* ptr, const BE32& v) { return ptr - (const unsigned) v; }
|
||||||
|
|
||||||
|
template <class T>
|
||||||
|
inline T* operator + (T* ptr, const LE16& v) { return ptr + (const unsigned) v; }
|
||||||
|
template <class T>
|
||||||
|
inline T* operator - (T* ptr, const LE16& v) { return ptr - (const unsigned) v; }
|
||||||
|
|
||||||
|
template <class T>
|
||||||
|
inline T* operator + (T* ptr, const LE32& v) { return ptr + (const unsigned) v; }
|
||||||
|
template <class T>
|
||||||
|
inline T* operator - (T* ptr, const LE32& v) { return ptr - (const unsigned) v; }
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
// misc
|
// misc
|
||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
@@ -255,10 +280,12 @@ int le32_compare(const void *e1, const void *e2);
|
|||||||
|
|
||||||
// just for testing...
|
// just for testing...
|
||||||
#if 0 && defined(__i386__) && defined(__GNUC__)
|
#if 0 && defined(__i386__) && defined(__GNUC__)
|
||||||
typedef unsigned short LE16_unaligned __attribute__((aligned(1)));
|
# if (__GNUC_VERSION_HEX__ >= 0x030100)
|
||||||
typedef unsigned int LE32_unaligned __attribute__((aligned(1)));
|
typedef unsigned short LE16_unaligned __attribute__((__packed__,__aligned__(1)));
|
||||||
|
typedef unsigned int LE32_unaligned __attribute__((__packed__,__aligned__(1)));
|
||||||
# define LE16 LE16_unaligned
|
# define LE16 LE16_unaligned
|
||||||
# define LE32 LE32_unaligned
|
# define LE32 LE32_unaligned
|
||||||
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
+4
-4
@@ -1,9 +1,9 @@
|
|||||||
/* c_file.cpp -- file console output
|
/* c_file.cpp --
|
||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2001 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2002 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2001 Laszlo Molnar
|
Copyright (C) 1996-2002 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
@@ -22,7 +22,7 @@
|
|||||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer Laszlo Molnar
|
Markus F.X.J. Oberhumer Laszlo Molnar
|
||||||
markus@oberhumer.com ml1050@cdata.tvnet.hu
|
<mfx@users.sourceforge.net> <ml1050@users.sourceforge.net>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
+4
-4
@@ -1,9 +1,9 @@
|
|||||||
/* c_init.cpp -- console initialization
|
/* c_init.cpp --
|
||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2001 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2002 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2001 Laszlo Molnar
|
Copyright (C) 1996-2002 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
@@ -22,7 +22,7 @@
|
|||||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer Laszlo Molnar
|
Markus F.X.J. Oberhumer Laszlo Molnar
|
||||||
markus@oberhumer.com ml1050@cdata.tvnet.hu
|
<mfx@users.sourceforge.net> <ml1050@users.sourceforge.net>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
+4
-4
@@ -1,9 +1,9 @@
|
|||||||
/* c_none.cpp -- dummy console output
|
/* c_none.cpp --
|
||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2001 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2002 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2001 Laszlo Molnar
|
Copyright (C) 1996-2002 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
@@ -22,7 +22,7 @@
|
|||||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer Laszlo Molnar
|
Markus F.X.J. Oberhumer Laszlo Molnar
|
||||||
markus@oberhumer.com ml1050@cdata.tvnet.hu
|
<mfx@users.sourceforge.net> <ml1050@users.sourceforge.net>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
+4
-4
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2001 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2002 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2001 Laszlo Molnar
|
Copyright (C) 1996-2002 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
@@ -22,7 +22,7 @@
|
|||||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer Laszlo Molnar
|
Markus F.X.J. Oberhumer Laszlo Molnar
|
||||||
markus@oberhumer.com ml1050@cdata.tvnet.hu
|
<mfx@users.sourceforge.net> <ml1050@users.sourceforge.net>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
@@ -196,7 +196,7 @@ static void print0(FILE *f, const char *ss)
|
|||||||
|
|
||||||
// Note:
|
// Note:
|
||||||
// We use 2 passes to avoid unnecessary system calls because
|
// We use 2 passes to avoid unnecessary system calls because
|
||||||
// scrollUp() under Win95/98 is *extremely* slow.
|
// scrollUp() under Win32 is *extremely* slow.
|
||||||
UNUSED(f);
|
UNUSED(f);
|
||||||
|
|
||||||
screen->getCursor(screen,&old_cx,&old_cy);
|
screen->getCursor(screen,&old_cx,&old_cy);
|
||||||
|
|||||||
+171
-73
@@ -1,9 +1,9 @@
|
|||||||
/* compress.cpp -- interface to the compression library
|
/* compress.cpp --
|
||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2001 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2002 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2001 Laszlo Molnar
|
Copyright (C) 1996-2002 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
@@ -22,16 +22,57 @@
|
|||||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer Laszlo Molnar
|
Markus F.X.J. Oberhumer Laszlo Molnar
|
||||||
markus@oberhumer.com ml1050@cdata.tvnet.hu
|
<mfx@users.sourceforge.net> <ml1050@users.sourceforge.net>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
#include "conf.h"
|
#include "conf.h"
|
||||||
|
#include "version.h"
|
||||||
|
|
||||||
#if defined(WITH_UCL) && !defined(WITH_NRV)
|
#if 0 && defined(WITH_NRV) && defined(__i386__)
|
||||||
|
# define NRV_USE_ASM
|
||||||
|
#endif
|
||||||
|
#if 0 && defined(WITH_UCL) && defined(__i386__)
|
||||||
|
# define UCL_USE_ASM
|
||||||
|
#endif
|
||||||
|
#if defined(WITH_NRV)
|
||||||
|
# include <nrv/nrv2b.h>
|
||||||
|
# include <nrv/nrv2d.h>
|
||||||
|
//# include <nrv/nrv2e.h>
|
||||||
|
# if !defined(NRV_VERSION) || (NRV_VERSION < 0x008000L)
|
||||||
|
# error
|
||||||
|
# endif
|
||||||
|
NRV_EXTERN_CDECL(int) nrv2b_99_compress_internal(const upx_byte *, ...);
|
||||||
|
NRV_EXTERN_CDECL(int) nrv2d_99_compress_internal(const upx_byte *, ...);
|
||||||
|
NRV_EXTERN_CDECL(int) nrv2e_99_compress_internal(const upx_byte *, ...);
|
||||||
|
#elif defined(WITH_UCL)
|
||||||
# define nrv2b_99_compress_internal ucl_nrv2b_99_compress
|
# define nrv2b_99_compress_internal ucl_nrv2b_99_compress
|
||||||
# define nrv2d_99_compress_internal ucl_nrv2d_99_compress
|
# define nrv2d_99_compress_internal ucl_nrv2d_99_compress
|
||||||
# if 0 && defined(__i386__)
|
# define nrv2e_99_compress_internal ucl_nrv2e_99_compress
|
||||||
|
#endif
|
||||||
|
#if 1 && defined(WITH_NRV) && defined(NRV_USE_ASM)
|
||||||
|
# if 1 && defined(NRV_USE_ASM)
|
||||||
|
# define nrv2b_decompress_safe_8 nrv2b_decompress_asm_safe_8
|
||||||
|
# define nrv2b_decompress_safe_le16 nrv2b_decompress_asm_safe_le16
|
||||||
|
# define nrv2b_decompress_safe_le32 nrv2b_decompress_asm_safe_le32
|
||||||
|
# define nrv2d_decompress_safe_8 nrv2d_decompress_asm_safe_8
|
||||||
|
# define nrv2d_decompress_safe_le16 nrv2d_decompress_asm_safe_le16
|
||||||
|
# define nrv2d_decompress_safe_le32 nrv2d_decompress_asm_safe_le32
|
||||||
|
# define nrv2e_decompress_safe_8 nrv2e_decompress_asm_safe_8
|
||||||
|
# define nrv2e_decompress_safe_le16 nrv2e_decompress_asm_safe_le16
|
||||||
|
# define nrv2e_decompress_safe_le32 nrv2e_decompress_asm_safe_le32
|
||||||
|
# endif
|
||||||
|
NRV_EXTERN_CDECL(int) nrv2b_decompress_safe_8(const upx_byte *, ...);
|
||||||
|
NRV_EXTERN_CDECL(int) nrv2b_decompress_safe_le16(const upx_byte *, ...);
|
||||||
|
NRV_EXTERN_CDECL(int) nrv2b_decompress_safe_le32(const upx_byte *, ...);
|
||||||
|
NRV_EXTERN_CDECL(int) nrv2d_decompress_safe_8(const upx_byte *, ...);
|
||||||
|
NRV_EXTERN_CDECL(int) nrv2d_decompress_safe_le16(const upx_byte *, ...);
|
||||||
|
NRV_EXTERN_CDECL(int) nrv2d_decompress_safe_le32(const upx_byte *, ...);
|
||||||
|
NRV_EXTERN_CDECL(int) nrv2e_decompress_safe_8(const upx_byte *, ...);
|
||||||
|
NRV_EXTERN_CDECL(int) nrv2e_decompress_safe_le16(const upx_byte *, ...);
|
||||||
|
NRV_EXTERN_CDECL(int) nrv2e_decompress_safe_le32(const upx_byte *, ...);
|
||||||
|
#elif defined(WITH_UCL)
|
||||||
|
# if defined(UCL_USE_ASM)
|
||||||
# include <ucl/ucl_asm.h>
|
# include <ucl/ucl_asm.h>
|
||||||
# define nrv2b_decompress_safe_8 ucl_nrv2b_decompress_asm_safe_8
|
# define nrv2b_decompress_safe_8 ucl_nrv2b_decompress_asm_safe_8
|
||||||
# define nrv2b_decompress_safe_le16 ucl_nrv2b_decompress_asm_safe_le16
|
# define nrv2b_decompress_safe_le16 ucl_nrv2b_decompress_asm_safe_le16
|
||||||
@@ -39,6 +80,9 @@
|
|||||||
# define nrv2d_decompress_safe_8 ucl_nrv2d_decompress_asm_safe_8
|
# define nrv2d_decompress_safe_8 ucl_nrv2d_decompress_asm_safe_8
|
||||||
# define nrv2d_decompress_safe_le16 ucl_nrv2d_decompress_asm_safe_le16
|
# define nrv2d_decompress_safe_le16 ucl_nrv2d_decompress_asm_safe_le16
|
||||||
# define nrv2d_decompress_safe_le32 ucl_nrv2d_decompress_asm_safe_le32
|
# define nrv2d_decompress_safe_le32 ucl_nrv2d_decompress_asm_safe_le32
|
||||||
|
# define nrv2e_decompress_safe_8 ucl_nrv2e_decompress_asm_safe_8
|
||||||
|
# define nrv2e_decompress_safe_le16 ucl_nrv2e_decompress_asm_safe_le16
|
||||||
|
# define nrv2e_decompress_safe_le32 ucl_nrv2e_decompress_asm_safe_le32
|
||||||
# else
|
# else
|
||||||
# define nrv2b_decompress_safe_8 ucl_nrv2b_decompress_safe_8
|
# define nrv2b_decompress_safe_8 ucl_nrv2b_decompress_safe_8
|
||||||
# define nrv2b_decompress_safe_le16 ucl_nrv2b_decompress_safe_le16
|
# define nrv2b_decompress_safe_le16 ucl_nrv2b_decompress_safe_le16
|
||||||
@@ -46,36 +90,12 @@
|
|||||||
# define nrv2d_decompress_safe_8 ucl_nrv2d_decompress_safe_8
|
# define nrv2d_decompress_safe_8 ucl_nrv2d_decompress_safe_8
|
||||||
# define nrv2d_decompress_safe_le16 ucl_nrv2d_decompress_safe_le16
|
# define nrv2d_decompress_safe_le16 ucl_nrv2d_decompress_safe_le16
|
||||||
# define nrv2d_decompress_safe_le32 ucl_nrv2d_decompress_safe_le32
|
# define nrv2d_decompress_safe_le32 ucl_nrv2d_decompress_safe_le32
|
||||||
|
# define nrv2e_decompress_safe_8 ucl_nrv2e_decompress_safe_8
|
||||||
|
# define nrv2e_decompress_safe_le16 ucl_nrv2e_decompress_safe_le16
|
||||||
|
# define nrv2e_decompress_safe_le32 ucl_nrv2e_decompress_safe_le32
|
||||||
# endif
|
# endif
|
||||||
#endif
|
#else
|
||||||
|
|
||||||
#if defined(WITH_NRV)
|
|
||||||
# include <nrv/nrv2b.h>
|
|
||||||
# include <nrv/nrv2d.h>
|
|
||||||
# if !defined(NRV_VERSION) || (NRV_VERSION < 0x007300L)
|
|
||||||
# error
|
# error
|
||||||
# endif
|
|
||||||
# if 1 && defined(__i386__)
|
|
||||||
# define nrv2b_decompress_safe_8 nrv2b_decompress_asm_safe_8
|
|
||||||
# define nrv2b_decompress_safe_le16 nrv2b_decompress_asm_safe_le16
|
|
||||||
# define nrv2d_decompress_safe_8 nrv2d_decompress_asm_safe_8
|
|
||||||
# define nrv2d_decompress_safe_le16 nrv2d_decompress_asm_safe_le16
|
|
||||||
# if (NRV_VERSION < 0x008000L)
|
|
||||||
# define nrv2b_decompress_safe_le32 nrv2b_decompress_asm_safe
|
|
||||||
# define nrv2d_decompress_safe_le32 nrv2d_decompress_asm_safe
|
|
||||||
# else
|
|
||||||
# define nrv2b_decompress_safe_le32 nrv2b_decompress_asm_safe_le32
|
|
||||||
# define nrv2d_decompress_safe_le32 nrv2d_decompress_asm_safe_le32
|
|
||||||
# endif
|
|
||||||
# endif
|
|
||||||
NRV_EXTERN_CDECL(int) nrv2b_99_compress_internal(...);
|
|
||||||
NRV_EXTERN_CDECL(int) nrv2d_99_compress_internal(...);
|
|
||||||
NRV_EXTERN_CDECL(int) nrv2b_decompress_safe_8(...);
|
|
||||||
NRV_EXTERN_CDECL(int) nrv2b_decompress_safe_le16(...);
|
|
||||||
NRV_EXTERN_CDECL(int) nrv2b_decompress_safe_le32(...);
|
|
||||||
NRV_EXTERN_CDECL(int) nrv2d_decompress_safe_8(...);
|
|
||||||
NRV_EXTERN_CDECL(int) nrv2d_decompress_safe_le16(...);
|
|
||||||
NRV_EXTERN_CDECL(int) nrv2d_decompress_safe_le32(...);
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if 0 && defined(WITH_ZLIB) && defined(M_ZLIB)
|
#if 0 && defined(WITH_ZLIB) && defined(M_ZLIB)
|
||||||
@@ -87,14 +107,11 @@
|
|||||||
//
|
//
|
||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
|
|
||||||
unsigned upx_adler32(unsigned adler, const void *buf, unsigned len)
|
unsigned upx_adler32(const void *buf, unsigned len, unsigned adler)
|
||||||
{
|
{
|
||||||
if (buf == NULL)
|
if (len == 0)
|
||||||
{
|
return adler;
|
||||||
assert(adler == 0);
|
assert(buf != NULL);
|
||||||
assert(len == 0);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
#if defined(WITH_NRV)
|
#if defined(WITH_NRV)
|
||||||
return nrv_adler32(adler, (const nrv_byte *)buf, len);
|
return nrv_adler32(adler, (const nrv_byte *)buf, len);
|
||||||
#elif defined(WITH_UCL)
|
#elif defined(WITH_UCL)
|
||||||
@@ -103,14 +120,28 @@ unsigned upx_adler32(unsigned adler, const void *buf, unsigned len)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
unsigned upx_adler32(const void *buf, unsigned len)
|
#if (UPX_VERSION_HEX >= 0x019000)
|
||||||
|
unsigned upx_adler32(unsigned adler, const void *buf, unsigned len)
|
||||||
{
|
{
|
||||||
//unsigned adler = upx_adler32(0, NULL, 0);
|
return upx_adler32(buf, len, adler);
|
||||||
unsigned adler = 1;
|
|
||||||
assert(buf != NULL);
|
|
||||||
adler = upx_adler32(adler, buf, len);
|
|
||||||
return adler;
|
|
||||||
}
|
}
|
||||||
|
#endif /* UPX_VERSION_HEX */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#if 0 // NOT USED
|
||||||
|
unsigned upx_crc32(const void *buf, unsigned len, unsigned crc)
|
||||||
|
{
|
||||||
|
if (len == 0)
|
||||||
|
return crc;
|
||||||
|
assert(buf != NULL);
|
||||||
|
#if defined(WITH_NRV)
|
||||||
|
return nrv_crc32(crc, (const nrv_byte *)buf, len);
|
||||||
|
#elif defined(WITH_UCL)
|
||||||
|
return ucl_crc32(crc, (const ucl_byte *)buf, len);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
@@ -162,18 +193,22 @@ int upx_compress ( const upx_byte *src, upx_uint src_len,
|
|||||||
// prepare bit-buffer settings
|
// prepare bit-buffer settings
|
||||||
conf.bb_endian = 0;
|
conf.bb_endian = 0;
|
||||||
conf.bb_size = 0;
|
conf.bb_size = 0;
|
||||||
if (method == M_NRV2B_LE32 || method == M_NRV2D_LE32)
|
if (method >= M_NRV2B_LE32 && method <= M_NRV2E_LE16)
|
||||||
|
{
|
||||||
|
int n = (method - M_NRV2B_LE32) % 3;
|
||||||
|
if (n == 0)
|
||||||
conf.bb_size = 32;
|
conf.bb_size = 32;
|
||||||
else if (method == M_NRV2B_8 || method == M_NRV2D_8)
|
else if (n == 1)
|
||||||
conf.bb_size = 8;
|
conf.bb_size = 8;
|
||||||
else if (method == M_NRV2B_LE16 || method == M_NRV2D_LE16)
|
else
|
||||||
conf.bb_size = 16;
|
conf.bb_size = 16;
|
||||||
|
}
|
||||||
else
|
else
|
||||||
throwInternalError("unknown compression method");
|
throwInternalError("unknown compression method");
|
||||||
|
|
||||||
#if 1 && defined(WITH_NRV)
|
#if 1 && defined(WITH_NRV)
|
||||||
if (level == 1 && conf.bb_size == 32 &&
|
if (level == 1 && conf.bb_size == 32 &&
|
||||||
conf.max_offset == UPX_UINT_MAX && conf.max_match == UPX_UINT_MAX)
|
conf.max_offset >= src_len && conf.max_match >= src_len)
|
||||||
{
|
{
|
||||||
if (method == M_NRV2B_LE32)
|
if (method == M_NRV2B_LE32)
|
||||||
{
|
{
|
||||||
@@ -191,6 +226,16 @@ int upx_compress ( const upx_byte *src, upx_uint src_len,
|
|||||||
#endif
|
#endif
|
||||||
r = nrv2d_1_16_compress(src, src_len, dst, dst_len, wrkmem);
|
r = nrv2d_1_16_compress(src, src_len, dst, dst_len, wrkmem);
|
||||||
}
|
}
|
||||||
|
#if 0
|
||||||
|
else if (method == M_NRV2E_LE32)
|
||||||
|
{
|
||||||
|
upx_byte wrkmem[NRV2E_1_16_MEM_COMPRESS];
|
||||||
|
#if defined(__UPX_CHECKER)
|
||||||
|
memset(wrkmem,0,NRV2E_1_16_MEM_COMPRESS);
|
||||||
|
#endif
|
||||||
|
r = nrv2e_1_16_compress(src, src_len, dst, dst_len, wrkmem);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
else
|
else
|
||||||
throwInternalError("unknown compression method");
|
throwInternalError("unknown compression method");
|
||||||
return r;
|
return r;
|
||||||
@@ -203,12 +248,12 @@ int upx_compress ( const upx_byte *src, upx_uint src_len,
|
|||||||
else if (level == 4 && conf.max_offset == UPX_UINT_MAX)
|
else if (level == 4 && conf.max_offset == UPX_UINT_MAX)
|
||||||
conf.max_offset = 32*1024-1;
|
conf.max_offset = 32*1024-1;
|
||||||
#if defined(WITH_NRV)
|
#if defined(WITH_NRV)
|
||||||
else if (level <= 7 && conf.max_offset == UPX_UINT_MAX)
|
else if (level <= 6 && conf.max_offset == UPX_UINT_MAX)
|
||||||
conf.max_offset = 1024*1024-1;
|
conf.max_offset = 1*1024*1024-1;
|
||||||
else if (level <= 8 && conf.max_offset == UPX_UINT_MAX)
|
else if (level <= 8 && conf.max_offset == UPX_UINT_MAX)
|
||||||
conf.max_offset = 2048*1024-1;
|
conf.max_offset = 2*1024*1024-1;
|
||||||
else if (level <= 10 && conf.max_offset == UPX_UINT_MAX)
|
else if (level <= 10 && conf.max_offset == UPX_UINT_MAX)
|
||||||
conf.max_offset = 4096*1024-1;
|
conf.max_offset = 4*1024*1024-1;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if M_IS_NRV2B(method)
|
if M_IS_NRV2B(method)
|
||||||
@@ -217,6 +262,11 @@ int upx_compress ( const upx_byte *src, upx_uint src_len,
|
|||||||
else if M_IS_NRV2D(method)
|
else if M_IS_NRV2D(method)
|
||||||
r = nrv2d_99_compress_internal(src, src_len, dst, dst_len,
|
r = nrv2d_99_compress_internal(src, src_len, dst, dst_len,
|
||||||
cb, level, &conf, result);
|
cb, level, &conf, result);
|
||||||
|
#if 0
|
||||||
|
else if M_IS_NRV2E(method)
|
||||||
|
r = nrv2e_99_compress_internal(src, src_len, dst, dst_len,
|
||||||
|
cb, level, &conf, result);
|
||||||
|
#endif
|
||||||
else
|
else
|
||||||
throwInternalError("unknown compression method");
|
throwInternalError("unknown compression method");
|
||||||
|
|
||||||
@@ -248,20 +298,42 @@ int upx_decompress ( const upx_byte *src, upx_uint src_len,
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (method == M_NRV2B_LE32)
|
switch (method)
|
||||||
r = nrv2b_decompress_safe_le32(src,src_len,dst,dst_len,NULL);
|
{
|
||||||
else if (method == M_NRV2B_8)
|
case M_NRV2B_8:
|
||||||
r = nrv2b_decompress_safe_8(src,src_len,dst,dst_len,NULL);
|
r = nrv2b_decompress_safe_8(src,src_len,dst,dst_len,NULL);
|
||||||
else if (method == M_NRV2B_LE16)
|
break;
|
||||||
|
case M_NRV2B_LE16:
|
||||||
r = nrv2b_decompress_safe_le16(src,src_len,dst,dst_len,NULL);
|
r = nrv2b_decompress_safe_le16(src,src_len,dst,dst_len,NULL);
|
||||||
else if (method == M_NRV2D_LE32)
|
break;
|
||||||
r = nrv2d_decompress_safe_le32(src,src_len,dst,dst_len,NULL);
|
case M_NRV2B_LE32:
|
||||||
else if (method == M_NRV2D_8)
|
r = nrv2b_decompress_safe_le32(src,src_len,dst,dst_len,NULL);
|
||||||
|
break;
|
||||||
|
case M_NRV2D_8:
|
||||||
r = nrv2d_decompress_safe_8(src,src_len,dst,dst_len,NULL);
|
r = nrv2d_decompress_safe_8(src,src_len,dst,dst_len,NULL);
|
||||||
else if (method == M_NRV2D_LE16)
|
break;
|
||||||
|
case M_NRV2D_LE16:
|
||||||
r = nrv2d_decompress_safe_le16(src,src_len,dst,dst_len,NULL);
|
r = nrv2d_decompress_safe_le16(src,src_len,dst,dst_len,NULL);
|
||||||
else
|
break;
|
||||||
|
case M_NRV2D_LE32:
|
||||||
|
r = nrv2d_decompress_safe_le32(src,src_len,dst,dst_len,NULL);
|
||||||
|
break;
|
||||||
|
#if 0
|
||||||
|
case M_NRV2E_8:
|
||||||
|
r = nrv2e_decompress_safe_8(src,src_len,dst,dst_len,NULL);
|
||||||
|
break;
|
||||||
|
case M_NRV2E_LE16:
|
||||||
|
r = nrv2e_decompress_safe_le16(src,src_len,dst,dst_len,NULL);
|
||||||
|
break;
|
||||||
|
case M_NRV2E_LE32:
|
||||||
|
r = nrv2e_decompress_safe_le32(src,src_len,dst,dst_len,NULL);
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
default:
|
||||||
throwInternalError("unknown decompression method");
|
throwInternalError("unknown decompression method");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -270,29 +342,55 @@ int upx_decompress ( const upx_byte *src, upx_uint src_len,
|
|||||||
//
|
//
|
||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
|
|
||||||
|
#if (UPX_VERSION_HEX >= 0x019000)
|
||||||
|
|
||||||
int upx_test_overlap ( const upx_byte *buf, upx_uint src_off,
|
int upx_test_overlap ( const upx_byte *buf, upx_uint src_off,
|
||||||
upx_uint src_len, upx_uint *dst_len,
|
upx_uint src_len, upx_uint *dst_len,
|
||||||
int method )
|
int method )
|
||||||
{
|
{
|
||||||
int r = UPX_E_ERROR;
|
int r = UPX_E_ERROR;
|
||||||
|
|
||||||
if (method == M_NRV2B_LE32)
|
switch (method)
|
||||||
r = ucl_nrv2b_test_overlap_le32(buf,src_off,src_len,dst_len,NULL);
|
{
|
||||||
else if (method == M_NRV2B_8)
|
case M_NRV2B_8:
|
||||||
r = ucl_nrv2b_test_overlap_8(buf,src_off,src_len,dst_len,NULL);
|
r = ucl_nrv2b_test_overlap_8(buf,src_off,src_len,dst_len,NULL);
|
||||||
else if (method == M_NRV2B_LE16)
|
break;
|
||||||
|
case M_NRV2B_LE16:
|
||||||
r = ucl_nrv2b_test_overlap_le16(buf,src_off,src_len,dst_len,NULL);
|
r = ucl_nrv2b_test_overlap_le16(buf,src_off,src_len,dst_len,NULL);
|
||||||
else if (method == M_NRV2D_LE32)
|
break;
|
||||||
r = ucl_nrv2d_test_overlap_le32(buf,src_off,src_len,dst_len,NULL);
|
case M_NRV2B_LE32:
|
||||||
else if (method == M_NRV2D_8)
|
r = ucl_nrv2b_test_overlap_le32(buf,src_off,src_len,dst_len,NULL);
|
||||||
|
break;
|
||||||
|
case M_NRV2D_8:
|
||||||
r = ucl_nrv2d_test_overlap_8(buf,src_off,src_len,dst_len,NULL);
|
r = ucl_nrv2d_test_overlap_8(buf,src_off,src_len,dst_len,NULL);
|
||||||
else if (method == M_NRV2D_LE16)
|
break;
|
||||||
|
case M_NRV2D_LE16:
|
||||||
r = ucl_nrv2d_test_overlap_le16(buf,src_off,src_len,dst_len,NULL);
|
r = ucl_nrv2d_test_overlap_le16(buf,src_off,src_len,dst_len,NULL);
|
||||||
else
|
break;
|
||||||
|
case M_NRV2D_LE32:
|
||||||
|
r = ucl_nrv2d_test_overlap_le32(buf,src_off,src_len,dst_len,NULL);
|
||||||
|
break;
|
||||||
|
#if 0
|
||||||
|
case M_NRV2E_8:
|
||||||
|
r = ucl_nrv2e_test_overlap_8(buf,src_off,src_len,dst_len,NULL);
|
||||||
|
break;
|
||||||
|
case M_NRV2E_LE16:
|
||||||
|
r = ucl_nrv2e_test_overlap_le16(buf,src_off,src_len,dst_len,NULL);
|
||||||
|
break;
|
||||||
|
case M_NRV2E_LE32:
|
||||||
|
r = ucl_nrv2e_test_overlap_le32(buf,src_off,src_len,dst_len,NULL);
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
default:
|
||||||
throwInternalError("unknown decompression method");
|
throwInternalError("unknown decompression method");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endif /* UPX_VERSION_HEX */
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
vi:ts=4:et:nowrap
|
vi:ts=4:et:nowrap
|
||||||
|
|||||||
+101
-42
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2001 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2002 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2001 Laszlo Molnar
|
Copyright (C) 1996-2002 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
@@ -22,7 +22,7 @@
|
|||||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer Laszlo Molnar
|
Markus F.X.J. Oberhumer Laszlo Molnar
|
||||||
markus@oberhumer.com ml1050@cdata.tvnet.hu
|
<mfx@users.sourceforge.net> <ml1050@users.sourceforge.net>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
@@ -58,24 +58,6 @@
|
|||||||
#undef unix
|
#undef unix
|
||||||
|
|
||||||
|
|
||||||
#if defined(WITH_UCL)
|
|
||||||
# include <ucl/uclconf.h>
|
|
||||||
# include <ucl/ucl.h>
|
|
||||||
# if !defined(UPX_UINT_MAX)
|
|
||||||
# define UPX_UINT_MAX UCL_UINT_MAX
|
|
||||||
# define upx_uint ucl_uint
|
|
||||||
# define upx_voidp ucl_voidp
|
|
||||||
# define upx_uintp ucl_uintp
|
|
||||||
# define upx_byte ucl_byte
|
|
||||||
# define upx_bytep ucl_bytep
|
|
||||||
# define upx_bool ucl_bool
|
|
||||||
# define upx_progress_callback_t ucl_progress_callback_t
|
|
||||||
# define UPX_E_OK UCL_E_OK
|
|
||||||
# define UPX_E_ERROR UCL_E_ERROR
|
|
||||||
# define UPX_E_OUT_OF_MEMORY UCL_E_OUT_OF_MEMORY
|
|
||||||
# define __UPX_ENTRY __UCL_ENTRY
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
#if defined(WITH_NRV)
|
#if defined(WITH_NRV)
|
||||||
# include <nrv/nrvconf.h>
|
# include <nrv/nrvconf.h>
|
||||||
# if !defined(UPX_UINT_MAX)
|
# if !defined(UPX_UINT_MAX)
|
||||||
@@ -92,6 +74,30 @@
|
|||||||
# define UPX_E_OUT_OF_MEMORY NRV_E_OUT_OF_MEMORY
|
# define UPX_E_OUT_OF_MEMORY NRV_E_OUT_OF_MEMORY
|
||||||
# define __UPX_ENTRY __NRV_ENTRY
|
# define __UPX_ENTRY __NRV_ENTRY
|
||||||
# endif
|
# endif
|
||||||
|
# if 1 && defined(__i386__) && !defined(__BORLANDC__) && !defined(__DMC__)
|
||||||
|
# define NRV_USE_ASM
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
#if defined(WITH_UCL)
|
||||||
|
# include <ucl/uclconf.h>
|
||||||
|
# include <ucl/ucl.h>
|
||||||
|
# if !defined(UCL_VERSION) || (UCL_VERSION < 0x010100L)
|
||||||
|
# error "please upgrade your UCL installation"
|
||||||
|
# endif
|
||||||
|
# if !defined(UPX_UINT_MAX)
|
||||||
|
# define UPX_UINT_MAX UCL_UINT_MAX
|
||||||
|
# define upx_uint ucl_uint
|
||||||
|
# define upx_voidp ucl_voidp
|
||||||
|
# define upx_uintp ucl_uintp
|
||||||
|
# define upx_byte ucl_byte
|
||||||
|
# define upx_bytep ucl_bytep
|
||||||
|
# define upx_bool ucl_bool
|
||||||
|
# define upx_progress_callback_t ucl_progress_callback_t
|
||||||
|
# define UPX_E_OK UCL_E_OK
|
||||||
|
# define UPX_E_ERROR UCL_E_ERROR
|
||||||
|
# define UPX_E_OUT_OF_MEMORY UCL_E_OUT_OF_MEMORY
|
||||||
|
# define __UPX_ENTRY __UCL_ENTRY
|
||||||
|
# endif
|
||||||
#endif
|
#endif
|
||||||
#if !defined(__UPX_CHECKER)
|
#if !defined(__UPX_CHECKER)
|
||||||
# if defined(__UCL_CHECKER) || defined(__NRV_CHECKER)
|
# if defined(__UCL_CHECKER) || defined(__NRV_CHECKER)
|
||||||
@@ -104,9 +110,6 @@
|
|||||||
#if !defined(WITH_UCL)
|
#if !defined(WITH_UCL)
|
||||||
# error "you lose"
|
# error "you lose"
|
||||||
#endif
|
#endif
|
||||||
#if !defined(UCL_VERSION) || (UCL_VERSION < 0x009200L)
|
|
||||||
# error "please upgrade your UCL installation"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef WITH_ZLIB
|
#ifndef WITH_ZLIB
|
||||||
# define WITH_ZLIB 1
|
# define WITH_ZLIB 1
|
||||||
@@ -196,6 +199,17 @@
|
|||||||
// portab
|
// portab
|
||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
|
|
||||||
|
#if defined(__GNUC__) && !defined(__GNUC_VERSION_HEX__)
|
||||||
|
# if !defined(__GNUC_MINOR__)
|
||||||
|
# error
|
||||||
|
# endif
|
||||||
|
# if !defined(__GNUC_PATCHLEVEL__)
|
||||||
|
# define __GNUC_PATCHLEVEL__ 0
|
||||||
|
# endif
|
||||||
|
# define __GNUC_VERSION_HEX__ \
|
||||||
|
(__GNUC__ * 0x10000L + __GNUC_MINOR__ * 0x100 + __GNUC_PATCHLEVEL__)
|
||||||
|
#endif
|
||||||
|
|
||||||
#if defined(NO_BOOL)
|
#if defined(NO_BOOL)
|
||||||
typedef int bool;
|
typedef int bool;
|
||||||
enum { false, true };
|
enum { false, true };
|
||||||
@@ -297,8 +311,41 @@ typedef RETSIGTYPE (SIGTYPEENTRY *sig_type)(int);
|
|||||||
#define outp upx_outp
|
#define outp upx_outp
|
||||||
|
|
||||||
|
|
||||||
#define COMPILE_TIME_ASSERT(expr) \
|
#if 0
|
||||||
{ typedef int __upx_compile_time_assert_fail[(expr) ? 1 : -1]; }
|
# define COMPILE_TIME_ASSERT(expr) \
|
||||||
|
{ typedef char __upx_compile_time_assert_fail[1 - 2 * !(expr)]; \
|
||||||
|
switch (sizeof(__upx_compile_time_assert_fail)) { \
|
||||||
|
case 1: case !(expr): break; \
|
||||||
|
} }
|
||||||
|
#elif defined(__SC__)
|
||||||
|
# define COMPILE_TIME_ASSERT(expr) \
|
||||||
|
{ switch (1) { case 1: case !(expr): break; } }
|
||||||
|
#elif 0
|
||||||
|
# define COMPILE_TIME_ASSERT(expr) \
|
||||||
|
{ typedef int __upx_compile_time_assert_fail[1 - 2 * !(expr)]; typedef int a[sizeof(__upx_compile_time_assert_fail]; }
|
||||||
|
#else
|
||||||
|
# define COMPILE_TIME_ASSERT(expr) \
|
||||||
|
{ typedef int __upx_compile_time_assert_fail[1 - 2 * !(expr)]; }
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#undef __attribute_packed
|
||||||
|
#if defined(__GNUC__)
|
||||||
|
# if 1 && defined(__i386__)
|
||||||
|
# define __attribute_packed
|
||||||
|
# else
|
||||||
|
# define __attribute_packed __attribute__((__packed__,__aligned__(1)))
|
||||||
|
# endif
|
||||||
|
#else
|
||||||
|
# define __attribute_packed
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#if defined(__cplusplus)
|
||||||
|
#define NOTHROW throw()
|
||||||
|
#else
|
||||||
|
#define NOTHROW
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
@@ -316,6 +363,10 @@ typedef RETSIGTYPE (SIGTYPEENTRY *sig_type)(int);
|
|||||||
# define O_BINARY 0
|
# define O_BINARY 0
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if defined(__DMC__)
|
||||||
|
# undef tell
|
||||||
|
#endif
|
||||||
|
|
||||||
#if defined(__DJGPP__)
|
#if defined(__DJGPP__)
|
||||||
# undef sopen
|
# undef sopen
|
||||||
# undef USE_SETMODE
|
# undef USE_SETMODE
|
||||||
@@ -328,13 +379,15 @@ typedef RETSIGTYPE (SIGTYPEENTRY *sig_type)(int);
|
|||||||
|
|
||||||
#undef UNUSED
|
#undef UNUSED
|
||||||
#if 1
|
#if 1
|
||||||
|
# define UNUSED(var) ((void) &(var))
|
||||||
|
#elif 1 && defined(__GNUC__)
|
||||||
# define UNUSED(var) { typedef int __upx_unused[sizeof(var) ? 1 : -1]; }
|
# define UNUSED(var) { typedef int __upx_unused[sizeof(var) ? 1 : -1]; }
|
||||||
#elif 1
|
#elif 0
|
||||||
# define UNUSED(var) do { } while (!sizeof(var))
|
# define UNUSED(var) do { } while (!sizeof(var))
|
||||||
#elif defined(__BORLANDC__)
|
#elif defined(__BORLANDC__)
|
||||||
# define UNUSED(var) ((void)(var))
|
# define UNUSED(parm) ((void)(parm))
|
||||||
#else
|
#else
|
||||||
# define UNUSED(var) (var = var)
|
# define UNUSED(parm) (parm = parm)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define HIGH(array) ((unsigned) (sizeof(array)/sizeof((array)[0])))
|
#define HIGH(array) ((unsigned) (sizeof(array)/sizeof((array)[0])))
|
||||||
@@ -379,22 +432,24 @@ inline void operator delete[](void *p)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
// A autoheap_array allocates memory on the heap, but automatically
|
// An Array allocates memory on the heap, but automatically
|
||||||
// gets destructed when leaving scope or on exceptions.
|
// gets destructed when leaving scope or on exceptions.
|
||||||
// "var" is declared as a read-only reference to a pointer
|
// "var" is declared as a read-only reference to a pointer
|
||||||
// and behaves exactly like an array "var[]".
|
// and behaves exactly like an array "var[]".
|
||||||
#if 0
|
#if 0
|
||||||
# define autoheap_array(type, var, size) \
|
# define Array(type, var, size) \
|
||||||
assert((int)(size) > 0); \
|
assert((int)(size) > 0); \
|
||||||
vector<type> var ## _autoheap_vec((size)); \
|
std::vector<type> var ## _array_vec((size)); \
|
||||||
type * const & var = & var ## _autoheap_vec[0]
|
type * const & var = & var ## _array_vec[0]
|
||||||
#else
|
#else
|
||||||
# define autoheap_array(type, var, size) \
|
# define Array(type, var, size) \
|
||||||
assert((int)(size) > 0); \
|
assert((int)(size) > 0); \
|
||||||
MemBuffer var ## _autoheap_buf((size)*(sizeof(type))); \
|
MemBuffer var ## _array_buf((size)*(sizeof(type))); \
|
||||||
type * const & var = (type *) (unsigned char *) var ## _autoheap_buf
|
type * const & var = ((type *) var ## _array_buf.getVoidPtr())
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#define ByteArray(var, size) Array(unsigned char, var, size)
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
//
|
//
|
||||||
@@ -421,9 +476,13 @@ inline void operator delete[](void *p)
|
|||||||
#define M_NRV2D_LE32 5
|
#define M_NRV2D_LE32 5
|
||||||
#define M_NRV2D_8 6
|
#define M_NRV2D_8 6
|
||||||
#define M_NRV2D_LE16 7
|
#define M_NRV2D_LE16 7
|
||||||
|
#define M_NRV2E_LE32 8
|
||||||
|
#define M_NRV2E_8 9
|
||||||
|
#define M_NRV2E_LE16 10
|
||||||
|
|
||||||
#define M_IS_NRV2B(x) ((x) >= M_NRV2B_LE32 && (x) <= M_NRV2B_LE16)
|
#define M_IS_NRV2B(x) ((x) >= M_NRV2B_LE32 && (x) <= M_NRV2B_LE16)
|
||||||
#define M_IS_NRV2D(x) ((x) >= M_NRV2D_LE32 && (x) <= M_NRV2D_LE16)
|
#define M_IS_NRV2D(x) ((x) >= M_NRV2D_LE32 && (x) <= M_NRV2D_LE16)
|
||||||
|
#define M_IS_NRV2E(x) ((x) >= M_NRV2E_LE32 && (x) <= M_NRV2E_LE16)
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
@@ -530,7 +589,7 @@ struct options_t {
|
|||||||
int compress_exports;
|
int compress_exports;
|
||||||
int compress_icons;
|
int compress_icons;
|
||||||
int compress_resources;
|
int compress_resources;
|
||||||
signed char compress_rt[24]; // 24 == RT_LAST
|
signed char compress_rt[25]; // 25 == RT_LAST
|
||||||
int strip_relocs;
|
int strip_relocs;
|
||||||
} w32pe;
|
} w32pe;
|
||||||
};
|
};
|
||||||
@@ -553,7 +612,7 @@ void e_exit(int ec);
|
|||||||
void printSetNl(int need_nl);
|
void printSetNl(int need_nl);
|
||||||
void printClearLine(FILE *f = NULL);
|
void printClearLine(FILE *f = NULL);
|
||||||
void printErr(const char *iname, const Throwable *e);
|
void printErr(const char *iname, const Throwable *e);
|
||||||
void printUnhandledException(const char *iname, const exception *e);
|
void printUnhandledException(const char *iname, const std::exception *e);
|
||||||
#if defined(__GNUC__)
|
#if defined(__GNUC__)
|
||||||
void printErr(const char *iname, const char *format, ...)
|
void printErr(const char *iname, const char *format, ...)
|
||||||
__attribute__((format(printf,2,3)));
|
__attribute__((format(printf,2,3)));
|
||||||
@@ -594,12 +653,10 @@ void show_version(int);
|
|||||||
|
|
||||||
|
|
||||||
// compress.cpp
|
// compress.cpp
|
||||||
unsigned upx_adler32(const void *buf, unsigned len);
|
unsigned upx_adler32(const void *buf, unsigned len, unsigned adler=1);
|
||||||
unsigned upx_adler32(unsigned adler, const void *buf, unsigned len);
|
unsigned upx_adler32(unsigned adler, const void *buf, unsigned len);
|
||||||
|
|
||||||
#if defined(WITH_UCL)
|
#if defined(WITH_NRV)
|
||||||
#define upx_compress_config_t ucl_compress_config_t
|
|
||||||
#elif defined(WITH_NRV)
|
|
||||||
struct nrv_compress_config_t;
|
struct nrv_compress_config_t;
|
||||||
struct nrv_compress_config_t
|
struct nrv_compress_config_t
|
||||||
{
|
{
|
||||||
@@ -614,6 +671,8 @@ struct nrv_compress_config_t
|
|||||||
nrv_uint m_size;
|
nrv_uint m_size;
|
||||||
};
|
};
|
||||||
#define upx_compress_config_t nrv_compress_config_t
|
#define upx_compress_config_t nrv_compress_config_t
|
||||||
|
#elif defined(WITH_UCL)
|
||||||
|
#define upx_compress_config_t ucl_compress_config_t
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
int upx_compress ( const upx_byte *src, upx_uint src_len,
|
int upx_compress ( const upx_byte *src, upx_uint src_len,
|
||||||
|
|||||||
+3
-3
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2001 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2002 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2001 Laszlo Molnar
|
Copyright (C) 1996-2002 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
@@ -22,7 +22,7 @@
|
|||||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer Laszlo Molnar
|
Markus F.X.J. Oberhumer Laszlo Molnar
|
||||||
markus@oberhumer.com ml1050@cdata.tvnet.hu
|
<mfx@users.sourceforge.net> <ml1050@users.sourceforge.net>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
+47
-8
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2001 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2002 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2001 Laszlo Molnar
|
Copyright (C) 1996-2002 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
@@ -22,13 +22,54 @@
|
|||||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer Laszlo Molnar
|
Markus F.X.J. Oberhumer Laszlo Molnar
|
||||||
markus@oberhumer.com ml1050@cdata.tvnet.hu
|
<mfx@users.sourceforge.net> <ml1050@users.sourceforge.net>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
#include "conf.h"
|
#include "conf.h"
|
||||||
|
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
//
|
||||||
|
**************************************************************************/
|
||||||
|
|
||||||
|
long Throwable::counter = 0;
|
||||||
|
|
||||||
|
Throwable::Throwable(const char *m, int e, bool w)
|
||||||
|
: super(), msg(NULL), err(e), is_warning(w)
|
||||||
|
{
|
||||||
|
if (m)
|
||||||
|
msg = strdup(m);
|
||||||
|
#if 0
|
||||||
|
fprintf(stderr, "construct exception: %s %ld\n", msg, counter);
|
||||||
|
counter++;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Throwable::Throwable(Throwable const &other)
|
||||||
|
: super(other), msg(NULL), err(other.err), is_warning(other.is_warning)
|
||||||
|
{
|
||||||
|
if (other.msg)
|
||||||
|
msg = strdup(other.msg);
|
||||||
|
#if 0
|
||||||
|
fprintf(stderr, "copy exception: %s %ld\n", msg, counter);
|
||||||
|
counter++;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Throwable::~Throwable() NOTHROW
|
||||||
|
{
|
||||||
|
#if 0
|
||||||
|
counter--;
|
||||||
|
fprintf(stderr, "destruct exception: %s %ld\n", msg, counter);
|
||||||
|
#endif
|
||||||
|
if (msg)
|
||||||
|
free(msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
// compression
|
// compression
|
||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
@@ -135,18 +176,16 @@ void throwEOFException(const char *msg, int e)
|
|||||||
|
|
||||||
const char *prettyName(const char *n)
|
const char *prettyName(const char *n)
|
||||||
{
|
{
|
||||||
#if defined(__GNUC__)
|
if (n == NULL)
|
||||||
|
return "";
|
||||||
while (*n >= '0' && *n <= '9') // gcc
|
while (*n >= '0' && *n <= '9') // gcc
|
||||||
n++;
|
n++;
|
||||||
#endif
|
|
||||||
#if defined(_MSC_VER)
|
|
||||||
if (strncmp(n, "class ", 6) == 0) // Visual C++
|
if (strncmp(n, "class ", 6) == 0) // Visual C++
|
||||||
n += 6;
|
n += 6;
|
||||||
#endif
|
|
||||||
return n;
|
return n;
|
||||||
}
|
}
|
||||||
|
|
||||||
const char *prettyName(const type_info &ti)
|
const char *prettyName(const std::type_info &ti)
|
||||||
{
|
{
|
||||||
return prettyName(ti.name());
|
return prettyName(ti.name());
|
||||||
}
|
}
|
||||||
|
|||||||
+30
-20
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2001 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2002 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2001 Laszlo Molnar
|
Copyright (C) 1996-2002 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
@@ -22,7 +22,7 @@
|
|||||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer Laszlo Molnar
|
Markus F.X.J. Oberhumer Laszlo Molnar
|
||||||
markus@oberhumer.com ml1050@cdata.tvnet.hu
|
<mfx@users.sourceforge.net> <ml1050@users.sourceforge.net>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
@@ -32,31 +32,41 @@
|
|||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
|
||||||
const char *prettyName(const char *n);
|
const char *prettyName(const char *n);
|
||||||
const char *prettyName(const type_info &ti);
|
const char *prettyName(const std::type_info &ti);
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
// exceptions
|
// exceptions
|
||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
|
|
||||||
class Throwable : public exception
|
class Throwable : public std::exception
|
||||||
{
|
{
|
||||||
|
typedef std::exception super;
|
||||||
protected:
|
protected:
|
||||||
Throwable(const char *m = 0, int e = 0, bool w = false)
|
Throwable(const char *m = 0, int e = 0, bool w = false);
|
||||||
: msg(m), err(e), is_warning(w) { }
|
|
||||||
public:
|
public:
|
||||||
virtual ~Throwable() { }
|
Throwable(Throwable const &);
|
||||||
|
virtual ~Throwable() NOTHROW;
|
||||||
const char *getMsg() const { return msg; }
|
const char *getMsg() const { return msg; }
|
||||||
int getErrno() const { return err; }
|
int getErrno() const { return err; }
|
||||||
bool isWarning() const { return is_warning; }
|
bool isWarning() const { return is_warning; }
|
||||||
private:
|
private:
|
||||||
//Throwable(const Throwable &);
|
char *msg;
|
||||||
private:
|
|
||||||
// void * operator new(size_t); // ...
|
|
||||||
const char *msg;
|
|
||||||
int err;
|
int err;
|
||||||
protected:
|
protected:
|
||||||
bool is_warning; // can be set by subclasses
|
bool is_warning; // can be set by subclasses
|
||||||
|
|
||||||
|
private:
|
||||||
|
// disable assignment
|
||||||
|
Throwable& operator= (Throwable const &);
|
||||||
|
// disable dynamic allocation
|
||||||
|
#ifndef new
|
||||||
|
static void *operator new (size_t); // {}
|
||||||
|
static void *operator new[] (size_t); // {}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
private:
|
||||||
|
static long counter; // for debugging
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@@ -196,25 +206,25 @@ public:
|
|||||||
#undef NORET
|
#undef NORET
|
||||||
#if 0 && defined(__GNUC__)
|
#if 0 && defined(__GNUC__)
|
||||||
// (noreturn) is probably not the correct semantics for throwing exceptions
|
// (noreturn) is probably not the correct semantics for throwing exceptions
|
||||||
#define NORET __attribute__((noreturn))
|
#define NORET __attribute__((__noreturn__))
|
||||||
#else
|
#else
|
||||||
#define NORET
|
#define NORET
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void throwCantPack(const char *msg) NORET;
|
void throwCantPack(const char *msg) NORET;
|
||||||
void throwUnknownExecutableFormat(const char *msg = 0, bool warn = false) NORET;
|
void throwUnknownExecutableFormat(const char *msg = NULL, bool warn = false) NORET;
|
||||||
void throwNotCompressible(const char *msg = 0) NORET;
|
void throwNotCompressible(const char *msg = NULL) NORET;
|
||||||
void throwAlreadyPacked(const char *msg = 0) NORET;
|
void throwAlreadyPacked(const char *msg = NULL) NORET;
|
||||||
void throwAlreadyPackedByUPX(const char *msg = 0) NORET;
|
void throwAlreadyPackedByUPX(const char *msg = NULL) NORET;
|
||||||
void throwCantUnpack(const char *msg) NORET;
|
void throwCantUnpack(const char *msg) NORET;
|
||||||
void throwNotPacked(const char *msg = 0) NORET;
|
void throwNotPacked(const char *msg = NULL) NORET;
|
||||||
void throwFilterException() NORET;
|
void throwFilterException() NORET;
|
||||||
void throwBadLoader() NORET;
|
void throwBadLoader() NORET;
|
||||||
void throwChecksumError() NORET;
|
void throwChecksumError() NORET;
|
||||||
void throwCompressedDataViolation() NORET;
|
void throwCompressedDataViolation() NORET;
|
||||||
void throwInternalError(const char *msg) NORET;
|
void throwInternalError(const char *msg) NORET;
|
||||||
void throwIOException(const char *msg = 0, int e = 0) NORET;
|
void throwIOException(const char *msg = NULL, int e = 0) NORET;
|
||||||
void throwEOFException(const char *msg = 0, int e = 0) NORET;
|
void throwEOFException(const char *msg = NULL, int e = 0) NORET;
|
||||||
|
|
||||||
#undef NORET
|
#undef NORET
|
||||||
|
|
||||||
|
|||||||
+32
-24
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2001 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2002 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2001 Laszlo Molnar
|
Copyright (C) 1996-2002 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
@@ -22,7 +22,7 @@
|
|||||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer Laszlo Molnar
|
Markus F.X.J. Oberhumer Laszlo Molnar
|
||||||
markus@oberhumer.com ml1050@cdata.tvnet.hu
|
<mfx@users.sourceforge.net> <ml1050@users.sourceforge.net>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
@@ -85,6 +85,25 @@ FileBase::~FileBase()
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void FileBase::sopen()
|
||||||
|
{
|
||||||
|
if (_shflags < 0)
|
||||||
|
_fd = ::open(_name,_flags,_mode);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
#if defined(__DJGPP__)
|
||||||
|
_fd = ::open(_name,_flags | _shflags, _mode);
|
||||||
|
#elif defined(__MINT__)
|
||||||
|
_fd = ::open(_name,_flags | (_shflags & O_SHMODE), _mode);
|
||||||
|
#elif defined(SH_DENYRW)
|
||||||
|
_fd = ::sopen(_name,_flags,_shflags,_mode);
|
||||||
|
#else
|
||||||
|
assert(0);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
bool FileBase::close()
|
bool FileBase::close()
|
||||||
{
|
{
|
||||||
bool ok = true;
|
bool ok = true;
|
||||||
@@ -213,16 +232,7 @@ void InputFile::sopen(const char *name, int flags, int shflags)
|
|||||||
_flags = flags;
|
_flags = flags;
|
||||||
_shflags = shflags;
|
_shflags = shflags;
|
||||||
_mode = 0;
|
_mode = 0;
|
||||||
if (shflags < 0)
|
FileBase::sopen();
|
||||||
_fd = ::open(_name,_flags);
|
|
||||||
else
|
|
||||||
#if defined(__DJGPP__)
|
|
||||||
_fd = ::open(_name,_flags | _shflags);
|
|
||||||
#elif defined(SH_DENYRW)
|
|
||||||
_fd = ::sopen(_name,_flags,_shflags);
|
|
||||||
#else
|
|
||||||
assert(0);
|
|
||||||
#endif
|
|
||||||
if (!isOpen())
|
if (!isOpen())
|
||||||
{
|
{
|
||||||
if (errno == ENOENT)
|
if (errno == ENOENT)
|
||||||
@@ -281,16 +291,7 @@ void OutputFile::sopen(const char *name, int flags, int shflags, int mode)
|
|||||||
_flags = flags;
|
_flags = flags;
|
||||||
_shflags = shflags;
|
_shflags = shflags;
|
||||||
_mode = mode;
|
_mode = mode;
|
||||||
if (shflags < 0)
|
FileBase::sopen();
|
||||||
_fd = ::open(_name,_flags,_mode);
|
|
||||||
else
|
|
||||||
#if defined(__DJGPP__)
|
|
||||||
_fd = ::open(_name,_flags | _shflags, _mode);
|
|
||||||
#elif defined(SH_DENYRW)
|
|
||||||
_fd = ::sopen(_name,_flags,_shflags,_mode);
|
|
||||||
#else
|
|
||||||
assert(0);
|
|
||||||
#endif
|
|
||||||
if (!isOpen())
|
if (!isOpen())
|
||||||
{
|
{
|
||||||
#if 0
|
#if 0
|
||||||
@@ -323,7 +324,9 @@ bool OutputFile::openStdout(int flags, bool force)
|
|||||||
if (flags != 0)
|
if (flags != 0)
|
||||||
{
|
{
|
||||||
assert(flags == O_BINARY);
|
assert(flags == O_BINARY);
|
||||||
#if defined(HAVE_SETMODE) && defined(USE_SETMODE)
|
#if defined(__MINT__)
|
||||||
|
__set_binmode(stdout, 1);
|
||||||
|
#elif defined(HAVE_SETMODE) && defined(USE_SETMODE)
|
||||||
if (setmode(_fd, O_BINARY) == -1)
|
if (setmode(_fd, O_BINARY) == -1)
|
||||||
throwIOException(_name,errno);
|
throwIOException(_name,errno);
|
||||||
#if defined(__DJGPP__)
|
#if defined(__DJGPP__)
|
||||||
@@ -358,6 +361,8 @@ void OutputFile::dump(const char *name, const void *buf, int len, int flags)
|
|||||||
//
|
//
|
||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
|
||||||
MemoryOutputFile::MemoryOutputFile() :
|
MemoryOutputFile::MemoryOutputFile() :
|
||||||
b(NULL), b_size(0), b_pos(0), bytes_written(0)
|
b(NULL), b_size(0), b_pos(0), bytes_written(0)
|
||||||
{
|
{
|
||||||
@@ -378,6 +383,9 @@ void MemoryOutputFile::write(const void *buf, int len)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* if 0 */
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
vi:ts=4:et
|
vi:ts=4:et
|
||||||
*/
|
*/
|
||||||
|
|||||||
+8
-5
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2001 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2002 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2001 Laszlo Molnar
|
Copyright (C) 1996-2002 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
@@ -22,7 +22,7 @@
|
|||||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer Laszlo Molnar
|
Markus F.X.J. Oberhumer Laszlo Molnar
|
||||||
markus@oberhumer.com ml1050@cdata.tvnet.hu
|
<mfx@users.sourceforge.net> <ml1050@users.sourceforge.net>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
@@ -56,6 +56,7 @@ public:
|
|||||||
const char *getName() const { return _name; }
|
const char *getName() const { return _name; }
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
void sopen();
|
||||||
virtual int read(void *buf, int len);
|
virtual int read(void *buf, int len);
|
||||||
virtual int readx(void *buf, int len);
|
virtual int readx(void *buf, int len);
|
||||||
virtual void write(const void *buf, int len);
|
virtual void write(const void *buf, int len);
|
||||||
@@ -89,8 +90,8 @@ public:
|
|||||||
sopen(name, flags, -1);
|
sopen(name, flags, -1);
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual int read(void * buf, int len);
|
virtual int read(void *buf, int len);
|
||||||
virtual int readx(void * buf, int len);
|
virtual int readx(void *buf, int len);
|
||||||
|
|
||||||
virtual void seek(off_t off, int whence);
|
virtual void seek(off_t off, int whence);
|
||||||
virtual off_t tell() const;
|
virtual off_t tell() const;
|
||||||
@@ -144,6 +145,7 @@ protected:
|
|||||||
//
|
//
|
||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
|
|
||||||
|
#if 0
|
||||||
class MemoryOutputFile : public FileBase
|
class MemoryOutputFile : public FileBase
|
||||||
{
|
{
|
||||||
typedef FileBase super;
|
typedef FileBase super;
|
||||||
@@ -166,6 +168,7 @@ protected:
|
|||||||
unsigned b_pos;
|
unsigned b_pos;
|
||||||
off_t bytes_written;
|
off_t bytes_written;
|
||||||
};
|
};
|
||||||
|
#endif /* if 0 */
|
||||||
|
|
||||||
|
|
||||||
#endif /* already included */
|
#endif /* already included */
|
||||||
|
|||||||
+16
-13
@@ -49,7 +49,7 @@ void show_head(void)
|
|||||||
fg = con_fg(f,FG_GREEN);
|
fg = con_fg(f,FG_GREEN);
|
||||||
con_fprintf(f,
|
con_fprintf(f,
|
||||||
" Ultimate Packer for eXecutables\n"
|
" Ultimate Packer for eXecutables\n"
|
||||||
" Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001\n"
|
" Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002\n"
|
||||||
"UPX %-12s Markus F.X.J. Oberhumer & Laszlo Molnar %20s\n\n",
|
"UPX %-12s Markus F.X.J. Oberhumer & Laszlo Molnar %20s\n\n",
|
||||||
#if defined(__MFX_DOS)
|
#if defined(__MFX_DOS)
|
||||||
V("d"),
|
V("d"),
|
||||||
@@ -74,7 +74,7 @@ void show_usage(void)
|
|||||||
{
|
{
|
||||||
FILE *f = con_term;
|
FILE *f = con_term;
|
||||||
|
|
||||||
con_fprintf(f,"Usage: %s [-123456788dlthVL] [-qvfk] [-o file] %sfile..\n", progname,
|
con_fprintf(f,"Usage: %s [-123456789dlthVL] [-qvfk] [-o file] %sfile..\n", progname,
|
||||||
#if defined(__DJGPP__) || defined(__EMX__)
|
#if defined(__DJGPP__) || defined(__EMX__)
|
||||||
"[@]");
|
"[@]");
|
||||||
#else
|
#else
|
||||||
@@ -295,7 +295,7 @@ void show_license(void)
|
|||||||
|
|
||||||
show_head();
|
show_head();
|
||||||
|
|
||||||
con_fprintf(f,
|
con_fprintf(f,
|
||||||
" This program may be used freely, and you are welcome to\n"
|
" This program may be used freely, and you are welcome to\n"
|
||||||
" redistribute it under certain conditions.\n"
|
" redistribute it under certain conditions.\n"
|
||||||
"\n"
|
"\n"
|
||||||
@@ -310,16 +310,15 @@ con_fprintf(f,
|
|||||||
"\n"
|
"\n"
|
||||||
);
|
);
|
||||||
int fg = con_fg(f,FG_CYAN);
|
int fg = con_fg(f,FG_CYAN);
|
||||||
con_fprintf(f,
|
con_fprintf(f,
|
||||||
" http://upx.tsx.org\n"
|
" http://upx.sourceforge.net\n"
|
||||||
" http://www.oberhumer.com/upx/\n"
|
" http://www.oberhumer.com/opensource/upx/\n"
|
||||||
" http://wildsau.idv.uni-linz.ac.at/mfx/upx.html\n"
|
|
||||||
);
|
);
|
||||||
(void)con_fg(f,FG_ORANGE);
|
(void)con_fg(f,FG_ORANGE);
|
||||||
con_fprintf(f,
|
con_fprintf(f,
|
||||||
"\n"
|
"\n"
|
||||||
" Markus F.X.J. Oberhumer Laszlo Molnar\n"
|
" Markus F.X.J. Oberhumer Laszlo Molnar\n"
|
||||||
" markus@oberhumer.com ml1050@cdata.tvnet.hu\n"
|
" <mfx@users.sourceforge.net> <ml1050@users.sourceforge.net>\n"
|
||||||
);
|
);
|
||||||
fg = con_fg(f,fg);
|
fg = con_fg(f,fg);
|
||||||
}
|
}
|
||||||
@@ -334,16 +333,20 @@ void show_version(int x)
|
|||||||
FILE *f = stdout;
|
FILE *f = stdout;
|
||||||
UNUSED(x);
|
UNUSED(x);
|
||||||
|
|
||||||
fprintf(f,"upx %s\n",UPX_VERSION_STRING);
|
#if 0 && defined(__GNUC__)
|
||||||
|
fprintf(f,"upx %s (gcc 0x%lx)\n", UPX_VERSION_STRING, __GNUC_VERSION_HEX__);
|
||||||
|
#else
|
||||||
|
fprintf(f,"upx %s\n", UPX_VERSION_STRING);
|
||||||
|
#endif
|
||||||
#if defined(WITH_NRV)
|
#if defined(WITH_NRV)
|
||||||
fprintf(f,"NRV data compression library %s\n", nrv_version_string());
|
fprintf(f,"NRV data compression library %s\n", nrv_version_string());
|
||||||
#endif
|
#endif
|
||||||
#if defined(WITH_UCL)
|
#if defined(WITH_UCL)
|
||||||
fprintf(f,"UCL data compression library %s\n", ucl_version_string());
|
fprintf(f,"UCL data compression library %s\n", ucl_version_string());
|
||||||
#endif
|
#endif
|
||||||
fprintf(f,"Copyright (C) 1996-2001 Markus Franz Xaver Johannes Oberhumer\n");
|
fprintf(f,"Copyright (C) 1996-2002 Markus Franz Xaver Johannes Oberhumer\n");
|
||||||
fprintf(f,"Copyright (C) 1996-2001 Laszlo Molnar\n");
|
fprintf(f,"Copyright (C) 1996-2002 Laszlo Molnar\n");
|
||||||
fprintf(f,"Copyright (C) 2000-2001 John F. Reiser\n");
|
fprintf(f,"Copyright (C) 2000-2002 John F. Reiser\n");
|
||||||
fprintf(f,"UPX comes with ABSOLUTELY NO WARRANTY; for details type `%s -L'.\n", progname);
|
fprintf(f,"UPX comes with ABSOLUTELY NO WARRANTY; for details type `%s -L'.\n", progname);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+28
-11
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2001 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2002 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2001 Laszlo Molnar
|
Copyright (C) 1996-2002 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
@@ -22,7 +22,7 @@
|
|||||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer Laszlo Molnar
|
Markus F.X.J. Oberhumer Laszlo Molnar
|
||||||
markus@oberhumer.com ml1050@cdata.tvnet.hu
|
<mfx@users.sourceforge.net> <ml1050@users.sourceforge.net>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
@@ -32,8 +32,13 @@
|
|||||||
#include "lefile.h"
|
#include "lefile.h"
|
||||||
|
|
||||||
|
|
||||||
LeFile::LeFile(InputFile *f) : fif(f)
|
LeFile::LeFile(InputFile *f) :
|
||||||
|
fif(f), fof(NULL),
|
||||||
|
le_offset(0), exe_offset(0)
|
||||||
{
|
{
|
||||||
|
COMPILE_TIME_ASSERT(sizeof(le_header_t) == 196);
|
||||||
|
COMPILE_TIME_ASSERT(sizeof(le_object_table_entry_t) == 24);
|
||||||
|
COMPILE_TIME_ASSERT(sizeof(le_pagemap_entry_t) == 4);
|
||||||
memset(&ih,0,sizeof ih);
|
memset(&ih,0,sizeof ih);
|
||||||
memset(&oh,0,sizeof oh);
|
memset(&oh,0,sizeof oh);
|
||||||
iobject_table = oobject_table = NULL;
|
iobject_table = oobject_table = NULL;
|
||||||
@@ -43,7 +48,6 @@ LeFile::LeFile(InputFile *f) : fif(f)
|
|||||||
ifixups = ofixups = NULL;
|
ifixups = ofixups = NULL;
|
||||||
inonres_names = ononres_names = NULL;
|
inonres_names = ononres_names = NULL;
|
||||||
ientries = oentries = NULL;
|
ientries = oentries = NULL;
|
||||||
le_offset = exe_offset = 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -168,6 +172,18 @@ void LeFile::writeFixups()
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
unsigned LeFile::getImageSize() const
|
||||||
|
{
|
||||||
|
unsigned n = 0;
|
||||||
|
if (ih.memory_pages > 0)
|
||||||
|
{
|
||||||
|
n = (ih.memory_pages - 1) * ih.memory_page_size;
|
||||||
|
n += ih.bytes_on_last_page;
|
||||||
|
}
|
||||||
|
return n;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void LeFile::readImage()
|
void LeFile::readImage()
|
||||||
{
|
{
|
||||||
soimage = pages*mps;
|
soimage = pages*mps;
|
||||||
@@ -295,7 +311,8 @@ void LeFile::writeFile(OutputFile *f, bool le)
|
|||||||
|
|
||||||
void LeFile::countFixups(unsigned *counts) const
|
void LeFile::countFixups(unsigned *counts) const
|
||||||
{
|
{
|
||||||
memset(counts,0,sizeof(unsigned)*(objects+2));
|
const unsigned o = objects;
|
||||||
|
memset(counts,0,sizeof(unsigned)*(o+2));
|
||||||
// counts[0..objects-1] - # of 32-bit offset relocations in for that objects
|
// counts[0..objects-1] - # of 32-bit offset relocations in for that objects
|
||||||
// counts[objects] - # of selector fixups
|
// counts[objects] - # of selector fixups
|
||||||
// counts[objects+1] - # of self-relative fixups
|
// counts[objects+1] - # of self-relative fixups
|
||||||
@@ -311,7 +328,7 @@ void LeFile::countFixups(unsigned *counts) const
|
|||||||
switch (*fix)
|
switch (*fix)
|
||||||
{
|
{
|
||||||
case 2: // selector fixup
|
case 2: // selector fixup
|
||||||
counts[objects] += 9;
|
counts[o] += 9;
|
||||||
fix += 5;
|
fix += 5;
|
||||||
break;
|
break;
|
||||||
case 0x12: // alias selector
|
case 0x12: // alias selector
|
||||||
@@ -320,7 +337,7 @@ void LeFile::countFixups(unsigned *counts) const
|
|||||||
fix += (fix[1] & 0x10) ? 9 : 7;
|
fix += (fix[1] & 0x10) ? 9 : 7;
|
||||||
break;
|
break;
|
||||||
case 6: // 16:32 pointer
|
case 6: // 16:32 pointer
|
||||||
counts[objects] += 9;
|
counts[o] += 9;
|
||||||
case 7: // 32-bit offset
|
case 7: // 32-bit offset
|
||||||
counts[fix[4]-1] += 4;
|
counts[fix[4]-1] += 4;
|
||||||
fix += (fix[1] & 0x10) ? 9 : 7;
|
fix += (fix[1] & 0x10) ? 9 : 7;
|
||||||
@@ -332,15 +349,15 @@ void LeFile::countFixups(unsigned *counts) const
|
|||||||
fix += ll*2;
|
fix += ll*2;
|
||||||
break;
|
break;
|
||||||
case 8: // 32-bit self relative fixup
|
case 8: // 32-bit self relative fixup
|
||||||
counts[objects+1] += 4;
|
counts[o+1] += 4;
|
||||||
fix += (fix[1] & 0x10) ? 9 : 7;
|
fix += (fix[1] & 0x10) ? 9 : 7;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
throwCantPack("unsupported fixup record");
|
throwCantPack("unsupported fixup record");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
counts[objects]++; // extra space for 'ret'
|
counts[o]++; // extra space for 'ret'
|
||||||
counts[objects+1] += 4; // extra space for 0xFFFFFFFF
|
counts[o+1] += 4; // extra space for 0xFFFFFFFF
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
+14
-10
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2001 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2002 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2001 Laszlo Molnar
|
Copyright (C) 1996-2002 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
@@ -22,7 +22,7 @@
|
|||||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer Laszlo Molnar
|
Markus F.X.J. Oberhumer Laszlo Molnar
|
||||||
markus@oberhumer.com ml1050@cdata.tvnet.hu
|
<mfx@users.sourceforge.net> <ml1050@users.sourceforge.net>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
@@ -117,7 +117,8 @@ protected:
|
|||||||
LE16 device_id;
|
LE16 device_id;
|
||||||
LE16 ddk_version;
|
LE16 ddk_version;
|
||||||
#endif
|
#endif
|
||||||
};
|
}
|
||||||
|
__attribute_packed;
|
||||||
|
|
||||||
struct le_object_table_entry_t
|
struct le_object_table_entry_t
|
||||||
{
|
{
|
||||||
@@ -127,15 +128,17 @@ protected:
|
|||||||
LE32 pagemap_index;
|
LE32 pagemap_index;
|
||||||
LE32 npages;
|
LE32 npages;
|
||||||
LE32 reserved;
|
LE32 reserved;
|
||||||
};
|
}
|
||||||
|
__attribute_packed;
|
||||||
|
|
||||||
struct le_pagemap_entry_t
|
struct le_pagemap_entry_t
|
||||||
{
|
{
|
||||||
upx_byte h;
|
unsigned char h;
|
||||||
upx_byte m;
|
unsigned char m;
|
||||||
upx_byte l;
|
unsigned char l;
|
||||||
upx_byte type; // 0x00-legal;0x40-iterated;0x80-invalid;0xC0-zeroed
|
unsigned char type; // 0x00-legal;0x40-iterated;0x80-invalid;0xC0-zeroed
|
||||||
};
|
}
|
||||||
|
__attribute_packed;
|
||||||
|
|
||||||
virtual void readObjectTable();
|
virtual void readObjectTable();
|
||||||
virtual void writeObjectTable();
|
virtual void writeObjectTable();
|
||||||
@@ -178,6 +181,7 @@ protected:
|
|||||||
//virtual void decodeImage(){encodeImage();}
|
//virtual void decodeImage(){encodeImage();}
|
||||||
|
|
||||||
void countFixups(unsigned *) const;
|
void countFixups(unsigned *) const;
|
||||||
|
unsigned getImageSize() const;
|
||||||
|
|
||||||
InputFile *fif;
|
InputFile *fif;
|
||||||
OutputFile *fof;
|
OutputFile *fof;
|
||||||
|
|||||||
@@ -88,7 +88,6 @@ private:
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#endif /* already included */
|
#endif /* already included */
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
+77
-28
@@ -69,6 +69,7 @@ void init_options(struct options_t *o)
|
|||||||
o->w32pe.compress_resources = -1;
|
o->w32pe.compress_resources = -1;
|
||||||
for (unsigned i = 0; i < HIGH(opt->w32pe.compress_rt); i++)
|
for (unsigned i = 0; i < HIGH(opt->w32pe.compress_rt); i++)
|
||||||
opt->w32pe.compress_rt[i] = -1;
|
opt->w32pe.compress_rt[i] = -1;
|
||||||
|
opt->w32pe.compress_rt[24] = false; // 24 == RT_MANIFEST
|
||||||
o->w32pe.strip_relocs = -1;
|
o->w32pe.strip_relocs = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -183,6 +184,14 @@ static void e_optarg(const char *n)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void e_optval(const char *n)
|
||||||
|
{
|
||||||
|
fflush(con_term);
|
||||||
|
fprintf(stderr,"%s: invalid value for option `%s'\n", argv0, n);
|
||||||
|
e_exit(EXIT_USAGE);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
#if defined(OPTIONS_VAR)
|
#if defined(OPTIONS_VAR)
|
||||||
void e_envopt(const char *n)
|
void e_envopt(const char *n)
|
||||||
{
|
{
|
||||||
@@ -334,7 +343,7 @@ static void set_script_name(const char *n, bool allow_m)
|
|||||||
fprintf(stderr,"%s: missing script name\n",argv0);
|
fprintf(stderr,"%s: missing script name\n",argv0);
|
||||||
e_usage();
|
e_usage();
|
||||||
}
|
}
|
||||||
if (strlen(n) >= opt->unix.SCRIPT_MAX - 3)
|
if (strlen(n) >= (size_t)opt->unix.SCRIPT_MAX - 3)
|
||||||
{
|
{
|
||||||
fprintf(stderr,"%s: script name too long\n",argv0);
|
fprintf(stderr,"%s: script name too long\n",argv0);
|
||||||
e_usage();
|
e_usage();
|
||||||
@@ -422,10 +431,13 @@ static int do_option(int optc, const char *arg)
|
|||||||
|
|
||||||
switch (optc)
|
switch (optc)
|
||||||
{
|
{
|
||||||
|
#if 0
|
||||||
|
// FIXME: to_stdout doesn't work because of console code mess
|
||||||
//case 'c':
|
//case 'c':
|
||||||
case 517:
|
case 517:
|
||||||
opt->to_stdout = true;
|
opt->to_stdout = true;
|
||||||
break;
|
break;
|
||||||
|
#endif
|
||||||
case 'd':
|
case 'd':
|
||||||
set_cmd(CMD_DECOMPRESS);
|
set_cmd(CMD_DECOMPRESS);
|
||||||
break;
|
break;
|
||||||
@@ -537,7 +549,9 @@ static int do_option(int optc, const char *arg)
|
|||||||
break;
|
break;
|
||||||
// compression settings
|
// compression settings
|
||||||
case 520: // --small
|
case 520: // --small
|
||||||
opt->small = 1;
|
if (opt->small < 0)
|
||||||
|
opt->small = 0;
|
||||||
|
opt->small++;
|
||||||
break;
|
break;
|
||||||
case 521: // --filter=
|
case 521: // --filter=
|
||||||
getoptvar(&opt->filter, 0, 255);
|
getoptvar(&opt->filter, 0, 255);
|
||||||
@@ -575,7 +589,8 @@ static int do_option(int optc, const char *arg)
|
|||||||
getoptvar(&opt->crp.max_match, 16u, ~0u);
|
getoptvar(&opt->crp.max_match, 16u, ~0u);
|
||||||
break;
|
break;
|
||||||
case 537:
|
case 537:
|
||||||
getoptvar(&opt->crp.m_size, 1024u, 512*1024u);
|
if (getoptvar(&opt->crp.m_size, 10000u, (unsigned)999999u) != 0)
|
||||||
|
e_optval("--crp-ms=");
|
||||||
break;
|
break;
|
||||||
// backup
|
// backup
|
||||||
case 'k':
|
case 'k':
|
||||||
@@ -720,8 +735,11 @@ static const struct mfx_option longopts[] =
|
|||||||
{"output", 0x21, 0, 'o'},
|
{"output", 0x21, 0, 'o'},
|
||||||
{"quiet", 0, 0, 'q'}, // quiet mode
|
{"quiet", 0, 0, 'q'}, // quiet mode
|
||||||
{"silent", 0, 0, 'q'}, // quiet mode
|
{"silent", 0, 0, 'q'}, // quiet mode
|
||||||
|
#if 0
|
||||||
|
// FIXME: to_stdout doesn't work because of console code mess
|
||||||
{"stdout", 0x10, 0, 517}, // write output on standard output
|
{"stdout", 0x10, 0, 517}, // write output on standard output
|
||||||
{"to-stdout", 0x10, 0, 517}, // write output on standard output
|
{"to-stdout", 0x10, 0, 517}, // write output on standard output
|
||||||
|
#endif
|
||||||
{"verbose", 0, 0, 'v'}, // verbose mode
|
{"verbose", 0, 0, 'v'}, // verbose mode
|
||||||
|
|
||||||
// backup options
|
// backup options
|
||||||
@@ -794,7 +812,7 @@ static const struct mfx_option longopts[] =
|
|||||||
// psx/exe
|
// psx/exe
|
||||||
{"no-align", 0x10, 0, 670},
|
{"no-align", 0x10, 0, 670},
|
||||||
|
|
||||||
{ 0, 0, 0, 0 }
|
{ NULL, 0, NULL, 0 }
|
||||||
};
|
};
|
||||||
|
|
||||||
int optc, longind;
|
int optc, longind;
|
||||||
@@ -862,7 +880,7 @@ static const struct mfx_option longopts[] =
|
|||||||
{"compress-resources", 2, 0, 632},
|
{"compress-resources", 2, 0, 632},
|
||||||
{"strip-relocs", 2, 0, 633},
|
{"strip-relocs", 2, 0, 633},
|
||||||
|
|
||||||
{ 0, 0, 0, 0 }
|
{ NULL, 0, NULL, 0 }
|
||||||
};
|
};
|
||||||
|
|
||||||
char *env, *p;
|
char *env, *p;
|
||||||
@@ -950,14 +968,22 @@ static const struct mfx_option longopts[] =
|
|||||||
static void first_options(int argc, char **argv)
|
static void first_options(int argc, char **argv)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
int n = argc;
|
||||||
|
|
||||||
for (i = 1; i < argc; i++)
|
for (i = 1; i < n; i++)
|
||||||
|
{
|
||||||
|
if (strcmp(argv[i],"--") == 0)
|
||||||
|
{
|
||||||
|
n = i;
|
||||||
|
break;
|
||||||
|
}
|
||||||
if (strcmp(argv[i],"--version") == 0)
|
if (strcmp(argv[i],"--version") == 0)
|
||||||
do_option('V'+256, argv[i]);
|
do_option('V'+256, argv[i]);
|
||||||
for (i = 1; i < argc; i++)
|
}
|
||||||
|
for (i = 1; i < n; i++)
|
||||||
if (strcmp(argv[i],"--help") == 0)
|
if (strcmp(argv[i],"--help") == 0)
|
||||||
do_option('h'+256, argv[i]);
|
do_option('h'+256, argv[i]);
|
||||||
for (i = 1; i < argc; i++)
|
for (i = 1; i < n; i++)
|
||||||
if (strcmp(argv[i],"--no-env") == 0)
|
if (strcmp(argv[i],"--no-env") == 0)
|
||||||
do_option(519, argv[i]);
|
do_option(519, argv[i]);
|
||||||
}
|
}
|
||||||
@@ -988,34 +1014,47 @@ void upx_sanity_check(void)
|
|||||||
COMPILE_TIME_ASSERT(sizeof(LE16) == 2);
|
COMPILE_TIME_ASSERT(sizeof(LE16) == 2);
|
||||||
COMPILE_TIME_ASSERT(sizeof(LE32) == 4);
|
COMPILE_TIME_ASSERT(sizeof(LE32) == 4);
|
||||||
|
|
||||||
|
#if defined(__GNUC__)
|
||||||
|
COMPILE_TIME_ASSERT(__alignof__(BE16) == 1);
|
||||||
|
COMPILE_TIME_ASSERT(__alignof__(BE32) == 1);
|
||||||
|
COMPILE_TIME_ASSERT(__alignof__(LE16) == 1);
|
||||||
|
COMPILE_TIME_ASSERT(__alignof__(LE32) == 1);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(__WATCOMC__)
|
||||||
struct align_assertion_1a_t
|
struct align_assertion_1a_t
|
||||||
{
|
{
|
||||||
struct foo_t {
|
struct foo_t {
|
||||||
char c1;
|
char c1;
|
||||||
LE16 v[4];
|
LE16 v[4];
|
||||||
} d[3];
|
} __attribute_packed;
|
||||||
};
|
foo_t d[3];
|
||||||
|
} __attribute_packed;
|
||||||
struct align_assertion_1b_t
|
struct align_assertion_1b_t
|
||||||
{
|
{
|
||||||
struct foo_t {
|
struct foo_t {
|
||||||
char c1;
|
char c1;
|
||||||
char v[4*2];
|
char v[4*2];
|
||||||
} d[3];
|
} __attribute_packed;
|
||||||
};
|
foo_t d[3];
|
||||||
|
} __attribute_packed;
|
||||||
struct align_assertion_2a_t
|
struct align_assertion_2a_t
|
||||||
{
|
{
|
||||||
struct foo_t {
|
struct foo_t {
|
||||||
char c1;
|
char c1;
|
||||||
LE32 v[4];
|
LE32 v[4];
|
||||||
} d[3];
|
} __attribute_packed;
|
||||||
};
|
foo_t d[3];
|
||||||
|
} __attribute_packed;
|
||||||
struct align_assertion_2b_t
|
struct align_assertion_2b_t
|
||||||
{
|
{
|
||||||
struct foo_t {
|
struct foo_t {
|
||||||
char c1;
|
char c1;
|
||||||
char v[4*4];
|
char v[4*4];
|
||||||
} d[3];
|
} __attribute_packed;
|
||||||
};
|
foo_t d[3];
|
||||||
|
} __attribute_packed;
|
||||||
|
|
||||||
//printf("%d\n", (int) sizeof(align_assertion_1a_t));
|
//printf("%d\n", (int) sizeof(align_assertion_1a_t));
|
||||||
//printf("%d\n", (int) sizeof(align_assertion_1b_t));
|
//printf("%d\n", (int) sizeof(align_assertion_1b_t));
|
||||||
//printf("%d\n", (int) sizeof(align_assertion_2a_t));
|
//printf("%d\n", (int) sizeof(align_assertion_2a_t));
|
||||||
@@ -1024,6 +1063,7 @@ void upx_sanity_check(void)
|
|||||||
COMPILE_TIME_ASSERT(sizeof(align_assertion_2a_t) == sizeof(align_assertion_2b_t));
|
COMPILE_TIME_ASSERT(sizeof(align_assertion_2a_t) == sizeof(align_assertion_2b_t));
|
||||||
COMPILE_TIME_ASSERT(sizeof(align_assertion_1a_t) == 3*9);
|
COMPILE_TIME_ASSERT(sizeof(align_assertion_1a_t) == 3*9);
|
||||||
COMPILE_TIME_ASSERT(sizeof(align_assertion_2a_t) == 3*17);
|
COMPILE_TIME_ASSERT(sizeof(align_assertion_2a_t) == 3*17);
|
||||||
|
#endif
|
||||||
|
|
||||||
COMPILE_TIME_ASSERT(sizeof(UPX_VERSION_STRING4) == 4 + 1);
|
COMPILE_TIME_ASSERT(sizeof(UPX_VERSION_STRING4) == 4 + 1);
|
||||||
assert(strlen(UPX_VERSION_STRING4) == 4);
|
assert(strlen(UPX_VERSION_STRING4) == 4);
|
||||||
@@ -1041,7 +1081,21 @@ int main(int argc, char *argv[])
|
|||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
static char default_argv0[] = "upx";
|
static char default_argv0[] = "upx";
|
||||||
int cmdline_cmd = CMD_NONE;
|
// int cmdline_cmd = CMD_NONE;
|
||||||
|
|
||||||
|
#if 0 && defined(__DJGPP__)
|
||||||
|
// LFN=n may cause problems with 2.03's _rename and mkdir under WinME
|
||||||
|
putenv("LFN=y");
|
||||||
|
#endif
|
||||||
|
#if defined(__EMX__)
|
||||||
|
_response(&argc,&argv);
|
||||||
|
_wildcard(&argc,&argv);
|
||||||
|
#endif
|
||||||
|
#if defined(__MINT__)
|
||||||
|
__binmode(1);
|
||||||
|
__set_binmode(stdout, 0);
|
||||||
|
__set_binmode(stderr, 0);
|
||||||
|
#endif
|
||||||
|
|
||||||
upx_sanity_check();
|
upx_sanity_check();
|
||||||
init_options(opt);
|
init_options(opt);
|
||||||
@@ -1050,11 +1104,6 @@ int main(int argc, char *argv[])
|
|||||||
MSS_DISABLE_LOG_OUTPUT;
|
MSS_DISABLE_LOG_OUTPUT;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(__EMX__)
|
|
||||||
_response(&argc,&argv);
|
|
||||||
_wildcard(&argc,&argv);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (!argv[0] || !argv[0][0])
|
if (!argv[0] || !argv[0][0])
|
||||||
argv[0] = default_argv0;
|
argv[0] = default_argv0;
|
||||||
argv0 = argv[0];
|
argv0 = argv[0];
|
||||||
@@ -1062,15 +1111,15 @@ int main(int argc, char *argv[])
|
|||||||
{
|
{
|
||||||
char *prog = fn_basename(argv0);
|
char *prog = fn_basename(argv0);
|
||||||
char *p;
|
char *p;
|
||||||
bool allupper = 1;
|
bool allupper = true;
|
||||||
for (p = prog; *p; p++)
|
for (p = prog; *p; p++)
|
||||||
if (islower((unsigned char)*p))
|
if (islower((unsigned char)*p))
|
||||||
allupper = 0;
|
allupper = false;
|
||||||
if (allupper)
|
if (allupper)
|
||||||
fn_strlwr(prog);
|
fn_strlwr(prog);
|
||||||
if (strlen(prog) > 4)
|
if (p - prog > 4)
|
||||||
{
|
{
|
||||||
p = prog + strlen(prog) - 4;
|
p -= 4;
|
||||||
if (fn_strcmp(p, ".exe") == 0 || fn_strcmp(p, ".ttp") == 0)
|
if (fn_strcmp(p, ".exe") == 0 || fn_strcmp(p, ".ttp") == 0)
|
||||||
*p = 0;
|
*p = 0;
|
||||||
}
|
}
|
||||||
@@ -1118,7 +1167,7 @@ int main(int argc, char *argv[])
|
|||||||
assert(i <= argc);
|
assert(i <= argc);
|
||||||
|
|
||||||
set_term(0);
|
set_term(0);
|
||||||
cmdline_cmd = opt->cmd;
|
// cmdline_cmd = opt->cmd;
|
||||||
switch (opt->cmd)
|
switch (opt->cmd)
|
||||||
{
|
{
|
||||||
case CMD_NONE:
|
case CMD_NONE:
|
||||||
@@ -1178,7 +1227,7 @@ int main(int argc, char *argv[])
|
|||||||
set_term(stdout);
|
set_term(stdout);
|
||||||
do_files(i,argc,argv);
|
do_files(i,argc,argv);
|
||||||
|
|
||||||
#if 1 && (UPX_VERSION < 0x012000)
|
#if 1 && (UPX_VERSION_HEX < 0x020000)
|
||||||
{
|
{
|
||||||
FILE *f = stdout;
|
FILE *f = stdout;
|
||||||
int fg = con_fg(f,FG_RED);
|
int fg = con_fg(f,FG_RED);
|
||||||
|
|||||||
+3
-3
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2001 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2002 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2001 Laszlo Molnar
|
Copyright (C) 1996-2002 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
@@ -22,7 +22,7 @@
|
|||||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer Laszlo Molnar
|
Markus F.X.J. Oberhumer Laszlo Molnar
|
||||||
markus@oberhumer.com ml1050@cdata.tvnet.hu
|
<mfx@users.sourceforge.net> <ml1050@users.sourceforge.net>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2001 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2002 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2001 Laszlo Molnar
|
Copyright (C) 1996-2002 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
@@ -22,7 +22,7 @@
|
|||||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer Laszlo Molnar
|
Markus F.X.J. Oberhumer Laszlo Molnar
|
||||||
markus@oberhumer.com ml1050@cdata.tvnet.hu
|
<mfx@users.sourceforge.net> <ml1050@users.sourceforge.net>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
@@ -52,6 +52,9 @@ public:
|
|||||||
operator unsigned char * () { return ptr; }
|
operator unsigned char * () { return ptr; }
|
||||||
//operator const unsigned char * () const { return ptr; }
|
//operator const unsigned char * () const { return ptr; }
|
||||||
|
|
||||||
|
void *getVoidPtr() { return (void *) ptr; }
|
||||||
|
const void *getVoidPtr() const { return (const void *) ptr; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void alloc(unsigned size, unsigned base_offset);
|
void alloc(unsigned size, unsigned base_offset);
|
||||||
|
|
||||||
|
|||||||
+4
-4
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2001 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2002 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2001 Laszlo Molnar
|
Copyright (C) 1996-2002 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
@@ -22,7 +22,7 @@
|
|||||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer Laszlo Molnar
|
Markus F.X.J. Oberhumer Laszlo Molnar
|
||||||
markus@oberhumer.com ml1050@cdata.tvnet.hu
|
<mfx@users.sourceforge.net> <ml1050@users.sourceforge.net>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
@@ -146,7 +146,7 @@ void printWarn(const char *iname, const char *format, ...)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void printUnhandledException(const char *iname, const exception *e)
|
void printUnhandledException(const char *iname, const std::exception *e)
|
||||||
{
|
{
|
||||||
if (e)
|
if (e)
|
||||||
printErr(iname,"unhandled exception: %s\n", prettyName(e->what()));
|
printErr(iname,"unhandled exception: %s\n", prettyName(e->what()));
|
||||||
|
|||||||
+6
-1
@@ -46,8 +46,13 @@ static const
|
|||||||
PackDjgpp2::PackDjgpp2(InputFile *f) :
|
PackDjgpp2::PackDjgpp2(InputFile *f) :
|
||||||
super(f), coff_offset(0)
|
super(f), coff_offset(0)
|
||||||
{
|
{
|
||||||
COMPILE_TIME_ASSERT(sizeof(coff_hdr) == 0xa8);
|
COMPILE_TIME_ASSERT(sizeof(external_scnhdr_t) == 40);
|
||||||
|
COMPILE_TIME_ASSERT(sizeof(coff_header_t) == 0xa8);
|
||||||
COMPILE_TIME_ASSERT(sizeof(stubify_stub) == 2048);
|
COMPILE_TIME_ASSERT(sizeof(stubify_stub) == 2048);
|
||||||
|
#if defined(STUBIFY_STUB_ADLER32)
|
||||||
|
//printf("0x%08x\n", upx_adler32(stubify_stub, sizeof(stubify_stub)));
|
||||||
|
assert(upx_adler32(stubify_stub, sizeof(stubify_stub)) == STUBIFY_STUB_ADLER32);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
+5
-2
@@ -71,7 +71,8 @@ protected:
|
|||||||
LE32 scnptr;
|
LE32 scnptr;
|
||||||
char misc[12]; // relptr, lnnoptr, nreloc, nlnno
|
char misc[12]; // relptr, lnnoptr, nreloc, nlnno
|
||||||
char __[4]; // flags
|
char __[4]; // flags
|
||||||
};
|
}
|
||||||
|
__attribute_packed;
|
||||||
|
|
||||||
struct coff_header_t
|
struct coff_header_t
|
||||||
{
|
{
|
||||||
@@ -95,8 +96,10 @@ protected:
|
|||||||
|
|
||||||
// section headers
|
// section headers
|
||||||
external_scnhdr_t sh[3];
|
external_scnhdr_t sh[3];
|
||||||
} coff_hdr;
|
}
|
||||||
|
__attribute_packed;
|
||||||
|
|
||||||
|
coff_header_t coff_hdr;
|
||||||
external_scnhdr_t *text,*data,*bss;
|
external_scnhdr_t *text,*data,*bss;
|
||||||
|
|
||||||
void stripDebug();
|
void stripDebug();
|
||||||
|
|||||||
+7
-3
@@ -51,7 +51,8 @@ struct Elf_LE32_Ehdr
|
|||||||
LE16 e_shentsize; /* Section header table entry size */
|
LE16 e_shentsize; /* Section header table entry size */
|
||||||
LE16 e_shnum; /* Section header table entry count */
|
LE16 e_shnum; /* Section header table entry count */
|
||||||
LE16 e_shstrndx; /* Section header string table index */
|
LE16 e_shstrndx; /* Section header string table index */
|
||||||
};
|
}
|
||||||
|
__attribute_packed;
|
||||||
|
|
||||||
|
|
||||||
// Program segment header.
|
// Program segment header.
|
||||||
@@ -77,7 +78,8 @@ struct Elf_LE32_Phdr
|
|||||||
enum { PF_X = (1 << 0) }; /* Segment is executable */
|
enum { PF_X = (1 << 0) }; /* Segment is executable */
|
||||||
enum { PF_W = (1 << 1) }; /* Segment is writable */
|
enum { PF_W = (1 << 1) }; /* Segment is writable */
|
||||||
enum { PF_R = (1 << 2) }; /* Segment is readable */
|
enum { PF_R = (1 << 2) }; /* Segment is readable */
|
||||||
};
|
}
|
||||||
|
__attribute_packed;
|
||||||
|
|
||||||
|
|
||||||
struct Elf_LE32_Dyn
|
struct Elf_LE32_Dyn
|
||||||
@@ -91,7 +93,9 @@ struct Elf_LE32_Dyn
|
|||||||
DT_STRTAB = 5, /* String table */
|
DT_STRTAB = 5, /* String table */
|
||||||
DT_STRSZ = 10 /* Sizeof string table */
|
DT_STRSZ = 10 /* Sizeof string table */
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
__attribute_packed;
|
||||||
|
|
||||||
#endif /* already included */
|
#endif /* already included */
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
+5
-2
@@ -227,7 +227,7 @@ unsigned optimize_relocs(upx_byte *b, const unsigned size,
|
|||||||
const upx_byte *relocs, const unsigned nrelocs,
|
const upx_byte *relocs, const unsigned nrelocs,
|
||||||
upx_byte *crel, bool *has_9a)
|
upx_byte *crel, bool *has_9a)
|
||||||
{
|
{
|
||||||
upx_byte *crel_save = crel;
|
upx_byte * const crel_save = crel;
|
||||||
unsigned i;
|
unsigned i;
|
||||||
unsigned seg_high = 0;
|
unsigned seg_high = 0;
|
||||||
#if 0
|
#if 0
|
||||||
@@ -486,7 +486,10 @@ void PackExe::pack(OutputFile *fo)
|
|||||||
oh.relocs = 0;
|
oh.relocs = 0;
|
||||||
oh.firstreloc = ih.cs*0x10000 + ih.ip;
|
oh.firstreloc = ih.cs*0x10000 + ih.ip;
|
||||||
}
|
}
|
||||||
oh.relocoffs = offsetof(exe_header_t, firstreloc);
|
|
||||||
|
// g++ 3.1 does not like the following line...
|
||||||
|
// oh.relocoffs = offsetof(exe_header_t, firstreloc);
|
||||||
|
oh.relocoffs = ptr_diff(&oh.firstreloc, &oh);
|
||||||
|
|
||||||
if (flag & SP)
|
if (flag & SP)
|
||||||
patch_le16(loader,lsize,"SP",ih.sp);
|
patch_le16(loader,lsize,"SP",ih.sp);
|
||||||
|
|||||||
+2
-2
@@ -404,8 +404,8 @@ void PackLinuxI386elf::unpack(OutputFile *fo)
|
|||||||
|
|
||||||
unsigned total_in = 0;
|
unsigned total_in = 0;
|
||||||
unsigned total_out = 0;
|
unsigned total_out = 0;
|
||||||
unsigned c_adler = upx_adler32(0, NULL, 0);
|
unsigned c_adler = upx_adler32(NULL, 0);
|
||||||
unsigned u_adler = upx_adler32(0, NULL, 0);
|
unsigned u_adler = upx_adler32(NULL, 0);
|
||||||
off_t ptload0hi=0, ptload1lo=0, ptload1sz=0;
|
off_t ptload0hi=0, ptload1lo=0, ptload1sz=0;
|
||||||
|
|
||||||
// decompress PT_LOAD
|
// decompress PT_LOAD
|
||||||
|
|||||||
+1
-3
@@ -456,9 +456,7 @@ void PackLinuxI386::patchLoaderChecksum()
|
|||||||
lp->l_version = (unsigned char) ph.version;
|
lp->l_version = (unsigned char) ph.version;
|
||||||
lp->l_format = (unsigned char) ph.format;
|
lp->l_format = (unsigned char) ph.format;
|
||||||
// INFO: lp->l_checksum is currently unused
|
// INFO: lp->l_checksum is currently unused
|
||||||
unsigned adler = upx_adler32(0,NULL,0);
|
lp->l_checksum = upx_adler32(ptr, lsize);
|
||||||
adler = upx_adler32(adler, ptr, lsize);
|
|
||||||
lp->l_checksum = adler;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
+8
-3
@@ -87,17 +87,22 @@ protected:
|
|||||||
struct Elf_LE32_Ehdr ehdr;
|
struct Elf_LE32_Ehdr ehdr;
|
||||||
struct Elf_LE32_Phdr phdr[1];
|
struct Elf_LE32_Phdr phdr[1];
|
||||||
struct PackUnix::l_info linfo;
|
struct PackUnix::l_info linfo;
|
||||||
};
|
}
|
||||||
|
__attribute_packed;
|
||||||
|
|
||||||
struct cprElfHdr2 {
|
struct cprElfHdr2 {
|
||||||
struct Elf_LE32_Ehdr ehdr;
|
struct Elf_LE32_Ehdr ehdr;
|
||||||
struct Elf_LE32_Phdr phdr[2];
|
struct Elf_LE32_Phdr phdr[2];
|
||||||
struct PackUnix::l_info linfo;
|
struct PackUnix::l_info linfo;
|
||||||
};
|
}
|
||||||
|
__attribute_packed;
|
||||||
|
|
||||||
struct cprElfHdr3 {
|
struct cprElfHdr3 {
|
||||||
struct Elf_LE32_Ehdr ehdr;
|
struct Elf_LE32_Ehdr ehdr;
|
||||||
struct Elf_LE32_Phdr phdr[3];
|
struct Elf_LE32_Phdr phdr[3];
|
||||||
struct PackUnix::l_info linfo;
|
struct PackUnix::l_info linfo;
|
||||||
};
|
}
|
||||||
|
__attribute_packed;
|
||||||
|
|
||||||
cprElfHdr3 elfout;
|
cprElfHdr3 elfout;
|
||||||
|
|
||||||
|
|||||||
+2
-1
@@ -42,7 +42,8 @@
|
|||||||
//
|
//
|
||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
|
|
||||||
#define SCRIPT_SIZE (opt->unix.SCRIPT_MAX + sizeof(l_info))
|
//#define SCRIPT_SIZE (opt->unix.SCRIPT_MAX + sizeof(l_info))
|
||||||
|
#define SCRIPT_SIZE (32 + sizeof(l_info))
|
||||||
|
|
||||||
const upx_byte *PackLinuxI386sep::getLoader() const
|
const upx_byte *PackLinuxI386sep::getLoader() const
|
||||||
{
|
{
|
||||||
|
|||||||
+2
-2
@@ -314,8 +314,8 @@ void PackUnix::unpack(OutputFile *fo)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned c_adler = upx_adler32(0, NULL, 0);
|
unsigned c_adler = upx_adler32(NULL, 0);
|
||||||
unsigned u_adler = upx_adler32(0, NULL, 0);
|
unsigned u_adler = upx_adler32(NULL, 0);
|
||||||
|
|
||||||
// defaults for ph.version == 8
|
// defaults for ph.version == 8
|
||||||
unsigned orig_file_size = 0;
|
unsigned orig_file_size = 0;
|
||||||
|
|||||||
+8
-3
@@ -92,19 +92,24 @@ protected:
|
|||||||
unsigned char b_ftid; // filter id
|
unsigned char b_ftid; // filter id
|
||||||
unsigned char b_cto8; // filter parameter
|
unsigned char b_cto8; // filter parameter
|
||||||
unsigned char b_unused;
|
unsigned char b_unused;
|
||||||
};
|
}
|
||||||
|
__attribute_packed;
|
||||||
|
|
||||||
struct l_info { // 12-byte trailer in header for loader
|
struct l_info { // 12-byte trailer in header for loader
|
||||||
unsigned l_checksum;
|
unsigned l_checksum;
|
||||||
unsigned l_magic;
|
unsigned l_magic;
|
||||||
unsigned short l_lsize;
|
unsigned short l_lsize;
|
||||||
unsigned char l_version;
|
unsigned char l_version;
|
||||||
unsigned char l_format;
|
unsigned char l_format;
|
||||||
};
|
}
|
||||||
|
__attribute_packed;
|
||||||
|
|
||||||
struct p_info { // 12-byte packed program header
|
struct p_info { // 12-byte packed program header
|
||||||
unsigned p_progid;
|
unsigned p_progid;
|
||||||
unsigned p_filesize;
|
unsigned p_filesize;
|
||||||
unsigned p_blocksize;
|
unsigned p_blocksize;
|
||||||
};
|
}
|
||||||
|
__attribute_packed;
|
||||||
|
|
||||||
// do not change !!!
|
// do not change !!!
|
||||||
enum { OVERHEAD = 2048 };
|
enum { OVERHEAD = 2048 };
|
||||||
|
|||||||
+2
-1
@@ -79,7 +79,8 @@ protected:
|
|||||||
|
|
||||||
// some more uninteresting fields here ...
|
// some more uninteresting fields here ...
|
||||||
// see /usr/src/linux/Documentation/i386/zero-page.txt
|
// see /usr/src/linux/Documentation/i386/zero-page.txt
|
||||||
};
|
}
|
||||||
|
__attribute_packed;
|
||||||
|
|
||||||
MemBuffer setup_buf;
|
MemBuffer setup_buf;
|
||||||
int setup_size;
|
int setup_size;
|
||||||
|
|||||||
+83
-27
@@ -57,6 +57,27 @@ static const
|
|||||||
#define tls PackW32Pe_tls
|
#define tls PackW32Pe_tls
|
||||||
|
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
//
|
||||||
|
**************************************************************************/
|
||||||
|
|
||||||
|
#if defined(__BORLANDC__)
|
||||||
|
# undef strcpy
|
||||||
|
# define strcpy(a,b) std::strcpy((char *)(a),(const char *)(b))
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
// Unicode string compare
|
||||||
|
static bool ustrsame(const void *s1, const void *s2)
|
||||||
|
{
|
||||||
|
unsigned len1 = get_le16(s1);
|
||||||
|
unsigned len2 = get_le16(s2);
|
||||||
|
if (len1 != len2)
|
||||||
|
return false;
|
||||||
|
return memcmp(s1, s2, 2 + 2*len1) == 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
//
|
//
|
||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
@@ -140,7 +161,7 @@ bool PackW32Pe::testUnpackVersion(int version) const
|
|||||||
|
|
||||||
int PackW32Pe::readFileHeader()
|
int PackW32Pe::readFileHeader()
|
||||||
{
|
{
|
||||||
struct h_t
|
struct exe_header_t
|
||||||
{
|
{
|
||||||
LE16 mz;
|
LE16 mz;
|
||||||
LE16 m512;
|
LE16 m512;
|
||||||
@@ -149,8 +170,11 @@ int PackW32Pe::readFileHeader()
|
|||||||
LE16 relocoffs;
|
LE16 relocoffs;
|
||||||
char __[34];
|
char __[34];
|
||||||
LE32 nexepos;
|
LE32 nexepos;
|
||||||
} h;
|
}
|
||||||
|
__attribute_packed;
|
||||||
|
COMPILE_TIME_ASSERT(sizeof(exe_header_t) == 64);
|
||||||
|
|
||||||
|
exe_header_t h;
|
||||||
int ic;
|
int ic;
|
||||||
pe_offset = 0;
|
pe_offset = 0;
|
||||||
|
|
||||||
@@ -283,10 +307,17 @@ class Reloc
|
|||||||
{
|
{
|
||||||
LE32 pagestart;
|
LE32 pagestart;
|
||||||
LE32 size;
|
LE32 size;
|
||||||
} *rel;
|
}
|
||||||
LE16 *rel1;
|
__attribute_packed;
|
||||||
void newRelocPos(void *p) { rel = (reloc*) p; rel1 = (LE16*) ((char*) p + sizeof (reloc)); }
|
|
||||||
|
|
||||||
|
void newRelocPos(void *p)
|
||||||
|
{
|
||||||
|
rel = (reloc*) p;
|
||||||
|
rel1 = (LE16*) ((char*) p + sizeof (reloc));
|
||||||
|
}
|
||||||
|
|
||||||
|
reloc *rel;
|
||||||
|
LE16 *rel1;
|
||||||
unsigned counts[16];
|
unsigned counts[16];
|
||||||
|
|
||||||
public:
|
public:
|
||||||
@@ -302,6 +333,7 @@ public:
|
|||||||
|
|
||||||
Reloc::Reloc(upx_byte *s,unsigned si) : start(s), size(si), rel(0)
|
Reloc::Reloc(upx_byte *s,unsigned si) : start(s), size(si), rel(0)
|
||||||
{
|
{
|
||||||
|
COMPILE_TIME_ASSERT(sizeof(reloc) == 8);
|
||||||
memset(counts,0,sizeof(counts));
|
memset(counts,0,sizeof(counts));
|
||||||
unsigned pos,type;
|
unsigned pos,type;
|
||||||
while (next(pos,type))
|
while (next(pos,type))
|
||||||
@@ -350,7 +382,7 @@ void Reloc::finish(upx_byte *&p,unsigned &siz)
|
|||||||
prev = pos;
|
prev = pos;
|
||||||
*rel1 = 0;
|
*rel1 = 0;
|
||||||
rel->size = ALIGN_UP(ptr_diff(rel1,rel),4);
|
rel->size = ALIGN_UP(ptr_diff(rel1,rel),4);
|
||||||
newRelocPos(rel->size + (char*) rel);
|
newRelocPos((char *)rel + rel->size);
|
||||||
rel->pagestart = (pos >> 4) &~ 0xfff;
|
rel->pagestart = (pos >> 4) &~ 0xfff;
|
||||||
}
|
}
|
||||||
*rel1++ = (pos << 12) + ((pos >> 4) & 0xfff);
|
*rel1++ = (pos << 12) + ((pos >> 4) & 0xfff);
|
||||||
@@ -440,10 +472,13 @@ struct import_desc
|
|||||||
char _[8];
|
char _[8];
|
||||||
LE32 dllname;
|
LE32 dllname;
|
||||||
LE32 iat; // import address table
|
LE32 iat; // import address table
|
||||||
};
|
}
|
||||||
|
__attribute_packed;
|
||||||
|
|
||||||
void PackW32Pe::processImports(unsigned myimport) // pass 2
|
void PackW32Pe::processImports(unsigned myimport) // pass 2
|
||||||
{
|
{
|
||||||
|
COMPILE_TIME_ASSERT(sizeof(import_desc) == 20);
|
||||||
|
|
||||||
// adjust import data
|
// adjust import data
|
||||||
for (import_desc *im = (import_desc*) oimpdlls; im->dllname; im++)
|
for (import_desc *im = (import_desc*) oimpdlls; im->dllname; im++)
|
||||||
{
|
{
|
||||||
@@ -499,11 +534,12 @@ unsigned PackW32Pe::processImports() // pass 1
|
|||||||
if (!u2->shname) return -1;
|
if (!u2->shname) return -1;
|
||||||
return strlen(u1->shname) - strlen(u2->shname);
|
return strlen(u1->shname) - strlen(u2->shname);
|
||||||
}
|
}
|
||||||
};
|
}
|
||||||
|
__attribute_packed;
|
||||||
|
|
||||||
// +1 for dllnum=0
|
// +1 for dllnum=0
|
||||||
autoheap_array(struct udll, dlls, dllnum+1);
|
Array(struct udll, dlls, dllnum+1);
|
||||||
autoheap_array(struct udll *, idlls, dllnum+1);
|
Array(struct udll *, idlls, dllnum+1);
|
||||||
|
|
||||||
soimport = 1024; // safety
|
soimport = 1024; // safety
|
||||||
|
|
||||||
@@ -691,10 +727,10 @@ unsigned PackW32Pe::processImports() // pass 1
|
|||||||
#endif
|
#endif
|
||||||
// do some work for the unpacker
|
// do some work for the unpacker
|
||||||
im = im_save;
|
im = im_save;
|
||||||
for (ic = 0; ic < dllnum; ic++)
|
for (ic = 0; ic < dllnum; ic++, im++)
|
||||||
{
|
{
|
||||||
memset(im,FILLVAL,sizeof(*im));
|
memset(im,FILLVAL,sizeof(*im));
|
||||||
im++->dllname = ptr_diff(idlls[ic]->name,ibuf); // I only need this info
|
im->dllname = ptr_diff(idlls[ic]->name,ibuf); // I only need this info
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -723,7 +759,7 @@ unsigned PackW32Pe::processImports() // pass 1
|
|||||||
|
|
||||||
class Export
|
class Export
|
||||||
{
|
{
|
||||||
struct export_dir
|
struct export_dir_t
|
||||||
{
|
{
|
||||||
char _[12]; // flags, timedate, version
|
char _[12]; // flags, timedate, version
|
||||||
LE32 name;
|
LE32 name;
|
||||||
@@ -733,9 +769,10 @@ class Export
|
|||||||
LE32 addrtable;
|
LE32 addrtable;
|
||||||
LE32 nameptrtable;
|
LE32 nameptrtable;
|
||||||
LE32 ordinaltable;
|
LE32 ordinaltable;
|
||||||
};
|
}
|
||||||
|
__attribute_packed;
|
||||||
|
|
||||||
export_dir edir;
|
export_dir_t edir;
|
||||||
char *ename;
|
char *ename;
|
||||||
char *functionptrs;
|
char *functionptrs;
|
||||||
char *ordinals;
|
char *ordinals;
|
||||||
@@ -760,6 +797,7 @@ private:
|
|||||||
|
|
||||||
Export::Export(char *_base) : base(_base), iv(_base)
|
Export::Export(char *_base) : base(_base), iv(_base)
|
||||||
{
|
{
|
||||||
|
COMPILE_TIME_ASSERT(sizeof(export_dir_t) == 40);
|
||||||
ename = functionptrs = ordinals = 0;
|
ename = functionptrs = ordinals = 0;
|
||||||
names = 0;
|
names = 0;
|
||||||
memset(&edir,0,sizeof(edir));
|
memset(&edir,0,sizeof(edir));
|
||||||
@@ -778,8 +816,8 @@ Export::~Export()
|
|||||||
|
|
||||||
void Export::convert(unsigned eoffs,unsigned esize)
|
void Export::convert(unsigned eoffs,unsigned esize)
|
||||||
{
|
{
|
||||||
memcpy(&edir,base + eoffs,sizeof(export_dir));
|
memcpy(&edir,base + eoffs,sizeof(export_dir_t));
|
||||||
size = sizeof(export_dir);
|
size = sizeof(export_dir_t);
|
||||||
iv.add(eoffs,size);
|
iv.add(eoffs,size);
|
||||||
|
|
||||||
unsigned len = strlen(base + edir.name) + 1;
|
unsigned len = strlen(base + edir.name) + 1;
|
||||||
@@ -914,10 +952,13 @@ struct tls
|
|||||||
LE32 tlsindex; // VA tls index
|
LE32 tlsindex; // VA tls index
|
||||||
LE32 callbacks; // VA tls callbacks
|
LE32 callbacks; // VA tls callbacks
|
||||||
char _[8]; // zero init, characteristics
|
char _[8]; // zero init, characteristics
|
||||||
};
|
}
|
||||||
|
__attribute_packed;
|
||||||
|
|
||||||
void PackW32Pe::processTls(Interval *iv) // pass 1
|
void PackW32Pe::processTls(Interval *iv) // pass 1
|
||||||
{
|
{
|
||||||
|
COMPILE_TIME_ASSERT(sizeof(tls) == 24);
|
||||||
|
|
||||||
if ((sotls = ALIGN_UP(IDSIZE(PEDIR_TLS),4)) == 0)
|
if ((sotls = ALIGN_UP(IDSIZE(PEDIR_TLS),4)) == 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@@ -1000,7 +1041,8 @@ class Resource
|
|||||||
{
|
{
|
||||||
LE32 tnl; // Type | Name | Language id - depending on level
|
LE32 tnl; // Type | Name | Language id - depending on level
|
||||||
LE32 child;
|
LE32 child;
|
||||||
};
|
}
|
||||||
|
__attribute_packed;
|
||||||
struct res_dir
|
struct res_dir
|
||||||
{
|
{
|
||||||
char _[12]; // flags, timedate, version
|
char _[12]; // flags, timedate, version
|
||||||
@@ -1011,13 +1053,15 @@ class Resource
|
|||||||
res_dir_entry entries[1];
|
res_dir_entry entries[1];
|
||||||
// it's usually safe to assume that every res_dir contains
|
// it's usually safe to assume that every res_dir contains
|
||||||
// at least one res_dir_entry - check() complains otherwise
|
// at least one res_dir_entry - check() complains otherwise
|
||||||
};
|
}
|
||||||
|
__attribute_packed;
|
||||||
struct res_data
|
struct res_data
|
||||||
{
|
{
|
||||||
LE32 offset;
|
LE32 offset;
|
||||||
LE32 size;
|
LE32 size;
|
||||||
char _[8]; // codepage, reserved
|
char _[8]; // codepage, reserved
|
||||||
};
|
}
|
||||||
|
__attribute_packed;
|
||||||
//
|
//
|
||||||
struct upx_rnode
|
struct upx_rnode
|
||||||
{
|
{
|
||||||
@@ -1083,6 +1127,10 @@ public:
|
|||||||
|
|
||||||
void Resource::init(const upx_byte *res)
|
void Resource::init(const upx_byte *res)
|
||||||
{
|
{
|
||||||
|
COMPILE_TIME_ASSERT(sizeof(res_dir_entry) == 8);
|
||||||
|
COMPILE_TIME_ASSERT(sizeof(res_dir) == 16 + sizeof(res_dir_entry));
|
||||||
|
COMPILE_TIME_ASSERT(sizeof(res_data) == 16);
|
||||||
|
|
||||||
start = res;
|
start = res;
|
||||||
root = head = current = 0;
|
root = head = current = 0;
|
||||||
dsize = ssize = 0;
|
dsize = ssize = 0;
|
||||||
@@ -1094,7 +1142,10 @@ void Resource::check(const res_dir *node,unsigned level)
|
|||||||
{
|
{
|
||||||
int ic = node->identr + node->namedentr;
|
int ic = node->identr + node->namedentr;
|
||||||
if (ic == 0)
|
if (ic == 0)
|
||||||
throwCantPack("unsupported resource structure");
|
{
|
||||||
|
//throwCantPack("unsupported resource structure");
|
||||||
|
throwCantPack("empty resource sections are not supported");
|
||||||
|
}
|
||||||
for (const res_dir_entry *rde = node->entries; --ic >= 0; rde++)
|
for (const res_dir_entry *rde = node->entries; --ic >= 0; rde++)
|
||||||
if (((rde->child & 0x80000000) == 0) ^ (level == 2))
|
if (((rde->child & 0x80000000) == 0) ^ (level == 2))
|
||||||
throwCantPack("unsupported resource structure");
|
throwCantPack("unsupported resource structure");
|
||||||
@@ -1325,9 +1376,13 @@ void PackW32Pe::processResources(Resource *res)
|
|||||||
else if (rtype > 0 && rtype < RT_LAST)
|
else if (rtype > 0 && rtype < RT_LAST)
|
||||||
do_compress = opt->w32pe.compress_rt[rtype] ? true : false;
|
do_compress = opt->w32pe.compress_rt[rtype] ? true : false;
|
||||||
else if (res->ntype()) // named resource type
|
else if (res->ntype()) // named resource type
|
||||||
if (0 == memcmp(res->ntype(),"\x7\x0T\x0Y\x0P\x0""E\x0L\x0I\x0""B\x0",16)
|
{
|
||||||
|| 0 == memcmp(res->ntype(),"\x8\x0R\x0""E\x0G\x0I\x0S\x0T\x0R\x0Y\x0",18))
|
const upx_byte * const t = res->ntype();
|
||||||
do_compress = false; // typelib or registry
|
if (ustrsame(t, "\x7\x0T\x0Y\x0P\x0""E\x0L\x0I\x0""B\x0"))
|
||||||
|
do_compress = false; // u"TYPELIB"
|
||||||
|
else if (ustrsame(t, "\x8\x0R\x0""E\x0G\x0I\x0S\x0T\x0R\x0Y\x0"))
|
||||||
|
do_compress = false; // u"REGISTRY"
|
||||||
|
}
|
||||||
|
|
||||||
if (do_compress)
|
if (do_compress)
|
||||||
{
|
{
|
||||||
@@ -1409,7 +1464,8 @@ unsigned PackW32Pe::stripDebug(unsigned overlaystart)
|
|||||||
LE32 size;
|
LE32 size;
|
||||||
char __[4]; // rva
|
char __[4]; // rva
|
||||||
LE32 fpos;
|
LE32 fpos;
|
||||||
};
|
}
|
||||||
|
__attribute_packed;
|
||||||
|
|
||||||
const debug_dir_t *dd = (const debug_dir_t*) (ibuf + IDADDR(PEDIR_DEBUG));
|
const debug_dir_t *dd = (const debug_dir_t*) (ibuf + IDADDR(PEDIR_DEBUG));
|
||||||
for (unsigned ic = 0; ic < IDSIZE(PEDIR_DEBUG) / sizeof(debug_dir_t); ic++, dd++)
|
for (unsigned ic = 0; ic < IDSIZE(PEDIR_DEBUG) / sizeof(debug_dir_t); ic++, dd++)
|
||||||
@@ -2230,7 +2286,7 @@ void PackW32Pe::unpack(OutputFile *fo)
|
|||||||
extrainfo += sizeof (oh);
|
extrainfo += sizeof (oh);
|
||||||
unsigned objs = oh.objects;
|
unsigned objs = oh.objects;
|
||||||
|
|
||||||
autoheap_array(pe_section_t, osection, objs);
|
Array(pe_section_t, osection, objs);
|
||||||
memcpy(osection,extrainfo,sizeof(pe_section_t) * objs);
|
memcpy(osection,extrainfo,sizeof(pe_section_t) * objs);
|
||||||
rvamin = osection[0].vaddr;
|
rvamin = osection[0].vaddr;
|
||||||
extrainfo += sizeof(pe_section_t) * objs;
|
extrainfo += sizeof(pe_section_t) * objs;
|
||||||
|
|||||||
+14
-6
@@ -159,8 +159,12 @@ protected:
|
|||||||
{
|
{
|
||||||
LE32 vaddr;
|
LE32 vaddr;
|
||||||
LE32 size;
|
LE32 size;
|
||||||
} ddirs[16];
|
}
|
||||||
} ih, oh;
|
__attribute_packed;
|
||||||
|
|
||||||
|
struct ddirs_t ddirs[16];
|
||||||
|
}
|
||||||
|
__attribute_packed;
|
||||||
|
|
||||||
struct pe_section_t
|
struct pe_section_t
|
||||||
{
|
{
|
||||||
@@ -171,7 +175,11 @@ protected:
|
|||||||
LE32 rawdataptr;
|
LE32 rawdataptr;
|
||||||
char _[12];
|
char _[12];
|
||||||
LE32 flags;
|
LE32 flags;
|
||||||
} *isection;
|
}
|
||||||
|
__attribute_packed;
|
||||||
|
|
||||||
|
pe_header_t ih, oh;
|
||||||
|
pe_section_t *isection;
|
||||||
|
|
||||||
static unsigned virta2objnum (unsigned, pe_section_t *, unsigned);
|
static unsigned virta2objnum (unsigned, pe_section_t *, unsigned);
|
||||||
unsigned tryremove (unsigned, unsigned);
|
unsigned tryremove (unsigned, unsigned);
|
||||||
@@ -225,13 +233,13 @@ protected:
|
|||||||
FBIG_ENDIAN = 0x8000
|
FBIG_ENDIAN = 0x8000
|
||||||
};
|
};
|
||||||
|
|
||||||
// resource types
|
// predefined resource types
|
||||||
enum {
|
enum {
|
||||||
RT_CURSOR = 1, RT_BITMAP, RT_ICON, RT_MENU, RT_DIALOG, RT_STRING,
|
RT_CURSOR = 1, RT_BITMAP, RT_ICON, RT_MENU, RT_DIALOG, RT_STRING,
|
||||||
RT_FONTDIR, RT_FONT, RT_ACCELERATOR, RT_RCDATA, RT_MESSAGE_TABLE,
|
RT_FONTDIR, RT_FONT, RT_ACCELERATOR, RT_RCDATA, RT_MESSAGETABLE,
|
||||||
RT_GROUP_CURSOR, RT_GROUP_ICON = 14, RT_VERSION = 16, RT_DLGINCLUDE,
|
RT_GROUP_CURSOR, RT_GROUP_ICON = 14, RT_VERSION = 16, RT_DLGINCLUDE,
|
||||||
RT_PLUGPLAY = 19, RT_VXD, RT_ANICURSOR, RT_ANIICON, RT_HTML,
|
RT_PLUGPLAY = 19, RT_VXD, RT_ANICURSOR, RT_ANIICON, RT_HTML,
|
||||||
RT_LAST
|
RT_MANIFEST, RT_LAST
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
+9
-10
@@ -173,6 +173,7 @@ void PackWcle::encodeEntryTable()
|
|||||||
}
|
}
|
||||||
|
|
||||||
//if (Opt_debug) printf("%d entries encoded.\n",n);
|
//if (Opt_debug) printf("%d entries encoded.\n",n);
|
||||||
|
UNUSED(n);
|
||||||
|
|
||||||
soentries = p - ientries + 1;
|
soentries = p - ientries + 1;
|
||||||
oentries = ientries;
|
oentries = ientries;
|
||||||
@@ -276,20 +277,18 @@ void PackWcle::preprocessFixups()
|
|||||||
|
|
||||||
unsigned ic,jc;
|
unsigned ic,jc;
|
||||||
|
|
||||||
MemBuffer counts_buf((objects+2)*sizeof(unsigned));
|
Array(unsigned, counts, objects+2);
|
||||||
unsigned *counts = (unsigned *) (unsigned char *) counts_buf;
|
|
||||||
countFixups(counts);
|
countFixups(counts);
|
||||||
|
|
||||||
for (ic = jc = 0; ic < objects; ic++)
|
for (ic = jc = 0; ic < objects; ic++)
|
||||||
jc += counts[ic];
|
jc += counts[ic];
|
||||||
|
|
||||||
MemBuffer rl(jc);
|
ByteArray(rl,jc);
|
||||||
MemBuffer srf(counts[objects+0]+1);
|
ByteArray(srf, counts[objects+0]+1);
|
||||||
MemBuffer slf(counts[objects+1]+1);
|
ByteArray(slf, counts[objects+1]+1);
|
||||||
|
|
||||||
upx_byte *selector_fixups = srf;
|
upx_byte *selector_fixups = srf;
|
||||||
upx_byte *selfrel_fixups = slf;
|
upx_byte *selfrel_fixups = slf;
|
||||||
|
|
||||||
unsigned rc = 0;
|
unsigned rc = 0;
|
||||||
|
|
||||||
upx_byte *fix = ifixups;
|
upx_byte *fix = ifixups;
|
||||||
@@ -297,7 +296,7 @@ void PackWcle::preprocessFixups()
|
|||||||
{
|
{
|
||||||
while ((unsigned)(fix - ifixups) < get_le32(ifpage_table+ic+1))
|
while ((unsigned)(fix - ifixups) < get_le32(ifpage_table+ic+1))
|
||||||
{
|
{
|
||||||
const short fixp2 = get_le16(fix+2);
|
const signed short fixp2 = (signed short) get_le16(fix+2);
|
||||||
unsigned value;
|
unsigned value;
|
||||||
|
|
||||||
switch (*fix)
|
switch (*fix)
|
||||||
@@ -319,7 +318,7 @@ void PackWcle::preprocessFixups()
|
|||||||
fix += 5;
|
fix += 5;
|
||||||
break;
|
break;
|
||||||
case 5: // 16-bit offset
|
case 5: // 16-bit offset
|
||||||
if ((unsigned)fixp2 < 4096 && IOT(fix[4]-1,my_base_address) == jc)
|
if ((unsigned short)fixp2 < 4096 && IOT(fix[4]-1,my_base_address) == jc)
|
||||||
dputc('6',stdout);
|
dputc('6',stdout);
|
||||||
else
|
else
|
||||||
throwCantPack("unsupported 16-bit offset relocation");
|
throwCantPack("unsupported 16-bit offset relocation");
|
||||||
@@ -483,7 +482,7 @@ void PackWcle::pack(OutputFile *fo)
|
|||||||
set_le32(ifixups+sofixups,ih.init_esp_offset+IOT(ih.init_ss_object-1,my_base_address)); // old stack pointer
|
set_le32(ifixups+sofixups,ih.init_esp_offset+IOT(ih.init_ss_object-1,my_base_address)); // old stack pointer
|
||||||
set_le32(ifixups+sofixups+4,ih.init_eip_offset+text_vaddr); // real entry point
|
set_le32(ifixups+sofixups+4,ih.init_eip_offset+text_vaddr); // real entry point
|
||||||
set_le32(ifixups+sofixups+8,mps*pages); // virtual address of unpacked relocations
|
set_le32(ifixups+sofixups+8,mps*pages); // virtual address of unpacked relocations
|
||||||
ifixups[sofixups+12] = (unsigned char) objects;
|
ifixups[sofixups+12] = (unsigned char) (unsigned) objects;
|
||||||
sofixups += 13;
|
sofixups += 13;
|
||||||
|
|
||||||
// filter
|
// filter
|
||||||
@@ -832,7 +831,7 @@ void PackWcle::unpack(OutputFile *fo)
|
|||||||
|
|
||||||
// copy the overlay
|
// copy the overlay
|
||||||
const unsigned overlaystart = ih.data_pages_offset + exe_offset
|
const unsigned overlaystart = ih.data_pages_offset + exe_offset
|
||||||
+ mps * (pages - 1) + ih.bytes_on_last_page;
|
+ getImageSize();
|
||||||
const unsigned overlay = file_size - overlaystart - ih.non_resident_name_table_length;
|
const unsigned overlay = file_size - overlaystart - ih.non_resident_name_table_length;
|
||||||
checkOverlay(overlay);
|
checkOverlay(overlay);
|
||||||
copyOverlay(fo, overlay, &oimage);
|
copyOverlay(fo, overlay, &oimage);
|
||||||
|
|||||||
+3
-3
@@ -458,7 +458,7 @@ void Packer::handleStub(InputFile *fif, OutputFile *fo, long size)
|
|||||||
{
|
{
|
||||||
// copy stub from exe
|
// copy stub from exe
|
||||||
info("Copying original stub: %ld bytes", size);
|
info("Copying original stub: %ld bytes", size);
|
||||||
autoheap_array(char, stub, size);
|
ByteArray(stub, size);
|
||||||
fif->seek(0,SEEK_SET);
|
fif->seek(0,SEEK_SET);
|
||||||
fif->readx(stub,size);
|
fif->readx(stub,size);
|
||||||
fo->write(stub,size);
|
fo->write(stub,size);
|
||||||
@@ -566,7 +566,7 @@ void Packer::initPackHeader()
|
|||||||
ph.format = getFormat();
|
ph.format = getFormat();
|
||||||
ph.method = -1;
|
ph.method = -1;
|
||||||
ph.level = -1;
|
ph.level = -1;
|
||||||
ph.u_adler = ph.c_adler = ph.saved_u_adler = ph.saved_c_adler = upx_adler32(0,NULL,0);
|
ph.u_adler = ph.c_adler = ph.saved_u_adler = ph.saved_c_adler = upx_adler32(NULL,0);
|
||||||
ph.buf_offset = -1;
|
ph.buf_offset = -1;
|
||||||
ph.u_file_size = file_size;
|
ph.u_file_size = file_size;
|
||||||
}
|
}
|
||||||
@@ -1160,7 +1160,7 @@ void Packer::compressWithFilters(Filter *parm_ft,
|
|||||||
// copy filters, add a 0
|
// copy filters, add a 0
|
||||||
int nfilters = 0;
|
int nfilters = 0;
|
||||||
bool zero_seen = false;
|
bool zero_seen = false;
|
||||||
autoheap_array(int, filters, raw_nfilters + 2);
|
Array(int, filters, raw_nfilters + 2);
|
||||||
for (f = raw_filters; *f >= 0; f++)
|
for (f = raw_filters; *f >= 0; f++)
|
||||||
{
|
{
|
||||||
if (*f == 0)
|
if (*f == 0)
|
||||||
|
|||||||
+14
-4
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2001 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2002 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2001 Laszlo Molnar
|
Copyright (C) 1996-2002 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
@@ -22,7 +22,7 @@
|
|||||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer Laszlo Molnar
|
Markus F.X.J. Oberhumer Laszlo Molnar
|
||||||
markus@oberhumer.com ml1050@cdata.tvnet.hu
|
<mfx@users.sourceforge.net> <ml1050@users.sourceforge.net>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
@@ -65,6 +65,7 @@ struct screen_data_t
|
|||||||
int rows;
|
int rows;
|
||||||
int cursor_x;
|
int cursor_x;
|
||||||
int cursor_y;
|
int cursor_y;
|
||||||
|
int scroll_counter;
|
||||||
unsigned char attr;
|
unsigned char attr;
|
||||||
unsigned char init_attr;
|
unsigned char init_attr;
|
||||||
unsigned char empty_attr;
|
unsigned char empty_attr;
|
||||||
@@ -312,7 +313,7 @@ static int init(screen_t *this, int fd)
|
|||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
#if 1 && defined(__DJGPP__)
|
#if 1 && defined(__DJGPP__)
|
||||||
/* check for Windows NT/2000 */
|
/* check for Windows NT/2000/XP */
|
||||||
if (_get_dos_version(1) == 0x0532)
|
if (_get_dos_version(1) == 0x0532)
|
||||||
return -1;
|
return -1;
|
||||||
#endif
|
#endif
|
||||||
@@ -419,6 +420,7 @@ static int scrollUp(screen_t *this, int lines)
|
|||||||
for (y = sr - lines; y < sr; y++)
|
for (y = sr - lines; y < sr; y++)
|
||||||
clearLine(this,y);
|
clearLine(this,y);
|
||||||
|
|
||||||
|
this->data->scroll_counter += lines;
|
||||||
return lines;
|
return lines;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -456,10 +458,17 @@ static int scrollDown(screen_t *this, int lines)
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
this->data->scroll_counter -= lines;
|
||||||
return lines;
|
return lines;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int getScrollCounter(const screen_t *this)
|
||||||
|
{
|
||||||
|
return this->data->scroll_counter;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static int s_kbhit(screen_t *this)
|
static int s_kbhit(screen_t *this)
|
||||||
{
|
{
|
||||||
UNUSED(this);
|
UNUSED(this);
|
||||||
@@ -531,6 +540,7 @@ static const screen_t driver =
|
|||||||
updateLineN,
|
updateLineN,
|
||||||
scrollUp,
|
scrollUp,
|
||||||
scrollDown,
|
scrollDown,
|
||||||
|
getScrollCounter,
|
||||||
s_kbhit,
|
s_kbhit,
|
||||||
intro,
|
intro,
|
||||||
(struct screen_data_t *) 0
|
(struct screen_data_t *) 0
|
||||||
|
|||||||
+3
-3
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2001 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2002 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2001 Laszlo Molnar
|
Copyright (C) 1996-2002 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
@@ -22,7 +22,7 @@
|
|||||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer Laszlo Molnar
|
Markus F.X.J. Oberhumer Laszlo Molnar
|
||||||
markus@oberhumer.com ml1050@cdata.tvnet.hu
|
<mfx@users.sourceforge.net> <ml1050@users.sourceforge.net>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
+19
-4
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2001 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2002 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2001 Laszlo Molnar
|
Copyright (C) 1996-2002 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
@@ -22,7 +22,7 @@
|
|||||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer Laszlo Molnar
|
Markus F.X.J. Oberhumer Laszlo Molnar
|
||||||
markus@oberhumer.com ml1050@cdata.tvnet.hu
|
<mfx@users.sourceforge.net> <ml1050@users.sourceforge.net>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
@@ -63,6 +63,7 @@ struct screen_data_t
|
|||||||
int rows;
|
int rows;
|
||||||
int cursor_x;
|
int cursor_x;
|
||||||
int cursor_y;
|
int cursor_y;
|
||||||
|
int scroll_counter;
|
||||||
unsigned char attr;
|
unsigned char attr;
|
||||||
unsigned char init_attr;
|
unsigned char init_attr;
|
||||||
unsigned char map[256];
|
unsigned char map[256];
|
||||||
@@ -324,7 +325,7 @@ static int init(screen_t *this, int fd)
|
|||||||
#if defined(MINOR) && defined(MAJOR) && defined(TTY_MAJOR)
|
#if defined(MINOR) && defined(MAJOR) && defined(TTY_MAJOR)
|
||||||
if (MAJOR(st.st_rdev) == TTY_MAJOR)
|
if (MAJOR(st.st_rdev) == TTY_MAJOR)
|
||||||
{
|
{
|
||||||
char vc_name[32];
|
char vc_name[64];
|
||||||
unsigned char vc_data[4];
|
unsigned char vc_data[4];
|
||||||
int i;
|
int i;
|
||||||
int attr;
|
int attr;
|
||||||
@@ -332,6 +333,11 @@ static int init(screen_t *this, int fd)
|
|||||||
|
|
||||||
sprintf(vc_name, "/dev/vcsa%d", (int) MINOR(st.st_rdev));
|
sprintf(vc_name, "/dev/vcsa%d", (int) MINOR(st.st_rdev));
|
||||||
this->data->fd = open(vc_name, O_RDWR);
|
this->data->fd = open(vc_name, O_RDWR);
|
||||||
|
if (this->data->fd == -1)
|
||||||
|
{
|
||||||
|
sprintf(vc_name, "/dev/vcc/a%d", (int) MINOR(st.st_rdev));
|
||||||
|
this->data->fd = open(vc_name, O_RDWR);
|
||||||
|
}
|
||||||
if (this->data->fd != -1)
|
if (this->data->fd != -1)
|
||||||
{
|
{
|
||||||
if (read(this->data->fd, vc_data, 4) == 4)
|
if (read(this->data->fd, vc_data, 4) == 4)
|
||||||
@@ -446,6 +452,7 @@ static int scrollUp(screen_t *this, int lines)
|
|||||||
for (y = sr - lines; y < sr; y++)
|
for (y = sr - lines; y < sr; y++)
|
||||||
clearLine(this,y);
|
clearLine(this,y);
|
||||||
|
|
||||||
|
this->data->scroll_counter += lines;
|
||||||
return lines;
|
return lines;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -483,10 +490,17 @@ static int scrollDown(screen_t *this, int lines)
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
this->data->scroll_counter -= lines;
|
||||||
return lines;
|
return lines;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int getScrollCounter(const screen_t *this)
|
||||||
|
{
|
||||||
|
return this->data->scroll_counter;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static int getCursorShape(const screen_t *this)
|
static int getCursorShape(const screen_t *this)
|
||||||
{
|
{
|
||||||
UNUSED(this);
|
UNUSED(this);
|
||||||
@@ -580,6 +594,7 @@ static const screen_t driver =
|
|||||||
updateLineN,
|
updateLineN,
|
||||||
scrollUp,
|
scrollUp,
|
||||||
scrollDown,
|
scrollDown,
|
||||||
|
getScrollCounter,
|
||||||
kbhit,
|
kbhit,
|
||||||
intro,
|
intro,
|
||||||
(struct screen_data_t *) 0
|
(struct screen_data_t *) 0
|
||||||
|
|||||||
+22
-5
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2001 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2002 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2001 Laszlo Molnar
|
Copyright (C) 1996-2002 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
@@ -22,7 +22,7 @@
|
|||||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer Laszlo Molnar
|
Markus F.X.J. Oberhumer Laszlo Molnar
|
||||||
markus@oberhumer.com ml1050@cdata.tvnet.hu
|
<mfx@users.sourceforge.net> <ml1050@users.sourceforge.net>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
@@ -62,6 +62,7 @@ struct screen_data_t
|
|||||||
int rows;
|
int rows;
|
||||||
int cursor_x;
|
int cursor_x;
|
||||||
int cursor_y;
|
int cursor_y;
|
||||||
|
int scroll_counter;
|
||||||
|
|
||||||
WORD attr;
|
WORD attr;
|
||||||
WORD init_attr;
|
WORD init_attr;
|
||||||
@@ -311,8 +312,10 @@ static int init(screen_t *this, int fd)
|
|||||||
#else
|
#else
|
||||||
this->data->cols = csbi->dwSize.X;
|
this->data->cols = csbi->dwSize.X;
|
||||||
this->data->rows = csbi->dwSize.Y;
|
this->data->rows = csbi->dwSize.Y;
|
||||||
|
#if 0
|
||||||
if (csbi->srWindow.Left != 0)
|
if (csbi->srWindow.Left != 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
this->data->cursor_x = csbi->dwCursorPosition.X;
|
this->data->cursor_x = csbi->dwCursorPosition.X;
|
||||||
@@ -413,12 +416,21 @@ static int do_scroll(screen_t *this, int lines, int way)
|
|||||||
|
|
||||||
static int scrollUp(screen_t *this, int lines)
|
static int scrollUp(screen_t *this, int lines)
|
||||||
{
|
{
|
||||||
return do_scroll(this, lines, 0);
|
lines = do_scroll(this, lines, 0);
|
||||||
|
this->data->scroll_counter += lines;
|
||||||
|
return lines;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int scrollDown(screen_t *this, int lines)
|
static int scrollDown(screen_t *this, int lines)
|
||||||
{
|
{
|
||||||
return do_scroll(this, lines, 1);
|
lines = do_scroll(this, lines, 1);
|
||||||
|
this->data->scroll_counter -= lines;
|
||||||
|
return lines;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int getScrollCounter(const screen_t *this)
|
||||||
|
{
|
||||||
|
return this->data->scroll_counter;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -426,7 +438,11 @@ static int s_kbhit(screen_t *this)
|
|||||||
{
|
{
|
||||||
#if defined(HAVE_CONIO_H)
|
#if defined(HAVE_CONIO_H)
|
||||||
UNUSED(this);
|
UNUSED(this);
|
||||||
|
# if defined(__BORLANDC__)
|
||||||
|
return kbhit();
|
||||||
|
# else
|
||||||
return _kbhit();
|
return _kbhit();
|
||||||
|
# endif
|
||||||
#else
|
#else
|
||||||
UNUSED(this);
|
UNUSED(this);
|
||||||
return 0;
|
return 0;
|
||||||
@@ -483,6 +499,7 @@ static const screen_t driver =
|
|||||||
updateLineN,
|
updateLineN,
|
||||||
scrollUp,
|
scrollUp,
|
||||||
scrollDown,
|
scrollDown,
|
||||||
|
getScrollCounter,
|
||||||
s_kbhit,
|
s_kbhit,
|
||||||
intro,
|
intro,
|
||||||
(struct screen_data_t *) 0
|
(struct screen_data_t *) 0
|
||||||
|
|||||||
+6
-3
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2001 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2002 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2001 Laszlo Molnar
|
Copyright (C) 1996-2002 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
@@ -22,7 +22,7 @@
|
|||||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer Laszlo Molnar
|
Markus F.X.J. Oberhumer Laszlo Molnar
|
||||||
markus@oberhumer.com ml1050@cdata.tvnet.hu
|
<mfx@users.sourceforge.net> <ml1050@users.sourceforge.net>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
@@ -79,6 +79,7 @@ struct screen_t
|
|||||||
|
|
||||||
int (*scrollUp)(screen_t *s, int);
|
int (*scrollUp)(screen_t *s, int);
|
||||||
int (*scrollDown)(screen_t *s, int);
|
int (*scrollDown)(screen_t *s, int);
|
||||||
|
int (*getScrollCounter)(const screen_t *s);
|
||||||
|
|
||||||
int (*kbhit)(screen_t *s);
|
int (*kbhit)(screen_t *s);
|
||||||
|
|
||||||
@@ -120,6 +121,8 @@ static void LOG(const char *format, ...)
|
|||||||
|
|
||||||
if (!logfile)
|
if (!logfile)
|
||||||
logfile = fopen("screen.log", "wt");
|
logfile = fopen("screen.log", "wt");
|
||||||
|
if (!logfile)
|
||||||
|
return;
|
||||||
|
|
||||||
va_start(args,format);
|
va_start(args,format);
|
||||||
vfprintf(logfile,format,args);
|
vfprintf(logfile,format,args);
|
||||||
|
|||||||
+4
-4
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2001 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2002 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2001 Laszlo Molnar
|
Copyright (C) 1996-2002 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
@@ -22,7 +22,7 @@
|
|||||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer Laszlo Molnar
|
Markus F.X.J. Oberhumer Laszlo Molnar
|
||||||
markus@oberhumer.com ml1050@cdata.tvnet.hu
|
<mfx@users.sourceforge.net> <ml1050@users.sourceforge.net>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
@@ -33,7 +33,7 @@
|
|||||||
|
|
||||||
#ifdef WANT_STL
|
#ifdef WANT_STL
|
||||||
|
|
||||||
#if defined(__DJGPP__) || defined(__MINGW32__) || defined(__sparc__)
|
#if defined(__GNUC__)
|
||||||
// provide missing oom_handler
|
// provide missing oom_handler
|
||||||
void (*__malloc_alloc_template<0>::__malloc_alloc_oom_handler)() = 0;
|
void (*__malloc_alloc_template<0>::__malloc_alloc_oom_handler)() = 0;
|
||||||
# if !defined(__USE_MALLOC)
|
# if !defined(__USE_MALLOC)
|
||||||
|
|||||||
+46
-8
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2001 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2002 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2001 Laszlo Molnar
|
Copyright (C) 1996-2002 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
@@ -22,7 +22,7 @@
|
|||||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer Laszlo Molnar
|
Markus F.X.J. Oberhumer Laszlo Molnar
|
||||||
markus@oberhumer.com ml1050@cdata.tvnet.hu
|
<mfx@users.sourceforge.net> <ml1050@users.sourceforge.net>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
@@ -32,16 +32,56 @@
|
|||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
|
||||||
|
|
||||||
|
//#define NOTHROW throw()
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
// exceptions, RTTI
|
// exceptions & RTTI
|
||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
|
|
||||||
|
#if defined(__DMC__)
|
||||||
|
|
||||||
|
#include <new.h>
|
||||||
|
#include <typeinfo.h>
|
||||||
|
|
||||||
|
namespace std {
|
||||||
|
typedef ::Type_info type_info;
|
||||||
|
class exception
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
exception() NOTHROW { }
|
||||||
|
virtual ~exception() NOTHROW { }
|
||||||
|
virtual const char* what() const NOTHROW { return "exception"; }
|
||||||
|
};
|
||||||
|
class bad_alloc : public exception
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
bad_alloc() NOTHROW { }
|
||||||
|
virtual ~bad_alloc() NOTHROW { }
|
||||||
|
virtual const char* what() const NOTHROW { return "bad_alloc"; }
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
#elif defined(__WATCOMC__)
|
||||||
|
|
||||||
|
#define std
|
||||||
|
|
||||||
#include <exception>
|
#include <exception>
|
||||||
//#include <stdexcept>
|
//#include <stdexcept>
|
||||||
|
|
||||||
#include <new>
|
#include <new>
|
||||||
#include <typeinfo>
|
#include <typeinfo>
|
||||||
|
|
||||||
|
class bad_alloc { };
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
#include <exception>
|
||||||
|
//#include <stdexcept>
|
||||||
|
#include <new>
|
||||||
|
#include <typeinfo>
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
// STL
|
// STL
|
||||||
@@ -52,7 +92,7 @@
|
|||||||
#if defined(__linux__)
|
#if defined(__linux__)
|
||||||
# define _NOTHREADS
|
# define _NOTHREADS
|
||||||
#endif
|
#endif
|
||||||
#if defined(__DJGPP__) || defined(__MINGW32__) || defined(__sparc__)
|
#if defined(__GNUC__)
|
||||||
# define __THROW_BAD_ALLOC throw bad_alloc()
|
# define __THROW_BAD_ALLOC throw bad_alloc()
|
||||||
# define __USE_MALLOC
|
# define __USE_MALLOC
|
||||||
# define enable upx_stl_enable
|
# define enable upx_stl_enable
|
||||||
@@ -71,8 +111,6 @@
|
|||||||
#endif /* WANT_STL */
|
#endif /* WANT_STL */
|
||||||
|
|
||||||
|
|
||||||
using namespace std;
|
|
||||||
|
|
||||||
#endif /* __cplusplus */
|
#endif /* __cplusplus */
|
||||||
|
|
||||||
#endif /* already included */
|
#endif /* already included */
|
||||||
|
|||||||
+35
-7
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2001 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2002 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2001 Laszlo Molnar
|
Copyright (C) 1996-2002 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
@@ -22,7 +22,7 @@
|
|||||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer Laszlo Molnar
|
Markus F.X.J. Oberhumer Laszlo Molnar
|
||||||
markus@oberhumer.com ml1050@cdata.tvnet.hu
|
<mfx@users.sourceforge.net> <ml1050@users.sourceforge.net>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
@@ -41,6 +41,8 @@
|
|||||||
# define __MFX_WIN
|
# define __MFX_WIN
|
||||||
# elif defined(__WIN32__) || defined(_WIN32) || defined(WIN32)
|
# elif defined(__WIN32__) || defined(_WIN32) || defined(WIN32)
|
||||||
# define __MFX_WIN
|
# define __MFX_WIN
|
||||||
|
# elif defined(__CYGWIN__) || defined(__MINGW32__)
|
||||||
|
# define __MFX_WIN
|
||||||
# elif defined(__NT__) || defined(__NT_DLL__) || defined(__WINDOWS_386__)
|
# elif defined(__NT__) || defined(__NT_DLL__) || defined(__WINDOWS_386__)
|
||||||
# define __MFX_WIN
|
# define __MFX_WIN
|
||||||
# elif defined(__DOS__) || defined(__MSDOS__) || defined(MSDOS)
|
# elif defined(__DOS__) || defined(__MSDOS__) || defined(MSDOS)
|
||||||
@@ -122,13 +124,18 @@
|
|||||||
# define HAVE_MODE_T 1
|
# define HAVE_MODE_T 1
|
||||||
# define HAVE_CHMOD 1
|
# define HAVE_CHMOD 1
|
||||||
# define HAVE_UTIME 1
|
# define HAVE_UTIME 1
|
||||||
#elif defined(__GNUC__) && defined(__MFX_TOS)
|
#elif defined(__MINT__)
|
||||||
|
# undef HAVE_SETMODE
|
||||||
# define TIME_WITH_SYS_TIME 1
|
# define TIME_WITH_SYS_TIME 1
|
||||||
# define HAVE_UNISTD_H 1
|
# define HAVE_UNISTD_H 1
|
||||||
# define HAVE_UTIME_H 1
|
# define HAVE_UTIME_H 1
|
||||||
# define HAVE_CHMOD 1
|
# define HAVE_CHMOD 1
|
||||||
|
# define HAVE_CHOWN 1
|
||||||
# define HAVE_UTIME 1
|
# define HAVE_UTIME 1
|
||||||
#elif defined(__BORLANDC__)
|
#elif defined(__BORLANDC__)
|
||||||
|
# if (__BORLANDC__ < 0x551)
|
||||||
|
# error "need Borland C 5.5.1 or newer"
|
||||||
|
# endif
|
||||||
# define __UPX_CDECL __cdecl
|
# define __UPX_CDECL __cdecl
|
||||||
# define SIGTYPEENTRY __cdecl
|
# define SIGTYPEENTRY __cdecl
|
||||||
# define HAVE_CONIO_H 1
|
# define HAVE_CONIO_H 1
|
||||||
@@ -140,6 +147,16 @@
|
|||||||
# define HAVE_UTIME 1
|
# define HAVE_UTIME 1
|
||||||
# define HAVE_VSNPRINTF 1
|
# define HAVE_VSNPRINTF 1
|
||||||
# define vsnprintf _vsnprintf
|
# define vsnprintf _vsnprintf
|
||||||
|
#elif defined(__DMC__)
|
||||||
|
# define __UPX_CDECL __cdecl
|
||||||
|
# define SIGTYPEENTRY __cdecl
|
||||||
|
# define HAVE_IO_H 1
|
||||||
|
# define HAVE_MALLOC_H 1
|
||||||
|
# define HAVE_UNISTD_H 1
|
||||||
|
# define HAVE_UTIME_H 1
|
||||||
|
# define HAVE_MODE_T 1
|
||||||
|
# define HAVE_CHMOD 1
|
||||||
|
# define HAVE_UTIME 1
|
||||||
#elif defined(_MSC_VER)
|
#elif defined(_MSC_VER)
|
||||||
# define __UPX_CDECL __cdecl
|
# define __UPX_CDECL __cdecl
|
||||||
# define SIGTYPEENTRY __cdecl
|
# define SIGTYPEENTRY __cdecl
|
||||||
@@ -154,16 +171,27 @@
|
|||||||
# define HAVE_VSNPRINTF 1
|
# define HAVE_VSNPRINTF 1
|
||||||
# define vsnprintf _vsnprintf
|
# define vsnprintf _vsnprintf
|
||||||
//# pragma warning(once: 4097 4710)
|
//# pragma warning(once: 4097 4710)
|
||||||
# pragma warning(disable: 4097 4710)
|
//# pragma warning(disable: 4097 4511 4512 4710)
|
||||||
# pragma warning(disable: 4511 4512)
|
# pragma warning(disable: 4097) // W3: typedef-name 'A' used as synonym for class-name 'B'
|
||||||
|
# pragma warning(disable: 4511) // W3: 'class': copy constructor could not be generated
|
||||||
|
# pragma warning(disable: 4512) // W4: 'class': assignment operator could not be generated
|
||||||
|
# pragma warning(disable: 4710) // W4: 'function': function not inlined
|
||||||
# endif
|
# endif
|
||||||
#elif defined(__WATCOMC__)
|
#elif defined(__WATCOMC__)
|
||||||
|
# if (__WATCOMC__ < 1100)
|
||||||
|
# error "need Watcom C 11.0c or newer"
|
||||||
|
# define NO_BOOL 1
|
||||||
|
# endif
|
||||||
# define __UPX_CDECL __cdecl
|
# define __UPX_CDECL __cdecl
|
||||||
# define HAVE_IO_H 1
|
# define HAVE_IO_H 1
|
||||||
# define HAVE_SYS_UTIME_H 1
|
# define HAVE_SYS_UTIME_H 1
|
||||||
# define HAVE_CHMOD 1
|
# define HAVE_CHMOD 1
|
||||||
# define HAVE_UTIME 1
|
# define HAVE_UTIME 1
|
||||||
# define NO_BOOL 1
|
# define HAVE_VSNPRINTF 1
|
||||||
|
# define vsnprintf _vsnprintf
|
||||||
|
# if defined(__cplusplus)
|
||||||
|
# pragma warning 656 9 // w5: define this function inside its class definition (may improve code quality)
|
||||||
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(__MFX_DOS)
|
#if defined(__MFX_DOS)
|
||||||
|
|||||||
+55
-38
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2001 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2002 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2001 Laszlo Molnar
|
Copyright (C) 1996-2002 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
@@ -22,14 +22,14 @@
|
|||||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer Laszlo Molnar
|
Markus F.X.J. Oberhumer Laszlo Molnar
|
||||||
markus@oberhumer.com ml1050@cdata.tvnet.hu
|
<mfx@users.sourceforge.net> <ml1050@users.sourceforge.net>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
#include "conf.h"
|
#include "conf.h"
|
||||||
#include "file.h"
|
#include "file.h"
|
||||||
#include "screen.h"
|
|
||||||
#include "ui.h"
|
#include "ui.h"
|
||||||
|
#include "screen.h"
|
||||||
#include "packer.h"
|
#include "packer.h"
|
||||||
|
|
||||||
|
|
||||||
@@ -47,7 +47,7 @@ enum {
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
struct UiPacker::State
|
struct UiPacker__State
|
||||||
{
|
{
|
||||||
int mode;
|
int mode;
|
||||||
|
|
||||||
@@ -116,7 +116,7 @@ static void init_global_constants(void)
|
|||||||
done = true;
|
done = true;
|
||||||
|
|
||||||
#if 1 && defined(__DJGPP__)
|
#if 1 && defined(__DJGPP__)
|
||||||
/* check for Windows NT/2000 */
|
/* check for Windows NT/2000/XP */
|
||||||
if (_get_dos_version(1) == 0x0532)
|
if (_get_dos_version(1) == 0x0532)
|
||||||
return;
|
return;
|
||||||
#endif
|
#endif
|
||||||
@@ -144,16 +144,18 @@ static const char *mkline(unsigned long fu_len, unsigned long fc_len,
|
|||||||
{
|
{
|
||||||
static char buf[2000];
|
static char buf[2000];
|
||||||
char r[7+1];
|
char r[7+1];
|
||||||
|
char fn[13+1];
|
||||||
const char *f;
|
const char *f;
|
||||||
|
|
||||||
unsigned ratio = get_ratio(fu_len, fc_len);
|
unsigned ratio = get_ratio(fu_len, fc_len);
|
||||||
upx_snprintf(r,sizeof(r),"%3d.%02d%%", ratio / 10000, (ratio % 10000) / 100);
|
upx_snprintf(r, sizeof(r), "%3d.%02d%%", ratio / 10000, (ratio % 10000) / 100);
|
||||||
if (decompress)
|
if (decompress)
|
||||||
f = "%10ld <-%10ld %7s %13s %s";
|
f = "%10ld <-%10ld %7s %13s %s";
|
||||||
else
|
else
|
||||||
f = "%10ld ->%10ld %7s %13s %s";
|
f = "%10ld ->%10ld %7s %13s %s";
|
||||||
upx_snprintf(buf,sizeof(buf),f,
|
center_string(fn, sizeof(fn), format_name);
|
||||||
fu_len, fc_len, r, center_string(format_name,13), filename);
|
assert(strlen(fn) == 13);
|
||||||
|
upx_snprintf(buf, sizeof(buf), f, fu_len, fc_len, r, fn, filename);
|
||||||
UNUSED(u_len); UNUSED(c_len);
|
UNUSED(u_len); UNUSED(c_len);
|
||||||
return buf;
|
return buf;
|
||||||
}
|
}
|
||||||
@@ -170,12 +172,12 @@ UiPacker::UiPacker(const Packer *p_) :
|
|||||||
|
|
||||||
clear_cb();
|
clear_cb();
|
||||||
|
|
||||||
s = new State;
|
s = new UiPacker__State;
|
||||||
memset(s,0,sizeof(*s));
|
memset(s,0,sizeof(*s));
|
||||||
s->msg_buf[0] = '\r';
|
s->msg_buf[0] = '\r';
|
||||||
|
|
||||||
#if defined(UI_USE_SCREEN)
|
#if defined(UI_USE_SCREEN)
|
||||||
// ugly hack
|
// FIXME - ugly hack
|
||||||
s->screen = sobject_get_screen();
|
s->screen = sobject_get_screen();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -185,7 +187,7 @@ UiPacker::UiPacker(const Packer *p_) :
|
|||||||
s->mode = M_INFO;
|
s->mode = M_INFO;
|
||||||
else if (opt->verbose == 1 || opt->no_progress)
|
else if (opt->verbose == 1 || opt->no_progress)
|
||||||
s->mode = M_MSG;
|
s->mode = M_MSG;
|
||||||
else if (!s->screen)
|
else if (s->screen == NULL)
|
||||||
s->mode = M_CB_TERM;
|
s->mode = M_CB_TERM;
|
||||||
else
|
else
|
||||||
s->mode = M_CB_SCREEN;
|
s->mode = M_CB_SCREEN;
|
||||||
@@ -203,6 +205,18 @@ UiPacker::~UiPacker()
|
|||||||
// start callback
|
// start callback
|
||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
|
|
||||||
|
void UiPacker::printInfo(int nl)
|
||||||
|
{
|
||||||
|
#if 1
|
||||||
|
char method_name[32+1];
|
||||||
|
set_method_name(method_name, sizeof(method_name), p->ph.method, p->ph.level);
|
||||||
|
con_fprintf(stdout, "Compressing %s [%s, %s]%s", p->fi->getName(), p->getName(), method_name, nl ? "\n" : "");
|
||||||
|
#else
|
||||||
|
con_fprintf(stdout, "Compressing %s [%s]%s", p->fi->getName(), p->getName(), nl ? "\n" : "");
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void UiPacker::startCallback(unsigned u_len, unsigned step,
|
void UiPacker::startCallback(unsigned u_len, unsigned step,
|
||||||
int pass, int total_passes)
|
int pass, int total_passes)
|
||||||
{
|
{
|
||||||
@@ -230,7 +244,7 @@ void UiPacker::startCallback(unsigned u_len, unsigned step,
|
|||||||
{
|
{
|
||||||
if (pass <= 1)
|
if (pass <= 1)
|
||||||
{
|
{
|
||||||
con_fprintf(stdout,"Compressing %s [%s]",p->fi->getName(),p->getName());
|
printInfo(0);
|
||||||
fflush(stdout);
|
fflush(stdout);
|
||||||
printSetNl(2);
|
printSetNl(2);
|
||||||
}
|
}
|
||||||
@@ -274,18 +288,18 @@ void UiPacker::startCallback(unsigned u_len, unsigned step,
|
|||||||
#if defined(UI_USE_SCREEN)
|
#if defined(UI_USE_SCREEN)
|
||||||
if (s->mode == M_CB_SCREEN)
|
if (s->mode == M_CB_SCREEN)
|
||||||
{
|
{
|
||||||
s->screen->getCursor(s->screen,&s->s_cx,&s->s_cy);
|
if (pass <= 1)
|
||||||
s->s_fg = s->screen->getFg(s->screen);
|
{
|
||||||
s->s_bg = s->screen->getBg(s->screen);
|
|
||||||
|
|
||||||
// FIXME: this message can be longer than one line.
|
|
||||||
// must adapt endCallback() for this case.
|
|
||||||
con_fprintf(stdout,"Compressing %s [%s]\n",p->fi->getName(),p->getName());
|
|
||||||
s->screen->getCursor(s->screen,&s->b_cx,&s->b_cy);
|
|
||||||
if (s->b_cy == s->s_cy)
|
|
||||||
s->scroll_up++;
|
|
||||||
if (s->screen->hideCursor)
|
if (s->screen->hideCursor)
|
||||||
s->cursor_shape = s->screen->hideCursor(s->screen);
|
s->cursor_shape = s->screen->hideCursor(s->screen);
|
||||||
|
s->s_fg = s->screen->getFg(s->screen);
|
||||||
|
s->s_bg = s->screen->getBg(s->screen);
|
||||||
|
s->screen->getCursor(s->screen,&s->s_cx,&s->s_cy);
|
||||||
|
s->scroll_up = s->screen->getScrollCounter(s->screen);
|
||||||
|
printInfo(1);
|
||||||
|
s->screen->getCursor(s->screen,&s->b_cx,&s->b_cy);
|
||||||
|
s->scroll_up = s->screen->getScrollCounter(s->screen) - s->scroll_up;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
#endif /* UI_USE_SCREEN */
|
#endif /* UI_USE_SCREEN */
|
||||||
}
|
}
|
||||||
@@ -330,24 +344,27 @@ void UiPacker::endCallback()
|
|||||||
#if defined(UI_USE_SCREEN)
|
#if defined(UI_USE_SCREEN)
|
||||||
if (s->mode == M_CB_SCREEN)
|
if (s->mode == M_CB_SCREEN)
|
||||||
{
|
{
|
||||||
#if 0
|
if (done)
|
||||||
if (s->scroll_up)
|
{
|
||||||
s->screen->scrollDown(screen,s->scroll_up);
|
int cx, cy, sy;
|
||||||
else
|
|
||||||
s->screen->clearLine(s->screen,s->s_cy+1);
|
|
||||||
s->screen->clearLine(s->screen,s->s_cy);
|
|
||||||
s->screen->setCursor(s->screen,s->s_cx,s->s_cy);
|
|
||||||
#else
|
|
||||||
assert(s->s_cx == 0 && s->b_cx == 0);
|
assert(s->s_cx == 0 && s->b_cx == 0);
|
||||||
s->screen->clearLine(s->screen,s->b_cy-1);
|
s->screen->getCursor(s->screen, &cx, &cy);
|
||||||
s->screen->clearLine(s->screen,s->b_cy);
|
sy = UPX_MAX(0, s->s_cy - s->scroll_up);
|
||||||
s->screen->setCursor(s->screen,s->b_cx,s->b_cy-1);
|
while (cy >= sy)
|
||||||
#endif
|
s->screen->clearLine(s->screen, cy--);
|
||||||
|
s->screen->setCursor(s->screen, s->s_cx, sy);
|
||||||
s->screen->setFg(s->screen,s->s_fg);
|
s->screen->setFg(s->screen,s->s_fg);
|
||||||
s->screen->setBg(s->screen,s->s_bg);
|
s->screen->setBg(s->screen,s->s_bg);
|
||||||
if (s->cursor_shape > 0)
|
if (s->cursor_shape > 0)
|
||||||
s->screen->setCursorShape(s->screen,s->cursor_shape);
|
s->screen->setCursorShape(s->screen,s->cursor_shape);
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// not needed:
|
||||||
|
// s->screen->clearLine(s->screen, s->b_cy);
|
||||||
|
// s->screen->setCursor(s->screen, s->b_cx, s->b_cy);
|
||||||
|
}
|
||||||
|
}
|
||||||
#endif /* UI_USE_SCREEN */
|
#endif /* UI_USE_SCREEN */
|
||||||
|
|
||||||
clear_cb();
|
clear_cb();
|
||||||
@@ -362,14 +379,14 @@ void UiPacker::endCallback()
|
|||||||
// the callback
|
// the callback
|
||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
|
|
||||||
void __UPX_ENTRY UiPacker::callback(upx_uint isize, upx_uint osize, int state, void * user)
|
void __UPX_ENTRY UiPacker::callback(upx_uint isize, upx_uint osize, int state, void *user)
|
||||||
{
|
{
|
||||||
//printf("%6d %6d %d\n", is, os, state);
|
//printf("%6d %6d %d\n", isize, osize, state);
|
||||||
if (state != -1 && state != 3) return;
|
if (state != -1 && state != 3) return;
|
||||||
if (user)
|
if (user)
|
||||||
{
|
{
|
||||||
UiPacker *uip = reinterpret_cast<UiPacker *>(user);
|
UiPacker *uip = reinterpret_cast<UiPacker *>(user);
|
||||||
uip->doCallback(isize,osize);
|
uip->doCallback(isize, osize);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2001 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2002 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2001 Laszlo Molnar
|
Copyright (C) 1996-2002 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
@@ -22,7 +22,7 @@
|
|||||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer Laszlo Molnar
|
Markus F.X.J. Oberhumer Laszlo Molnar
|
||||||
markus@oberhumer.com ml1050@cdata.tvnet.hu
|
<mfx@users.sourceforge.net> <ml1050@users.sourceforge.net>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
@@ -43,10 +43,12 @@ class CMainDlg;
|
|||||||
//
|
//
|
||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
|
|
||||||
|
struct UiPacker__State;
|
||||||
|
|
||||||
class UiPacker
|
class UiPacker
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
UiPacker(const Packer *p);
|
UiPacker(const Packer *p_);
|
||||||
public:
|
public:
|
||||||
virtual ~UiPacker();
|
virtual ~UiPacker();
|
||||||
|
|
||||||
@@ -91,14 +93,14 @@ public:
|
|||||||
static void uiFooter(const char *n);
|
static void uiFooter(const char *n);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
virtual void printInfo(int nl=0);
|
||||||
const Packer *p;
|
const Packer *p;
|
||||||
|
|
||||||
// callback
|
// callback
|
||||||
cb_t cb;
|
cb_t cb;
|
||||||
|
|
||||||
// internal state
|
// internal state
|
||||||
struct State;
|
UiPacker__State *s;
|
||||||
struct State *s;
|
|
||||||
|
|
||||||
// totals
|
// totals
|
||||||
static long total_files;
|
static long total_files;
|
||||||
|
|||||||
+3
-3
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2001 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2002 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2001 Laszlo Molnar
|
Copyright (C) 1996-2002 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
@@ -22,7 +22,7 @@
|
|||||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer Laszlo Molnar
|
Markus F.X.J. Oberhumer Laszlo Molnar
|
||||||
markus@oberhumer.com ml1050@cdata.tvnet.hu
|
<mfx@users.sourceforge.net> <ml1050@users.sourceforge.net>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
+59
@@ -0,0 +1,59 @@
|
|||||||
|
#include <winres.h>
|
||||||
|
#include "version.h"
|
||||||
|
|
||||||
|
#define VERSION_MAJOR ((UPX_VERSION_HEX >> 16) & 0xff)
|
||||||
|
#define VERSION_MINOR ((UPX_VERSION_HEX >> 8) & 0xff)
|
||||||
|
#define VERSION_MICRO ((UPX_VERSION_HEX >> 0) & 0xff)
|
||||||
|
#define VERSION_STRING UPX_VERSION_STRING
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
#ifdef _WIN32
|
||||||
|
LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
|
||||||
|
#pragma code_page(1252)
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
//---------------------------------------------------------------------------##
|
||||||
|
// Icons
|
||||||
|
//---------------------------------------------------------------------------##
|
||||||
|
|
||||||
|
|
||||||
|
//---------------------------------------------------------------------------##
|
||||||
|
// Version
|
||||||
|
//---------------------------------------------------------------------------##
|
||||||
|
|
||||||
|
VS_VERSION_INFO VERSIONINFO
|
||||||
|
FILEVERSION VERSION_MAJOR,VERSION_MINOR,VERSION_MICRO,0
|
||||||
|
PRODUCTVERSION VERSION_MAJOR,VERSION_MINOR,VERSION_MICRO,0
|
||||||
|
FILEFLAGSMASK 0x3fL
|
||||||
|
#ifdef _DEBUG
|
||||||
|
FILEFLAGS 0x1L
|
||||||
|
#else
|
||||||
|
FILEFLAGS 0x0L
|
||||||
|
#endif
|
||||||
|
FILEOS 0x4L
|
||||||
|
FILETYPE 0x1L
|
||||||
|
FILESUBTYPE 0x0L
|
||||||
|
BEGIN
|
||||||
|
BLOCK "StringFileInfo"
|
||||||
|
BEGIN
|
||||||
|
BLOCK "040904b0"
|
||||||
|
BEGIN
|
||||||
|
VALUE "CompanyName", "The UPX Team http://upx.sf.net\0"
|
||||||
|
VALUE "FileDescription", "UPX executable packer\0"
|
||||||
|
VALUE "FileVersion", VERSION_STRING "\0"
|
||||||
|
VALUE "InternalName", "upx.exe\0"
|
||||||
|
VALUE "LegalCopyright", "© 1996-2002 Markus F.X.J. Oberhumer\0"
|
||||||
|
VALUE "OriginalFilename", "upx.exe\0"
|
||||||
|
VALUE "ProductName", "UPX\0"
|
||||||
|
VALUE "ProductVersion", VERSION_STRING "\0"
|
||||||
|
END
|
||||||
|
END
|
||||||
|
BLOCK "VarFileInfo"
|
||||||
|
BEGIN
|
||||||
|
VALUE "Translation", 0x409, 1200
|
||||||
|
END
|
||||||
|
END
|
||||||
|
|
||||||
|
// vi:ts=4:et
|
||||||
+113
-27
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2001 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2002 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2001 Laszlo Molnar
|
Copyright (C) 1996-2002 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
@@ -22,7 +22,7 @@
|
|||||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer Laszlo Molnar
|
Markus F.X.J. Oberhumer Laszlo Molnar
|
||||||
markus@oberhumer.com ml1050@cdata.tvnet.hu
|
<mfx@users.sourceforge.net> <ml1050@users.sourceforge.net>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
@@ -69,15 +69,16 @@ int le32_compare(const void *e1, const void *e2)
|
|||||||
|
|
||||||
int find(const void *b, int blen, const void *what, int wlen)
|
int find(const void *b, int blen, const void *what, int wlen)
|
||||||
{
|
{
|
||||||
if (b == NULL || what == NULL || wlen <= 0)
|
if (b == NULL || blen <= 0 || what == NULL || wlen <= 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
int i;
|
int i;
|
||||||
const unsigned char *base = (const unsigned char *) b;
|
const unsigned char *base = (const unsigned char *) b;
|
||||||
unsigned char firstc = * (const unsigned char *) what;
|
unsigned char firstc = * (const unsigned char *) what;
|
||||||
|
|
||||||
for (i = 0; i <= blen - wlen; i++, base++)
|
blen -= wlen;
|
||||||
if (*base == firstc && memcmp(base,what,wlen) == 0)
|
for (i = 0; i <= blen; i++, base++)
|
||||||
|
if (*base == firstc && memcmp(base, what, wlen) == 0)
|
||||||
return i;
|
return i;
|
||||||
|
|
||||||
return -1;
|
return -1;
|
||||||
@@ -87,35 +88,93 @@ int find(const void *b, int blen, const void *what, int wlen)
|
|||||||
int find_be16(const void *b, int blen, unsigned what)
|
int find_be16(const void *b, int blen, unsigned what)
|
||||||
{
|
{
|
||||||
unsigned char w[2];
|
unsigned char w[2];
|
||||||
set_be16(w,what);
|
set_be16(w, what);
|
||||||
return find(b,blen,w,2);
|
return find(b, blen, w, 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int find_be32(const void *b, int blen, unsigned what)
|
int find_be32(const void *b, int blen, unsigned what)
|
||||||
{
|
{
|
||||||
unsigned char w[4];
|
unsigned char w[4];
|
||||||
set_be32(w,what);
|
set_be32(w, what);
|
||||||
return find(b,blen,w,4);
|
return find(b, blen, w, 4);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int find_le16(const void *b, int blen, unsigned what)
|
int find_le16(const void *b, int blen, unsigned what)
|
||||||
{
|
{
|
||||||
unsigned char w[2];
|
unsigned char w[2];
|
||||||
set_le16(w,what);
|
set_le16(w, what);
|
||||||
return find(b,blen,w,2);
|
return find(b, blen, w, 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int find_le32(const void *b, int blen, unsigned what)
|
int find_le32(const void *b, int blen, unsigned what)
|
||||||
{
|
{
|
||||||
unsigned char w[4];
|
unsigned char w[4];
|
||||||
set_le32(w,what);
|
set_le32(w, what);
|
||||||
return find(b,blen,w,4);
|
return find(b, blen, w, 4);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
// find util
|
||||||
|
**************************************************************************/
|
||||||
|
|
||||||
|
#if (UPX_VERSION_HEX < 0x019000)
|
||||||
|
|
||||||
|
upx_bytep pfind(const void *b, int blen, const void *what, int wlen)
|
||||||
|
{
|
||||||
|
if (b == NULL || blen <= 0 || what == NULL || wlen <= 0)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
int i;
|
||||||
|
const upx_bytep base = (const upx_bytep) b;
|
||||||
|
unsigned char firstc = * (const upx_bytep) what;
|
||||||
|
|
||||||
|
blen -= wlen;
|
||||||
|
for (i = 0; i <= blen; i++, base++)
|
||||||
|
if (*base == firstc && memcmp(base, what, wlen) == 0)
|
||||||
|
return const_cast<upx_bytep>(base);
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
upx_bytep pfind_be16(const void *b, int blen, unsigned what)
|
||||||
|
{
|
||||||
|
unsigned char w[2];
|
||||||
|
set_be16(w,what);
|
||||||
|
return pfind(b,blen,w,2);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
upx_bytep pfind_be32(const void *b, int blen, unsigned what)
|
||||||
|
{
|
||||||
|
unsigned char w[4];
|
||||||
|
set_be32(w,what);
|
||||||
|
return pfind(b,blen,w,4);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
upx_bytep pfind_le16(const void *b, int blen, unsigned what)
|
||||||
|
{
|
||||||
|
unsigned char w[2];
|
||||||
|
set_le16(w,what);
|
||||||
|
return pfind(b,blen,w,2);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
upx_bytep pfind_le32(const void *b, int blen, unsigned what)
|
||||||
|
{
|
||||||
|
unsigned char w[4];
|
||||||
|
set_le32(w,what);
|
||||||
|
return pfind(b,blen,w,4);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* UPX_VERSION_HEX */
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
// string util
|
// string util
|
||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
@@ -318,15 +377,37 @@ void time2str(char *s, const time_t *t)
|
|||||||
// misc.
|
// misc.
|
||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
|
|
||||||
char *center_string(const char *name, size_t s)
|
bool set_method_name(char *buf, size_t size, int method, int level)
|
||||||
{
|
{
|
||||||
static char buf[256+1];
|
bool r = true;
|
||||||
size_t l = strlen(name);
|
const char *alg;
|
||||||
assert(l <= s && l < sizeof(buf));
|
if (M_IS_NRV2B(method))
|
||||||
memset(buf,' ',s);
|
alg = "NRV2B";
|
||||||
memcpy(buf+(s-l)/2,name,l);
|
else if (M_IS_NRV2D(method))
|
||||||
buf[s] = 0;
|
alg = "NRV2D";
|
||||||
return buf;
|
else if (M_IS_NRV2E(method))
|
||||||
|
alg = "NRV2E";
|
||||||
|
else
|
||||||
|
{
|
||||||
|
alg = "???";
|
||||||
|
r = false;
|
||||||
|
}
|
||||||
|
if (level > 0)
|
||||||
|
upx_snprintf(buf, size, "%s/%d", alg, level);
|
||||||
|
else
|
||||||
|
upx_snprintf(buf, size, "%s", alg);
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void center_string(char *buf, size_t size, const char *s)
|
||||||
|
{
|
||||||
|
size_t l = strlen(s);
|
||||||
|
size_t len = size - 1;
|
||||||
|
assert(l < size);
|
||||||
|
memset(buf, ' ', len);
|
||||||
|
memcpy(buf+(len-l)/2, s, l);
|
||||||
|
buf[len] = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -449,15 +530,20 @@ bool isafile(int fd)
|
|||||||
// return compression ratio, where 100% == 1000*1000 == 1e6
|
// return compression ratio, where 100% == 1000*1000 == 1e6
|
||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
|
|
||||||
unsigned get_ratio (unsigned u_len, unsigned c_len)
|
unsigned get_ratio(unsigned u_len, unsigned c_len)
|
||||||
{
|
{
|
||||||
#if defined(__GNUC__)
|
#if (ULONG_MAX <= 0xffffffffL)
|
||||||
|
# if defined(__GNUC__) || defined(__DMC__)
|
||||||
const unsigned long long n = 1000000;
|
const unsigned long long n = 1000000;
|
||||||
#elif defined(_MSC_VER)
|
# elif defined(__BORLANDC__) || defined(_MSC_VER) || defined(__WATCOMC__)
|
||||||
const unsigned __int64 n = 1000000;
|
const unsigned __int64 n = 1000000;
|
||||||
|
# else
|
||||||
|
# error "need a 64-bit integer type"
|
||||||
|
# endif
|
||||||
#else
|
#else
|
||||||
#error
|
const unsigned long n = 1000000;
|
||||||
#endif
|
#endif
|
||||||
|
COMPILE_TIME_ASSERT(sizeof(n) >= 8);
|
||||||
if (u_len <= 0)
|
if (u_len <= 0)
|
||||||
return (unsigned) n;
|
return (unsigned) n;
|
||||||
return (unsigned) ((c_len * n) / u_len) + 5;
|
return (unsigned) ((c_len * n) / u_len) + 5;
|
||||||
@@ -509,7 +595,7 @@ int _is_executable(const char *, int , const char *)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
//FIXME: something wants to link in ctime.o
|
// FIXME: something wants to link in ctime.o
|
||||||
time_t mktime(struct tm *)
|
time_t mktime(struct tm *)
|
||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
|
|||||||
+13
-4
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2001 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2002 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2001 Laszlo Molnar
|
Copyright (C) 1996-2002 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
@@ -22,7 +22,7 @@
|
|||||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer Laszlo Molnar
|
Markus F.X.J. Oberhumer Laszlo Molnar
|
||||||
markus@oberhumer.com ml1050@cdata.tvnet.hu
|
<mfx@users.sourceforge.net> <ml1050@users.sourceforge.net>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
@@ -49,7 +49,8 @@ bool makebakname(char *ofilename, const char *ifilename, bool force=true);
|
|||||||
bool isafile(int fd);
|
bool isafile(int fd);
|
||||||
|
|
||||||
unsigned get_ratio(unsigned u_len, unsigned c_len);
|
unsigned get_ratio(unsigned u_len, unsigned c_len);
|
||||||
char *center_string(const char *name, size_t s);
|
bool set_method_name(char *buf, size_t size, int method, int level);
|
||||||
|
void center_string(char *buf, size_t size, const char *s);
|
||||||
|
|
||||||
|
|
||||||
int find(const void *b, int blen, const void *what, int wlen);
|
int find(const void *b, int blen, const void *what, int wlen);
|
||||||
@@ -58,6 +59,14 @@ int find_be32(const void *b, int blen, unsigned what);
|
|||||||
int find_le16(const void *b, int blen, unsigned what);
|
int find_le16(const void *b, int blen, unsigned what);
|
||||||
int find_le32(const void *b, int blen, unsigned what);
|
int find_le32(const void *b, int blen, unsigned what);
|
||||||
|
|
||||||
|
#if (UPX_VERSION_HEX < 0x019000)
|
||||||
|
upx_bytep pfind(const void *b, int blen, const void *what, int wlen);
|
||||||
|
upx_bytep pfind_be16(const void *b, int blen, unsigned what);
|
||||||
|
upx_bytep pfind_be32(const void *b, int blen, unsigned what);
|
||||||
|
upx_bytep pfind_le16(const void *b, int blen, unsigned what);
|
||||||
|
upx_bytep pfind_le32(const void *b, int blen, unsigned what);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
inline ptrdiff_t ptr_diff(const void *p1, const void *p2)
|
inline ptrdiff_t ptr_diff(const void *p1, const void *p2)
|
||||||
{
|
{
|
||||||
|
|||||||
+1
-1
@@ -1,4 +1,4 @@
|
|||||||
#define UPX_VERSION 0x019001 /* 01.90.01 */
|
#define UPX_VERSION_HEX 0x019001 /* 01.90.01 */
|
||||||
#define UPX_VERSION_STRING "1.90.1"
|
#define UPX_VERSION_STRING "1.90.1"
|
||||||
#define UPX_VERSION_STRING4 "1.90"
|
#define UPX_VERSION_STRING4 "1.90"
|
||||||
#define UPX_VERSION_DATE "Jul 16th 2002"
|
#define UPX_VERSION_DATE "Jul 16th 2002"
|
||||||
|
|||||||
+18
-7
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2001 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2002 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2001 Laszlo Molnar
|
Copyright (C) 1996-2002 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
@@ -22,7 +22,7 @@
|
|||||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer Laszlo Molnar
|
Markus F.X.J. Oberhumer Laszlo Molnar
|
||||||
markus@oberhumer.com ml1050@cdata.tvnet.hu
|
<mfx@users.sourceforge.net> <ml1050@users.sourceforge.net>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
@@ -31,6 +31,7 @@
|
|||||||
#include "packmast.h"
|
#include "packmast.h"
|
||||||
#include "packer.h"
|
#include "packer.h"
|
||||||
#include "ui.h"
|
#include "ui.h"
|
||||||
|
#include "version.h"
|
||||||
|
|
||||||
|
|
||||||
#if defined(__DJGPP__)
|
#if defined(__DJGPP__)
|
||||||
@@ -129,6 +130,10 @@ void do_one_file(const char *iname, char *oname)
|
|||||||
else
|
else
|
||||||
flags |= O_EXCL;
|
flags |= O_EXCL;
|
||||||
int shmode = SH_DENYWR;
|
int shmode = SH_DENYWR;
|
||||||
|
#if defined(__MINT__)
|
||||||
|
flags |= O_TRUNC;
|
||||||
|
shmode = O_DENYRW;
|
||||||
|
#endif
|
||||||
#if defined(__DJGPP__) || defined(_MSC_VER)
|
#if defined(__DJGPP__) || defined(_MSC_VER)
|
||||||
// we can avoid the chmod() call below
|
// we can avoid the chmod() call below
|
||||||
int omode = st.st_mode;
|
int omode = st.st_mode;
|
||||||
@@ -146,7 +151,11 @@ void do_one_file(const char *iname, char *oname)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// handle command
|
// handle command
|
||||||
|
#if (UPX_VERSION_HEX >= 0x019000)
|
||||||
PackMaster pm(&fi, opt);
|
PackMaster pm(&fi, opt);
|
||||||
|
#else
|
||||||
|
PackMaster pm(&fi);
|
||||||
|
#endif
|
||||||
if (opt->cmd == CMD_COMPRESS)
|
if (opt->cmd == CMD_COMPRESS)
|
||||||
pm.pack(&fo);
|
pm.pack(&fo);
|
||||||
else if (opt->cmd == CMD_DECOMPRESS)
|
else if (opt->cmd == CMD_DECOMPRESS)
|
||||||
@@ -275,21 +284,23 @@ void do_files(int i, int argc, char *argv[])
|
|||||||
unlink_ofile(oname);
|
unlink_ofile(oname);
|
||||||
printErr(iname,&e);
|
printErr(iname,&e);
|
||||||
e_exit(EXIT_ERROR);
|
e_exit(EXIT_ERROR);
|
||||||
} catch (const std::bad_alloc &e) {
|
} catch (const std::bad_alloc &) {
|
||||||
unlink_ofile(oname);
|
unlink_ofile(oname);
|
||||||
printErr(iname,"out of memory");
|
printErr(iname,"out of memory");
|
||||||
e_exit(EXIT_ERROR);
|
e_exit(EXIT_ERROR);
|
||||||
} catch (const std::bad_alloc *e) {
|
} catch (std::bad_alloc *e) {
|
||||||
unlink_ofile(oname);
|
unlink_ofile(oname);
|
||||||
printErr(iname,"out of memory");
|
printErr(iname,"out of memory");
|
||||||
|
delete e;
|
||||||
e_exit(EXIT_ERROR);
|
e_exit(EXIT_ERROR);
|
||||||
} catch (const exception &e) {
|
} catch (const std::exception &e) {
|
||||||
unlink_ofile(oname);
|
unlink_ofile(oname);
|
||||||
printUnhandledException(iname,&e);
|
printUnhandledException(iname,&e);
|
||||||
e_exit(EXIT_ERROR);
|
e_exit(EXIT_ERROR);
|
||||||
} catch (const exception *e) {
|
} catch (std::exception *e) {
|
||||||
unlink_ofile(oname);
|
unlink_ofile(oname);
|
||||||
printUnhandledException(iname,e);
|
printUnhandledException(iname,e);
|
||||||
|
delete e;
|
||||||
e_exit(EXIT_ERROR);
|
e_exit(EXIT_ERROR);
|
||||||
} catch (...) {
|
} catch (...) {
|
||||||
unlink_ofile(oname);
|
unlink_ofile(oname);
|
||||||
|
|||||||
Reference in New Issue
Block a user