Compare commits

...

541 Commits

Author SHA1 Message Date
Markus F.X.J. Oberhumer ce6d99bdb4 More README updates.
committer: mfx <mfx> 1146086335 +0000
2006-04-26 21:18:55 +00:00
Markus F.X.J. Oberhumer 86d4125893 Updates.
committer: mfx <mfx> 1146086189 +0000
2006-04-26 21:16:29 +00:00
Markus F.X.J. Oberhumer 3a18f00379 Prepared 2.00 release notes.
committer: mfx <mfx> 1146085621 +0000
2006-04-26 21:07:01 +00:00
Markus F.X.J. Oberhumer e6274904a7 Rebuilt using i386-linux-ld-2.16.1 and i386-linux-objcopy-2.16.1.
committer: mfx <mfx> 1146079399 +0000
2006-04-26 19:23:19 +00:00
Markus F.X.J. Oberhumer 3677395444 Add version suffix to the binutils we use. Prefix all linux/386 tools
with i386-linux-.

committer: mfx <mfx> 1146079325 +0000
2006-04-26 19:22:05 +00:00
László Molnár 22ba35b3b5 new arm/pe assembly with UPX linker support
committer: ml1050 <ml1050> 1145955479 +0000
2006-04-25 08:57:59 +00:00
Markus F.X.J. Oberhumer 9c1ab9979b Split "$Id" strings so that CVS does not interfere. Explicitlty
use ".p2align" and ".balign" instead of ".align".

committer: mfx <mfx> 1145864788 +0000
2006-04-24 07:46:28 +00:00
John Reiser eaa463e1c9 Insert copyright notice (equivalent to ident_s.ash) into stub by hand
because buildLoader is not fully working yet
	l_lx_elf64amd.S l_lx_elfppc32.S l_mac_ppc32.S

committer: jreiser <jreiser> 1145825498 +0000
2006-04-23 20:51:38 +00:00
John Reiser 6984be48c3 build sync: compile using crosstool gcc-3.4.3.20050507-glibc-2.3.5
committer: jreiser <jreiser> 1145820281 +0000
2006-04-23 19:24:41 +00:00
John Reiser b739bd3d79 Work better with SELinux. We still require allow_execmem.
p_lx_elf.cpp
	stub/fold_elfppc32.h
	stub/l_lx_elfppc32.h
	stub/l_lx_elfppc32.S
	stub/m_lx_elfppc32.c

committer: jreiser <jreiser> 1145666524 +0000
2006-04-22 00:42:04 +00:00
John Reiser 23f3e4396c For elf64and and elfppc32: -fno-exceptions -fno-asynchronous-unwind-tables
committer: jreiser <jreiser> 1145666377 +0000
2006-04-22 00:39:37 +00:00
John Reiser c264750924 Adapt better to SELinux. We still need allow_execmem.
p_lx_elf.cpp
	stub/a_lx_elf64.c
	stub/l_lx_elf64amd.h
	stub/l_lx_elf64amd.lds
	stub/l_lx_elf64amd.S
	stub/fold_elf64amd.h

committer: jreiser <jreiser> 1145657332 +0000
2006-04-21 22:08:52 +00:00
John Reiser c155f0a5d5 Better fit with SELinux. Now requires only execmem, which Fedora Core 5
enables as default for non-confined [ordinary] executables.
	l_lx_elf.c
	l_lx_elf86.asm
	l_lx_elf86.h
	l_lx_elf86.lds
	fold_elf86.asm
	fold_elf86.h

committer: jreiser <jreiser> 1145634453 +0000
2006-04-21 15:47:33 +00:00
László Molnár 76734f086d added an arm/linux based loader/tester for arm/pe files
committer: ml1050 <ml1050> 1145605029 +0000
2006-04-21 07:37:09 +00:00
Markus F.X.J. Oberhumer 4f2d1172dd Added a note about --force-execve. Converted quoting from using
backticks to single-quotes.

committer: mfx <mfx> 1145444708 +0000
2006-04-19 11:05:08 +00:00
Markus F.X.J. Oberhumer 75caf4e297 Fix spelling in NEWS.
committer: mfx <mfx> 1145436378 +0000
2006-04-19 08:46:18 +00:00
Markus F.X.J. Oberhumer 509ab8261f Avoid code bloat in the official builds.
committer: mfx <mfx> 1145436321 +0000
2006-04-19 08:45:21 +00:00
Markus F.X.J. Oberhumer 1e05b40d4f Whitespace changes.
committer: mfx <mfx> 1145436164 +0000
2006-04-19 08:42:44 +00:00
Markus F.X.J. Oberhumer 451390f835 Updated NEWS.
committer: mfx <mfx> 1145435924 +0000
2006-04-19 08:38:44 +00:00
John Reiser 58cce9d2f8 Give message on stderr when SELinux enforcing mode inhibits execution.
l_lx_elf.c fold_elf86.asm fold_elf86.h

committer: jreiser <jreiser> 1145393418 +0000
2006-04-18 20:50:18 +00:00
László Molnár 2eb6e3b0ea arm/pe & w32/pe: disable filters for files with broken headers
committer: ml1050 <ml1050> 1145356307 +0000
2006-04-18 10:31:47 +00:00
John Reiser fb1181ed26 Allow executables >=3MB on elf64amd; -r1.69 on 2005-11-12 forgot to remove check.
committer: jreiser <jreiser> 1145139994 +0000
2006-04-15 22:26:34 +00:00
Markus F.X.J. Oberhumer 6d5e1d529d Updated NEWS.
committer: mfx <mfx> 1144968512 +0000
2006-04-13 22:48:32 +00:00
John Reiser 0e0ca08924 Propagate changes from linux.hh.
fold_elf86.h fold_pti86.h fold_sh86.h

committer: jreiser <jreiser> 1144967510 +0000
2006-04-13 22:31:50 +00:00
John Reiser 5d948a67a8 Propagate changes from linux.hh.
Also adjust calling segquence of upx_main() to shave a few bytes.
	l_lx_exec.c fold_exec86.asm fold_exec86.h

committer: jreiser <jreiser> 1144967447 +0000
2006-04-13 22:30:47 +00:00
John Reiser 6a4db2ecab Linux syscalls can clobber any input register, thanks to gcc and
the lack of a Linux kernel ABI.
	linux.hh

committer: jreiser <jreiser> 1144967342 +0000
2006-04-13 22:29:02 +00:00
Markus F.X.J. Oberhumer f700273624 Really bump the release date.
committer: mfx <mfx> 1144944628 +0000
2006-04-13 16:10:28 +00:00
Markus F.X.J. Oberhumer 0c198e0ccc Set tentative release date.
committer: mfx <mfx> 1144944070 +0000
2006-04-13 16:01:10 +00:00
Markus F.X.J. Oberhumer 71ffbbc420 Prepared 1.96 release.
committer: mfx <mfx> 1144943500 +0000
2006-04-13 15:51:40 +00:00
Markus F.X.J. Oberhumer 4fd09b889d Updated .cvsignore.
committer: mfx <mfx> 1144943334 +0000
2006-04-13 15:48:54 +00:00
László Molnár 4cb2a3eebe show image size change in info mode
committer: ml1050 <ml1050> 1144941392 +0000
2006-04-13 15:16:32 +00:00
László Molnár c25186b1f6 minor documentation updates
committer: ml1050 <ml1050> 1144941274 +0000
2006-04-13 15:14:34 +00:00
László Molnár 779033d0bc added filter (id: 0x50) support to the stub
the data cache is written back before the stub jumps to the uncompressed code

committer: ml1050 <ml1050> 1144931349 +0000
2006-04-13 12:29:09 +00:00
László Molnár 3e31560e7d added a new filter for ARM 24-bit naive calltrick
committer: ml1050 <ml1050> 1144931022 +0000
2006-04-13 12:23:42 +00:00
László Molnár d23d7e8775 removed unneeded entry point address check
committer: ml1050 <ml1050> 1144745835 +0000
2006-04-11 08:57:15 +00:00
László Molnár f6fdf5cb7f show image size change in info mode
committer: ml1050 <ml1050> 1144671675 +0000
2006-04-10 12:21:15 +00:00
Markus F.X.J. Oberhumer 1879ccd27d Next version will be 2.00.
committer: mfx <mfx> 1144586292 +0000
2006-04-09 12:38:12 +00:00
Markus F.X.J. Oberhumer 08c0796719 Avoid warnings when building for m68k.
committer: mfx <mfx> 1144523702 +0000
2006-04-08 19:15:02 +00:00
Markus F.X.J. Oberhumer edc7994ce5 Prepared 1.95 release.
committer: mfx <mfx> 1144522884 +0000
2006-04-08 19:01:24 +00:00
Markus F.X.J. Oberhumer bcfcfbd064 Added some more operators.
committer: mfx <mfx> 1144522838 +0000
2006-04-08 19:00:38 +00:00
Markus F.X.J. Oberhumer 9e79b3258d Make const-correct to avoid warning.
committer: mfx <mfx> 1144522792 +0000
2006-04-08 18:59:52 +00:00
John Reiser 243873cd2d Workaround inconsistent SIZEOF_HEADERS in stub/*.lds.
Test with --force-execve and --no-filter.
	p_lx_exc.cpp p_lx_sh.cpp stub/l_lx_sh86.asm stub/l_lx_sh86.h

committer: jreiser <jreiser> 1144381286 +0000
2006-04-07 03:41:26 +00:00
Markus F.X.J. Oberhumer c7b8a4b0c1 Updated.
committer: mfx <mfx> 1144320028 +0000
2006-04-06 10:40:28 +00:00
Markus F.X.J. Oberhumer e39e0c7140 Added .gitignore files.
committer: mfx <mfx> 1144319429 +0000
2006-04-06 10:30:29 +00:00
Markus F.X.J. Oberhumer d4a3f11dbb Whitespace changes.
committer: mfx <mfx> 1144318755 +0000
2006-04-06 10:19:15 +00:00
Markus F.X.J. Oberhumer 0962f266b3 Whitespace changes.
committer: mfx <mfx> 1144314053 +0000
2006-04-06 09:00:53 +00:00
Markus F.X.J. Oberhumer 69e4d3fdad Bumped tentative release date.
committer: mfx <mfx> 1144313563 +0000
2006-04-06 08:52:43 +00:00
Markus F.X.J. Oberhumer c0908f463a Added files to "clean" target.
committer: mfx <mfx> 1144313493 +0000
2006-04-06 08:51:33 +00:00
Markus F.X.J. Oberhumer b00a61a17b Updated.
committer: mfx <mfx> 1144313468 +0000
2006-04-06 08:51:08 +00:00
László Molnár 553c2f886a arm/pe: thumb mode dll support added
committer: ml1050 <ml1050> 1144312217 +0000
2006-04-06 08:30:17 +00:00
László Molnár 4fd9c5772a arm/pe:
v4 ARM mode stub support with assembly decompressor by John
dll support for v4 ARM mode
unpacking support

committer: ml1050 <ml1050> 1144249762 +0000
2006-04-05 15:09:22 +00:00
Markus F.X.J. Oberhumer 04e0e06d85 Whitespace changes.
committer: mfx <mfx> 1144235344 +0000
2006-04-05 11:09:04 +00:00
Markus F.X.J. Oberhumer 4d7829d72b New ACC version.
committer: mfx <mfx> 1144235271 +0000
2006-04-05 11:07:51 +00:00
John Reiser 6b751aac57 Fix return from THUMB to ARM mode on ARMv4T. Document r6 unused.
committer: jreiser <jreiser> 1143650112 +0000
2006-03-29 16:35:12 +00:00
László Molnár 813349fd23 arm/pe: support for nrv2b, support for cpu = 0x1c2, certificate info now removed
committer: ml1050 <ml1050> 1143614738 +0000
2006-03-29 06:45:38 +00:00
John Reiser 16a2744782 find_SEGMENT_gap() like find_LOAD_gap(). Use it to avoid checksum trouble.
p_mach.cpp p_mach.h

committer: jreiser <jreiser> 1143576015 +0000
2006-03-28 20:00:15 +00:00
John Reiser 7b6870db22 Fix bug: bad test for reaching back too far in SAFE mode. (Thank you, Laszlo.)
committer: jreiser <jreiser> 1143564998 +0000
2006-03-28 16:56:38 +00:00
Markus F.X.J. Oberhumer 3e38e7d52c Small cleanups.
committer: mfx <mfx> 1143474969 +0000
2006-03-27 15:56:09 +00:00
László Molnár 8142d3474d get_le32 reimplemented in assembly
committer: ml1050 <ml1050> 1143473260 +0000
2006-03-27 15:27:40 +00:00
Markus F.X.J. Oberhumer 8773649de6 Make code warning-free.
committer: mfx <mfx> 1143464312 +0000
2006-03-27 12:58:32 +00:00
Markus F.X.J. Oberhumer c117920ff9 Add -Wall -Werror to cross-compiler flags.
committer: mfx <mfx> 1143463128 +0000
2006-03-27 12:38:48 +00:00
László Molnár c8dd2a3eb8 arm/pe: use -march=armv4t instead of v5
committer: ml1050 <ml1050> 1143462067 +0000
2006-03-27 12:21:07 +00:00
Markus F.X.J. Oberhumer 90b1817e92 Undef PAGE_{MASK,SIZE} in conf.h.
committer: mfx <mfx> 1143454717 +0000
2006-03-27 10:18:37 +00:00
Markus F.X.J. Oberhumer d6c3ff5997 Cleanups.
committer: mfx <mfx> 1143454663 +0000
2006-03-27 10:17:43 +00:00
László Molnár 984ec25132 arm/pe: the assembly thumb mode decompressor is used in the stub
arm/pe: the C part of the stub is compiled as thumb

committer: ml1050 <ml1050> 1143449862 +0000
2006-03-27 08:57:42 +00:00
John Reiser a7bff34784 Fix THUMB mode return to ARM mode on ARMv4T. Spend 18 bytes to inline
most of get1b via conditional subroutine call idiom.

committer: jreiser <jreiser> 1143302120 +0000
2006-03-25 15:55:20 +00:00
John Reiser a6e7afbc91 Fix bug: first 'add' instead of 'adc' at get1_n2b. (Thank you, Laszlo.)
committer: jreiser <jreiser> 1143228535 +0000
2006-03-24 19:28:55 +00:00
John Reiser 33f1d63b64 Fix bug: first 'add' at get1_n2e instead of 'adc'.
Also conditionally assemble SAFE mode for buffer checking (default off).

committer: jreiser <jreiser> 1143228361 +0000
2006-03-24 19:26:01 +00:00
John Reiser f95e171e11 Workaround linux-2.6.14 binfmt_elf.c: SIGKILL if (0==.p_memsz) on a page boundary.
p_lx_elf.cpp p_lx_exc.cpp

committer: jreiser <jreiser> 1143057770 +0000
2006-03-22 20:02:50 +00:00
Markus F.X.J. Oberhumer c82b50b212 Bumped tentative release date.
committer: mfx <mfx> 1142610024 +0000
2006-03-17 15:40:24 +00:00
Markus F.X.J. Oberhumer 2b402b77f1 Updated short-list of supported executable formats.
committer: mfx <mfx> 1142609852 +0000
2006-03-17 15:37:32 +00:00
Markus F.X.J. Oberhumer adcb551020 Increase alignment to 16.
committer: mfx <mfx> 1142608657 +0000
2006-03-17 15:17:37 +00:00
Markus F.X.J. Oberhumer 2680aabe06 Removed bogus __attribute_packed from struct udll.
committer: mfx <mfx> 1142607440 +0000
2006-03-17 14:57:20 +00:00
Markus F.X.J. Oberhumer d5c0533b74 Allow the PE sections to cross a page boundary.
committer: mfx <mfx> 1142603590 +0000
2006-03-17 13:53:10 +00:00
Markus F.X.J. Oberhumer 609307668b Use $(MAKEFILE_LIST) for dependencies.
committer: mfx <mfx> 1142527291 +0000
2006-03-16 16:41:31 +00:00
Markus F.X.J. Oberhumer cdaf36572a Use UPX_VERSION_DATE_ISO from src/version.h.
committer: mfx <mfx> 1142527194 +0000
2006-03-16 16:39:54 +00:00
Markus F.X.J. Oberhumer 033c8d5d51 Updated.
committer: mfx <mfx> 1142523608 +0000
2006-03-16 15:40:08 +00:00
Markus F.X.J. Oberhumer 6216ec1d6a Mention John as a main author.
committer: mfx <mfx> 1142522272 +0000
2006-03-16 15:17:52 +00:00
László Molnár 6c9c67f6c5 DEP hack: it seems we need to patch the flags of section "UPX1" too
committer: ml1050 <ml1050> 1142508181 +0000
2006-03-16 11:23:01 +00:00
Markus F.X.J. Oberhumer 5bd32b5521 Commented out "int3" debugging leftovers.
committer: mfx <mfx> 1142312678 +0000
2006-03-14 05:04:38 +00:00
Markus F.X.J. Oberhumer 549336f75b Use boolean instead of bitwise logic.
committer: mfx <mfx> 1142311485 +0000
2006-03-14 04:44:45 +00:00
Markus F.X.J. Oberhumer f0e75f30b3 Fixed typo in comment.
committer: mfx <mfx> 1142310885 +0000
2006-03-14 04:34:45 +00:00
Markus F.X.J. Oberhumer 144c09f175 Rebuilt i386-linux stubs by gcc-3.4.6.
committer: mfx <mfx> 1142310823 +0000
2006-03-14 04:33:43 +00:00
Markus F.X.J. Oberhumer ee50c0f97c Corrected app_*.pl dependency.
committer: mfx <mfx> 1142309988 +0000
2006-03-14 04:19:48 +00:00
John Reiser ade921bf02 %.asy and %.asx depend onf $(APP_I386)
committer: jreiser <jreiser> 1142306625 +0000
2006-03-14 03:23:45 +00:00
John Reiser 676cacff04 gcc-4.1.0 vs. mmap()
linux.hh
	fold_elf86.asm  l_lx_elf.c
	fold_exec86.asm l_lx_exec.c
	fold_pti86.asm  l_lx_pti.c
	fold_sh86.asm   l_lx_sh.c    l_lx_sh86.asm
	l_lx_sep.c

committer: jreiser <jreiser> 1142305438 +0000
2006-03-14 03:03:58 +00:00
Markus F.X.J. Oberhumer a3097d5e25 Added a dependency.
committer: mfx <mfx> 1142303569 +0000
2006-03-14 02:32:49 +00:00
Markus F.X.J. Oberhumer fd78148558 Fixed typo in disabled code.
committer: mfx <mfx> 1142302679 +0000
2006-03-14 02:17:59 +00:00
Markus F.X.J. Oberhumer a4d79d7375 Small cosmetic changes.
committer: mfx <mfx> 1142302586 +0000
2006-03-14 02:16:26 +00:00
Markus F.X.J. Oberhumer df04e8183d Filter parameters should be called "ft" instead of "fp".
committer: mfx <mfx> 1142301730 +0000
2006-03-14 02:02:10 +00:00
Markus F.X.J. Oberhumer c43c484a62 Re-synced both files a little bit.
committer: mfx <mfx> 1142301586 +0000
2006-03-14 01:59:46 +00:00
Markus F.X.J. Oberhumer 0608c35669 Added some more OBJSTRIP. Small cleanups.
committer: mfx <mfx> 1142298790 +0000
2006-03-14 01:13:10 +00:00
Markus F.X.J. Oberhumer 7dd4d06e26 Added some more calls to $(OBJSTRIP_LINUX_I386) after $(NASM) invocations.
committer: mfx <mfx> 1142288478 +0000
2006-03-13 22:21:18 +00:00
John Reiser 1ee0310b86 silence complaint from ld "cannot find entry symbol _start; defaulting to 10000000"
committer: jreiser <jreiser> 1142285749 +0000
2006-03-13 21:35:49 +00:00
Markus F.X.J. Oberhumer cc0a52038f Rebuilt i386-linux stubs with gcc-4.1.0 for small size decrease.
committer: mfx <mfx> 1142248018 +0000
2006-03-13 11:06:58 +00:00
Markus F.X.J. Oberhumer 6aed1fe231 Updated.
committer: mfx <mfx> 1142247976 +0000
2006-03-13 11:06:16 +00:00
Markus F.X.J. Oberhumer 680608fe18 Portability fix.
committer: mfx <mfx> 1142247872 +0000
2006-03-13 11:04:32 +00:00
Markus F.X.J. Oberhumer ec6acbc602 Small fix to make valid ANSI C again.
committer: mfx <mfx> 1142247837 +0000
2006-03-13 11:03:57 +00:00
John Reiser cb7ee4c5d2 _syscall1nr() for _exit; [still wastes 4 bytes]
committer: jreiser <jreiser> 1142210712 +0000
2006-03-13 00:45:12 +00:00
Markus F.X.J. Oberhumer 88d5798f45 Bumped versions for starting 1.95 development.
committer: mfx <mfx> 1142090576 +0000
2006-03-11 15:22:56 +00:00
Markus F.X.J. Oberhumer fcc22a0aa3 Added UPX_VERSION_DATE_ISO.
committer: mfx <mfx> 1142085195 +0000
2006-03-11 13:53:15 +00:00
Markus F.X.J. Oberhumer aabefff298 Prepared for release 1.94.
committer: mfx <mfx> 1142081862 +0000
2006-03-11 12:57:42 +00:00
Markus F.X.J. Oberhumer ed25c64e97 Updated.
committer: mfx <mfx> 1142081797 +0000
2006-03-11 12:56:37 +00:00
Markus F.X.J. Oberhumer b7dc870c2d Centered strings.
committer: mfx <mfx> 1142081776 +0000
2006-03-11 12:56:16 +00:00
Markus F.X.J. Oberhumer 9bea608843 Don't suppress errors with -qq.
committer: mfx <mfx> 1142081041 +0000
2006-03-11 12:44:01 +00:00
Markus F.X.J. Oberhumer 9db1732c36 Added a note that we should upgrade to gcc-4.1.0 on i386-linux.
committer: mfx <mfx> 1142074774 +0000
2006-03-11 10:59:34 +00:00
Markus F.X.J. Oberhumer 39f1a70174 Small update.
committer: mfx <mfx> 1142036155 +0000
2006-03-11 00:15:55 +00:00
Markus F.X.J. Oberhumer 1810440355 Added __attribute__((__sentinel__)) to Packer::addLoader(). This is
a new gcc-4.1 feature.

committer: mfx <mfx> 1142035833 +0000
2006-03-11 00:10:33 +00:00
Markus F.X.J. Oberhumer 37ac8f179e New ACC version.
committer: mfx <mfx> 1142035385 +0000
2006-03-11 00:03:05 +00:00
Markus F.X.J. Oberhumer 626a09328f Updated.
committer: mfx <mfx> 1141807336 +0000
2006-03-08 08:42:16 +00:00
Markus F.X.J. Oberhumer 8d489d0d77 New ACC version.
committer: mfx <mfx> 1141798968 +0000
2006-03-08 06:22:48 +00:00
Markus F.X.J. Oberhumer 776f3db0d7 Detabified.
committer: mfx <mfx> 1141795978 +0000
2006-03-08 05:32:58 +00:00
John Reiser 6046057b88 Commentary on SELinux and UPX.
committer: jreiser <jreiser> 1141686040 +0000
2006-03-06 23:00:40 +00:00
Markus F.X.J. Oberhumer 7e85d9e549 Updated.
committer: mfx <mfx> 1141679044 +0000
2006-03-06 21:04:04 +00:00
Markus F.X.J. Oberhumer 01c8a8b1c2 Disabled an expensive run-time assertion.
committer: mfx <mfx> 1141642878 +0000
2006-03-06 11:01:18 +00:00
Markus F.X.J. Oberhumer c9bf6ac9ae No need to preserve eax in clearstack.
committer: mfx <mfx> 1141642647 +0000
2006-03-06 10:57:27 +00:00
John Reiser 62e4d69be9 re-compile from changed m_lx_elfppc32.c
committer: jreiser <jreiser> 1141605710 +0000
2006-03-06 00:41:50 +00:00
John Reiser 62ac733b09 simplify and save a few bytes
committer: jreiser <jreiser> 1141488398 +0000
2006-03-04 16:06:38 +00:00
John Reiser c3b3e1b1b9 MAP_DENYWRITE
committer: jreiser <jreiser> 1141484579 +0000
2006-03-04 15:02:59 +00:00
John Reiser a791e96e00 Fix do_xmap() to work under SElinux. Also trim unneeded code.
committer: jreiser <jreiser> 1141413353 +0000
2006-03-03 19:15:53 +00:00
John Reiser e87f5521c1 conditionally compile debugging printf
committer: jreiser <jreiser> 1141365595 +0000
2006-03-03 05:59:55 +00:00
John Reiser 366a708f3a Generalize to more than 2 PT_LOAD using find_LOAD_gap; needed for linux/ElfAMD.
Also simplifies, and applies to both ::pack and ::unpack.
	p_lx_elf.cpp p_lx_elf.h

committer: jreiser <jreiser> 1141348876 +0000
2006-03-03 01:21:16 +00:00
John Reiser 70ba662574 Avoid overwrite of obuf when hdr_buf and non-first method.
committer: jreiser <jreiser> 1141327368 +0000
2006-03-02 19:22:48 +00:00
John Reiser b389abd99f PackLinuxElf64amd::getCompressionMethods allows both nrv2b and nrv2e
committer: jreiser <jreiser> 1141326792 +0000
2006-03-02 19:13:12 +00:00
John Reiser 4aa2d14fe3 acknowledge unused results to avoid compiler warnings treated as errors
committer: jreiser <jreiser> 1141326721 +0000
2006-03-02 19:12:01 +00:00
John Reiser af7de75ad4 Allow unfilter when verifyOverlappingDecompression, for convenience
in end-to-end checksum.
	packer.h packer.cpp p_unix.cpp

committer: jreiser <jreiser> 1141252960 +0000
2006-03-01 22:42:40 +00:00
John Reiser d461ebbda1 fix packExtent checksums and lengths (of uncompressed data) for 0!=hdr_ulen
committer: jreiser <jreiser> 1141241763 +0000
2006-03-01 19:36:03 +00:00
John Reiser 55ef94abcd 8-bit decompressors for ARM; minimize space aggressively
arm_nrv2b_d8.S arm_nrv2e_d8.S

committer: jreiser <jreiser> 1140993873 +0000
2006-02-26 22:44:33 +00:00
John Reiser afaf489d99 save space aggressively
committer: jreiser <jreiser> 1140713717 +0000
2006-02-23 16:55:17 +00:00
John Reiser 20e4cbfd13 passes first tests! Only untested feature: large offset which forces
minimum match length to be >=3.
	arm_nrv2b_d32.S arm_nrv2e_d32.S

committer: jreiser <jreiser> 1140677145 +0000
2006-02-23 06:45:45 +00:00
John Reiser f3b8c9f34e debugging
committer: jreiser <jreiser> 1140634679 +0000
2006-02-22 18:57:59 +00:00
John Reiser 45e8ff25a5 hand-tuned decompressors for 32-bit NRV on ARM
arm_nrv2b_d32.S arm_nrv2e_d32.S

committer: jreiser <jreiser> 1140535945 +0000
2006-02-21 15:32:25 +00:00
John Reiser 268e322e1c Extra parameter for compressWithFilters and packExtent,
to fix 2-pass problem with --brute on linux/elf386.
Only one decompression method is allowed, chosen by
smallest output for .text; but Elf headers come first.
	packer.cpp packer.h p_unix.cpp p_unix.h p_lx_elf.cpp

committer: jreiser <jreiser> 1140241030 +0000
2006-02-18 05:37:10 +00:00
Markus F.X.J. Oberhumer d3bcba6a05 Removed "volatile" from global var "opt" - this was only needed
a long time ago to work around problems with ancient C++ compilers.

committer: mfx <mfx> 1140002094 +0000
2006-02-15 11:14:54 +00:00
Markus F.X.J. Oberhumer cc4ef1944d Make sure we only touch exactly one page. Update comments.
committer: mfx <mfx> 1139928961 +0000
2006-02-14 14:56:01 +00:00
Markus F.X.J. Oberhumer 5aa8486265 Prefer restoring the original protection flags.
committer: mfx <mfx> 1139928517 +0000
2006-02-14 14:48:37 +00:00
László Molnár fd181673cd a little more comments on the DEP hack stuff
committer: ml1050 <ml1050> 1139927444 +0000
2006-02-14 14:30:44 +00:00
László Molnár 62c9547c4e added some comments on the DEP hack stuff
committer: ml1050 <ml1050> 1139918135 +0000
2006-02-14 11:55:35 +00:00
Markus F.X.J. Oberhumer cdd117bfb9 Rearranged debug options.
committer: mfx <mfx> 1139916141 +0000
2006-02-14 11:22:21 +00:00
Markus F.X.J. Oberhumer 304ba57dad Clear the dirty stack on win32/pe.
committer: mfx <mfx> 1139914965 +0000
2006-02-14 11:02:45 +00:00
Markus F.X.J. Oberhumer 69eaaa4177 Revert previous checkin.
committer: mfx <mfx> 1139914479 +0000
2006-02-14 10:54:39 +00:00
Markus F.X.J. Oberhumer 452ac52fcb Added an overloaded addLoader() method.
committer: mfx <mfx> 1139913550 +0000
2006-02-14 10:39:10 +00:00
Markus F.X.J. Oberhumer 40cf489290 Avoid possibly clobbering edx.
committer: mfx <mfx> 1139881592 +0000
2006-02-14 01:46:32 +00:00
Markus F.X.J. Oberhumer 891d6be4a6 Removed options_t::win32_pe::strip_loadconf.
For compatibility reasons the option is still accepted (but
ignored) during commandline parsing.

committer: mfx <mfx> 1139866279 +0000
2006-02-13 21:31:19 +00:00
Markus F.X.J. Oberhumer 5d45ce5cf7 Removed an already fixed item.
committer: mfx <mfx> 1139864523 +0000
2006-02-13 21:02:03 +00:00
Markus F.X.J. Oberhumer a0f2241f3a Added comment.
committer: mfx <mfx> 1139862668 +0000
2006-02-13 20:31:08 +00:00
Markus F.X.J. Oberhumer aa513bf7d3 Quick fix for the Win32 startup crash. Needs more testing.
committer: mfx <mfx> 1139861398 +0000
2006-02-13 20:09:58 +00:00
Markus F.X.J. Oberhumer b2d65febc8 Small update.
committer: mfx <mfx> 1139843847 +0000
2006-02-13 15:17:27 +00:00
Markus F.X.J. Oberhumer 23a6d326e8 Bump tentative release date. Update READMEs.
committer: mfx <mfx> 1139840129 +0000
2006-02-13 14:15:29 +00:00
Markus F.X.J. Oberhumer 5b2f1b6d8b Introduced UPX_VERSION_YEAR.
committer: mfx <mfx> 1139826163 +0000
2006-02-13 10:22:43 +00:00
Markus F.X.J. Oberhumer b4e9ad031b Break strings so that CVS does not try to expand keywords.
committer: mfx <mfx> 1139786765 +0000
2006-02-12 23:26:05 +00:00
Markus F.X.J. Oberhumer 8b7ebcf040 Enter 2006.
committer: mfx <mfx> 1139778883 +0000
2006-02-12 21:14:43 +00:00
Markus F.X.J. Oberhumer af05296631 Made ps1/exe work again.
committer: mfx <mfx> 1139776798 +0000
2006-02-12 20:39:58 +00:00
Markus F.X.J. Oberhumer 29d693de2d New ACC version.
committer: mfx <mfx> 1139772863 +0000
2006-02-12 19:34:23 +00:00
Markus F.X.J. Oberhumer 51ac5172f5 #undef PAGE_{MASK,SIZE} to fix build problems on some machines.
committer: mfx <mfx> 1139743226 +0000
2006-02-12 11:20:26 +00:00
Markus F.X.J. Oberhumer 24ce1ef5e7 Enter 2006.
committer: mfx <mfx> 1139742400 +0000
2006-02-12 11:06:40 +00:00
Markus F.X.J. Oberhumer f6d1e269d1 Prepare for new release.
committer: mfx <mfx> 1139742224 +0000
2006-02-12 11:03:44 +00:00
Markus F.X.J. Oberhumer 62c2f5228d Rebuilt stubs.
committer: mfx <mfx> 1139742130 +0000
2006-02-12 11:02:10 +00:00
Markus F.X.J. Oberhumer 9882d9683b Updated.
committer: mfx <mfx> 1139741935 +0000
2006-02-12 10:58:55 +00:00
Markus F.X.J. Oberhumer 45ce89ee1f Removed trailing whitespace.
committer: mfx <mfx> 1139741919 +0000
2006-02-12 10:58:39 +00:00
László Molnár bfb9df1553 win32/pe: R6002 runtime errors worked around
committer: ml1050 <ml1050> 1139505685 +0000
2006-02-09 17:21:25 +00:00
László Molnár a5f79204ce set use_dep_hack to true
committer: ml1050 <ml1050> 1139404812 +0000
2006-02-08 13:20:12 +00:00
László Molnár e322613d84 workaround added for a msvc runtime "protection"
committer: ml1050 <ml1050> 1139393823 +0000
2006-02-08 10:17:03 +00:00
Markus F.X.J. Oberhumer fbb60f5191 Refactored a new mem_replace() function.
committer: mfx <mfx> 1138984802 +0000
2006-02-03 16:40:02 +00:00
Markus F.X.J. Oberhumer 899e7d2f39 Added internal debugging options '--fake-stub-version=X.XX' and
'--fake-stub-year=XXXX'.

These might prove useful for building up a test suite which is able to
check binary identity of compressed executables between UPX releases
where the implementation of a specific format has not changed.

committer: mfx <mfx> 1138960010 +0000
2006-02-03 09:46:50 +00:00
László Molnár 8e2aa07747 load config support for win32/pe dlls
committer: ml1050 <ml1050> 1138878465 +0000
2006-02-02 11:07:45 +00:00
Markus F.X.J. Oberhumer a0d262cd76 New ACC version.
committer: mfx <mfx> 1138683583 +0000
2006-01-31 04:59:43 +00:00
Markus F.X.J. Oberhumer b43a7edee4 Preliminary bump some version information.
committer: mfx <mfx> 1138080865 +0000
2006-01-24 05:34:25 +00:00
Markus F.X.J. Oberhumer 7760bbd77c New ACC version.
committer: mfx <mfx> 1138080385 +0000
2006-01-24 05:26:25 +00:00
Markus F.X.J. Oberhumer 9c0f1b02a7 Small Makefile updates.
committer: mfx <mfx> 1138080320 +0000
2006-01-24 05:25:20 +00:00
Markus F.X.J. Oberhumer 4ecfff4d8d Print a #define for the _SIZE. Enter 2006. Add John's name.
committer: mfx <mfx> 1138080110 +0000
2006-01-24 05:21:50 +00:00
László Molnár ac03b89f38 docs updates for 1.94
committer: ml1050 <ml1050> 1137999714 +0000
2006-01-23 07:01:54 +00:00
László Molnár 620174aea9 copyright text added
committer: ml1050 <ml1050> 1137999649 +0000
2006-01-23 07:00:49 +00:00
Markus F.X.J. Oberhumer ab50d28bc4 New ACC version.
committer: mfx <mfx> 1134926345 +0000
2005-12-18 17:19:05 +00:00
Markus F.X.J. Oberhumer b5318602d1 Fixed compilation problem.
committer: mfx <mfx> 1134926052 +0000
2005-12-18 17:14:12 +00:00
John Reiser bff2a63ea2 prefetching does not help length of match
l_lx_elf64amd.S amd_d_nrv2b.S amd_d_nrv2e.S

committer: jreiser <jreiser> 1132290120 +0000
2005-11-18 05:02:00 +00:00
László Molnár aacfb8820e better load_conf directory support. still needs some work.
committer: ml1050 <ml1050> 1132077577 +0000
2005-11-15 17:59:37 +00:00
John Reiser 98e8c031d0 generated header files
fold_elf64amd.h l_lx_elf64amd.h

committer: jreiser <jreiser> 1131994505 +0000
2005-11-14 18:55:05 +00:00
John Reiser beb4319d1e tune for better branch prediction by avoiding more than 3 in a 16-byte block
amd_d_nrv2b.S amd_d_nrv2e.S l_lx_elf64amd.S

committer: jreiser <jreiser> 1131994471 +0000
2005-11-14 18:54:31 +00:00
John Reiser 2558243c83 de-tabify; also speculate 1-byte loads to save a cycle or two
amd_d_nrv2b.S amd_d_nrv2e.S l_lx_elf64amd.S

committer: jreiser <jreiser> 1131943590 +0000
2005-11-14 04:46:30 +00:00
John Reiser b670e8d1ac tuning
amd_bxx.S amd_d_nrv2b.S amd_d_nrv2e.S l_lx_elf64amd.S

committer: jreiser <jreiser> 1131939243 +0000
2005-11-14 03:34:03 +00:00
John Reiser 68f8358f06 tune: avoid MOVSB for literals; inline default case of NEXTB macros
committer: jreiser <jreiser> 1131923823 +0000
2005-11-13 23:17:03 +00:00
John Reiser db5a099097 CLD and documentation
amd_d_nrv2e.S l_lx_elf64amd.S fold_elf64amd.S

committer: jreiser <jreiser> 1131854052 +0000
2005-11-13 03:54:12 +00:00
John Reiser ce33ffb62a handle compressed executables larger than 3MB on Elf64amd
committer: jreiser <jreiser> 1131833508 +0000
2005-11-12 22:11:48 +00:00
John Reiser 59a2fb9cfd recompile generated .h after source changes
fold_elf64amd.h l_lx_elf64amd.h

committer: jreiser <jreiser> 1131824699 +0000
2005-11-12 19:44:59 +00:00
John Reiser 75bba319de tuning, and prepare for large executables (>3MB compressed)
p_lx_elf.cpp stub/a_lx_elf64.c stub/amd_d_nrv2e.S
	stub/fold_elf64amd.S stub/l_lx_elf64amd.S

committer: jreiser <jreiser> 1131824655 +0000
2005-11-12 19:44:15 +00:00
John Reiser f78e9261f3 Do initLoader() properly, instead of relying on the amount of stack space
that is in use when ::buildLinuxLoader is called.

committer: jreiser <jreiser> 1131597922 +0000
2005-11-10 04:45:22 +00:00
Markus F.X.J. Oberhumer 5f77562333 Cleanup.
committer: mfx <mfx> 1131596991 +0000
2005-11-10 04:29:51 +00:00
Markus F.X.J. Oberhumer 5c4f01a68d New ACC version.
committer: mfx <mfx> 1131596966 +0000
2005-11-10 04:29:26 +00:00
Markus F.X.J. Oberhumer 35f6f998e6 Avoid warnings. Detabified.
committer: mfx <mfx> 1131593815 +0000
2005-11-10 03:36:55 +00:00
John Reiser 6737a3ae09 PackLinuxElf64amd
p_lx_elf.h p_lx_elf.cpp packmast.cpp

committer: jreiser <jreiser> 1131570778 +0000
2005-11-09 21:12:58 +00:00
John Reiser 09559bee8c Elf64
p_unix.h p_elf.h

committer: jreiser <jreiser> 1131570530 +0000
2005-11-09 21:08:50 +00:00
John Reiser f487ea27a8 UPX_F_LINUX_ELF64_AMD
committer: jreiser <jreiser> 1131568333 +0000
2005-11-09 20:32:13 +00:00
John Reiser a3d95f239a Generated .h header files for AMD x86_64
fold_elf64amd.h l_lx_elf64amd.h

committer: jreiser <jreiser> 1131566912 +0000
2005-11-09 20:08:32 +00:00
John Reiser 023c06e178 Support for 64-bit AMD x86_64
Makefile
Added Files:
	a_lx_elf64.c amd_bxx.S amd_d_nrv2e.S amd_regs.h
	fold_elf64amd.S l_lx_elf64amd.S l_lx_elf64amd.lds

committer: jreiser <jreiser> 1131566835 +0000
2005-11-09 20:07:15 +00:00
John Reiser 414a6c1c9e Enhance to handle both Elf32 and Elf64, and little/big endian.
http://buildroot.uclibc.org/cgi-bin/viewcvs.cgi/trunk/buildroot/toolchain/sstrip/sstrip.c
Revision 11028 [Added Tue Aug 2 18:20:34 2005 PDT (3 months, 1 week ago) by mjn3]

committer: jreiser <jreiser> 1131566192 +0000
2005-11-09 19:56:32 +00:00
John Reiser 910e18fb22 b_method 5th argument to f_decompress
l_lx_exec.c l_lx_pti.c l_lx_sep.c l_lx_sh.c

committer: jreiser <jreiser> 1131565060 +0000
2005-11-09 19:37:40 +00:00
John Reiser ac441fd1cf definitions for Elf64_*
committer: jreiser <jreiser> 1131564732 +0000
2005-11-09 19:32:12 +00:00
John Reiser 0c328372b5 Allow __uClibc_main and __uClibc_start_main like __libc_start_main.
committer: jreiser <jreiser> 1127269046 +0000
2005-09-21 02:17:26 +00:00
Markus F.X.J. Oberhumer 55ef60a6d4 Rebuilt with gcc-3.4.4.
committer: mfx <mfx> 1127188101 +0000
2005-09-20 03:48:21 +00:00
Markus F.X.J. Oberhumer c33584e683 Detabified.
committer: mfx <mfx> 1126929315 +0000
2005-09-17 03:55:15 +00:00
Markus F.X.J. Oberhumer ee8c7453bd Small updates.
committer: mfx <mfx> 1126927283 +0000
2005-09-17 03:21:23 +00:00
John Reiser 0330369603 remove debugging strut
l_lx_elf86.asm l_lx_elf86.h

committer: jreiser <jreiser> 1126892616 +0000
2005-09-16 17:43:36 +00:00
John Reiser 3f7b642c7d Linux i386 allow compression of position-independent main executables (gcc -pie).
p_elf.h p_lx_elf.cpp p_lx_elf.h p_lx_exc.cpp
	stub/fold_elf86.asm stub/fold_elf86.h stub/l_lx_elf.c
	stub/l_lx_elf86.asm stub/l_lx_elf86.h stub/l_lx_elf86.lds
	stub/linux.hh

committer: jreiser <jreiser> 1126886896 +0000
2005-09-16 16:08:16 +00:00
László Molnár eb6c51426a fixed a nasty relocation handling error which could produce broken
compressed files

committer: ml1050 <ml1050> 1126865811 +0000
2005-09-16 10:16:51 +00:00
Markus F.X.J. Oberhumer 0337bdb9fd Added support for UCL_USE_ASM.
committer: mfx <mfx> 1126844111 +0000
2005-09-16 04:15:11 +00:00
Markus F.X.J. Oberhumer 7aedc62058 Removed some old and dead code.
committer: mfx <mfx> 1126744217 +0000
2005-09-15 00:30:17 +00:00
Markus F.X.J. Oberhumer bfc835cbbf Added some more tests to upx_sanity_check(). Disable these for production
builds - code bloat.

committer: mfx <mfx> 1126743964 +0000
2005-09-15 00:26:04 +00:00
Markus F.X.J. Oberhumer 5c6ba30c48 New ACC version.
committer: mfx <mfx> 1126741199 +0000
2005-09-14 23:39:59 +00:00
Markus F.X.J. Oberhumer 8fe4824ed2 Fix typo.
committer: mfx <mfx> 1126295791 +0000
2005-09-09 19:56:31 +00:00
Markus F.X.J. Oberhumer d40cb3bd55 Cosmetic cleanups.
committer: mfx <mfx> 1126295335 +0000
2005-09-09 19:48:55 +00:00
Markus F.X.J. Oberhumer 4bcd3ac5d7 Mention arm/pe.
committer: mfx <mfx> 1126294945 +0000
2005-09-09 19:42:25 +00:00
Markus F.X.J. Oberhumer e2b8e9dea9 Avoid some warnings about unused args.
committer: mfx <mfx> 1126294727 +0000
2005-09-09 19:38:47 +00:00
László Molnár 572314bf3f support for arm/WinCE ("arm/pe") exes
committer: ml1050 <ml1050> 1126255781 +0000
2005-09-09 08:49:41 +00:00
Markus F.X.J. Oberhumer 14d303d331 Small updates according to latest glibc headers.
committer: mfx <mfx> 1126184484 +0000
2005-09-08 13:01:24 +00:00
Markus F.X.J. Oberhumer 24ffaa0738 Added BE64 and LE64 types.
committer: mfx <mfx> 1126183138 +0000
2005-09-08 12:38:58 +00:00
Markus F.X.J. Oberhumer 5d9b6d056d Small updates.
committer: mfx <mfx> 1126029328 +0000
2005-09-06 17:55:28 +00:00
Markus F.X.J. Oberhumer 5c28ff15ba Changes for new ACC version.
committer: mfx <mfx> 1126029282 +0000
2005-09-06 17:54:42 +00:00
Markus F.X.J. Oberhumer 06ceb2f2a1 New ACC version.
committer: mfx <mfx> 1126029264 +0000
2005-09-06 17:54:24 +00:00
Markus F.X.J. Oberhumer 7373e1dd8b Updated.
committer: mfx <mfx> 1122416155 +0000
2005-07-26 22:15:55 +00:00
Markus F.X.J. Oberhumer 4b1a9e714d New ACC version.
committer: mfx <mfx> 1122416002 +0000
2005-07-26 22:13:22 +00:00
Markus F.X.J. Oberhumer 9d76136358 Use gcc-3.4.4 for Linux stubs.
committer: mfx <mfx> 1122415958 +0000
2005-07-26 22:12:38 +00:00
Markus F.X.J. Oberhumer b3502420ad Removed patches/patch-elfcode.h and the patches/ directory - these
fixes now are already in upstream binutils for quite some time.

committer: mfx <mfx> 1119797919 +0000
2005-06-26 14:58:39 +00:00
Markus F.X.J. Oberhumer dd7ac7cca9 Updated.
committer: mfx <mfx> 1119614331 +0000
2005-06-24 11:58:51 +00:00
Markus F.X.J. Oberhumer 31dfa18e9b Updated.
committer: mfx <mfx> 1119613913 +0000
2005-06-24 11:51:53 +00:00
Markus F.X.J. Oberhumer 3e785008d3 Avoid warnings.
committer: mfx <mfx> 1119613856 +0000
2005-06-24 11:50:56 +00:00
Markus F.X.J. Oberhumer 6b7c7f755c Avoid warnings about unused vars.
committer: mfx <mfx> 1119613814 +0000
2005-06-24 11:50:14 +00:00
Markus F.X.J. Oberhumer c55a8a8703 Added some more sanity checks.
committer: mfx <mfx> 1119613748 +0000
2005-06-24 11:49:08 +00:00
Markus F.X.J. Oberhumer 64c97308ac Portability fix for gcc -ftrapv option.
committer: mfx <mfx> 1119613504 +0000
2005-06-24 11:45:04 +00:00
Markus F.X.J. Oberhumer 3551b0b95a Updated.
committer: mfx <mfx> 1119613441 +0000
2005-06-24 11:44:01 +00:00
Markus F.X.J. Oberhumer 9f16b5c4af Recompiled stubs.
committer: mfx <mfx> 1119613249 +0000
2005-06-24 11:40:49 +00:00
Markus F.X.J. Oberhumer 9777e549cb New upstream version.
committer: mfx <mfx> 1119613222 +0000
2005-06-24 11:40:22 +00:00
Markus F.X.J. Oberhumer fbfced1b93 New ACC version.
committer: mfx <mfx> 1119613192 +0000
2005-06-24 11:39:52 +00:00
John Reiser 1a84b4681c fix sign-extend bug
committer: jreiser <jreiser> 1114311664 +0000
2005-04-24 03:01:04 +00:00
John Reiser 4bf81b8e1c propagate compiled changes due to ppc_bxx.S
stub/fold_elfppc32.h stub/fold_machppc32.h

committer: jreiser <jreiser> 1114229942 +0000
2005-04-23 04:19:02 +00:00
John Reiser c282e7fdb4 PPC branch+call trick: filter first 4MB only
filteri.cpp filter/ppcbxx.h stub/ppc_bxx.S

committer: jreiser <jreiser> 1114229877 +0000
2005-04-23 04:17:57 +00:00
John Reiser d339ee3135 PackLinuxElf32::unpack forgot several get_native32()
committer: jreiser <jreiser> 1114229735 +0000
2005-04-23 04:15:35 +00:00
Markus F.X.J. Oberhumer 1de95de299 Updated.
committer: mfx <mfx> 1111664629 +0000
2005-03-24 11:43:49 +00:00
Markus F.X.J. Oberhumer 96c998a1d7 Updated for current glibc.
committer: mfx <mfx> 1111664285 +0000
2005-03-24 11:38:05 +00:00
Markus F.X.J. Oberhumer b5413c0156 Added John to main banner.
committer: mfx <mfx> 1110936050 +0000
2005-03-16 01:20:50 +00:00
Markus F.X.J. Oberhumer 7371c195ff Allocate larger xtrasize based on ih.datasize.
committer: mfx <mfx> 1110936001 +0000
2005-03-16 01:20:01 +00:00
Markus F.X.J. Oberhumer 0866a1996b Added two checks for buffer overflows as suggested by Giovanni Bajo.
committer: mfx <mfx> 1110732210 +0000
2005-03-13 16:43:30 +00:00
Markus F.X.J. Oberhumer 41f44c4e78 Updated.
committer: mfx <mfx> 1110731666 +0000
2005-03-13 16:34:26 +00:00
Markus F.X.J. Oberhumer 131712c3bd New ACC version.
committer: mfx <mfx> 1110731645 +0000
2005-03-13 16:34:05 +00:00
Markus F.X.J. Oberhumer bae12aaab7 Added more global operators.
committer: mfx <mfx> 1110731448 +0000
2005-03-13 16:30:48 +00:00
Markus F.X.J. Oberhumer 74d5844d8c Tried to make 64-bit clean. John, please have a look!
committer: mfx <mfx> 1110731221 +0000
2005-03-13 16:27:01 +00:00
Markus F.X.J. Oberhumer c87908266a Fix a compilation problem with older compilers.
committer: mfx <mfx> 1110730245 +0000
2005-03-13 16:10:45 +00:00
Markus F.X.J. Oberhumer f788d76b8c Added several __attribute_packed.
committer: mfx <mfx> 1110730186 +0000
2005-03-13 16:09:46 +00:00
Markus F.X.J. Oberhumer 41031e572e Updated.
committer: mfx <mfx> 1110729509 +0000
2005-03-13 15:58:29 +00:00
Markus F.X.J. Oberhumer f8a0864c1b Final updates. Really.
committer: mfx <mfx> 1109817185 +0000
2005-03-03 02:33:05 +00:00
Markus F.X.J. Oberhumer 949587334c Updates.
committer: mfx <mfx> 1109816699 +0000
2005-03-03 02:24:59 +00:00
Markus F.X.J. Oberhumer 0bc6a1a7f1 Updated.
committer: mfx <mfx> 1109765803 +0000
2005-03-02 12:16:43 +00:00
Markus F.X.J. Oberhumer 0d9cbfe927 Updated.
committer: mfx <mfx> 1109756565 +0000
2005-03-02 09:42:45 +00:00
Markus F.X.J. Oberhumer 8742a524c3 Small updates.
committer: mfx <mfx> 1109750922 +0000
2005-03-02 08:08:42 +00:00
Markus F.X.J. Oberhumer 79bf2297b5 New simple and modern Makefile.
committer: mfx <mfx> 1109750619 +0000
2005-03-02 08:03:39 +00:00
Markus F.X.J. Oberhumer 32e9e23630 Removed old Makfiles (horrible cruft dating back from 1998).
committer: mfx <mfx> 1109750572 +0000
2005-03-02 08:02:52 +00:00
Markus F.X.J. Oberhumer 7f1cecba92 Got changed. We must sync our toolchains.
committer: mfx <mfx> 1109750498 +0000
2005-03-02 08:01:38 +00:00
Markus F.X.J. Oberhumer efd30c61c3 Use namespace.
committer: mfx <mfx> 1109750346 +0000
2005-03-02 07:59:06 +00:00
Markus F.X.J. Oberhumer 4c97b11207 Added OBJSTRIP_xxx variables.
committer: mfx <mfx> 1109734187 +0000
2005-03-02 03:29:47 +00:00
John Reiser 58ea0ab745 use "~0u" to force unsigned bitmasks
committer: jreiser <jreiser> 1109691309 +0000
2005-03-01 15:35:09 +00:00
Markus F.X.J. Oberhumer 3547c71ad5 New ACC version.
committer: mfx <mfx> 1109674986 +0000
2005-03-01 11:03:06 +00:00
Markus F.X.J. Oberhumer 044d6b2ce2 Updated some ELF constants.
committer: mfx <mfx> 1109674932 +0000
2005-03-01 11:02:12 +00:00
Markus F.X.J. Oberhumer a0b26b6c06 Added Elf32_Dyn.
committer: mfx <mfx> 1109671693 +0000
2005-03-01 10:08:13 +00:00
Markus F.X.J. Oberhumer 8e3bfde439 Use templates.
committer: mfx <mfx> 1109671197 +0000
2005-03-01 09:59:57 +00:00
Markus F.X.J. Oberhumer 6507de959b Remove "struct" keywords.
committer: mfx <mfx> 1109671153 +0000
2005-03-01 09:59:13 +00:00
Markus F.X.J. Oberhumer 56d09bf3b5 Avoid warning.
committer: mfx <mfx> 1109669763 +0000
2005-03-01 09:36:03 +00:00
Markus F.X.J. Oberhumer 232754b978 Removed trailing whitespace.
committer: mfx <mfx> 1109669261 +0000
2005-03-01 09:27:41 +00:00
Markus F.X.J. Oberhumer 75ef603308 Linker updates from Laszlo. Needs some testing.
committer: mfx <mfx> 1109669078 +0000
2005-03-01 09:24:38 +00:00
Markus F.X.J. Oberhumer a5a2fcee4d Avoid warning.
committer: mfx <mfx> 1109345414 +0000
2005-02-25 15:30:14 +00:00
John Reiser f86d57bfe3 mmap() needs in-range fd; b_method as arg5 to decompress
l_lx_elfppc32.S l_lx_elfppc32.h
	ppc_d_nrv2e.S
	ppc_d_nrv2b.S

committer: jreiser <jreiser> 1109217478 +0000
2005-02-24 03:57:58 +00:00
John Reiser 615615b1df Unmap the compressed program before running the uncompressed.
fold_elfppc32.S fold_elfppc32.h

committer: jreiser <jreiser> 1109129677 +0000
2005-02-23 03:34:37 +00:00
John Reiser aeba0ce170 add dependencies for ppc_bxx.S and ppc_d_nrv2e.S
Makefile fold_elfppc32.h l_mac_ppc32.h

committer: jreiser <jreiser> 1109093661 +0000
2005-02-22 17:34:21 +00:00
John Reiser 5ce60aad53 data cache prefetch
ppc_d_nrv2e.S l_lx_elfppc32.h

committer: jreiser <jreiser> 1109034808 +0000
2005-02-22 01:13:28 +00:00
John Reiser dbc01de9a0 remove debugg-only 'trap'
committer: jreiser <jreiser> 1109012788 +0000
2005-02-21 19:06:28 +00:00
John Reiser dfaf3f24fc fix bad merge
p_lx_elf.h p_lx_exc.cpp

committer: jreiser <jreiser> 1108944786 +0000
2005-02-21 00:13:06 +00:00
John Reiser 14b0527e79 fix compiler waring
committer: jreiser <jreiser> 1108941316 +0000
2005-02-20 23:15:16 +00:00
John Reiser f0148c3161 prepare for M_CL1B
committer: jreiser <jreiser> 1108940729 +0000
2005-02-20 23:05:29 +00:00
John Reiser 6a5e3d924d p_lx_interp, p_mach
committer: jreiser <jreiser> 1108940412 +0000
2005-02-20 23:00:12 +00:00
John Reiser 664a82e7c9 Start re-organizing the packing of Elf, by making Elf32 come first,
with Big endian and Little endian derived from it.
I386 still uses the old way, but PowerPC (both Linux and Darwin [Mac])
use the new way.
	p_elf.h p_lx_elf.cpp p_lx_elf.h p_lx_exc.cpp p_lx_exc.h
	p_unix.cpp p_unix.h p_vmlinx.cpp p_vmlinx.h p_vmlinz.cpp

committer: jreiser <jreiser> 1108940224 +0000
2005-02-20 22:57:04 +00:00
John Reiser e2763b4826 new packers PackMachPPC32 PackLinuxElf32ppc PackLinuxI386interp
packmast.cpp
	p_lx_interp.h

committer: jreiser <jreiser> 1108939957 +0000
2005-02-20 22:52:37 +00:00
John Reiser afb29b19c2 PowerPC branch [and call] trick
committer: jreiser <jreiser> 1108939726 +0000
2005-02-20 22:48:46 +00:00
John Reiser 8d60343940 allow better handling for no_filter option;
new options is_ptinterp, use_ptintep, make_ptinterp;
reserve codes for M_CL1B.
	compress.ch conf.h main.cpp options.h

committer: jreiser <jreiser> 1108939577 +0000
2005-02-20 22:46:17 +00:00
John Reiser 67a77f1880 Packer for Macintosh Darwin Mach-o PowerPC32
Added Files:
	p_mach.cpp p_mach.h

committer: jreiser <jreiser> 1108863998 +0000
2005-02-20 01:46:38 +00:00
John Reiser c933974174 branch trick for PowerPC32
committer: jreiser <jreiser> 1108863063 +0000
2005-02-20 01:31:03 +00:00
John Reiser 19715903fb New stubs pti86 (PT_INTERP for Linux x86), Linux Elf PowerPC-32,
Apple Macintosh Darwin PowerPC-32.

committer: jreiser <jreiser> 1108862148 +0000
2005-02-20 01:15:48 +00:00
John Reiser c88f72fd15 disinguish between __i386__ and generic
committer: jreiser <jreiser> 1108861387 +0000
2005-02-20 01:03:07 +00:00
John Reiser 7818596271 stub loader for Linux Elf PowerPC32
Added Files:
	m_lx_elfppc32.c l_lx_elfppc32.lds
	fold_elfppc32.S l_lx_elfppc32.S
	fold_elfppc32.h l_lx_elfppc32.h  [these two created by Makefile]

committer: jreiser <jreiser> 1108861182 +0000
2005-02-20 00:59:42 +00:00
John Reiser 9cb8d7bca6 stub loader for Macintosh (Darwin) Mach-o PowerPC32
Added Files:
	l_mac_ppc32.S fold_machppc32.S m_mac_mach32.c
	l_mac_ppc32.h fold_machppc32.h [these two created by Makefile]

committer: jreiser <jreiser> 1108860254 +0000
2005-02-20 00:44:14 +00:00
John Reiser 46f9256114 PowerPC unfilter, decompress, and register definitions
Added Files:
	ppc_bxx.S ppc_d_nrv2e.S ppc_regs.h

committer: jreiser <jreiser> 1108855959 +0000
2005-02-19 23:32:39 +00:00
John Reiser c26ef87202 Let the UPX loader be an Elf PT_INTERP /opt/upx/run
Added Files:
	p_lx_interp.cpp stub/l_lx_pti.c stub/fold_pti86.asm
	stub/fold_pti86.h stub/l_lx_pti86.asm stub/l_lx_pti86.h
	stub/l_lx_pti86.lds

committer: jreiser <jreiser> 1108855010 +0000
2005-02-19 23:16:50 +00:00
John Reiser 89fee5b835 allow more sections; print failing section on overflow
committer: jreiser <jreiser> 1108850756 +0000
2005-02-19 22:05:56 +00:00
John Reiser f5795eb01b make_hatch() is called from l_lx_sep86.asm, so cannot be 'static'
committer: jreiser <jreiser> 1108850437 +0000
2005-02-19 22:00:37 +00:00
László Molnár dbf0c9f016 msg.cpp: fixed possible sigsegv caused by a tricky filename
committer: ml1050 <ml1050> 1108382780 +0000
2005-02-14 12:06:20 +00:00
Markus F.X.J. Oberhumer 586b43048f Bump version.
committer: mfx <mfx> 1107807914 +0000
2005-02-07 20:25:14 +00:00
Markus F.X.J. Oberhumer 63b9ee61d2 Prepare UPX 1.93 release.
committer: mfx <mfx> 1107804731 +0000
2005-02-07 19:32:11 +00:00
Markus F.X.J. Oberhumer 3b9eff7f34 Enter 2005; added all needed stub files to CVS.
committer: mfx <mfx> 1107804447 +0000
2005-02-07 19:27:27 +00:00
John Reiser 59668c5fc1 ::pack3 to set .p_filesz; also set blocksize to allow giant scripts as input
p_lx_sh.cpp p_lx_sh.h

committer: jreiser <jreiser> 1105479043 +0000
2005-01-11 21:30:43 +00:00
Markus F.X.J. Oberhumer 3ed786fb5c Updated.
committer: mfx <mfx> 1103717402 +0000
2004-12-22 12:10:02 +00:00
Markus F.X.J. Oberhumer 0cd5eb5472 Use gcc-3.4.3 for Linux stubs.
committer: mfx <mfx> 1103717370 +0000
2004-12-22 12:09:30 +00:00
Markus F.X.J. Oberhumer ff571b96cb New ACC version.
committer: mfx <mfx> 1103717337 +0000
2004-12-22 12:08:57 +00:00
John Reiser 36b852e6bf %cs at entry to decompressor varies a _lot_ among Linux 2.4.x, 2.6.y kernels.
Decompressor must adapt; no universal constants exist for __BOOT_CS, _BOOT_DS.
	p_vmlinx.cpp stub/l_vmlinz.asm

committer: jreiser <jreiser> 1103605278 +0000
2004-12-21 05:01:18 +00:00
John Reiser f0c21c7203 Enhance documentation for process flow and testing.
Include some notes for compressing kernels from Linux 2.4.x.

committer: jreiser <jreiser> 1103513947 +0000
2004-12-20 03:39:07 +00:00
John Reiser 0516d8260c Fix stack synchronization bug at end of unfilter.
[The confusing fake "conditional compilation" strikes again!]

committer: jreiser <jreiser> 1103513713 +0000
2004-12-20 03:35:13 +00:00
John Reiser 1418f57b96 Fix bugs between Filter.addvalue and ckt32 macro call: [re-]compressed
Linux kernels were not booting.  Explain .addvalue better.
Set kernel stack pointer for boot-time decompression according to
Linux kernel documentation.
	     p_vmlinx.cpp      p_vmlinz.cpp
	stub/l_vmlinx.asm stub/l_vmlinz.asm
	filter/cto.h filter/ctoj.h filter/ctok.h

committer: jreiser <jreiser> 1103326936 +0000
2004-12-17 23:42:16 +00:00
Markus F.X.J. Oberhumer b24fb59c94 New upstream version.
committer: mfx <mfx> 1101602738 +0000
2004-11-28 00:45:38 +00:00
Markus F.X.J. Oberhumer 8fcf2bcd59 Fix bele.h to use strict PODs. This should fix build problems reported on ARM.
committer: mfx <mfx> 1098709362 +0000
2004-10-25 13:02:42 +00:00
Markus F.X.J. Oberhumer 079b808a56 Updated.
committer: mfx <mfx> 1098709263 +0000
2004-10-25 13:01:03 +00:00
Markus F.X.J. Oberhumer a4e01e28db New ACC version.
committer: mfx <mfx> 1098709116 +0000
2004-10-25 12:58:36 +00:00
Markus F.X.J. Oberhumer ec1ef9099f Updated.
committer: mfx <mfx> 1096637333 +0000
2004-10-01 13:28:53 +00:00
Markus F.X.J. Oberhumer ac724c7e6c New PS1 version from Jens.
committer: mfx <mfx> 1096637259 +0000
2004-10-01 13:27:39 +00:00
Markus F.X.J. Oberhumer ec25835525 New ACC version.
committer: mfx <mfx> 1096636709 +0000
2004-10-01 13:18:29 +00:00
Markus F.X.J. Oberhumer d4841a641c Updates.
committer: mfx <mfx> 1092135204 +0000
2004-08-10 10:53:24 +00:00
Markus F.X.J. Oberhumer 5612460720 New ACC version.
committer: mfx <mfx> 1092134926 +0000
2004-08-10 10:48:46 +00:00
John Reiser 465ea6429f "new []" requires matching "delete []"
committer: jreiser <jreiser> 1090882098 +0000
2004-07-26 22:48:18 +00:00
Markus F.X.J. Oberhumer ed9057ca83 Cleanups.
committer: mfx <mfx> 1090594763 +0000
2004-07-23 14:59:23 +00:00
Markus F.X.J. Oberhumer 14ced962db Cleanup.
committer: mfx <mfx> 1090583778 +0000
2004-07-23 11:56:18 +00:00
Markus F.X.J. Oberhumer 1aff6b862d Replaced ACC with miniACC.
committer: mfx <mfx> 1090583659 +0000
2004-07-23 11:54:19 +00:00
Markus F.X.J. Oberhumer ef490c4220 Updates.
committer: mfx <mfx> 1090577049 +0000
2004-07-23 10:04:09 +00:00
Markus F.X.J. Oberhumer 0dda83cbbc Updated.
committer: mfx <mfx> 1090577037 +0000
2004-07-23 10:03:57 +00:00
Markus F.X.J. Oberhumer fa4efec3b5 Bumped version numbers.
committer: mfx <mfx> 1090283329 +0000
2004-07-20 00:28:49 +00:00
Markus F.X.J. Oberhumer 814eabb88e Final updates for upx 1.92.
committer: mfx <mfx> 1090281040 +0000
2004-07-19 23:50:40 +00:00
John Reiser 95021e4977 mention vmlinux/i386
NEWS README README.1ST

committer: jreiser <jreiser> 1090261436 +0000
2004-07-19 18:23:56 +00:00
Markus F.X.J. Oberhumer d17fb7ebf0 Updated.
committer: mfx <mfx> 1090258607 +0000
2004-07-19 17:36:47 +00:00
Markus F.X.J. Oberhumer df9aa9ac32 Misc updates.
committer: mfx <mfx> 1090256162 +0000
2004-07-19 16:56:02 +00:00
Markus F.X.J. Oberhumer 9110517893 Check for .NET (win32/net) files.
committer: mfx <mfx> 1090256077 +0000
2004-07-19 16:54:37 +00:00
Markus F.X.J. Oberhumer 8204c7deb6 Small portability fixes.
committer: mfx <mfx> 1090256008 +0000
2004-07-19 16:53:28 +00:00
Markus F.X.J. Oberhumer 6662f8985e New ACC version.
committer: mfx <mfx> 1090253767 +0000
2004-07-19 16:16:07 +00:00
John Reiser a2b305ed3b Don't spend too much time compressing large symbol tables.
committer: jreiser <jreiser> 1090072585 +0000
2004-07-17 13:56:25 +00:00
John Reiser ce3d3a850c Allow any number of contiguous PT_LOAD.
p_vmlinx.cpp p_vmlinx.h

committer: jreiser <jreiser> 1090040793 +0000
2004-07-17 05:06:33 +00:00
Markus F.X.J. Oberhumer 212b674bc2 Portability fixes. Avoid some warnings.
committer: mfx <mfx> 1089734843 +0000
2004-07-13 16:07:23 +00:00
John Reiser 2980a6b4bb save 4 bytes
committer: jreiser <jreiser> 1089733580 +0000
2004-07-13 15:46:20 +00:00
Markus F.X.J. Oberhumer 435c0a9e82 New ACC version.
committer: mfx <mfx> 1089731989 +0000
2004-07-13 15:19:49 +00:00
Markus F.X.J. Oberhumer 4102cd7c91 Detabified.
committer: mfx <mfx> 1089731601 +0000
2004-07-13 15:13:21 +00:00
Markus F.X.J. Oberhumer b4b603819d Comment out cl1_d32.ash for now.
committer: mfx <mfx> 1089731343 +0000
2004-07-13 15:09:03 +00:00
Markus F.X.J. Oberhumer 20e3707e69 Updated some comments.
committer: mfx <mfx> 1089731255 +0000
2004-07-13 15:07:35 +00:00
John Reiser fc6eeaaea8 Decodes a format similar to nrv2b, except that a run of literals
is counted and phased instead of always 1-hot (no more 9/8 expansion).

committer: jreiser <jreiser> 1089692385 +0000
2004-07-13 04:19:45 +00:00
Markus F.X.J. Oberhumer 41799955ce Updated.
committer: mfx <mfx> 1089687731 +0000
2004-07-13 03:02:11 +00:00
Markus F.X.J. Oberhumer efb4ec9cb8 New ACC version.
committer: mfx <mfx> 1089687481 +0000
2004-07-13 02:58:01 +00:00
Markus F.X.J. Oberhumer 4dbda29f82 New upstream version.
committer: mfx <mfx> 1089687264 +0000
2004-07-13 02:54:24 +00:00
Markus F.X.J. Oberhumer befaa3c501 Detabified.
committer: mfx <mfx> 1089685145 +0000
2004-07-13 02:19:05 +00:00
John Reiser f41edf9e21 more Example twiddling
committer: jreiser <jreiser> 1089683530 +0000
2004-07-13 01:52:10 +00:00
John Reiser 754f10f0b0 update Example from linux kernel debuggin
committer: jreiser <jreiser> 1089674802 +0000
2004-07-12 23:26:42 +00:00
John Reiser 5d331fdf69 new file format vmlinux/i386
Modified Files:
	Makefile conf.h help.cpp linker.cpp p_elf.h packer.cpp
	packerf.cpp packmast.cpp stub/Makefile stub/l_vmlinz.asm
Added Files:
	p_vmlinx.h p_vmlinx.cpp stub/l_vmlinx.asm

committer: jreiser <jreiser> 1089652867 +0000
2004-07-12 17:21:07 +00:00
Markus F.X.J. Oberhumer cbf1dbe2cb Added new win32/pe option `--strip-loadconf'.
committer: mfx <mfx> 1089630382 +0000
2004-07-12 11:06:22 +00:00
Markus F.X.J. Oberhumer 3177de92fb New ACC version.
committer: mfx <mfx> 1089162904 +0000
2004-07-07 01:15:04 +00:00
Markus F.X.J. Oberhumer 3878890783 Prefer gcc-3.4.0 over gcc-3.4.1. Converted PF_TO_PROT into a macro (small size gain).
committer: mfx <mfx> 1088832985 +0000
2004-07-03 05:36:25 +00:00
Markus F.X.J. Oberhumer 61594f7873 Misc cleanups.
committer: mfx <mfx> 1088804669 +0000
2004-07-02 21:44:29 +00:00
Markus F.X.J. Oberhumer f412b5e0cd Fixed Win64 warnings.
committer: mfx <mfx> 1088804606 +0000
2004-07-02 21:43:26 +00:00
Markus F.X.J. Oberhumer f14d594a1a New ACC version.
committer: mfx <mfx> 1088804565 +0000
2004-07-02 21:42:45 +00:00
Markus F.X.J. Oberhumer f0279d23d3 Bumped version to start working on 1.92.
committer: mfx <mfx> 1088568203 +0000
2004-06-30 04:03:23 +00:00
Markus F.X.J. Oberhumer 18ef55ac14 Final updates for upx-1.91.
committer: mfx <mfx> 1088566877 +0000
2004-06-30 03:41:17 +00:00
Markus F.X.J. Oberhumer 0010c50de6 Updated.
committer: mfx <mfx> 1088552416 +0000
2004-06-29 23:40:16 +00:00
Markus F.X.J. Oberhumer 130699a33b Updated.
committer: mfx <mfx> 1088541938 +0000
2004-06-29 20:45:38 +00:00
Markus F.X.J. Oberhumer 5a8d60d3e0 Assorted fixes.
committer: mfx <mfx> 1088541880 +0000
2004-06-29 20:44:40 +00:00
Markus F.X.J. Oberhumer 603dc83c1a Fixed wrong n_mru storage in putPackHeader().
committer: mfx <mfx> 1088541728 +0000
2004-06-29 20:42:08 +00:00
Markus F.X.J. Oberhumer 51106e730b Updated.
committer: mfx <mfx> 1088532712 +0000
2004-06-29 18:11:52 +00:00
Markus F.X.J. Oberhumer 23ec864130 Removed trailing whitespace.
committer: mfx <mfx> 1088532664 +0000
2004-06-29 18:11:04 +00:00
Markus F.X.J. Oberhumer 5349bd0b2a Stricter check of some PE values.
committer: mfx <mfx> 1088532595 +0000
2004-06-29 18:09:55 +00:00
Markus F.X.J. Oberhumer 74d70fe1d9 New ACC version.
committer: mfx <mfx> 1088531787 +0000
2004-06-29 17:56:27 +00:00
Markus F.X.J. Oberhumer 041865c320 Misc cleanups.
committer: mfx <mfx> 1088103372 +0000
2004-06-24 18:56:12 +00:00
Markus F.X.J. Oberhumer 6a7d555ad7 Recompute tlsindex in buildLoader() as suggested by Laszlo.
committer: mfx <mfx> 1088101947 +0000
2004-06-24 18:32:27 +00:00
Markus F.X.J. Oberhumer 18262f79c7 New upstream version.
committer: mfx <mfx> 1087253885 +0000
2004-06-14 22:58:05 +00:00
John Reiser 9769599f1d Avoid "ASCII armor" area below 16MB (0x01000000) for exec-shield and
pre-linked PT_INTERP such as ld-linux.so.2
	l_lx_elf86.asm l_lx_elf86.lds l_lx_sh86.asm l_lx_sh86.lds

committer: jreiser <jreiser> 1084925700 +0000
2004-05-19 00:15:00 +00:00
John Reiser aee150474c Revamp do_xmap() to work under exec-shield and exec-shield-randomize,
and with pre-linked PT_INTERP such as ld-linux.so.2.
	l_lx_elf.c l_lx_sh.c

committer: jreiser <jreiser> 1084923593 +0000
2004-05-18 23:39:53 +00:00
Markus F.X.J. Oberhumer 0e45021a5a Bumped version-date.
committer: mfx <mfx> 1084324462 +0000
2004-05-12 01:14:22 +00:00
Markus F.X.J. Oberhumer 241abcc89c Whitespace changes.
committer: mfx <mfx> 1084324421 +0000
2004-05-12 01:13:41 +00:00
Markus F.X.J. Oberhumer 90fc32a56e Small cleanup.
committer: mfx <mfx> 1084324395 +0000
2004-05-12 01:13:15 +00:00
Markus F.X.J. Oberhumer 7ce85ab712 Fixes for gcc 3.4 (-funit-at-a-time). Reduced size of stubs a little bit.
committer: mfx <mfx> 1084323518 +0000
2004-05-12 00:58:38 +00:00
Markus F.X.J. Oberhumer 55cde23f10 Updated for gcc 3.4.0 release.
committer: mfx <mfx> 1084317169 +0000
2004-05-11 23:12:49 +00:00
Markus F.X.J. Oberhumer a19e6cd4f5 Detabified.
committer: mfx <mfx> 1084317075 +0000
2004-05-11 23:11:15 +00:00
Markus F.X.J. Oberhumer 06f8c55908 Fixed partial reads.
committer: mfx <mfx> 1084308720 +0000
2004-05-11 20:52:00 +00:00
Markus F.X.J. Oberhumer b10f68d20a New ACC version.
committer: mfx <mfx> 1084307588 +0000
2004-05-11 20:33:08 +00:00
John Reiser ed8a71bba1 recognize another variation of head.S: ljmp $0x10,...
committer: jreiser <jreiser> 1084136848 +0000
2004-05-09 21:07:28 +00:00
John Reiser fee6f17caf explicit PHDRS to control number of Elf32_Phdr: no PT_GNU_STACK
l_lx_elf86.lds l_lx_exec86.lds l_lx_sep86.lds l_lx_sh86.lds

committer: jreiser <jreiser> 1083997506 +0000
2004-05-08 06:25:06 +00:00
Markus F.X.J. Oberhumer 767e4e2ce6 New ps1/exe version from Jens.
committer: mfx <mfx> 1083813373 +0000
2004-05-06 03:16:13 +00:00
Markus F.X.J. Oberhumer 23f5370dcf Added cdecl.
committer: mfx <mfx> 1083812698 +0000
2004-05-06 03:04:58 +00:00
Markus F.X.J. Oberhumer 37ae689328 New PS1 version from Jens.
committer: mfx <mfx> 1081901413 +0000
2004-04-14 00:10:13 +00:00
Markus F.X.J. Oberhumer 123b33efd4 New upstream version.
committer: mfx <mfx> 1081448201 +0000
2004-04-08 18:16:41 +00:00
Markus F.X.J. Oberhumer 736ec9d9e5 Now requires djasm-2.04-mfx1.
committer: mfx <mfx> 1081387577 +0000
2004-04-08 01:26:17 +00:00
John Reiser 5a94136764 "python -c" works, so python is a shell. [However, scripts often use:
#!/usr/bin/env python
instead of
	#!/usr/bin/python
because for a long time python was not "blessed" by living in /usr/bin;
many users have python in /usr/local or some other place in $PATH.
And /usr/bin/env does not take "-c".]

committer: jreiser <jreiser> 1081041516 +0000
2004-04-04 01:18:36 +00:00
John Reiser 1555be40b7 fix alignment of loader after packing multiple blocks
p_lx_elf.h p_lx_elf.cpp

committer: jreiser <jreiser> 1080880623 +0000
2004-04-02 04:37:03 +00:00
Markus F.X.J. Oberhumer 60b7a3c33b Updated to gcc-3.4 20040314 prerelease.
committer: mfx <mfx> 1080195627 +0000
2004-03-25 06:20:27 +00:00
Markus F.X.J. Oberhumer a5d8e575bd Building the Linux stub is now completely freestanding of any libc/kernel headers.
committer: mfx <mfx> 1080194907 +0000
2004-03-25 06:08:27 +00:00
Markus F.X.J. Oberhumer 23db1d375c *** empty log message ***
committer: mfx <mfx> 1080194792 +0000
2004-03-25 06:06:32 +00:00
Markus F.X.J. Oberhumer e06722d121 Finally fixed long-standing reloc bug.
committer: mfx <mfx> 1080194776 +0000
2004-03-25 06:06:16 +00:00
John Reiser 81e77a8b2b linux-2.6.4 has different code in head.S
committer: jreiser <jreiser> 1079655854 +0000
2004-03-19 00:24:14 +00:00
Markus F.X.J. Oberhumer 5c567c5a76 Converted ctojr32 to use macro-local defines.
committer: mfx <mfx> 1075806803 +0000
2004-02-03 11:13:23 +00:00
Markus F.X.J. Oberhumer b8e698bde3 Added CPU instructions to all nasm source files.
FIXME: ctojr32 needs CPU 486 because it uses bswap.

committer: mfx <mfx> 1075806034 +0000
2004-02-03 11:00:34 +00:00
Markus F.X.J. Oberhumer 440b5b2608 Build updates.
committer: mfx <mfx> 1075804038 +0000
2004-02-03 10:27:18 +00:00
Markus F.X.J. Oberhumer 8b2e7ffe0b New ACC version.
committer: mfx <mfx> 1075803957 +0000
2004-02-03 10:25:57 +00:00
Markus F.X.J. Oberhumer 1018a96b31 Enter 2004.
committer: mfx <mfx> 1074624720 +0000
2004-01-20 18:52:00 +00:00
Markus F.X.J. Oberhumer 5f87e9891b Enter 2004.
committer: mfx <mfx> 1074623868 +0000
2004-01-20 18:37:48 +00:00
Markus F.X.J. Oberhumer 19564ed27e Cleanups.
committer: mfx <mfx> 1074623253 +0000
2004-01-20 18:27:33 +00:00
Markus F.X.J. Oberhumer f4022af48a Fixes for gcc 3.4 20040118.
committer: mfx <mfx> 1074619023 +0000
2004-01-20 17:17:03 +00:00
Markus F.X.J. Oberhumer 2d1de8b9e9 New ACC version.
committer: mfx <mfx> 1074109375 +0000
2004-01-14 19:42:55 +00:00
Markus F.X.J. Oberhumer cdbfdee725 Updates.
committer: mfx <mfx> 1071922490 +0000
2003-12-20 12:14:50 +00:00
Markus F.X.J. Oberhumer ac64126a66 Use gcc-3.4 20031206 (experimental) for smallest Linux stubs.
committer: mfx <mfx> 1071920621 +0000
2003-12-20 11:43:41 +00:00
Markus F.X.J. Oberhumer 97153e8e09 Compile fixes for PGI C++.
committer: mfx <mfx> 1071917829 +0000
2003-12-20 10:57:09 +00:00
Markus F.X.J. Oberhumer b9c976304a Avoid unused variables.
committer: mfx <mfx> 1071779657 +0000
2003-12-18 20:34:17 +00:00
Markus F.X.J. Oberhumer 670b67cc98 Updated.
committer: mfx <mfx> 1071754494 +0000
2003-12-18 13:34:54 +00:00
Markus F.X.J. Oberhumer ccecaa741c New ACC version.
committer: mfx <mfx> 1071754470 +0000
2003-12-18 13:34:30 +00:00
Markus F.X.J. Oberhumer 07230edec0 New ACC version.
committer: mfx <mfx> 1069787548 +0000
2003-11-25 19:12:28 +00:00
Markus F.X.J. Oberhumer de1a4b4da4 Cleanups.
committer: mfx <mfx> 1068991974 +0000
2003-11-16 14:12:54 +00:00
Markus F.X.J. Oberhumer aba5c40b17 New ACC version.
committer: mfx <mfx> 1068991888 +0000
2003-11-16 14:11:28 +00:00
Markus F.X.J. Oberhumer a55b3480ef Small updates.
committer: mfx <mfx> 1066732696 +0000
2003-10-21 10:38:16 +00:00
Markus F.X.J. Oberhumer bcb5e7d852 New ACC version.
committer: mfx <mfx> 1066732570 +0000
2003-10-21 10:36:10 +00:00
Markus F.X.J. Oberhumer e4f6378dfe Added support for amd64 (aka x86_64) cross compiler.
committer: mfx <mfx> 1064515134 +0000
2003-09-25 18:38:54 +00:00
Markus F.X.J. Oberhumer f616d2edf1 New upstream version.
committer: mfx <mfx> 1063623307 +0000
2003-09-15 10:55:07 +00:00
Markus F.X.J. Oberhumer bffb138b9c New ACC version.
committer: mfx <mfx> 1063544494 +0000
2003-09-14 13:01:34 +00:00
Markus F.X.J. Oberhumer b49fc6c081 Changed -O2 flag to -O15 for new nasm version.
committer: mfx <mfx> 1063502219 +0000
2003-09-14 01:16:59 +00:00
Markus F.X.J. Oberhumer 570b195ed6 Fixed cdecl.
committer: mfx <mfx> 1062472677 +0000
2003-09-02 03:17:57 +00:00
Markus F.X.J. Oberhumer b0e961b90b New ACC version.
committer: mfx <mfx> 1062472636 +0000
2003-09-02 03:17:16 +00:00
Markus F.X.J. Oberhumer 919a899c39 New ACC version.
committer: mfx <mfx> 1062077078 +0000
2003-08-28 13:24:38 +00:00
Markus F.X.J. Oberhumer 655094239c Cleanups.
committer: mfx <mfx> 1061224700 +0000
2003-08-18 16:38:20 +00:00
Markus F.X.J. Oberhumer 8eda698a9c New ACC version.
committer: mfx <mfx> 1061224659 +0000
2003-08-18 16:37:39 +00:00
Markus F.X.J. Oberhumer d1753c6df9 Misc cleanups.
committer: mfx <mfx> 1060699283 +0000
2003-08-12 14:41:23 +00:00
Markus F.X.J. Oberhumer 3db0b0e8fe New ACC version.
committer: mfx <mfx> 1060699213 +0000
2003-08-12 14:40:13 +00:00
Markus F.X.J. Oberhumer 8d5d6bd1a5 Updated TODO list.
committer: mfx <mfx> 1060091356 +0000
2003-08-05 13:49:16 +00:00
Markus F.X.J. Oberhumer 05f6f4d2ff Bump version date.
committer: mfx <mfx> 1060090111 +0000
2003-08-05 13:28:31 +00:00
Markus F.X.J. Oberhumer 9e154e33c3 Win64 updates.
committer: mfx <mfx> 1060086924 +0000
2003-08-05 12:35:24 +00:00
Markus F.X.J. Oberhumer 5125f4d4ac New ACC version.
committer: mfx <mfx> 1060086835 +0000
2003-08-05 12:33:55 +00:00
Markus F.X.J. Oberhumer 365a3c0432 Cleanups.
committer: mfx <mfx> 1059739807 +0000
2003-08-01 12:10:07 +00:00
Markus F.X.J. Oberhumer ab37b5ea0c New ACC version.
committer: mfx <mfx> 1059739715 +0000
2003-08-01 12:08:35 +00:00
Markus F.X.J. Oberhumer 20ddd8590d New ACC version.
committer: mfx <mfx> 1059549679 +0000
2003-07-30 07:21:19 +00:00
Markus F.X.J. Oberhumer 69d9aa6c69 Some fixes for latest gcc 3.4 snapshot.
committer: mfx <mfx> 1059510876 +0000
2003-07-29 20:34:36 +00:00
Markus F.X.J. Oberhumer 2163231401 New ACC version.
committer: mfx <mfx> 1059510824 +0000
2003-07-29 20:33:44 +00:00
Markus F.X.J. Oberhumer f513373693 Updated.
committer: mfx <mfx> 1058967901 +0000
2003-07-23 13:45:01 +00:00
Markus F.X.J. Oberhumer ed0e3b9af4 Small cleanups.
committer: mfx <mfx> 1058967699 +0000
2003-07-23 13:41:39 +00:00
Markus F.X.J. Oberhumer 4205c699ac Correct rounding issue when displaying the compression ratio.
committer: mfx <mfx> 1058789628 +0000
2003-07-21 12:13:48 +00:00
Markus F.X.J. Oberhumer 4e64cdac15 Final round of portab fixes - UPX should now compile on any halfway
modern C++ compiler.

committer: mfx <mfx> 1058789145 +0000
2003-07-21 12:05:45 +00:00
Markus F.X.J. Oberhumer bbbea34d74 New ACC version.
committer: mfx <mfx> 1058788892 +0000
2003-07-21 12:01:32 +00:00
Markus F.X.J. Oberhumer 66565f7238 Some portab fixes.
committer: mfx <mfx> 1058450658 +0000
2003-07-17 14:04:18 +00:00
Markus F.X.J. Oberhumer 9cb922425e Whitespace changes.
committer: mfx <mfx> 1058450247 +0000
2003-07-17 13:57:27 +00:00
Markus F.X.J. Oberhumer 268e13c572 New ACC version.
committer: mfx <mfx> 1058449640 +0000
2003-07-17 13:47:20 +00:00
John Reiser 03f1f615e5 filter 0x49 for [b]vmlinuz; 2nd parameter for ckt32 (addvalue)
p_vmlinz.cpp stub/macros.ash
	stub/l_lx_elf86.asm
	stub/l_lx_exec86.asm
	stub/l_vmlinz.asm

committer: jreiser <jreiser> 1058406408 +0000
2003-07-17 01:46:48 +00:00
John Reiser 94152391b1 patch ULEN for LZCKLLT1; filter 0x49 still not working
committer: jreiser <jreiser> 1058382714 +0000
2003-07-16 19:11:54 +00:00
John Reiser 2d403e07bb clear eflags; set cs; set ecx for LZCKLLT1; more documentation
committer: jreiser <jreiser> 1058382511 +0000
2003-07-16 19:08:31 +00:00
Markus F.X.J. Oberhumer 48ec581539 Renamed the options sub-structs for more consistency. Some portab fixes.
committer: mfx <mfx> 1058221575 +0000
2003-07-14 22:26:15 +00:00
Markus F.X.J. Oberhumer f9054529c1 New ACC version.
committer: mfx <mfx> 1058104401 +0000
2003-07-13 13:53:21 +00:00
Markus F.X.J. Oberhumer 67d9ff987c Updated.
committer: mfx <mfx> 1058050408 +0000
2003-07-12 22:53:28 +00:00
Markus F.X.J. Oberhumer a3bb8f00fd Updates for latest ACC changes.
committer: mfx <mfx> 1058050328 +0000
2003-07-12 22:52:08 +00:00
Markus F.X.J. Oberhumer 48846c7226 New ACC version.
committer: mfx <mfx> 1058045717 +0000
2003-07-12 21:35:17 +00:00
Markus F.X.J. Oberhumer ad8648f668 New ACC version.
committer: mfx <mfx> 1057743808 +0000
2003-07-09 09:43:28 +00:00
Markus F.X.J. Oberhumer c7224c7727 Added some important TODO entries.
committer: mfx <mfx> 1054071077 +0000
2003-05-27 21:31:17 +00:00
Markus F.X.J. Oberhumer b2949259c5 Portability updates.
committer: mfx <mfx> 1054071025 +0000
2003-05-27 21:30:25 +00:00
Markus F.X.J. Oberhumer 757bdd1264 New ACC version.
committer: mfx <mfx> 1054070133 +0000
2003-05-27 21:15:33 +00:00
Markus F.X.J. Oberhumer ec1e5849eb Remove debug output.
committer: mfx <mfx> 1054069636 +0000
2003-05-27 21:07:16 +00:00
Markus F.X.J. Oberhumer 1752fab911 New ACC version.
committer: mfx <mfx> 1054069577 +0000
2003-05-27 21:06:17 +00:00
Markus F.X.J. Oberhumer b0748388b2 New upstream version.
committer: mfx <mfx> 1052654076 +0000
2003-05-11 11:54:36 +00:00
Markus F.X.J. Oberhumer 175899013e Updated.
committer: mfx <mfx> 1051152491 +0000
2003-04-24 02:48:11 +00:00
Markus F.X.J. Oberhumer c448d15a8f New ACC version.
committer: mfx <mfx> 1051152474 +0000
2003-04-24 02:47:54 +00:00
Markus F.X.J. Oberhumer 5c7bca5b3e Updates.
committer: mfx <mfx> 1050612607 +0000
2003-04-17 20:50:07 +00:00
Markus F.X.J. Oberhumer 390cdbba2d New ACC version.
committer: mfx <mfx> 1050608556 +0000
2003-04-17 19:42:36 +00:00
Markus F.X.J. Oberhumer 256b8f066f New version from Jens.
committer: mfx <mfx> 1049938824 +0000
2003-04-10 01:40:24 +00:00
Markus F.X.J. Oberhumer 30915862cd New upstream version.
committer: mfx <mfx> 1049683526 +0000
2003-04-07 02:45:26 +00:00
Markus F.X.J. Oberhumer eeb1dfaf8f Updated.
committer: mfx <mfx> 1049676306 +0000
2003-04-07 00:45:06 +00:00
Markus F.X.J. Oberhumer 90161bc3a7 New ACC version.
committer: mfx <mfx> 1049665216 +0000
2003-04-06 21:40:16 +00:00
Markus F.X.J. Oberhumer a1064dc2cb New ps1/exe version from Jens.
committer: mfx <mfx> 1049665152 +0000
2003-04-06 21:39:12 +00:00
Markus F.X.J. Oberhumer b8a9b321fa Updated.
committer: mfx <mfx> 1049665135 +0000
2003-04-06 21:38:55 +00:00
Markus F.X.J. Oberhumer a3e80b1628 Fixed call to typeid().
committer: mfx <mfx> 1049380061 +0000
2003-04-03 14:27:41 +00:00
Markus F.X.J. Oberhumer 350ebfc47d *** empty log message ***
committer: mfx <mfx> 1049380046 +0000
2003-04-03 14:27:26 +00:00
Markus F.X.J. Oberhumer b9b75c536c *** empty log message ***
committer: mfx <mfx> 1049237553 +0000
2003-04-01 22:52:33 +00:00
Markus F.X.J. Oberhumer 8b74704bbf *** empty log message ***
committer: mfx <mfx> 1049203016 +0000
2003-04-01 13:16:56 +00:00
Markus F.X.J. Oberhumer bead894e49 Updated.
committer: mfx <mfx> 1049194128 +0000
2003-04-01 10:48:48 +00:00
John Reiser 502f9b5a00 better hadling of Linux AT_SYSINFO (32 <= a_type)
committer: jreiser <jreiser> 1048872136 +0000
2003-03-28 17:22:16 +00:00
Markus F.X.J. Oberhumer cd15b7d5af *** empty log message ***
committer: mfx <mfx> 1048717636 +0000
2003-03-26 22:27:16 +00:00
Markus F.X.J. Oberhumer 0c1d544e98 *** empty log message ***
committer: mfx <mfx> 1048663373 +0000
2003-03-26 07:22:53 +00:00
Markus F.X.J. Oberhumer 728be1867f *** empty log message ***
committer: mfx <mfx> 1048662806 +0000
2003-03-26 07:13:26 +00:00
Markus F.X.J. Oberhumer 09578df46b New ACC system.
committer: mfx <mfx> 1048662134 +0000
2003-03-26 07:02:14 +00:00
Markus F.X.J. Oberhumer b29f5b7c09 *** empty log message ***
committer: mfx <mfx> 1048661664 +0000
2003-03-26 06:54:24 +00:00
Markus F.X.J. Oberhumer 10f602fca7 *** empty log message ***
committer: mfx <mfx> 1048661243 +0000
2003-03-26 06:47:23 +00:00
Markus F.X.J. Oberhumer 2f8917f450 wc/le: Refuse to pack files without relocations. This should be fixed.
committer: mfx <mfx> 1048283863 +0000
2003-03-21 21:57:43 +00:00
Markus F.X.J. Oberhumer b57f48d543 Updated.
committer: mfx <mfx> 1046369903 +0000
2003-02-27 18:18:23 +00:00
Markus F.X.J. Oberhumer 87a4d8455d Updated.
committer: mfx <mfx> 1046366795 +0000
2003-02-27 17:26:35 +00:00
Markus F.X.J. Oberhumer b14df392fa Updated.
committer: mfx <mfx> 1045574984 +0000
2003-02-18 13:29:44 +00:00
Markus F.X.J. Oberhumer 437c34a68c Small cleanups.
committer: mfx <mfx> 1044946475 +0000
2003-02-11 06:54:35 +00:00
Markus F.X.J. Oberhumer b218cec3d7 Updated for VC7.
committer: mfx <mfx> 1044418804 +0000
2003-02-05 04:20:04 +00:00
Markus F.X.J. Oberhumer f19c91243a Cleanups.
committer: mfx <mfx> 1044346802 +0000
2003-02-04 08:20:02 +00:00
Markus F.X.J. Oberhumer 882e1be2db Cleanups.
committer: mfx <mfx> 1044346308 +0000
2003-02-04 08:11:48 +00:00
Markus F.X.J. Oberhumer 8e21c1e965 Updated.
committer: mfx <mfx> 1043776870 +0000
2003-01-28 18:01:10 +00:00
Markus F.X.J. Oberhumer f3970eaed9 Updated.
committer: mfx <mfx> 1043694056 +0000
2003-01-27 19:00:56 +00:00
Markus F.X.J. Oberhumer ac4b8f8617 Use MemBuffer.clear().
committer: mfx <mfx> 1043693892 +0000
2003-01-27 18:58:12 +00:00
Markus F.X.J. Oberhumer 51c28020de Use a MemBuffer instead of a pointer.
committer: mfx <mfx> 1043693800 +0000
2003-01-27 18:56:40 +00:00
Markus F.X.J. Oberhumer fd525ae7df Portability fixes.
committer: mfx <mfx> 1043693750 +0000
2003-01-27 18:55:50 +00:00
Markus F.X.J. Oberhumer a282171318 Rewritten.
committer: mfx <mfx> 1043693646 +0000
2003-01-27 18:54:06 +00:00
Markus F.X.J. Oberhumer c3040d1636 Updated.
committer: mfx <mfx> 1043693611 +0000
2003-01-27 18:53:31 +00:00
John Reiser c76c07aea0 prepare to allow multiple decompressors and multiple unfilters
committer: jreiser <jreiser> 1043441624 +0000
2003-01-24 20:53:44 +00:00
László Molnár 1282ed333a djgpp2/coff updates
committer: ml1050 <ml1050> 1043312061 +0000
2003-01-23 08:54:21 +00:00
Markus F.X.J. Oberhumer 32e76e88cf Updated.
committer: mfx <mfx> 1043211831 +0000
2003-01-22 05:03:51 +00:00
Markus F.X.J. Oberhumer fc0d3ff118 Updated.
committer: mfx <mfx> 1043101129 +0000
2003-01-20 22:18:49 +00:00
Markus F.X.J. Oberhumer 0bd05c0d67 Updated.
committer: mfx <mfx> 1042994191 +0000
2003-01-19 16:36:31 +00:00
Markus F.X.J. Oberhumer ff2c5300b8 New upstream version.
committer: mfx <mfx> 1042993977 +0000
2003-01-19 16:32:57 +00:00
Markus F.X.J. Oberhumer a38989dfbf Updated.
committer: mfx <mfx> 1042930217 +0000
2003-01-18 22:50:17 +00:00
Markus F.X.J. Oberhumer e387c6bc56 Portability updates.
committer: mfx <mfx> 1042930101 +0000
2003-01-18 22:48:21 +00:00
John Reiser 5eb81c0ec4 omit unfilter when .b_ftid==0
committer: jreiser <jreiser> 1042755704 +0000
2003-01-16 22:21:44 +00:00
Markus F.X.J. Oberhumer f92b617c43 Updated.
committer: mfx <mfx> 1042742278 +0000
2003-01-16 18:37:58 +00:00
Markus F.X.J. Oberhumer 8f25c72085 Consistently use const Class &' instead of Class const &'.
committer: mfx <mfx> 1042741665 +0000
2003-01-16 18:27:45 +00:00
Markus F.X.J. Oberhumer 7860e7a249 Updated.
committer: mfx <mfx> 1042741465 +0000
2003-01-16 18:24:25 +00:00
Markus F.X.J. Oberhumer a2e3ceb8c8 Portability updates.
committer: mfx <mfx> 1042738038 +0000
2003-01-16 17:27:18 +00:00
Markus F.X.J. Oberhumer e96ad21db1 Added support for Intel C++ 7.0.
committer: mfx <mfx> 1042686101 +0000
2003-01-16 03:01:41 +00:00
Markus F.X.J. Oberhumer 888ac8a220 Updated.
committer: mfx <mfx> 1042654719 +0000
2003-01-15 18:18:39 +00:00
Markus F.X.J. Oberhumer 29db8bca3a Major cleanup.
committer: mfx <mfx> 1042637889 +0000
2003-01-15 13:38:09 +00:00
Markus F.X.J. Oberhumer 63d49f0143 Updated.
committer: mfx <mfx> 1042637875 +0000
2003-01-15 13:37:55 +00:00
Markus F.X.J. Oberhumer 378224c6ba Updated.
committer: mfx <mfx> 1042634011 +0000
2003-01-15 12:33:31 +00:00
Markus F.X.J. Oberhumer 2f3e7a82b5 Detabified.
committer: mfx <mfx> 1042632555 +0000
2003-01-15 12:09:15 +00:00
Markus F.X.J. Oberhumer 960f020277 Fixed typos.
committer: mfx <mfx> 1042632460 +0000
2003-01-15 12:07:40 +00:00
Markus F.X.J. Oberhumer 6962da718c Added some calls to MemBuffer::checkState().
committer: mfx <mfx> 1042580584 +0000
2003-01-14 21:43:04 +00:00
Markus F.X.J. Oberhumer 42575d9f57 Use NULL instead of 0.
committer: mfx <mfx> 1042580552 +0000
2003-01-14 21:42:32 +00:00
Markus F.X.J. Oberhumer 03fb0d95c6 Rewrote MemBuffer to do some internal checks.
committer: mfx <mfx> 1042580463 +0000
2003-01-14 21:41:03 +00:00
Markus F.X.J. Oberhumer beb766b005 Major cleanup. Jens, please have a look.
committer: mfx <mfx> 1042576817 +0000
2003-01-14 20:40:17 +00:00
Markus F.X.J. Oberhumer 29c1f67057 Cleanup.
committer: mfx <mfx> 1042576530 +0000
2003-01-14 20:35:30 +00:00
Markus F.X.J. Oberhumer a709b38065 Use new file+MemBuffer methods.
committer: mfx <mfx> 1042576321 +0000
2003-01-14 20:32:01 +00:00
Markus F.X.J. Oberhumer ec5840fb2a Added overloaded write functions for MemBuffer.
committer: mfx <mfx> 1042576236 +0000
2003-01-14 20:30:36 +00:00
Markus F.X.J. Oberhumer 9511e3c9b1 Added ALIGN_GAP(a,b) marco.
committer: mfx <mfx> 1042576135 +0000
2003-01-14 20:28:55 +00:00
Markus F.X.J. Oberhumer 9190e7d51a Use new allocForCompression().
committer: mfx <mfx> 1042575473 +0000
2003-01-14 20:17:53 +00:00
Markus F.X.J. Oberhumer cff830c43b Cleanup.
committer: mfx <mfx> 1042575285 +0000
2003-01-14 20:14:45 +00:00
Markus F.X.J. Oberhumer e31c45dc10 Allow a number of extra bytes in the allocForXXX() methods.
committer: mfx <mfx> 1042575213 +0000
2003-01-14 20:13:33 +00:00
Markus F.X.J. Oberhumer e1da733810 Updated.
committer: mfx <mfx> 1042567596 +0000
2003-01-14 18:06:36 +00:00
Markus F.X.J. Oberhumer b8c34036a5 Cleanups.
committer: mfx <mfx> 1042565088 +0000
2003-01-14 17:24:48 +00:00
Markus F.X.J. Oberhumer d771f219f0 Bumped version.
committer: mfx <mfx> 1042565001 +0000
2003-01-14 17:23:21 +00:00
Markus F.X.J. Oberhumer d8280343f9 Makefiles updated.
committer: mfx <mfx> 1042564758 +0000
2003-01-14 17:19:18 +00:00
Markus F.X.J. Oberhumer c7b9395866 Detabified.
committer: mfx <mfx> 1042564671 +0000
2003-01-14 17:17:51 +00:00
Markus F.X.J. Oberhumer 992ceee52b CLeanups.
committer: mfx <mfx> 1042480204 +0000
2003-01-13 17:50:04 +00:00
Markus F.X.J. Oberhumer 2162a01848 Enter 2003.
committer: mfx <mfx> 1042478199 +0000
2003-01-13 17:16:39 +00:00
Markus F.X.J. Oberhumer 102e0f0a98 Re-worked the Makefiles.
committer: mfx <mfx> 1042477974 +0000
2003-01-13 17:12:54 +00:00
John Reiser 4e0967e0a1 Code to supply a "linking view" for /usr/bin/strip.
(Not used today because yet another bug is worse.)  See
https://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=81644

committer: jreiser <jreiser> 1042341933 +0000
2003-01-12 03:25:33 +00:00
John Reiser 73dc4eede0 Elf_LE32_Shdr; set_native16()
p_elf.h p_unix.h

committer: jreiser <jreiser> 1042341777 +0000
2003-01-12 03:22:57 +00:00
Markus F.X.J. Oberhumer 5e5ea9f6e4 Cleanups.
committer: mfx <mfx> 1041858220 +0000
2003-01-06 13:03:40 +00:00
Markus F.X.J. Oberhumer e537f25857 Default to `-cpu=i686'.
committer: mfx <mfx> 1041858189 +0000
2003-01-06 13:03:09 +00:00
Markus F.X.J. Oberhumer 47aea88c27 Whitespace changes.
committer: mfx <mfx> 1041858159 +0000
2003-01-06 13:02:39 +00:00
Markus F.X.J. Oberhumer 0237bf8915 Updated.
committer: mfx <mfx> 1041858132 +0000
2003-01-06 13:02:12 +00:00
Markus F.X.J. Oberhumer 3a7032f21c Updated.
committer: mfx <mfx> 1041162781 +0000
2002-12-29 11:53:01 +00:00
John Reiser 54d01790b5 Linux 2.5.53 has some Elf32_auxv_t.a_type >= 32
committer: jreiser <jreiser> 1040352519 +0000
2002-12-20 02:48:39 +00:00
John Reiser fb3375112e [B]VMLINUZ for 0x40 series filters
packerf.cpp p_vmlinz.cpp

committer: jreiser <jreiser> 1039144160 +0000
2002-12-06 03:09:20 +00:00
John Reiser 554f22a14f ckt32 for 0x40 series filters
committer: jreiser <jreiser> 1039144122 +0000
2002-12-06 03:08:42 +00:00
Markus F.X.J. Oberhumer eb6a6e3909 Cleanups.
committer: mfx <mfx> 1037132993 +0000
2002-11-12 20:29:53 +00:00
Markus F.X.J. Oberhumer 041947507f Small patch from Jens.
committer: mfx <mfx> 1037131376 +0000
2002-11-12 20:02:56 +00:00
Markus F.X.J. Oberhumer ff03ac17b2 Cosmetic changes.
committer: mfx <mfx> 1037106750 +0000
2002-11-12 13:12:30 +00:00
John Reiser 12c6cd8021 Comment on current state of stub/fold* vs decompress, and independent unfilter.
p_lx_elf.cpp p_lx_exc.cpp

committer: jreiser <jreiser> 1037072124 +0000
2002-11-12 03:35:24 +00:00
John Reiser de6e8c8020 upx_itoa() in assembler to enforce no relocation
Makefile l_lx_exec.c upx_itoa.asm

committer: jreiser <jreiser> 1037070863 +0000
2002-11-12 03:14:23 +00:00
Markus F.X.J. Oberhumer f3b64cfe78 Bumped version.
committer: mfx <mfx> 1037068905 +0000
2002-11-12 02:41:45 +00:00
264 changed files with 34850 additions and 7499 deletions
+12 -3
View File
@@ -1,4 +1,13 @@
.cvsignore .bzr*
ChangeLog.cvs* .darcs*
build .git*
.hg*
_darcs
B
build*
doxygen
maint maint
ChangeLog.cvs*
GNUmakefile
MMakefile
TODO.*
+13
View File
@@ -0,0 +1,13 @@
.bzr*
.darcs*
.git*
.hg*
_darcs
B
build*
doxygen
maint
ChangeLog.cvs*
GNUmakefile
MMakefile
TODO.*
+1 -1
View File
@@ -8,7 +8,7 @@
The Ultimate Packer for eXecutables The Ultimate Packer for eXecutables
Copyright (c) 1996-2002 Markus Oberhumer & Laszlo Molnar Copyright (c) 1996-2006 Markus Oberhumer, Laszlo Molnar & John Reiser
http://upx.sourceforge.net http://upx.sourceforge.net
+18 -8
View File
@@ -1,11 +1,16 @@
# Toplevel Makefile for UPX # Toplevel Makefile for UPX
SHELL = /bin/sh MAKEFLAGS += -rR
.SUFFIXES:
export SHELL = /bin/sh
srcdir = . srcdir = .
top_srcdir = . top_srcdir = .
default:
@echo "UPX info: please choose a target for 'make'"
all mostlyclean clean distclean maintainer-clean: all mostlyclean clean distclean maintainer-clean:
$(MAKE) -C src/stub/util/sstrip $@ $(MAKE) -C src/stub/util/sstrip $@
$(MAKE) -C src/stub $@ $(MAKE) -C src/stub $@
@@ -15,19 +20,24 @@ all mostlyclean clean distclean maintainer-clean:
dist: distclean dist: distclean
false false
zip:
cd .. && rm -f upx-current.zip && zip -r upx-current.zip upx ifneq ($(wildcard CVS/R*),)
CVS_ROOT := $(shell cat CVS/Root)
CVS_REPO := $(shell cat CVS/Repository)
endif
cvs-info:
@echo 'CVS info: $(CVS_ROOT) $(CVS_REPO)'
cvs-admin-ko: cvs-admin-ko:
cvs admin -ko . cvs admin -ko .
cvs update cvs -q -z6 update -P -d
ChangeLog: # automatically generate ChangeLog from CVS
ChangeLog ChangeLog.cvs:
perl $(srcdir)/scripts/cvs2cl.pl --utc -f ChangeLog.cvs perl $(srcdir)/scripts/cvs2cl.pl --utc -f ChangeLog.cvs
.PHONY: all mostlyclean clean distclean maintainer-clean .PHONY: all mostlyclean clean distclean maintainer-clean
.PHONY: dist cvs-admin-ko ChangeLog .PHONY: dist cvs-info cvs-admin-ko ChangeLog ChangeLog.cvs
.NOEXPORT:
+86 -29
View File
@@ -2,19 +2,68 @@
User visible changes for UPX User visible changes for UPX
================================================================== ==================================================================
[ BETA VERSION - please see README.1ST for some more info ] Changes in 2.00 (27 Apr 2006):
* linux/386: the stub now prints an error message if some strict
SELinux mode does prevent runtime decompression and execution
(for a fully SELinux-compatible but otherwise inferior compression
format you can use the '--force-execve' option)
* linux/386: worked around a problem where certain Linux kernels
clobber the %ebx register during a syscall
* win32/pe: disable filters for files with broken PE headers
Changes in 1.96 beta (13 Apr 2006):
* arm/pe: added filter support
* win32/pe: removed an unnecessary check so that Delphi 2006 and
Digital Mars C++ programs finally are supported
Changes in 1.95 beta (09 Apr 2006):
* arm/pe: added DLL support
* arm/pe: added thumb mode stub support
* arm/pe: added unpacking support
* win32/pe: really worked around R6002 runtime errors
Changes in 1.94 beta (11 Mar 2006):
* new format: added support for arm/pe (ARM executables running on WinCE)
* new format: added support for linux elf/amd64
* new format: added support for linux elf/ppc32
* new format: added support for mach/ppc32 (Apple Mac OS X)
* win32/pe: hopefully working "load config" support
* win32/pe: R6002 runtime errors worked around
* win32/pe: the stub now clears the dirty stack
Changes in 1.93 beta (07 Feb 2005):
* vmlinuz/386: fixes to support more kernels
Changes in 1.92 beta (20 Jul 2004):
* win32/pe: added option '--strip-loadconf' to strip the SEH load
config section [NOTE: this option is obsolete since UPX 1.94]
* win32/pe: try to detect .NET (win32/net) files [not yet supported by UPX]
* vmlinux/386: new format that directly supports building Linux kernels
* source code: now compiles cleanly under Win64
Changes in 1.91 beta (30 Jun 2004):
* djgpp2/coff: added support for recent binutils versions
* linux/elf386, linux/sh386: lots of improvements
* vmlinuz/386: added support for recent kernels
* watcom/le: don't crash on files without relocations
* win32/pe: stricter checks of some PE values
* option '--brute' now implies '--crp-ms=999999'.
* source code: much improved portability using ACC, the
Automatic Compiler Configuration
* source code: compile fixes for strict ISO C++ compilers
* source code: compile fixes for Win64
* re-synced with upx 1.25 branch
Changes in 1.90 beta (11 Nov 2002): Changes in 1.90 beta (11 Nov 2002):
* 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'
* ps1/exe: new format - UPX now supports PlayStation One programs * ps1/exe: new format - UPX now supports PlayStation One programs
* linux/386: added the option `--force-execve' * linux/386: added the option '--force-execve'
* vmlinuz/386: better kernel detection and sanity checks * vmlinuz/386: better kernel detection and sanity checks
* re-synced with upx 1.24 branch
* documentation updates * documentation updates
Changes in 1.11 beta (20 Dec 2000): Changes in 1.11 beta (20 Dec 2000):
* UNSTABLE BETA VERSION - DO NOT USE EXCEPT FOR TESTING
* vmlinuz/386: new format - UPX now supports bootable linux kernels * vmlinuz/386: new format - UPX now supports bootable linux kernels
* linux/elf386: added the new ELF direct-to-memory executable format - no * linux/elf386: added the new ELF direct-to-memory executable format - no
more temp files are needed for decompression! more temp files are needed for decompression!
@@ -25,6 +74,15 @@ Changes in 1.11 beta (20 Dec 2000):
================================================================== ==================================================================
Changes in 1.25 (29 Jun 2004)
* INFO: http://upx.sourceforge.net is the permanent UPX home page
* watcom/le: don't crash on files without relocations
* win32/pe: stricter checks of some PE values
* source code: much improved portability using ACC, the
Automatic Compiler Configuration
* source code: compile fixes for strict ISO C++ compilers
* source code: compile fixes for Win64
Changes in 1.24 (07 Nov 2002) Changes in 1.24 (07 Nov 2002)
* djgpp2/coff: stricter check of the COFF header to work around a * djgpp2/coff: stricter check of the COFF header to work around a
problem with certain binutils versions problem with certain binutils versions
@@ -41,13 +99,13 @@ Changes in 1.23 (05 Sep 2002)
Changes in 1.22 (27 Jun 2002) Changes in 1.22 (27 Jun 2002)
* atari/tos: the stub now flushes the CPU cache to avoid * atari/tos: the stub now flushes the CPU cache to avoid
problems on 68030+ machines problems on 68030+ machines
* source code: additional compiler support for Borland C++ 5.5.1, * source code: additional compiler support for Borland C++,
Digital Mars C++ 8.28 and Watcom C++ 11.0c Digital Mars C++ and Watcom C++
Changes in 1.21 (01 Jun 2002) Changes in 1.21 (01 Jun 2002)
* New option `--crp-ms=' for slightly better compression at the cost * New option '--crp-ms=' for slightly better compression at the cost
of higher memory requirements during compression. of higher memory requirements during compression.
Try `upx --best --crp-ms=100000'. See the docs for more info. Try 'upx --best --crp-ms=100000'. See the docs for more info.
* source code: portability fixes * source code: portability fixes
* source code: compile fixes for g++ 3.0 and g++ 3.1 * source code: compile fixes for g++ 3.0 and g++ 3.1
@@ -61,7 +119,6 @@ Changes in 1.20 (23 May 2001)
our unstable development releases 1.1x and 1.9x] our unstable development releases 1.1x and 1.9x]
Changes in 1.08 (30 Apr 2001) 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 * new native port to atari/tos
* win32/pe: shortened the identstring * win32/pe: shortened the identstring
* source code: portability fixes - UPX now builds cleanly under m68k CPUs * source code: portability fixes - UPX now builds cleanly under m68k CPUs
@@ -86,7 +143,7 @@ Changes in 1.05 (24 Jan 2001)
at the unstable UPX 1.1x beta versions for that) at the unstable UPX 1.1x beta versions for that)
Changes in 1.04 (19 Dec 2000) Changes in 1.04 (19 Dec 2000)
* dos/exe: fixed an internal error when using `--no-reloc' * dos/exe: fixed an internal error when using '--no-reloc'
* win32/pe: fixed a rare bug in the relocation handling code * win32/pe: fixed a rare bug in the relocation handling code
* some tunings for the default compression level * some tunings for the default compression level
@@ -94,7 +151,7 @@ Changes in 1.03 (30 Nov 2000)
* linked with a new version of the NRV compression library: * linked with a new version of the NRV compression library:
- improved compression ratio a little bit - improved compression ratio a little bit
- overall significantly faster compression - overall significantly faster compression
- much faster when using high compression levels like `-9' or `--best' - much faster when using high compression levels like '-9' or '--best'
- much faster with large files - much faster with large files
* atari/tos: added support for FreeMiNT * atari/tos: added support for FreeMiNT
* the 32-bit DOS version now uses the new CWSDSTUB extender * the 32-bit DOS version now uses the new CWSDSTUB extender
@@ -102,7 +159,7 @@ Changes in 1.03 (30 Nov 2000)
Changes in 1.02 (13 Sep 2000) Changes in 1.02 (13 Sep 2000)
* watcom/le: fixed a problem with the Causeway extender * watcom/le: fixed a problem with the Causeway extender
* win32/pe: don't automatically strip relocs if they seem needed * win32/pe: don't automatically strip relocs if they seem needed
* support multiple backup generations when using `-k' * support multiple backup generations when using '-k'
* updated the console screen driver * updated the console screen driver
Changes in 1.01 (09 Apr 2000) Changes in 1.01 (09 Apr 2000)
@@ -130,7 +187,7 @@ Changes in 0.99.1 (29 Feb 2000)
Changes in 0.99 (25 Feb 2000) Changes in 0.99 (25 Feb 2000)
* FULL SOURCE CODE RELEASED UNDER THE TERMS OF THE GNU GPL * FULL SOURCE CODE RELEASED UNDER THE TERMS OF THE GNU GPL
* win32/pe: changed default to `--strip-relocs=1' * win32/pe: changed default to '--strip-relocs=1'
* dos/com and dos/sys: fixed a bad decompressor problem * dos/com and dos/sys: fixed a bad decompressor problem
* linux/386: the counter for the progress indicator was off by one * linux/386: the counter for the progress indicator was off by one
@@ -153,7 +210,7 @@ Changes in 0.91 (13 Nov 1999)
* dos/exe: correctly restore cs when uncompressing * dos/exe: correctly restore cs when uncompressing
Changes in 0.90 (10 Nov 1999) Changes in 0.90 (10 Nov 1999)
* all formats: `--overlay=copy' now is the default overlay mode * all formats: '--overlay=copy' now is the default overlay mode
* improved compression ratio for most files * improved compression ratio for most files
* win32/pe: uncompression is finally supported * win32/pe: uncompression is finally supported
* win32/pe: never compress REGISTRY resources * win32/pe: never compress REGISTRY resources
@@ -163,7 +220,7 @@ Changes in 0.90 (10 Nov 1999)
* win32/pe: somewhat less memory is required during compression * win32/pe: somewhat less memory is required during compression
* linux/386: fixed compression of scripts which was broken since 0.71 * linux/386: fixed compression of scripts which was broken since 0.71
* linux/386: more FreeBSD compatibility issues * linux/386: more FreeBSD compatibility issues
* changed option: `-i' now prints some more details during compression * changed option: '-i' now prints some more details during compression
(not finished yet) (not finished yet)
Changes in 0.84 (04 Oct 1999) Changes in 0.84 (04 Oct 1999)
@@ -179,7 +236,7 @@ Changes in 0.83 (17 Sep 1999)
Changes in 0.82 (16 Aug 1999) Changes in 0.82 (16 Aug 1999)
* dos/exe: fixed a decompressor bug which could cause crash on some files * dos/exe: fixed a decompressor bug which could cause crash on some files
* linux/386: section headers are now stripped from the stub so that * linux/386: section headers are now stripped from the stub so that
`strip' won't ruin a compressed file any longer 'strip' won't ruin a compressed file any longer
* wc/le: support for stack not in the last object disabled again * wc/le: support for stack not in the last object disabled again
* win32/pe: removed some unneeded data * win32/pe: removed some unneeded data
@@ -188,32 +245,32 @@ Changes in 0.81 (04 Aug 1999)
* dos/com: fixed an internal error that could happen with very small files * dos/com: fixed an internal error that could happen with very small files
Changes in 0.80 (03 Aug 1999) Changes in 0.80 (03 Aug 1999)
* you can set some default options in the environment var `UPX' * you can set some default options in the environment var 'UPX'
* dos/com: the decompressor stub now checks for enough free memory * dos/com: the decompressor stub now checks for enough free memory
* dos/exe: decompressor rewritten, some bugs are fixed * dos/exe: decompressor rewritten, some bugs are fixed
* dos/exe: new option `--no-reloc': no relocation data is put into * dos/exe: new option '--no-reloc': no relocation data is put into
the DOS header the DOS header
* tmt/adam: added support for more stubs, detect already packed files * tmt/adam: added support for more stubs, detect already packed files
* tmt/adam: new option `--copy-overlay' * tmt/adam: new option '--copy-overlay'
* wc/le: reduced memory requirement during uncompression * wc/le: reduced memory requirement during uncompression
* wc/le: support files which do not contain their stack in the last object * wc/le: support files which do not contain their stack in the last object
* wc/le: fixed a bug which could cause a crash, improved relocation * wc/le: fixed a bug which could cause a crash, improved relocation
handling handling
* wc/le: new option `--copy-overlay' * wc/le: new option '--copy-overlay'
* win32/pe: `--compress-icons=2' is now the default * win32/pe: '--compress-icons=2' is now the default
* win32/pe: even better TLS support * win32/pe: even better TLS support
* win32/pe: versioninfo works on NT * win32/pe: versioninfo works on NT
* win32/pe: import by ordinal from kernel32.dll works * win32/pe: import by ordinal from kernel32.dll works
* win32/pe: other import improvements: importing a nonexistant DLL * win32/pe: other import improvements: importing a nonexistant DLL
results in a usual Windows message, importing a nonexistant function results in a usual Windows message, importing a nonexistant function
results in program exit (instead of crash ;-) results in program exit (instead of crash ;-)
* win32/pe: new option: `--compress-resources=0' * win32/pe: new option: '--compress-resources=0'
* win32/pe: reduced memory requirement during uncompression, some * win32/pe: reduced memory requirement during uncompression, some
files might even require LESS memory when they're compressed files might even require LESS memory when they're compressed
* win32/pe: TYPELIBs should work now * win32/pe: TYPELIBs should work now
* win32/pe: improved relocation handling, 16-bit relocations should work * win32/pe: improved relocation handling, 16-bit relocations should work
* win32/pe: new option `--strip-relocs' (only if you know what you are doing) * win32/pe: new option '--strip-relocs' (only if you know what you are doing)
* win32/pe: new option `--copy-overlay' * win32/pe: new option '--copy-overlay'
* important internal changes: now the stubs are built at runtime * important internal changes: now the stubs are built at runtime
Changes in 0.72 (12 May 1999) Changes in 0.72 (12 May 1999)
@@ -227,20 +284,20 @@ Changes in 0.72 (12 May 1999)
* linux/386: minor decompressor stub updates, nicer progress bar * linux/386: minor decompressor stub updates, nicer progress bar
Changes in 0.71 (19 Apr 1999) Changes in 0.71 (19 Apr 1999)
* dos/exe: added option `--no-overlay' * dos/exe: added option '--no-overlay'
* linux/386: various improvements in the stub, most notably the * linux/386: various improvements in the stub, most notably the
overhead for an extra cleanup process has been removed overhead for an extra cleanup process has been removed
* win32/pe: added support for export forwarders * win32/pe: added support for export forwarders
* win32/pe: added support for DLLs without entry point or imports * win32/pe: added support for DLLs without entry point or imports
* win32/pe: yet another .bss fix * win32/pe: yet another .bss fix
* win32/pe: new option `--compress-icons=2': compress all icons * win32/pe: new option '--compress-icons=2': compress all icons
which are not in the first icon directory which are not in the first icon directory
* win32/pe: rearranged stub to avoid false alerts from some virus scanners * win32/pe: rearranged stub to avoid false alerts from some virus scanners
Changes in 0.70 (30 Mar 1999) Changes in 0.70 (30 Mar 1999)
* added support for linux/386 executables * added support for linux/386 executables
* improved compression ratio quite a bit * improved compression ratio quite a bit
* added new compression level `--best' to squeeze out even some more bytes * added new compression level '--best' to squeeze out even some more bytes
* win32/pe: TLS support is much better now * win32/pe: TLS support is much better now
* win32/pe: --compress-icons=0 should now work as well * win32/pe: --compress-icons=0 should now work as well
* the usual minor fixes for win32/pe * the usual minor fixes for win32/pe
@@ -281,7 +338,7 @@ Changes in 0.40 (05 Oct 1998)
* fixed a small but fatal bug in dos/sys introduced in 0.30 * fixed a small but fatal bug in dos/sys introduced in 0.30
* fixed a rare bug in dos/exe * fixed a rare bug in dos/exe
* worked around a bug in djgpp's strip 2.8 * worked around a bug in djgpp's strip 2.8
* Allegro packfile support should work now * djgpp/coff: Allegro packfile support should work now
* added dos/exeh compression method (works on 386+) * added dos/exeh compression method (works on 386+)
Changes in 0.30 (27 Jul 1998) Changes in 0.30 (27 Jul 1998)
+1 -3
View File
@@ -8,7 +8,7 @@
The Ultimate Packer for eXecutables The Ultimate Packer for eXecutables
Copyright (c) 1996-2002 Markus Oberhumer & Laszlo Molnar Copyright (c) 1996-2006 Markus Oberhumer, Laszlo Molnar & John Reiser
http://upx.sourceforge.net http://upx.sourceforge.net
@@ -42,8 +42,6 @@ More formats:
- freebsd/386 (generic), freebsd/elf386 (specialized). - freebsd/386 (generic), freebsd/elf386 (specialized).
Probably could share most of the linux code. Probably could share most of the linux code.
- Windows CE
- add support for self-extracting HTML pages using a Javascript stub - add support for self-extracting HTML pages using a Javascript stub
(like the AlgART HTML Packer "AHP") (like the AlgART HTML Packer "AHP")
+9 -23
View File
@@ -8,26 +8,11 @@
The Ultimate Packer for eXecutables The Ultimate Packer for eXecutables
Copyright (c) 1996-2002 Markus Oberhumer & Laszlo Molnar Copyright (c) 1996-2006 Markus Oberhumer, Laszlo Molnar & John Reiser
http://upx.sourceforge.net http://upx.sourceforge.net
WARNING - UNSTABLE BETA VERSION
===============================
All versions 1.9x are unstable beta releases - use them only for testing,
and never distribute a program that is packed with them !
There will be hidden bugs. Really.
The current stable release is 1.22, and the next stable release
will be called version 2.00.
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
no reason to use the unstable versions unless you want to try the new formats.
WELCOME WELCOME
======= =======
@@ -52,7 +37,7 @@ 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
Windows 95/98/ME/NT/2000/XP programs and DLLs, DOS programs, Windows 95/98/ME/NT/2000/XP/CE programs and DLLs, DOS programs,
and Linux 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
@@ -70,8 +55,8 @@ UPX aims to be Commercial Quality Freeware.
SHORT DOCUMENTATION SHORT DOCUMENTATION
=================== ===================
`upx program.exe' will compress a program or DLL. For best compression 'upx program.exe' will compress a program or DLL. For best compression
results try `upx --best program.exe'. results try 'upx --brute program.exe'.
Please see the file UPX.DOC for the full documentation. The files Please see the file UPX.DOC for the full documentation. The files
NEWS and BUGS also contain various tidbits of information. NEWS and BUGS also contain various tidbits of information.
@@ -85,7 +70,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 more than 4 years since our first public beta. actually it's almost 8 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.
@@ -123,8 +108,9 @@ THE FUTURE
COPYRIGHT COPYRIGHT
========= =========
Copyright (C) 1996-2002 Markus Franz Xaver Johannes Oberhumer Copyright (C) 1996-2006 Markus Franz Xaver Johannes Oberhumer
Copyright (C) 1996-2002 Laszlo Molnar Copyright (C) 1996-2006 Laszlo Molnar
Copyright (C) 2000-2006 John F. Reiser
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.
@@ -143,7 +129,7 @@ Markus & Laszlo
Markus F.X.J. Oberhumer Laszlo Molnar Markus F.X.J. Oberhumer Laszlo Molnar
markus@oberhumer.com ml1050@cdata.tvnet.hu markus@oberhumer.com ml1050@users.sourceforge.net
+16 -14
View File
@@ -8,24 +8,26 @@
The Ultimate Packer for eXecutables The Ultimate Packer for eXecutables
Copyright (c) 1996-2006 Markus Oberhumer, Laszlo Molnar & John Reiser
http://upx.sourceforge.net
WARNING - UNSTABLE BETA VERSION MAJOR NEWS IN UPX 2
=============================== ===================
All versions 1.9x are unstable beta releases - use them only for testing, The main news since 1.25 are:
and never distribute a program that is packed with them !
There will be hidden bugs. Really.
The current stable release is 1.24, and the next stable release * new format: added support for arm/pe (ARM executables running on WinCE)
will be called version 2.00. * new format: added support for linux elf/amd64
* new format: added support for linux elf/ppc32
* new format: added support for mach/ppc32 (Apple Mac OS X)
* new format: added support for bootable Linux kernels ("vmlinuz/386")
* new format: added support for Playstation exes ("ps1/exe")
The main news since 1.24 are: * slightly better compression using the new NRV2E algorithm
- slightly better compression using the new NRV2E algorithm * new options for compression tuning (e.g. '--brute')
- new options for compression tuining (e.g. `--brute') * improved win32/pe compatibility
- support for bootable Linux kernels ("vmlinuz/386") * direct ELF-to-memory decompression
- direct Linux ELF-to-memory decompression ("linux/elf386") * various bug fixes
- support for playstation exes ("ps1/exe")
- lots of new bugs ;-) take care
+28 -22
View File
@@ -66,13 +66,10 @@ Prerequisites
Tools needed to build/modify the UPX sources Tools needed to build/modify the UPX sources
-------------------------------------------- --------------------------------------------
- A modern C++ compiler like gcc 2.95.3 or Visual C++ 6 - A C++ compiler supporting inner classes, templates, exceptions
and RTTI.
- GNU make for Win32 - GNU make 3.80 or better
http://upx.sourceforge.net/download/tools/
- GNU make for DOS
ftp://ftp.simtel.net/pub/simtelnet/gnu/djgpp/v2gnu/
To compile the packer sources To compile the packer sources
@@ -80,35 +77,45 @@ 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-1.01 (DOS / Windows) set UCLDIR=c:\src\ucl-1.03 (DOS / Windows)
export UCLDIR=$HOME/local/src/ucl-1.01 (Unix) export UCLDIR=$HOME/local/src/ucl-1.03 (Unix)
then type then type
make target=linux # on linux make target=linux # linux
make target=djgpp2 # for djgpp2 make target=djgpp2 # dos32 - djgpp2
make target=mingw32 # for mingw32 make target=cygwin # win32 - cygwin 1.3.x
make target=cygwin # cygwin 1.3.x make target=mingw32 # win32 - mingw32
make target=no-cygwin # for mingw32 as included in cygwin make target=no-cygwin # win32 - mingw32 as included in cygwin
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 0.98.34 - the Netwide Assembler
http://upx.sourceforge.net/download/tools/
http://nasm.sourceforge.net/
- A68K - a 68000 macro assembler - A68K - a 68000 macro assembler
http://upx.sourceforge.net/download/tools/ http://upx.sourceforge.net/download/tools/
- ASM5900 - a MIPS R3000 assembler
http://upx.sourceforge.net/download/tools/
- djasm - an assembler for the djgpp stub - djasm - an assembler for the djgpp stub
http://upx.sourceforge.net/download/tools/ http://upx.sourceforge.net/download/tools/
- Perl 5.004 or better - nasm 0.98.39 - the Netwide Assembler
http://upx.sourceforge.net/download/tools/
http://sourceforge.net/projects/nasm/
- Linux (for the linux/386 stubs) - Perl & Python
- Certain versions of some i386-linux tools:
- gcc-2.95.3
- gcc-3.4.6
- binutils-2.16.1
- Other cross compilers targeted at the following architectures:
- arm-9tdmi-linux-gnu
- powerpc-750-linux-gnu
- x86_64-unknown-linux-gnu
Misc. notes Misc. notes
@@ -124,8 +131,7 @@ Misc. notes
- Use gcc extensions and other compiler specific stuff only through - Use gcc extensions and other compiler specific stuff only through
macros. macros.
- Keep in mind that it should be possible to build UPX on braindead - Keep in mind that it should be possible to build UPX on braindead
file systems (FAT). Don't use long file names or other things case insensitive file systems (FAT).
that break building under plain DOS.
*** ***
+1 -3
View File
@@ -8,7 +8,7 @@
The Ultimate Packer for eXecutables The Ultimate Packer for eXecutables
Copyright (c) 1996-2002 Markus Oberhumer & Laszlo Molnar Copyright (c) 1996-2006 Markus Oberhumer, Laszlo Molnar & John Reiser
http://upx.sourceforge.net http://upx.sourceforge.net
@@ -39,8 +39,6 @@ Ice
for debugging the PE headersize problem down for debugging the PE headersize problem down
Joergen Ibsen <jibz@hotmail.com> and d'b Joergen Ibsen <jibz@hotmail.com> and d'b
for the relocation & address optimization ideas for the relocation & address optimization ideas
John F. Reiser <jreiser@BitWagon.com>
for the new Linux executable formats
John S. Fine <johnfine@erols.com> John S. Fine <johnfine@erols.com>
for the new version of the dos/exe decompressor for the new version of the dos/exe decompressor
Lukundoo <Lukundoo@softhome.net> Lukundoo <Lukundoo@softhome.net>
+15 -3
View File
@@ -1,4 +1,14 @@
UPX TODO list. Last updated 2002-11-11. UPX TODO list. Last updated 2006-03-11.
IMPORTANT PROBLEMS THAT SHOULD BE FIXED SOON:
- [None]
OTHER:
- docs: convert docs from upx.pod to use AsciiDoc
- check all <const_cast> to make sure they are not invalid - check all <const_cast> to make sure they are not invalid
@@ -6,6 +16,8 @@ UPX TODO list. Last updated 2002-11-11.
(info: bla bla). Also ui.cpp (total_*). (info: bla bla). Also ui.cpp (total_*).
-----------------------------------------------------------------------
IMPROVED COMPRESSION RATIO IMPROVED COMPRESSION RATIO
========================== ==========================
@@ -65,6 +77,8 @@ FORMAT TMT/ADAM
FORMAT WATCOM/LE FORMAT WATCOM/LE
================ ================
- handle files without relocations
- the decompressors are already aligned, no need for an - the decompressors are already aligned, no need for an
extra alignment extra alignment
@@ -94,8 +108,6 @@ FORMAT WIN32/PE
2 - easy - mfx + ml) new switch(es) : do not compress resource types x,y,z 2 - easy - mfx + ml) new switch(es) : do not compress resource types x,y,z
or resource names a,b,c or resource names a,b,c
3 - medium - ml) rebuild exports
3 - difficult) don't compress the BSS section and other holes. 3 - difficult) don't compress the BSS section and other holes.
4 - medium - ml) fix when objectalign < 0x1000 4 - medium - ml) fix when objectalign < 0x1000
+6
View File
@@ -0,0 +1,6 @@
upx.1
upx.doc
upx.html
upx.man
upx.ps
upx.tex
+4 -4
View File
@@ -1,9 +1,11 @@
MAKEFLAGS += -rR
.SUFFIXES:
SHELL = /bin/sh SHELL = /bin/sh
top_srcdir = .. top_srcdir = ..
PACKAGE = upx PACKAGE = upx
VERSION_DATE = 11 Nov 2002 VERSION_DATE := $(shell sed -n 's/^.*UPX_VERSION_DATE_ISO .*"\(.*\)".*/\1/p' $(top_srcdir)/src/version.h)
VERSION := $(shell sed -n 's/^.*UPX_VERSION_STRING .*"\(.*\)".*/\1/p' $(top_srcdir)/src/version.h) VERSION := $(shell sed -n 's/^.*UPX_VERSION_STRING .*"\(.*\)".*/\1/p' $(top_srcdir)/src/version.h)
TRIMSPACE = cat TRIMSPACE = cat
@@ -62,7 +64,5 @@ maintainer-clean: distclean
### dependencies ### dependencies
### ###
$(BUILT_SOURCES): $(top_srcdir)/src/version.h Makefile $(BUILT_SOURCES): $(top_srcdir)/src/version.h $(MAKEFILE_LIST)
.NOEXPORT:
+1 -1
View File
@@ -11,7 +11,7 @@ loads of cryptic comments like `__PERELOC2__'.
If you look at the C++ source files, however you can notice that these If you look at the C++ source files, however you can notice that these
comment strings (without the leading and trailing underscores) are used comment strings (without the leading and trailing underscores) are used
in the following way (they are all 8 character length strings): in the following way:
addLoader("PEMAIN20", addLoader("PEMAIN20",
ih.entry ? "PEDOJUMP" : "PERETURN", ih.entry ? "PEDOJUMP" : "PERETURN",
+43
View File
@@ -0,0 +1,43 @@
UPX and SELinux
March 6, 2006
When a program that has been compressed by UPX is run, the decompressor
must create and write new memory pages of executable instructions.
SELinux (Security Enhanced Linux) directly controls the conditions
under which generating and/or executing new instructions is allowed,
so the configuration settings of SELinux affect the running of programs
that have been compressed by UPX.
In SELinux "strict enforcing" mode (the most restrictive), generating
new instructions at runtime is not allowed at all: any page with
PROT_EXEC permission must be mapped from a file in a mounted filesystem
that has 'x' [eXecute] permission, and the generation of such files is
also tightly controlled. A program that was compressed by UPX will not
run in SELinux strict enforcing mode. Attempts will fail with exit
code 127, and a record will be added to the history file
/var/log/audit/audit.log.
In "targeted enforcing" mode, SELinux pays close attention mostly to
designated processes that run with elevated privileges: web server,
print server, login server, etc. Ordinary user excutables receive
much less scrutiny. However, one of the eventual goals of SELinux is to
eradicate runtime generation of instructions because of the possibility
for exploitation by malware (virus, trojan, key logger, privilege
elevation exploit, etc.) Thus targeted enforcing mode notices and
logs the use of "execmem" capability that is used by a program which
was compressed by UPX. In keeping with the goal of eventual prohibition,
SELinux ordinarily would deny execmem. However, most current SELinux
systems, including Fedora Core 5 [set for release March 15, 2006],
override this with "allow_exemem=1" in /etc/selinux/targeted/booleans.
Thus a program compressed by UPX will run in the default installed
configuration (targeted enforcing, allow_execmem=1) of SELinux under
Fedora Core 5. Each invocation will add a few lines to the log file
/var/log/audit/audit.log, one line for each use of execmem. If the
SELinux policy becomes more restrictive in the future, then a special
SELinux class or other mechanism must be created for compressed programs,
or else UPX-compressed executables will not run then.
In its "permissive" modes, SELinux just logs the potential problems,
but otherwise does not interfere. A program compressed by UPX will run
in any permissive mode.
+78 -42
View File
@@ -13,14 +13,15 @@ B<upx> S<[ I<command> ]> S<[ I<options> ]> I<filename>...
=head1 ABSTRACT =head1 ABSTRACT
The Ultimate Packer for eXecutables The Ultimate Packer for eXecutables
Copyright (c) 1996-2002 Markus Oberhumer & Laszlo Molnar Copyright (c) 1996-2006 Markus Oberhumer, Laszlo Molnar & John Reiser
http://upx.sourceforge.net http://upx.sourceforge.net
B<UPX> is a portable, extendable, high-performance executable packer for B<UPX> is a portable, extendable, high-performance executable packer for
several different executable formats. It achieves an excellent compression several different executable formats. It achieves an excellent compression
ratio and offers I<*very*> fast decompression. Your executables suffer ratio and offers I<*very*> fast decompression. Your executables suffer
no memory overhead or other drawbacks for most of the formats supported. no memory overhead or other drawbacks for most of the formats supported,
because of in-place decompression.
While you may use B<UPX> freely for both non-commercial and commercial While you may use B<UPX> freely for both non-commercial and commercial
executables (for details see the file LICENSE), we would highly executables (for details see the file LICENSE), we would highly
@@ -36,11 +37,6 @@ is considered not politically correct ;-) ]
B<UPX> comes with ABSOLUTELY NO WARRANTY; for details see the file LICENSE. B<UPX> comes with ABSOLUTELY NO WARRANTY; for details see the file LICENSE.
Having said that, we think that B<UPX> is quite stable now. Indeed we
have compressed lots of files without any problems. Also, the
current version has undergone several months of beta testing -
actually it's more than 4 years since our first public beta back in 1998.
This is the first production quality release, and we plan that future 1.xx This is the first production quality release, and we plan that future 1.xx
releases will be backward compatible with this version. releases will be backward compatible with this version.
@@ -55,7 +51,8 @@ B<UPX> is a versatile executable packer with the following features:
- excellent compression ratio: compresses better than zip/gzip, - excellent compression ratio: compresses better than zip/gzip,
use UPX to decrease the size of your distribution ! use UPX to decrease the size of your distribution !
- very fast decompression: about 10 MB/sec even on my old Pentium 133 - very fast decompression: about 10 MB/sec on an ancient Pentium 133,
about 200 MB/sec on an Athlon XP 2000+.
- no memory overhead for your compressed executables for most of the - no memory overhead for your compressed executables for most of the
supported formats supported formats
@@ -78,8 +75,13 @@ B<UPX> is a versatile executable packer with the following features:
* rtm32/pe * rtm32/pe
* tmt/adam * tmt/adam
* vmlinuz/386 [bootable Linux kernel] * vmlinuz/386 [bootable Linux kernel]
* vmlinux/386
* watcom/le (supporting DOS4G, PMODE/W, DOS32a and CauseWay) * watcom/le (supporting DOS4G, PMODE/W, DOS32a and CauseWay)
* win32/pe * win32/pe (exe and dll)
* arm/pe (exe and dll)
* linux/elfamd64
* linux/elfppc32
* mach/elfppc32
- portable: UPX is written in portable endian-neutral C++ - portable: UPX is written in portable endian-neutral C++
@@ -166,16 +168,19 @@ Compression level B<--best> may take a long time.
=back =back
Note that compression level B<-9> can be somewhat slow for large Note that compression level B<--best> can be somewhat slow for large
files, but you definitely should use it when releasing a final version files, but you definitely should use it when releasing a final version
of your program. of your program.
Since UPX 0.70 there is also an extra compression level B<--best> which Quick start for achieving the best compression ratio:
squeezes out even some more compression ratio. While it is usually fine
to use this option with your favorite .com file it may take a long time
to compress a multi-megabyte program. You have been warned.
Tips for achieving the best compression ratio: =over 4
Try B<upx --brute myfile.exe>.
=back
Details for achieving the best compression ratio:
=over 4 =over 4
@@ -187,8 +192,18 @@ Use the compression level B<--best>.
Try one or both of the options B<--all-methods> and B<--all-filters>. Try one or both of the options B<--all-methods> and B<--all-filters>.
Info: the option B<--brute> is an abbrevation for all the options =item *
B<S<--best> S<--all-methods> S<--all-filters>>.
Try the option B<--crp-ms=NUMBER>. This uses more memory during compression
to achieve a (slightly) better compression ratio.
NUMBER must be a decimal value from 10000 to 999999, inclusive.
The default value is 10000 (ten thousand).
=item *
Info: the option B<--brute> is an abbrevation for the options
B<S<--best> S<--all-methods> S<--all-filters> S<--crp-ms=999999>>.
=item * =item *
@@ -204,12 +219,15 @@ For win32/pe programs there's B<--strip-relocs=0>. See notes below.
=head1 OVERLAY HANDLING OPTIONS =head1 OVERLAY HANDLING OPTIONS
Info: An "overlay" means auxillary data atached after the logical end of
an executable, and it often contains application specific data
(this is a common practice to avoid an extra data file, though
it would be better to use resource sections).
B<UPX> handles overlays like many other executable packers do: it simply B<UPX> handles overlays like many other executable packers do: it simply
copies the overlay after the compressed image. This works with some copies the overlay after the compressed image. This works with some
files, but doesn't work with others. files, but doesn't work with others, depending on how an application
actually accesses this overlayed data.
Since version 0.90 UPX defaults to B<--overlay=copy> for
all executable formats.
--overlay=copy Copy any extra data attached to the file. [DEFAULT] --overlay=copy Copy any extra data attached to the file. [DEFAULT]
@@ -238,7 +256,8 @@ environment variable because of a COMMAND.COM limitation.
Not all of the options are valid in the environment variable - Not all of the options are valid in the environment variable -
B<UPX> will tell you. B<UPX> will tell you.
You can use the B<--no-env> option to turn this support off. You can explicitly use the B<--no-env> option to ignore the
environment variable.
@@ -250,6 +269,7 @@ This is the executable format used by the Atari ST/TT, a Motorola 68000
based personal computer which was popular in the late '80s. Support based personal computer which was popular in the late '80s. Support
of this format is only because of nostalgic feelings of one of of this format is only because of nostalgic feelings of one of
the authors and serves no practical purpose :-). the authors and serves no practical purpose :-).
See http://www.freemint.de for more info.
Packed programs will be byte-identical to the original after uncompression. Packed programs will be byte-identical to the original after uncompression.
All debug information will be stripped, though. All debug information will be stripped, though.
@@ -354,7 +374,7 @@ will fix the 4 KByte aligment of the stub.
B<UPX> includes the full functionality of stubify. This means it will B<UPX> includes the full functionality of stubify. This means it will
automatically stubify your COFF files. Use the option B<--coff> to automatically stubify your COFF files. Use the option B<--coff> to
disable this behaviour (see below). disable this functionality (see below).
B<UPX> automatically handles Allegro packfiles. B<UPX> automatically handles Allegro packfiles.
@@ -677,15 +697,18 @@ Extra options available for this executable format:
This is the executable format used by the Sony PlayStation (PSone), This is the executable format used by the Sony PlayStation (PSone),
a Mips R3000 based gaming console which is popular since the late '90s. a Mips R3000 based gaming console which is popular since the late '90s.
Support of this format is very similar to the Atari one, because of Support of this format is very similar to the Atari one, because of
nostalgic feelings of one of the authors, but this format maybe serves nostalgic feelings of one of the authors.
a practical purpose ;-).
Packed programs will be byte-identical to the original after uncompression. Packed programs will be byte-identical to the original after uncompression,
until further notice.
Maximum uncompressed size: ~1998848 bytes. Maximum uncompressed size: ~1998848 bytes.
Notes: Notes:
- UPX creates as default a 'CD-Rom only' PS1/PS2 compatible executable.
For transfer between client/target use options below.
- Normally the packed files use the same memory areas like the uncompressed - Normally the packed files use the same memory areas like the uncompressed
versions, so they will not override other memory areas while unpacking. versions, so they will not override other memory areas while unpacking.
If this isn't possible UPX will abort showing a 'packed data overlap' If this isn't possible UPX will abort showing a 'packed data overlap'
@@ -700,14 +723,19 @@ Extra options available for this executable format:
the compression ratio in some cases, but usually the compression ratio in some cases, but usually
the default method gives the best results anyway. the default method gives the best results anyway.
--boot-only The format will only run from a CD and may slightly
improves the compression ratio. The decompression
routines are faster than default ones.
But it cannot be used for host/client transfer !
--no-align This option disables CD mode 2 data sector format --no-align This option disables CD mode 2 data sector format
alignment. This will slightly increase the compression alignment. May slightly improves the compression ratio,
ratio, but the compressed executable will not work but the compressed executable will not boot from a CD.
when started from a CD. Use it for client/target transfer only !
=head2 NOTES FOR RTM32/PE =head2 NOTES FOR RTM32/PE and ARM/PE
Same as win32/pe. Same as win32/pe.
@@ -758,8 +786,8 @@ Benefits:
641073 bzImage [original] 641073 bzImage [original]
560755 bzImage.upx [compressed by "upx -9"] 560755 bzImage.upx [compressed by "upx -9"]
- Much faster decompression at kernel boot time (but decompression - Much faster decompression at kernel boot time (but kernel
speed is not really an issue these days). decompression speed is not really an issue these days).
Drawbacks: Drawbacks:
@@ -801,10 +829,11 @@ The PE support in B<UPX> is quite stable now, but probably there are
still some incompabilities with some files. still some incompabilities with some files.
Because of the way B<UPX> (and other packers for this format) works, you Because of the way B<UPX> (and other packers for this format) works, you
can see increased memory usage of your compressed files. If you start can see increased memory usage of your compressed files because the whole
several instances of huge compressed programs you're wasting memory program is loaded into memory at startup.
because the common segements of the program won't get shared If you start several instances of huge compressed programs you're
across the instances. wasting memory because the common segements of the program won't
get shared across the instances.
On the other hand if you're compressing only smaller programs, or On the other hand if you're compressing only smaller programs, or
running only one instance of larger programs, then this penalty is running only one instance of larger programs, then this penalty is
smaller, but it's still there. smaller, but it's still there.
@@ -812,12 +841,19 @@ smaller, but it's still there.
If you're running executables from network, then compressed programs If you're running executables from network, then compressed programs
will load faster, and require less bandwidth during execution. will load faster, and require less bandwidth during execution.
DLLs are supported. DLLs are supported. But UPX compressed DLLs can not share common data and
code when they got used by multiple applications. So compressing msvcrt.dll
is a waste of memory, but compressing the dll plugins of a particular
application may be a better idea.
Screensavers are supported, with the restriction that the filename Screensavers are supported, with the restriction that the filename
must end with ".scr" (as screensavers are handled slightly different must end with ".scr" (as screensavers are handled slightly different
than normal exe files). than normal exe files).
UPX compressed PE files has some minor memory overhead (usually in the
10 - 30 kbytes range) which can be seen by specifying the "-i" command
line switch during compression.
Extra options available for this executable format: Extra options available for this executable format:
--compress-exports=0 Don't compress the export section. --compress-exports=0 Don't compress the export section.
@@ -847,7 +883,7 @@ Extra options available for this executable format:
address greater or equal to 0x400000. Usually the address greater or equal to 0x400000. Usually the
compressed files becomes smaller, but some files compressed files becomes smaller, but some files
may become larger. Note that the resulting file will may become larger. Note that the resulting file will
not work under Win32s. not work under Windows 3.x (Win32s).
UPX never strips relocations from a DLL UPX never strips relocations from a DLL
regardless of this option. regardless of this option.
@@ -893,13 +929,13 @@ Please report all bugs immediately to the authors.
=head1 COPYRIGHT =head1 COPYRIGHT
Copyright (C) 1996-2002 Markus Franz Xaver Johannes Oberhumer Copyright (C) 1996-2006 Markus Franz Xaver Johannes Oberhumer
Copyright (C) 1996-2002 Laszlo Molnar Copyright (C) 1996-2006 Laszlo Molnar
Copyright (C) 2000-2002 John F. Reiser Copyright (C) 2000-2006 John F. Reiser
Copyright (C) 2002 Jens Medoch Copyright (C) 2002-2006 Jens Medoch
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.
View File
-101
View File
@@ -1,101 +0,0 @@
The GNU bfd binary file descriptor package, part of the GNU binutils package,
contains code to recognize an Elf file by looking at fields in the file header.
Many programs (such as gdb, size, objdump, objcopy, strip and others) use bfd.
Unfortunately, bfd has been overly strict. In releases
binutils-2.9.1.0.4, binutils-2.9.1.0.23, binutils-2.9.5.0.0,
binutils-2.10.1,
gdb-4.17, gdb-5.0,
and probably others,
bfd does not recognize a file with zero in Elf32_Ehdr.e_shoff, .e_shentsize,
or .e_shnum, even though the operating system kernel does not care, and many
bfd clients would work just fine in these cases.
Because of its desire to create small size compressed executables, UPX
generates and uses Elf files with zero in .e_shoff, .e_shentsizes, and .e_shnum.
As a result, many widely-distributed instances of gdb, size, objdump, etc.,
refuse to work on UPX-packed executables.
Here is a patch to bfd/elfcode.h which enables many bfd clients to work
with UPX-packed executables. The last two lines of the patch are
if (bfd_seek (abfd, hdr->sh_offset, SEEK_SET) == -1)
return -1;
--- elfcode.h.orig Mon Jun 16 11:45:32 1997
+++ elfcode.h Sat Apr 22 10:18:56 2000
@@ -1,5 +1,5 @@
/* ELF executable support for BFD.
- Copyright 1991, 92, 93, 94, 95, 96, 1997 Free Software Foundation, Inc.
+ Copyright 1991, 92, 93, 94, 95, 96, 97, 1998 Free Software Foundation, Inc.
Written by Fred Fish @ Cygnus Support, from information published
in "UNIX System V Release 4, Programmers Guide: ANSI C and
@@ -517,14 +517,14 @@
elf_debug_file (i_ehdrp);
#endif
- /* If there is no section header table, we're hosed. */
- if (i_ehdrp->e_shoff == 0)
+ /* If there is no section header table, and relocatable, then we're hosed. */
+ if (i_ehdrp->e_shoff == 0 && i_ehdrp->e_type == ET_REL)
goto got_wrong_format_error;
/* As a simple sanity check, verify that the what BFD thinks is the
size of each section header table entry actually matches the size
- recorded in the file. */
- if (i_ehdrp->e_shentsize != sizeof (x_shdr))
+ recorded in the file, but only if there are any sections. */
+ if (i_ehdrp->e_shentsize != sizeof (x_shdr) && i_ehdrp->e_shnum != 0)
goto got_wrong_format_error;
ebd = get_elf_backend_data (abfd);
@@ -579,6 +579,7 @@
/* Allocate space for a copy of the section header table in
internal form, seek to the section header table in the file,
read it in, and convert it to internal form. */
+ if (i_ehdrp->e_shnum!=0) {
i_shdrp = ((Elf_Internal_Shdr *)
bfd_alloc (abfd, sizeof (*i_shdrp) * i_ehdrp->e_shnum));
elf_elfsections (abfd) = ((Elf_Internal_Shdr **)
@@ -609,6 +610,7 @@
if (! bfd_section_from_shdr (abfd, i_ehdrp->e_shstrndx))
goto got_no_match;
}
+ }
/* Read in the program headers. */
if (i_ehdrp->e_phnum == 0)
@@ -644,6 +646,7 @@
bfd_section_from_shdr with it (since this particular strtab is
used to find all of the ELF section names.) */
+ if (i_ehdrp->e_shstrndx != 0) {
shstrtab = bfd_elf_get_str_section (abfd, i_ehdrp->e_shstrndx);
if (!shstrtab)
goto got_no_match;
@@ -657,6 +660,7 @@
if (! bfd_section_from_shdr (abfd, shindex))
goto got_no_match;
}
+ }
/* Let the backend double check the format and override global
information. */
@@ -930,7 +934,7 @@
{
Elf_Internal_Shdr *hdr;
Elf_Internal_Shdr *verhdr;
- long symcount; /* Number of external ELF symbols */
+ unsigned long symcount; /* Number of external ELF symbols */
elf_symbol_type *sym; /* Pointer to current bfd symbol */
elf_symbol_type *symbase; /* Buffer for generated bfd symbols */
Elf_Internal_Sym i_sym;
@@ -978,7 +982,7 @@
sym = symbase = NULL;
else
{
- long i;
+ unsigned long i;
if (bfd_seek (abfd, hdr->sh_offset, SEEK_SET) == -1)
return -1;
View File
+2575 -1220
View File
File diff suppressed because it is too large Load Diff
+8 -7
View File
@@ -1,19 +1,20 @@
GNUmakefile
*.0?? *.0??
*.d
*.dat *.dat
*.idb *.idb
*.img *.img
*.map *.map
*.raw *.raw
*.rc
*.rel *.rel
*.res
*.pdb *.pdb
*.out
*.upx *.upx
.gdbinit .gdbinit
.Attic GNUmakefile
.deps MMakefile
compress_nrv.* compress_nrv.*
upx upx
upx_nrv version1*.h
upx_nrv.* version2*.h
upx_ucl
upx_ucl.*
+20
View File
@@ -0,0 +1,20 @@
*.0??
*.d
*.dat
*.idb
*.img
*.map
*.raw
*.rc
*.rel
*.res
*.pdb
*.out
*.upx
.gdbinit
GNUmakefile
MMakefile
compress_nrv.*
upx
version1*.h
version2*.h
+38 -608
View File
@@ -1,625 +1,55 @@
# #
# UPX Makefile (GNU make) - works with unix/win32/djgpp2 # UPX Makefile - needs GNU make 3.80 or better
#
# usage:
# `make target=linux' # linux
# `make target=djggp2' # dos32 - djggp2 2.03
# `make target=cygwin' # win32 - cygwin 1.3.x
# `make target=mingw32' # win32 - mingw32
# `make target=no-cygwin' # win32 - mingw32 as included in cygwin 1.3.x
# `make target=bcc' # win32 - Borland C++ 5.5.1
# `make target=dmc' # win32 - Digital Mars C++ 8.30
# `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
# #
MAKEFLAGS += -rR
# configuration section
ifeq ($(strip $(UCLDIR)),)
# change this to reflect where the UCL library is
UCLDIR = $(HOME)/local/src/ucl-1.01
endif
##target =
DEBUG = 0
# -------------------------------------------------------
# You should not have to change anything below this line.
# -------------------------------------------------------
SHELL = /bin/sh
.SUFFIXES: .SUFFIXES:
.SUFFIXES: .a .c .cpp .exe .lib .o .obj .rc .res .ttp export SHELL = /bin/sh
override e = $($1) $(EXTRA_$1) $(upx_$1) $($(basename $(notdir $@)).$1)
srcdir ?= $(dir $(word $(words $(MAKEFILE_LIST)),$(MAKEFILE_LIST)))
srcdir = . ifneq ($(srcdir),./)
top_srcdir = .. srcdir := $(shell echo '$(srcdir)' | sed 's,/*$$,,')
##$(info Info: using VPATH . $(srcdir))
VPATH = $(srcdir) VPATH := . $(srcdir)
# auto-detect the target unless given on the commandline
ifeq ($(strip $(target)),)
##target = djgpp2
ifneq ($(strip $(wildcard /usr/include/linux)),)
target = linux
endif
##ifneq ($(strip $(wildcard /platform/sun4?/kernel/unix)),)
##target = sparc
##endif
endif endif
ifeq ($(strip $(target)),) ifeq ($(CXX),)
include please_specify_a_target CXX = g++
endif endif
ifeq ($(CXX),g++)
CXXFLAGS += -O2 -MMD
# util var for use in the rules - basename of the current target CXXFLAGS += -Wall -W -Wcast-align -Wcast-qual -Wpointer-arith -Wwrite-strings -Werror
override T = $(basename $@)
# /***********************************************************************
# // object files
# ************************************************************************/
# these use exceptions & RTTI
OBJECTS1 = \
compress$o except$o file$o lefile$o \
filter$o linker$o mem$o msg$o stdcxx$o work$o ui$o \
packer$o packerf$o packhead$o packmast$o \
p_com$o p_djgpp2$o p_elks$o p_exe$o \
p_lx_elf$o p_lx_exc$o p_lx_sep$o p_lx_sh$o \
p_ps1$o p_sys$o p_tmt$o p_tos$o \
p_unix$o p_vmlinz$o p_w16ne$o p_w32pe$o p_wcle$o
# no exceptions or RTTI
OBJECTS2 = \
filteri$o help$o main$o mygetopt$o snprintf$o util$o \
c_init$o c_file$o c_none$o c_screen$o \
s_object$o s_djgpp2$o s_vcsa$o s_win32$o
# pure C sources
OBJECTS3 =
OBJECTS = $(OBJECTS1) $(OBJECTS2) $(OBJECTS3)
LIBS =
RESOURCES =
# /***********************************************************************
# // compiler settings
# ************************************************************************/
###
### default compiler (gcc under unix)
###
o = .o
a = .a
e =
CC = gcc
DEFS =
INCLUDES =
##INCLUDES = -I. -I$(srcdir)
CFLAGS_OUTPUT = -o $@
LINK_EXE = $(CXXLD) $(LDFLAGS) -o $@ $^ $(LDLIBS)
STUBEDIT_EXE =
STUBIFY_EXE =
CHMOD_EXE =
# C++ defaults are set later
CXX =
CXXLD =
CXXFLAGS_OUTPUT =
###
### gcc defaults
###
##CFLAGS_WERROR = -Werror
CFLAGS_WERROR =
CFLAGS_W = $(CFLAGS_WERROR)
CFLAGS_W += -Wall -W -Wcast-align -Wcast-qual -Wmissing-prototypes -Wpointer-arith -Wshadow -Wwrite-strings
CFLAGS_M =
##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_M) $(CFLAGS_O)
CXXFLAGS = $(CFLAGS) -Wsynth -fconserve-space
CXXFLAGS1 = $(CXXFLAGS)
##CXXFLAGS1 += -fasynchronous-exceptions
CXXFLAGS2 = $(CXXFLAGS) -fno-exceptions -fno-rtti
ifeq ($(DEBUG),1)
DEFS += -DDEBUG
## DEFS += -DTESTING
endif endif
CPPFLAGS += $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES)
CXXLD ?= $(CXX)
ifeq ($(DEBUG),1) exeext ?= .out
LDFLAGS = -g libext ?= .a
else objext ?= .o
LDFLAGS = -s
# we need UCL and zlib - you can set envvar UCLDIR
ifneq ($(wildcard $(UCLDIR)/include/ucl/ucl.h),)
INCLUDES += -I$(UCLDIR)/include
LIBS += $(addprefix -L,$(dir $(wildcard $(UCLDIR)/libucl$(libext) $(UCLDIR)/src/.libs/libucl$(libext))))
endif endif
LDFLAGS += -Wl,-Map,$T.map LIBS += -lucl -lz
LDLIBS = -lz
LIBDIRS =
DOS_LDLIBS =
DOS_LIBDIRS =
upx_SOURCES := $(wildcard $(srcdir)/*.cpp)
upx_OBJECTS := $(notdir $(upx_SOURCES:.cpp=$(objext)))
### all: upx$(exeext)
### compression library
###
UCLDIR:=$(strip $(subst \,/,$(UCLDIR))) upx$(exeext): $(upx_OBJECTS) $(upx_DEPENDENCIES)
NRVDIR:=$(strip $(subst \,/,$(NRVDIR))) $($(notdir $@).PRE_LINK_STEP)
u = ucl $(strip $(CXXLD) $(call e,CPPFLAGS) $(call e,CXXFLAGS) $(call e,LDFLAGS) -o $@ $(upx_OBJECTS) $(call e,LDADD) $(call e,LIBS))
U = UCL $($(notdir $@).POST_LINK_STEP)
upx_exe_tail =
include $(srcdir)/Makefile.inc
ifneq ($(strip $(wildcard $(NRVDIR)/include/nrv)),)
u = nrv
U = NRV
upx_exe_tail = _$(u)
include $(srcdir)/Makefile.inc
endif
upx_exe = upx$(upx_exe_tail)$(e)
override tmp := -Wl,--rpath, %.o : %.cpp
LDRPATH := $(addprefix $(tmp),$(LIBDIRS)) $(strip $(CXX) $(call e,CPPFLAGS) $(call e,CXXFLAGS) -o $@ -c $<)
LIBDIRS += .
LDLIBDIRS := $(addprefix -L,$(LIBDIRS))
##LDFLAGS += $(LDRPATH) mostlyclean clean distclean maintainer-clean:
LDFLAGS += $(LDLIBDIRS) rm -f *.d *.map *.o *.obj *.res upx.exe upx.out upx.ttp upx$(exeext)
-include *.d
### .PHONY: all mostlyclean clean distclean maintainer-clean
### Linux
###
ifeq ($(target),linux)
override arch := $(shell uname -m | sed -e 's/^i[3456789]86$$/i386/')
DEFS += '-DUPX_CONFIG_H="config_h/linux.h"'
DEFS += -D_FILE_OFFSET_BITS=64
LDLIBS += -lmcheck
ifeq ($(arch),i386)
CC += -march=i386 -mcpu=i586
##CFLAGS_M += -mno-schedule-prologue
endif
##CFLAGS_WERROR = -Werror
ifeq (1,2) # checkergcc
CC = checkergcc
CXX = checkerg++
else
ifeq ($(DEBUG),1)
##CFLAGS += -O0 -gstabs+3
##CFLAGS += -O0 -gdwarf-2
CFLAGS += -O0 -g
else
##LDFLAGS += -static
STUBEDIT_EXE = objcopy -S -R .comment -R .note $@
ifeq ($(arch),i386)
STUBIFY_EXE = perl $(srcdir)/stub/scripts/brandelf.pl $@
CHMOD_EXE = chmod 755 $@
endif
endif
endif
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
ifeq ($(target),cross-mint-m68020-60)
e = .ttp
CC = m68k-atari-mint-gcc
CC += -m68020-60 -m68881
endif
###
### djgpp2
###
ifeq ($(target),djgpp2)
e = .exe
CC += -march=i386 -mcpu=i586
##CFLAGS_M += -mno-schedule-prologue
CFLAGS_WERROR = -Werror
STUBEDIT_EXE = stubedit $@ bufsize=0xfc00
ifneq ($(strip $(wildcard $(DJDIR)/bin/mfxdjstubify.ex[eE])),)
ifneq ($(strip $(wildcard $(DJDIR)/bin/cwsdstub.ex[eE])),)
STUBIFY_EXE = mfxdjstubify -v -s $(DJDIR)/bin/cwsdstub.exe $(upx_exe)
endif
endif
endif # djgpp2
###
### cygwin / mingw32
###
ifeq ($(target),cygwin)
e = .exe
CC += -march=i386 -mcpu=i586
CXXLD = g++
##CFLAGS_M += -mno-schedule-prologue
endif
ifeq ($(target),mingw32)
e = .exe
CC = gcc -mno-cygwin
CC += -march=i386 -mcpu=i586
CXXLD = g++ -mno-cygwin
##CFLAGS_M += -mno-schedule-prologue
endif
# mingw32 as included in cygwin
ifeq ($(target),no-cygwin)
e = .exe
CC = gcc -mno-cygwin
CC += -march=i386 -mcpu=i586
CXXLD = g++ -mno-cygwin
##CFLAGS_M += -mno-schedule-prologue
endif
# mingw32 cross compiler
ifeq ($(target),cross-mingw32)
e = .exe
CC = i586-mingw32msvc-gcc
CC += -march=i386 -mcpu=i586
CXXLD = i586-mingw32msvc-g++
##CFLAGS_M += -mno-schedule-prologue
endif
###
### Borland C++ 5.5.1
###
ifeq ($(target),bcc)
o = .obj
a = .lib
e = .exe
CC = bcc32 -q
CFLAGS = -w -w-aus -g1
CXXFLAGS1 = $(CFLAGS)
CXXFLAGS2 = $(CFLAGS) -x- -xd- -RT-
CFLAGS_OUTPUT = -o$@
LDFLAGS =
LDLIBS = $(DOS_LDLIBS) zlib114.lib
ifneq ($(strip $(DOS_LIBDIRS)),)
LIB := $(DOS_LIBDIRS);$(LIB)
endif
export LIB
ifeq ($(DEBUG),1)
CFLAGS += -Od -d
else
CFLAGS += -O2 -d
endif
LINK_EXE = $(CXXLD) $(LDFLAGS) -e$@ $^ $(LDLIBS)
endif # bcc
###
### Digital Mars C++ 8.30
###
ifeq ($(target),dmc)
o = .obj
a = .lib
e = .exe
CC = dmc -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) zlib114.lib 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 - somewhat obsolete, use valgrind
# ************************************************************************/
ifeq (1,2)
# compile in extra valgrind support
CFLAGS += -DWITH_VALGRIND
endif
ifeq (1,2)
LDLIBS += -lefence
endif
ifeq (1,2)
CFLAGS += -DWITH_DMALLOC
LDLIBS += -ldmalloc
endif
ifeq (1,2)
CFLAGS += -DWITH_GC -DLINUX_THREADS -D_REENTRANT
LDLIBS += -lgc -lpthread
# only needed when using -static:
##LDFLAGS += -Wl,-defsym,_DYNAMIC=0
endif
# /***********************************************************************
# // 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_W += $(EXTRA_CFLAGS_W)
CFLAGS_M += $(EXTRA_CFLAGS_M)
CFLAGS_O += $(EXTRA_CFLAGS_O)
CXXFLAGS1 += $(EXTRA_CXXFLAGS1)
CXXFLAGS2 += $(EXTRA_CXXFLAGS2)
LDFLAGS += $(EXTRA_LDFLAGS)
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
# ************************************************************************/
all: $(upx_exe)
.PHONY: all mostlyclean clean distclean maintainer-clean untabify tags
$(upx_exe): $(OBJECTS) $(LIBS) $(RESOURCES)
$(LINK_EXE)
$(STUBEDIT_EXE)
$(STUBIFY_EXE)
$(CHMOD_EXE)
mostlyclean:
-rm -f *.d *.err *.i *.log *.map *~ gdb-trans*
clean: mostlyclean
-rm -f *.a *.lib *.o *.obj *.res *.tds tags TAGS ID
-rm -f *.idb *.pdb
-rm -f $(upx_exe) upx upx.exe upx.ttp upx_nrv upx_nrv.exe upx_nrv.ttp upx_ucl upx_ucl.exe upx_ucl.ttp
-rm -rf .deps
distclean: clean
maintainer-clean: distclean
untabify:
mfxtu -d4 -t *.h *.cpp *.ch
mfxtu -d8 -t stub/[ln]*.asm stub/*.ash stub/*.[cs]
tags TAGS:
ctags *.h *.cpp *.ch
ID:
mkid *.h *.cpp *.ch
# /***********************************************************************
# // rules
# ************************************************************************/
%$o : %.c
$(CC) $(DEFS) $(INCLUDES) $(CFLAGS) $(CFLAGS_OUTPUT) -c $<
%$o : %.cpp
$(CXX) $(DEFS) $(INCLUDES) $(CXXFLAGS1) $(CXXFLAGS_OUTPUT) -c $<
ifneq ($(strip $(OBJECTS2)),)
$(OBJECTS2): %$o : %.cpp
$(CXX) $(DEFS) $(INCLUDES) $(CXXFLAGS2) $(CXXFLAGS_OUTPUT) -c $<
endif
%.res : %.rc
rc -l 0x409 -fo$@ $<
# /***********************************************************************
# // dependencies
# ************************************************************************/
include $(srcdir)/Makefile.dep
# vi:nowrap
-16
View File
@@ -1,16 +0,0 @@
# /***********************************************************************
# // 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
-39
View File
@@ -1,39 +0,0 @@
UDIR := $($(U)DIR)
ifneq ($(strip $(wildcard $(UDIR)/include)),) # { include
DEFS += -DWITH_$(U)
INCLUDES += -I$(UDIR)/include
ifneq ($(strip $(wildcard $(UDIR)/build/$(target)/src/.libs)),)
LIBDIRS += $(UDIR)/build/$(target)/src/.libs
endif
ifneq ($(strip $(wildcard $(UDIR)/src/.libs)),)
LIBDIRS += $(UDIR)/src/.libs
endif
ifeq ($(DEBUG),1)
ifneq ($(strip $(wildcard $(UDIR)/build/debug/src/.libs)),)
LIBDIRS += $(UDIR)/build/debug/src/.libs
endif
endif
ifneq ($(strip $(wildcard $(UDIR)/build/release/src/.libs)),)
LIBDIRS += $(UDIR)/build/release/src/.libs
endif
ifneq ($(strip $(wildcard $(UDIR)/build/src/.libs)),)
LIBDIRS += $(UDIR)/build/src/.libs
endif
ifneq ($(strip $(wildcard $(UDIR))),)
LIBDIRS += $(UDIR)
DOS_LIBDIRS := $(DOS_LIBDIRS);$(UDIR)
endif
LDLIBS += -l$(u)
DOS_LDLIBS += $(u).lib
DEFS := $(DEFS)
INCLUDES := $(INCLUDES)
LIBDIRS := $(LIBDIRS)
LDLIBS := $(LDLIBS)
DOS_LDLIBS := $(DOS_LDLIBS)
endif # } include
+303 -191
View File
@@ -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-2002 Markus Franz Xaver Johannes Oberhumer Copyright (C) 1996-2005 Markus Franz Xaver Johannes Oberhumer
Copyright (C) 1996-2002 Laszlo Molnar Copyright (C) 1996-2005 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
@@ -34,132 +34,147 @@
// core // core
**************************************************************************/ **************************************************************************/
inline unsigned get_be16(const void *bb) inline unsigned get_be16(const void *p)
{ {
const upx_bytep b = (const upx_bytep) bb; #if defined(ACC_UA_GET_BE16)
unsigned v; return ACC_UA_GET_BE16(p);
v = (unsigned) b[1] << 0;
v |= (unsigned) b[0] << 8;
return v;
}
inline void set_be16(void *bb, unsigned v)
{
upx_bytep b = (upx_bytep) bb;
b[1] = (unsigned char) (v >> 0);
b[0] = (unsigned char) (v >> 8);
}
inline unsigned get_be24(const void *bb)
{
const upx_bytep b = (const upx_bytep) bb;
unsigned v;
v = (unsigned) b[2] << 0;
v |= (unsigned) b[1] << 8;
v |= (unsigned) b[0] << 16;
return v;
}
inline void set_be24(void *bb, unsigned v)
{
upx_bytep b = (upx_bytep) bb;
b[2] = (unsigned char) (v >> 0);
b[1] = (unsigned char) (v >> 8);
b[0] = (unsigned char) (v >> 16);
}
inline unsigned get_be32(const void *bb)
{
const upx_bytep b = (const upx_bytep) bb;
unsigned v;
v = (unsigned) b[3] << 0;
v |= (unsigned) b[2] << 8;
v |= (unsigned) b[1] << 16;
v |= (unsigned) b[0] << 24;
return v;
}
inline void set_be32(void *bb, unsigned v)
{
upx_bytep b = (upx_bytep) bb;
b[3] = (unsigned char) (v >> 0);
b[2] = (unsigned char) (v >> 8);
b[1] = (unsigned char) (v >> 16);
b[0] = (unsigned char) (v >> 24);
}
inline unsigned get_le16(const void *bb)
{
#if defined(__i386__)
return * (const unsigned short *) bb;
#else #else
const upx_bytep b = (const upx_bytep) bb; return acc_ua_get_be16(p);
unsigned v;
v = (unsigned) b[0] << 0;
v |= (unsigned) b[1] << 8;
return v;
#endif #endif
} }
inline void set_le16(void *bb, unsigned v) inline void set_be16(void *p, unsigned v)
{ {
#if defined(__i386__) #if defined(ACC_UA_SET_BE16)
(* (unsigned short *) bb) = (unsigned short) (v & 0xffff); ACC_UA_SET_BE16(p, v);
#else #else
upx_bytep b = (upx_bytep) bb; acc_ua_set_be16(p, v);
b[0] = (unsigned char) (v >> 0);
b[1] = (unsigned char) (v >> 8);
#endif #endif
} }
inline unsigned get_be24(const void *p)
inline unsigned get_le24(const void *bb)
{ {
const upx_bytep b = (const upx_bytep) bb; #if defined(ACC_UA_GET_BE24)
unsigned v; return ACC_UA_GET_BE24(p);
v = (unsigned) b[0] << 0;
v |= (unsigned) b[1] << 8;
v |= (unsigned) b[2] << 16;
return v;
}
inline void set_le24(void *bb, unsigned v)
{
upx_bytep b = (upx_bytep) bb;
b[0] = (unsigned char) (v >> 0);
b[1] = (unsigned char) (v >> 8);
b[2] = (unsigned char) (v >> 16);
}
inline unsigned get_le32(const void *bb)
{
#if defined(__i386__)
return * (const unsigned *) bb;
#else #else
const upx_bytep b = (const upx_bytep) bb; return acc_ua_get_be24(p);
unsigned v;
v = (unsigned) b[0] << 0;
v |= (unsigned) b[1] << 8;
v |= (unsigned) b[2] << 16;
v |= (unsigned) b[3] << 24;
return v;
#endif #endif
} }
inline void set_le32(void *bb, unsigned v) inline void set_be24(void *p, unsigned v)
{ {
#if defined(__i386__) #if defined(ACC_UA_SET_BE24)
(* (unsigned *) bb) = v; ACC_UA_SET_BE24(p, v);
#else #else
upx_bytep b = (upx_bytep) bb; acc_ua_set_be24(p, v);
b[0] = (unsigned char) (v >> 0); #endif
b[1] = (unsigned char) (v >> 8); }
b[2] = (unsigned char) (v >> 16);
b[3] = (unsigned char) (v >> 24); inline unsigned get_be32(const void *p)
{
#if defined(ACC_UA_GET_BE32)
return ACC_UA_GET_BE32(p);
#else
return acc_ua_get_be32(p);
#endif
}
inline void set_be32(void *p, unsigned v)
{
#if defined(ACC_UA_SET_BE32)
ACC_UA_SET_BE32(p, v);
#else
acc_ua_set_be32(p, v);
#endif
}
inline acc_uint64l_t get_be64(const void *p)
{
#if defined(ACC_UA_GET_BE64)
return ACC_UA_GET_BE64(p);
#else
return acc_ua_get_be64(p);
#endif
}
inline void set_be64(void *p, acc_uint64l_t v)
{
#if defined(ACC_UA_SET_BE64)
ACC_UA_SET_BE64(p, v);
#else
acc_ua_set_be64(p, v);
#endif
}
inline unsigned get_le16(const void *p)
{
#if defined(ACC_UA_GET_LE16)
return ACC_UA_GET_LE16(p);
#else
return acc_ua_get_le16(p);
#endif
}
inline void set_le16(void *p, unsigned v)
{
#if defined(ACC_UA_SET_LE16)
ACC_UA_SET_LE16(p, v);
#else
acc_ua_set_le16(p, v);
#endif
}
inline unsigned get_le24(const void *p)
{
#if defined(ACC_UA_GET_LE24)
return ACC_UA_GET_LE24(p);
#else
return acc_ua_get_le24(p);
#endif
}
inline void set_le24(void *p, unsigned v)
{
#if defined(ACC_UA_SET_LE24)
ACC_UA_SET_LE24(p, v);
#else
acc_ua_set_le24(p, v);
#endif
}
inline unsigned get_le32(const void *p)
{
#if defined(ACC_UA_GET_LE32)
return ACC_UA_GET_LE32(p);
#else
return acc_ua_get_le32(p);
#endif
}
inline void set_le32(void *p, unsigned v)
{
#if defined(ACC_UA_SET_LE32)
ACC_UA_SET_LE32(p, v);
#else
acc_ua_set_le32(p, v);
#endif
}
inline acc_uint64l_t get_le64(const void *p)
{
#if defined(ACC_UA_GET_LE64)
return ACC_UA_GET_LE64(p);
#else
return acc_ua_get_le64(p);
#endif
}
inline void set_le64(void *p, acc_uint64l_t v)
{
#if defined(ACC_UA_SET_LE64)
ACC_UA_SET_LE64(p, v);
#else
acc_ua_set_le64(p, v);
#endif #endif
} }
@@ -170,120 +185,191 @@ inline void set_le32(void *bb, unsigned v)
inline int sign_extend(int v, int bits) inline int sign_extend(int v, int bits)
{ {
const int sign_bit = 1 << (bits - 1); const unsigned sign_bit = 1u << (bits - 1);
v |= -(v & sign_bit); v |= 0u - (v & sign_bit);
return v; return v;
} }
inline int get_be16_signed(const void *bb) inline acc_int64l_t sign_extend(acc_int64l_t v, int bits)
{ {
int v = get_be16(bb); const acc_uint64l_t sign_bit = ACC_UINT64_C(1) << (bits - 1);
v |= ACC_UINT64_C(0) - (v & sign_bit);
return v;
}
inline int get_be16_signed(const void *p)
{
int v = get_be16(p);
return sign_extend(v, 16); return sign_extend(v, 16);
} }
inline int get_be24_signed(const void *bb) inline int get_be24_signed(const void *p)
{ {
int v = get_be24(bb); int v = get_be24(p);
return sign_extend(v, 24); return sign_extend(v, 24);
} }
inline int get_be32_signed(const void *bb) inline int get_be32_signed(const void *p)
{ {
int v = get_be32(bb); int v = get_be32(p);
return sign_extend(v, 32); return sign_extend(v, 32);
} }
inline int get_le16_signed(const void *bb) inline acc_int64l_t get_be64_signed(const void *p)
{ {
int v = get_le16(bb); acc_int64l_t v = get_be64(p);
return sign_extend(v, 64);
}
inline int get_le16_signed(const void *p)
{
int v = get_le16(p);
return sign_extend(v, 16); return sign_extend(v, 16);
} }
inline int get_le24_signed(const void *bb) inline int get_le24_signed(const void *p)
{ {
int v = get_le24(bb); int v = get_le24(p);
return sign_extend(v, 24); return sign_extend(v, 24);
} }
inline int get_le32_signed(const void *bb) inline int get_le32_signed(const void *p)
{ {
int v = get_le32(bb); int v = get_le32(p);
return sign_extend(v, 32); return sign_extend(v, 32);
} }
inline int get_le64_signed(const void *p)
{
acc_int64l_t v = get_le64(p);
return sign_extend(v, 64);
}
/************************************************************************* /*************************************************************************
// classes for portable unaligned access // classes for portable unaligned access
//
// Important: these classes must be PODs (Plain Old Data), i.e. no
// constructor, no destructor, no virtual functions and no default
// assignment operator, and all fields must be public(!).
**************************************************************************/ **************************************************************************/
class BE16 struct BE16
{ {
unsigned char d[2]; unsigned char d[2];
public:
BE16& operator = (const BE16 &v) { memcpy(d, v.d, sizeof(d)); return *this; }
BE16& operator = (unsigned v) { set_be16(d, v); return *this; } BE16& operator = (unsigned v) { set_be16(d, v); return *this; }
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; }
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; }
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; }
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; }
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; }
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; }
BE16& operator >>= (unsigned v) { set_be16(d, get_be16(d) >> v); return *this; }
operator const unsigned () const { return get_be16(d); } operator unsigned () const { return get_be16(d); }
} }
__attribute_packed; __attribute_packed;
class BE32 struct BE32
{ {
unsigned char d[4]; unsigned char d[4];
public:
BE32& operator = (const BE32 &v) { memcpy(d, v.d, sizeof(d)); return *this; }
BE32& operator = (unsigned v) { set_be32(d, v); return *this; } BE32& operator = (unsigned v) { set_be32(d, v); return *this; }
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; }
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; }
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; }
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; }
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; }
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; }
BE32& operator >>= (unsigned v) { set_be32(d, get_be32(d) >> v); return *this; }
operator const unsigned () const { return get_be32(d); } operator unsigned () const { return get_be32(d); }
} }
__attribute_packed; __attribute_packed;
class LE16 struct BE64
{
unsigned char d[8];
BE64& operator = (acc_uint64l_t v) { set_be64(d, v); return *this; }
BE64& operator += (acc_uint64l_t v) { set_be64(d, get_be64(d) + v); return *this; }
BE64& operator -= (acc_uint64l_t v) { set_be64(d, get_be64(d) - v); return *this; }
BE64& operator *= (acc_uint64l_t v) { set_be64(d, get_be64(d) * v); return *this; }
BE64& operator /= (acc_uint64l_t v) { set_be64(d, get_be64(d) / v); return *this; }
BE64& operator &= (acc_uint64l_t v) { set_be64(d, get_be64(d) & v); return *this; }
BE64& operator |= (acc_uint64l_t v) { set_be64(d, get_be64(d) | v); return *this; }
BE64& operator ^= (acc_uint64l_t v) { set_be64(d, get_be64(d) ^ v); return *this; }
BE64& operator <<= (unsigned v) { set_be64(d, get_be64(d) << v); return *this; }
BE64& operator >>= (unsigned v) { set_be64(d, get_be64(d) >> v); return *this; }
operator acc_uint64l_t () const { return get_be64(d); }
}
__attribute_packed;
struct LE16
{ {
unsigned char d[2]; unsigned char d[2];
public:
LE16& operator = (const LE16 &v) { memcpy(d, v.d, sizeof(d)); return *this; }
LE16& operator = (unsigned v) { set_le16(d, v); return *this; } LE16& operator = (unsigned v) { set_le16(d, v); return *this; }
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; }
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; }
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; }
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; }
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; }
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; }
LE16& operator >>= (unsigned v) { set_le16(d, get_le16(d) >> v); return *this; }
operator const unsigned () const { return get_le16(d); } operator unsigned () const { return get_le16(d); }
} }
__attribute_packed; __attribute_packed;
class LE32 struct LE32
{ {
unsigned char d[4]; unsigned char d[4];
public:
LE32& operator = (const LE32 &v) { memcpy(d, v.d, sizeof(d)); return *this; }
LE32& operator = (unsigned v) { set_le32(d, v); return *this; } LE32& operator = (unsigned v) { set_le32(d, v); return *this; }
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; }
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; }
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; }
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; }
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; }
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; }
LE32& operator >>= (unsigned v) { set_le32(d, get_le32(d) >> v); return *this; }
operator const unsigned () const { return get_le32(d); } operator unsigned () const { return get_le32(d); }
}
__attribute_packed;
struct LE64
{
unsigned char d[8];
LE64& operator = (acc_uint64l_t v) { set_le64(d, v); return *this; }
LE64& operator += (acc_uint64l_t v) { set_le64(d, get_le64(d) + v); return *this; }
LE64& operator -= (acc_uint64l_t v) { set_le64(d, get_le64(d) - v); return *this; }
LE64& operator *= (acc_uint64l_t v) { set_le64(d, get_le64(d) * v); return *this; }
LE64& operator /= (acc_uint64l_t v) { set_le64(d, get_le64(d) / v); return *this; }
LE64& operator &= (acc_uint64l_t v) { set_le64(d, get_le64(d) & v); return *this; }
LE64& operator |= (acc_uint64l_t v) { set_le64(d, get_le64(d) | v); return *this; }
LE64& operator ^= (acc_uint64l_t v) { set_le64(d, get_le64(d) ^ v); return *this; }
LE64& operator <<= (unsigned v) { set_le64(d, get_le64(d) << v); return *this; }
LE64& operator >>= (unsigned v) { set_le64(d, get_le64(d) >> v); return *this; }
operator acc_uint64l_t () const { return get_le64(d); }
} }
__attribute_packed; __attribute_packed;
@@ -292,46 +378,43 @@ __attribute_packed;
// global operators // global operators
**************************************************************************/ **************************************************************************/
inline bool operator < (const BE16& v1, const BE16& v2) template <class T>
{ inline T* operator + (T* ptr, const BE16& v) { return ptr + (unsigned) v; }
return (const unsigned)v1 < (const unsigned)v2; template <class T>
} inline T* operator + (const BE16& v, T* ptr) { return ptr + (unsigned) v; }
template <class T>
inline bool operator < (const BE32& v1, const BE32& v2) inline T* operator - (T* ptr, const BE16& v) { return ptr - (unsigned) v; }
{
return (const unsigned)v1 < (const unsigned)v2;
}
inline bool operator < (const LE16& v1, const LE16& v2)
{
return (const unsigned)v1 < (const unsigned)v2;
}
inline bool operator < (const LE32& v1, const LE32& v2)
{
return (const unsigned)v1 < (const unsigned)v2;
}
template <class T> template <class T>
inline T* operator + (T* ptr, const BE16& v) { return ptr + (const unsigned) v; } inline T* operator + (T* ptr, const BE32& v) { return ptr + (unsigned) v; }
template <class T> template <class T>
inline T* operator - (T* ptr, const BE16& v) { return ptr - (const unsigned) v; } inline T* operator + (const BE32& v, T* ptr) { return ptr + (unsigned) v; }
template <class T>
inline T* operator - (T* ptr, const BE32& v) { return ptr - (unsigned) v; }
// these are not implemented on purpose and will cause link-time errors
template <class T> T* operator + (T* ptr, const BE64& v);
template <class T> T* operator + (const BE64& v, T* ptr);
template <class T> T* operator - (T* ptr, const BE64& v);
template <class T> template <class T>
inline T* operator + (T* ptr, const BE32& v) { return ptr + (const unsigned) v; } inline T* operator + (T* ptr, const LE16& v) { return ptr + (unsigned) v; }
template <class T> template <class T>
inline T* operator - (T* ptr, const BE32& v) { return ptr - (const unsigned) v; } inline T* operator + (const LE16& v, T* ptr) { return ptr + (unsigned) v; }
template <class T>
inline T* operator - (T* ptr, const LE16& v) { return ptr - (unsigned) v; }
template <class T> template <class T>
inline T* operator + (T* ptr, const LE16& v) { return ptr + (const unsigned) v; } inline T* operator + (T* ptr, const LE32& v) { return ptr + (unsigned) v; }
template <class T> template <class T>
inline T* operator - (T* ptr, const LE16& v) { return ptr - (const unsigned) v; } inline T* operator + (const LE32& v, T* ptr) { return ptr + (unsigned) v; }
template <class T>
inline T* operator - (T* ptr, const LE32& v) { return ptr - (unsigned) v; }
template <class T> // these are not implemented on purpose and will cause link-time errors
inline T* operator + (T* ptr, const LE32& v) { return ptr + (const unsigned) v; } template <class T> T* operator + (T* ptr, const LE64& v);
template <class T> template <class T> T* operator + (const LE64& v, T* ptr);
inline T* operator - (T* ptr, const LE32& v) { return ptr - (const unsigned) v; } template <class T> T* operator - (T* ptr, const LE64& v);
/************************************************************************* /*************************************************************************
@@ -339,29 +422,58 @@ inline T* operator - (T* ptr, const LE32& v) { return ptr - (const unsigned) v;
**************************************************************************/ **************************************************************************/
// for use with qsort() // for use with qsort()
int be16_compare(const void *e1, const void *e2); int __acc_cdecl_qsort be16_compare(const void *, const void *);
int be24_compare(const void *e1, const void *e2); int __acc_cdecl_qsort be24_compare(const void *, const void *);
int be32_compare(const void *e1, const void *e2); int __acc_cdecl_qsort be32_compare(const void *, const void *);
int le16_compare(const void *e1, const void *e2); int __acc_cdecl_qsort be64_compare(const void *, const void *);
int le24_compare(const void *e1, const void *e2); int __acc_cdecl_qsort le16_compare(const void *, const void *);
int le32_compare(const void *e1, const void *e2); int __acc_cdecl_qsort le24_compare(const void *, const void *);
int be16_compare_signed(const void *e1, const void *e2); int __acc_cdecl_qsort le32_compare(const void *, const void *);
int be24_compare_signed(const void *e1, const void *e2); int __acc_cdecl_qsort le64_compare(const void *, const void *);
int be32_compare_signed(const void *e1, const void *e2); int __acc_cdecl_qsort be16_compare_signed(const void *, const void *);
int le16_compare_signed(const void *e1, const void *e2); int __acc_cdecl_qsort be24_compare_signed(const void *, const void *);
int le24_compare_signed(const void *e1, const void *e2); int __acc_cdecl_qsort be32_compare_signed(const void *, const void *);
int le32_compare_signed(const void *e1, const void *e2); int __acc_cdecl_qsort be64_compare_signed(const void *, const void *);
int __acc_cdecl_qsort le16_compare_signed(const void *, const void *);
int __acc_cdecl_qsort le24_compare_signed(const void *, const void *);
int __acc_cdecl_qsort le32_compare_signed(const void *, const void *);
int __acc_cdecl_qsort le64_compare_signed(const void *, const void *);
// just for testing... // just for testing...
#if 0 && defined(__i386__) && defined(__GNUC_VERSION_HEX__) #if !defined(ACC_CFG_NO_UNALIGNED)
# if (__GNUC_VERSION_HEX__ >= 0x030100) #if 0 && (ACC_ARCH_AMD64 || ACC_ARCH_I386) && (ACC_CC_GNUC >= 0x030200)
typedef unsigned short LE16_unaligned __attribute__((__packed__,__aligned__(1))); typedef acc_uint16e_t LE16_unaligned __attribute__((__aligned__(1)));
typedef unsigned int LE32_unaligned __attribute__((__packed__,__aligned__(1))); typedef acc_uint32e_t LE32_unaligned __attribute__((__aligned__(1)));
# ifndef LE16
# define LE16 LE16_unaligned # define LE16 LE16_unaligned
# endif
# ifndef LE32
# define LE32 LE32_unaligned # define LE32 LE32_unaligned
# endif # endif
#endif #endif
#if 0 && (ACC_ARCH_I386) && (ACC_CC_INTELC)
typedef __declspec(align(1)) acc_uint16e_t LE16_unaligned;
typedef __declspec(align(1)) acc_uint32e_t LE32_unaligned;
# ifndef LE16
# define LE16 LE16_unaligned
# endif
# ifndef LE32
# define LE32 LE32_unaligned
# endif
#endif
#if 0 && (ACC_ARCH_AMD64 || ACC_ARCH_I386) && (ACC_CC_MSC) && (_MSC_VER >= 1200)
typedef __declspec(align(1)) acc_uint16e_t LE16_unaligned;
typedef __declspec(align(1)) acc_uint32e_t LE32_unaligned;
# ifndef LE16
# define LE16 LE16_unaligned
# endif
# ifndef LE32
# define LE32 LE32_unaligned
# endif
# pragma warning(disable: 4244) // Wx: conversion, possible loss of data
#endif
#endif
#endif /* already included */ #endif /* already included */
+115
View File
@@ -0,0 +1,115 @@
/* bptr.h --
This file is part of the UPX executable compressor.
Copyright (C) 1996-2004 Markus Franz Xaver Johannes Oberhumer
Copyright (C) 1996-2004 Laszlo Molnar
All Rights Reserved.
UPX and the UCL library are free software; you can redistribute them
and/or modify them under the terms of the GNU General Public License as
published by the Free Software Foundation; either version 2 of
the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; see the file COPYING.
If not, write to the Free Software Foundation, Inc.,
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
Markus F.X.J. Oberhumer Laszlo Molnar
<mfx@users.sourceforge.net> <ml1050@users.sourceforge.net>
*/
#ifndef __UPX_BPTR_H
#define __UPX_BPTR_H
/*************************************************************************
// BoundedPtr
**************************************************************************/
template <class T>
class BoundedPtr
{
// typedef BoundedPtr<T> Self;
public:
typedef T* StoredType;
typedef T* PointerType;
typedef T& ReferenceType;
~BoundedPtr() { }
explicit BoundedPtr(void* base, unsigned size, T* ptr=0)
: ptr_(ptr), base_(base), size_(size) { check(); }
BoundedPtr& operator= (const BoundedPtr& other) {
assert(base_ == other.base_); assert(size_ == other.size_);
ptr_ = other.ptr_; check(); return *this;
}
BoundedPtr& operator= (T* other) {
ptr_ = other; check(); return *this;
}
operator T* () { check(); return ptr_; }
operator const T* () const { check(); return ptr_; }
BoundedPtr& operator += (size_t n) {
checkStrict(); ptr_ += n; checkStrict(); return *this;
}
BoundedPtr& operator -= (size_t n) {
checkStrict(); ptr_ -= n; checkStrict(); return *this;
}
BoundedPtr& operator ++ (void) {
checkStrict(); ptr_ += 1; checkStrict(); return *this;
}
// T* operator ++ (int) {
// T* p = ptr_; checkStrict(); ptr_ += 1; checkStrict(); return p;
// }
// BoundedPtr& operator -- (void) {
// checkStrict(); ptr_ -= 1; checkStrict(); return *this;
// }
private:
void checkNULL() const {
if (!ptr_)
throwCantUnpack("unexpected NULL pointer; take care!");
}
void checkRange(size_t extra=0) const {
size_t off = (const char *) ptr_ - (const char *) base_;
if (off > size_ || off + extra > size_)
throwCantUnpack("pointer out of range; take care!");
}
void checkStrict(size_t extra=0) const {
checkNULL();
checkRange(extra);
}
void check(size_t extra=0) const {
if (ptr_) checkRange(extra);
}
T* ptr_;
void* base_;
size_t size_;
// disable copy
BoundedPtr(const BoundedPtr&); // {}
// BoundedPtr& operator= (const BoundedPtr&); // { return *this; }
// disable dynamic allocation
DISABLE_NEW_DELETE
};
#endif /* already included */
/*
vi:ts=4:et
*/
+2 -2
View File
@@ -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-2002 Markus Franz Xaver Johannes Oberhumer Copyright (C) 1996-2004 Markus Franz Xaver Johannes Oberhumer
Copyright (C) 1996-2002 Laszlo Molnar Copyright (C) 1996-2004 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
+4 -4
View File
@@ -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-2002 Markus Franz Xaver Johannes Oberhumer Copyright (C) 1996-2004 Markus Franz Xaver Johannes Oberhumer
Copyright (C) 1996-2002 Laszlo Molnar Copyright (C) 1996-2004 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
@@ -81,7 +81,7 @@ static int do_init(FILE *f)
if (opt->console == CON_NONE || opt->to_stdout) if (opt->console == CON_NONE || opt->to_stdout)
return con_mode; return con_mode;
try_init(&console_file,f); try_init(&console_file,f);
if (!isatty(STDIN_FILENO) || !isatty(STDOUT_FILENO) || !isatty(STDERR_FILENO)) if (!acc_isatty(STDIN_FILENO) || !acc_isatty(STDOUT_FILENO) || !acc_isatty(STDERR_FILENO))
return con_mode; return con_mode;
#if defined(USE_ANSI) #if defined(USE_ANSI)
@@ -142,7 +142,7 @@ console_t console_init =
}; };
void con_fprintf(FILE *f, const char *format, ...) void __acc_cdecl_va con_fprintf(FILE *f, const char *format, ...)
{ {
va_list args; va_list args;
char buf[80*25]; char buf[80*25];
+2 -2
View File
@@ -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-2002 Markus Franz Xaver Johannes Oberhumer Copyright (C) 1996-2004 Markus Franz Xaver Johannes Oberhumer
Copyright (C) 1996-2002 Laszlo Molnar Copyright (C) 1996-2004 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
+4 -4
View File
@@ -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-2002 Markus Franz Xaver Johannes Oberhumer Copyright (C) 1996-2004 Markus Franz Xaver Johannes Oberhumer
Copyright (C) 1996-2002 Laszlo Molnar Copyright (C) 1996-2004 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
@@ -88,7 +88,7 @@ static screen_t *do_construct(screen_t *s, int fd)
static screen_t *screen = NULL; static screen_t *screen = NULL;
static void do_destroy(void) static void __acc_cdecl_atexit do_destroy(void)
{ {
if (screen) if (screen)
{ {
@@ -130,7 +130,7 @@ static int init(FILE *f, int o, int now)
if (!screen) if (!screen)
screen = do_construct(screen_djgpp2_construct(),fd); screen = do_construct(screen_djgpp2_construct(),fd);
#endif #endif
#if defined(__MFX_WIN32) #if defined(USE_SCREEN_WIN32)
if (!screen) if (!screen)
screen = do_construct(screen_win32_construct(),fd); screen = do_construct(screen_win32_construct(),fd);
#endif #endif
+46 -10
View File
@@ -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-2002 Markus Franz Xaver Johannes Oberhumer Copyright (C) 1996-2004 Markus Franz Xaver Johannes Oberhumer
Copyright (C) 1996-2002 Laszlo Molnar Copyright (C) 1996-2004 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
@@ -26,6 +26,20 @@
*/ */
#if 1 && defined(UCL_USE_ASM)
# include <ucl/ucl_asm.h>
# define ucl_nrv2b_decompress_safe_8 ucl_nrv2b_decompress_asm_safe_8
# define ucl_nrv2b_decompress_safe_le16 ucl_nrv2b_decompress_asm_safe_le16
# define ucl_nrv2b_decompress_safe_le32 ucl_nrv2b_decompress_asm_safe_le32
# define ucl_nrv2d_decompress_safe_8 ucl_nrv2d_decompress_asm_safe_8
# define ucl_nrv2d_decompress_safe_le16 ucl_nrv2d_decompress_asm_safe_le16
# define ucl_nrv2d_decompress_safe_le32 ucl_nrv2d_decompress_asm_safe_le32
# define ucl_nrv2e_decompress_safe_8 ucl_nrv2e_decompress_asm_safe_8
# define ucl_nrv2e_decompress_safe_le16 ucl_nrv2e_decompress_asm_safe_le16
# define ucl_nrv2e_decompress_safe_le32 ucl_nrv2e_decompress_asm_safe_le32
#endif
/************************************************************************* /*************************************************************************
// //
**************************************************************************/ **************************************************************************/
@@ -89,15 +103,10 @@ int upx_compress ( const upx_bytep 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_NRV2E_LE16) if (method >= M_NRV2B_LE32 && method <= M_CL1B_LE16)
{ {
int n = (method - M_NRV2B_LE32) % 3; static const unsigned char sizes[3]={32,8,16};
if (n == 0) conf.bb_size = sizes[(method - M_NRV2B_LE32) % 3];
conf.bb_size = 32;
else if (n == 1)
conf.bb_size = 8;
else
conf.bb_size = 16;
} }
else else
throwInternalError("unknown compression method"); throwInternalError("unknown compression method");
@@ -119,6 +128,11 @@ int upx_compress ( const upx_bytep src, upx_uint src_len,
r = ucl_nrv2e_99_compress(src, src_len, dst, dst_len, r = ucl_nrv2e_99_compress(src, src_len, dst, dst_len,
cb, level, &conf, result); cb, level, &conf, result);
#endif #endif
#if 0 /*{*/
else if M_IS_CL1B(method)
r = cl1b_compress(src, src_len, dst, dst_len,
cb, level, &conf, result);
#endif /*}*/
else else
throwInternalError("unknown compression method"); throwInternalError("unknown compression method");
@@ -171,6 +185,17 @@ int upx_decompress ( const upx_bytep src, upx_uint src_len,
r = ucl_nrv2e_decompress_safe_le32(src,src_len,dst,dst_len,NULL); r = ucl_nrv2e_decompress_safe_le32(src,src_len,dst,dst_len,NULL);
break; break;
#endif #endif
#if 0 /*{*/
case M_CL1B_8:
r = cl1b_decompress_safe_8(src,src_len,dst,dst_len,NULL);
break;
case M_CL1B_LE16:
r = cl1b_decompress_safe_le16(src,src_len,dst,dst_len,NULL);
break;
case M_CL1B_LE32:
r = cl1b_decompress_safe_le32(src,src_len,dst,dst_len,NULL);
break;
#endif /*}*/
default: default:
throwInternalError("unknown decompression method"); throwInternalError("unknown decompression method");
break; break;
@@ -225,6 +250,17 @@ int upx_test_overlap ( const upx_bytep buf, upx_uint src_off,
r = ucl_nrv2e_test_overlap_le32(buf,src_off,src_len,dst_len,NULL); r = ucl_nrv2e_test_overlap_le32(buf,src_off,src_len,dst_len,NULL);
break; break;
#endif #endif
#if 0 /*{*/
case M_CL1B_8:
r = cl1b_test_overlap_8(buf,src_off,src_len,dst_len,NULL);
break;
case M_CL1B_LE16:
r = cl1b_test_overlap_le16(buf,src_off,src_len,dst_len,NULL);
break;
case M_CL1B_LE32:
r = cl1b_test_overlap_le32(buf,src_off,src_len,dst_len,NULL);
break;
#endif /*}*/
default: default:
throwInternalError("unknown decompression method"); throwInternalError("unknown decompression method");
break; break;
+3 -5
View File
@@ -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-2002 Markus Franz Xaver Johannes Oberhumer Copyright (C) 1996-2004 Markus Franz Xaver Johannes Oberhumer
Copyright (C) 1996-2002 Laszlo Molnar Copyright (C) 1996-2004 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
@@ -32,14 +32,12 @@
#if defined(WITH_NRV) #if defined(WITH_NRV)
# include "compress_nrv.ch" # include "compress_nrv.ch"
#elif defined(WITH_UCL) #elif defined(WITH_UCL)
# define ALG_NRV2E
# define upx_adler32 upx_adler32 # define upx_adler32 upx_adler32
//# define upx_crc32 upx_crc32 //# define upx_crc32 upx_crc32
# define upx_compress upx_compress # define upx_compress upx_compress
# define upx_decompress upx_decompress # define upx_decompress upx_decompress
# if (UPX_VERSION_HEX >= 0x019000)
# define ALG_NRV2E
# define upx_test_overlap upx_test_overlap # define upx_test_overlap upx_test_overlap
# endif
# include "compress.ch" # include "compress.ch"
#else #else
# error # error
+191 -238
View File
@@ -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-2002 Markus Franz Xaver Johannes Oberhumer Copyright (C) 1996-2004 Markus Franz Xaver Johannes Oberhumer
Copyright (C) 1996-2002 Laszlo Molnar Copyright (C) 1996-2004 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
@@ -29,51 +29,99 @@
#ifndef __UPX_CONF_H #ifndef __UPX_CONF_H
#define __UPX_CONF_H #define __UPX_CONF_H
#if 0 && defined(__EMX__)
# include <sys/emx.h>
#endif
#if defined(UPX_CONFIG_H)
# include UPX_CONFIG_H
#endif
#if defined(HAVE_STDINT_H)
# if !defined(__STDC_LIMIT_MACROS)
# define __STDC_LIMIT_MACROS 1
# endif
# if !defined(__STDC_CONSTANT_MACROS)
# define __STDC_CONSTANT_MACROS 1
# endif
# include <stdint.h>
#endif
#include <limits.h>
#include "version.h" #include "version.h"
#include "tailor.h"
// upx_int64l is int_least64_t in <stdint.h> terminology
#if !defined(upx_int64l) /*************************************************************************
# if defined(HAVE_STDINT_H) // ACC
# define upx_int64l int_least64_t **************************************************************************/
# define upx_uint64l uint_least64_t
# elif (ULONG_MAX > 0xffffffffL) #include "miniacc.h"
# define upx_int64l long int #if ((ACC_OS_WIN32 || ACC_OS_WIN64) && ACC_CC_MWERKS) && defined(__MSL__)
# define upx_uint64l unsigned long int # undef HAVE_UTIME_H /* this pulls in <windows.h> */
# elif defined(__GNUC__) || defined(__DMC__) #endif
# define upx_int64l long long int
# define upx_uint64l unsigned long long int
# elif defined(__BORLANDC__) || defined(_MSC_VER) || defined(__WATCOMC__) #if (ACC_CC_BORLANDC)
# define upx_int64l __int64 # if (__BORLANDC__ < 0x0500)
# define upx_uint64l unsigned __int64 # error "need Borland C++ 5.0 or newer"
# endif
# pragma warn -aus // 8004: 'x' is assigned a value that is never used
# pragma warn -inl // 8026+8027: Function not expanded inline
// Borland compilers typically produce a number of bogus warnings, and
// the actual diagnostics vary from version to version...
# if (__BORLANDC__ < 0x0530)
# pragma warn -csu // 8012: Comparing signed and unsigned values
# endif
# if (__BORLANDC__ >= 0x0530 && __BORLANDC__ < 0x0560)
# pragma warn -osh // 8055: Possible overflow in shift operation
# endif
# if (__BORLANDC__ >= 0x0560)
# pragma warn -use // 8080: 'x' is declared but never used
# endif
#elif (ACC_CC_DMC)
# if (__DMC__ < 0x829)
# error "need Digital Mars C++ 8.29 or newer"
# endif
#elif (ACC_CC_INTELC)
# if (__INTEL_COMPILER < 450)
# error "need Intel C++ 4.5 or newer"
# endif
# if (ACC_OS_WIN32 || ACC_OS_WIN64)
# elif defined(__linux__)
# pragma warning(error: 424) // #424: extra ";" ignored
# pragma warning(disable: 193) // #193: zero used for undefined preprocessing identifier
# pragma warning(disable: 810) // #810: conversion from "A" to "B" may lose significant bits
# pragma warning(disable: 981) // #981: operands are evaluated in unspecified order
# pragma warning(disable: 1418) // #1418: external definition with no prior declaration
# else # else
# error "need a 64-bit integer type" # error "untested platform"
# endif
#elif (ACC_CC_MSC)
# if (_MSC_VER < 1100)
# error "need Visual C++ 5.0 or newer"
# endif
# pragma warning(error: 4096) // W2: '__cdecl' must be used with '...'
# 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: 4514) // W4: 'function': unreferenced inline function has been removed
# pragma warning(disable: 4710) // W4: 'function': function not inlined
# if (_MSC_VER >= 1300)
# pragma warning(disable: 4625) // W4: 'class' : copy constructor could not be generated because a base class copy constructor is inaccessible
# pragma warning(disable: 4626) // W4: 'class' : assignment operator could not be generated because a base class assignment operator is inaccessible
# pragma warning(disable: 4711) // W4: 'function' selected for automatic inline expansion
# pragma warning(disable: 4820) // W4: 'struct' : 'x' bytes padding added after member 'member'
# endif
# if (_MSC_VER >= 1400)
# pragma warning(disable: 4996) // W1: 'function': was declared deprecated
# endif
#elif (ACC_CC_WATCOMC)
# if (__WATCOMC__ < 1100)
# error "need Watcom C++ 11.0c or newer"
# endif
# if defined(__cplusplus)
# pragma warning 656 9 // w5: define this function inside its class definition (may improve code quality)
# endif # endif
#endif #endif
#if !defined(__i386__)
# if defined(__386__) || defined(_M_IX86) #define ACC_WANT_ACC_INCD_H 1
# define __i386__ 1 #define ACC_WANT_ACC_INCE_H 1
#define ACC_WANT_ACC_LIB_H 1
#define ACC_WANT_ACC_CXX_H 1
#include "miniacc.h"
#if (ACC_OS_CYGWIN || ACC_OS_DOS16 || ACC_OS_DOS32 || ACC_OS_EMX || ACC_OS_OS2 || ACC_OS_OS216 || ACC_OS_WIN16 || ACC_OS_WIN32 || ACC_OS_WIN64)
# if defined(INVALID_HANDLE_VALUE) || defined(MAKEWORD) || defined(RT_CURSOR)
# error "something pulled in <windows.h>"
# endif # endif
#endif #endif
/*************************************************************************
//
**************************************************************************/
#if defined(__linux__) && !defined(__unix__) #if defined(__linux__) && !defined(__unix__)
# define __unix__ 1 # define __unix__ 1
#endif #endif
@@ -84,16 +132,26 @@
#undef linux #undef linux
#undef small #undef small
#undef tos #undef tos
#undef unix #if defined(ACC_CC_DMC)
# undef tell
#endif
#if !defined(ACC_CC_PGI)
# undef unix
#endif
#if defined(__DJGPP__)
# undef sopen
# undef __unix__
# undef __unix
#endif
#if !defined(WITH_UCL) #if !defined(WITH_UCL)
# error "you lose" # define WITH_UCL 1
#endif #endif
#if defined(WITH_UCL) #if defined(WITH_UCL)
# include <ucl/uclconf.h> # include <ucl/uclconf.h>
# include <ucl/ucl.h> # include <ucl/ucl.h>
# if !defined(UCL_VERSION) || (UCL_VERSION < 0x010100L) # if !defined(UCL_VERSION) || (UCL_VERSION < 0x010200L)
# error "please upgrade your UCL installation" # error "please upgrade your UCL installation"
# endif # endif
# if !defined(UPX_UINT_MAX) # if !defined(UPX_UINT_MAX)
@@ -109,7 +167,7 @@
# define UPX_E_OK UCL_E_OK # define UPX_E_OK UCL_E_OK
# define UPX_E_ERROR UCL_E_ERROR # define UPX_E_ERROR UCL_E_ERROR
# define UPX_E_OUT_OF_MEMORY UCL_E_OUT_OF_MEMORY # define UPX_E_OUT_OF_MEMORY UCL_E_OUT_OF_MEMORY
# define __UPX_ENTRY __UCL_ENTRY # define __UPX_CDECL __UCL_CDECL
# endif # endif
#endif #endif
#if defined(WITH_NRV) #if defined(WITH_NRV)
@@ -121,7 +179,7 @@
# endif # endif
#endif #endif
#if !defined(UINT_MAX) || (UINT_MAX < 0xffffffffL) #if !defined(UINT_MAX) || (UINT_MAX < 0xffffffffL)
# error "you lose" # error "UINT_MAX"
#endif #endif
@@ -129,65 +187,9 @@
// system includes // system includes
**************************************************************************/ **************************************************************************/
#if !defined(NO_SYS_TYPES_H)
# include <sys/types.h>
#endif
#define NDEBUG
#undef NDEBUG
#include <assert.h>
#include <stdio.h>
#include <stddef.h>
#include <stdlib.h>
#include <stdarg.h>
#include <string.h>
#include <ctype.h>
#include <limits.h>
#include <errno.h>
#if !defined(NO_FCNTL_H)
# include <fcntl.h>
#endif
#if !defined(NO_SYS_STAT_H)
# include <sys/stat.h>
#endif
#if defined(HAVE_IO_H) && !defined(NO_IO_H)
# include <io.h>
#endif
#if defined(HAVE_DOS_H) && !defined(NO_DOS_H)
# include <dos.h>
#endif
#if defined(HAVE_MALLOC_H) && !defined(NO_MALLOC_H)
# include <malloc.h>
#endif
#if defined(HAVE_ALLOCA_H) && !defined(NO_ALLOCA_H)
# include <alloca.h>
#endif
#if defined(HAVE_SIGNAL_H)
# include <signal.h>
#endif
#if defined(HAVE_UNISTD_H)
# include <unistd.h>
#endif
#if defined(TIME_WITH_SYS_TIME)
# include <sys/time.h>
# include <time.h>
#else
# include <time.h>
#endif
#if defined(HAVE_UTIME_H)
# include <utime.h>
#elif defined(HAVE_SYS_UTIME_H)
# include <sys/utime.h>
#endif
#if defined(HAVE_SHARE_H)
# include <share.h>
#endif
// malloc debuggers // malloc debuggers
#if defined(WITH_VALGRIND) #if defined(WITH_VALGRIND)
# include <valgrind.h> # include <valgrind/memcheck.h>
#elif defined(WITH_DMALLOC) #elif defined(WITH_DMALLOC)
# define DMALLOC_FUNC_CHECK # define DMALLOC_FUNC_CHECK
# include <dmalloc.h> # include <dmalloc.h>
@@ -207,73 +209,24 @@
#endif #endif
#if !defined(VALGRIND_MAKE_READABLE) #if !defined(VALGRIND_MAKE_READABLE)
# if 0 # if 0
# define VALGRIND_MAKE_READABLE(addr,len) memset(addr,0,len), 0 # define VALGRIND_MAKE_READABLE(addr,len) (memset(addr,0,len), 0)
# else # else
# define VALGRIND_MAKE_READABLE(addr,len) 0 # define VALGRIND_MAKE_READABLE(addr,len) 0
# endif # endif
#endif #endif
#if !defined(VALGRIND_DISCARD) #if !defined(VALGRIND_DISCARD)
# define VALGRIND_DISCARD(handle) ((void) &handle) # define VALGRIND_DISCARD(handle) ((void)(&handle))
#endif #endif
#undef NDEBUG
#include <assert.h>
/************************************************************************* /*************************************************************************
// 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(PATH_MAX)
# define PATH_MAX 512
#elif (PATH_MAX < 512)
# undef PATH_MAX
# define PATH_MAX 512
#endif
#ifndef RETSIGTYPE
# define RETSIGTYPE void
#endif
#ifndef SIGTYPEENTRY
# define SIGTYPEENTRY
#endif
typedef RETSIGTYPE (SIGTYPEENTRY *sig_type)(int);
#undef MODE_T
#if defined(HAVE_MODE_T)
# define MODE_T mode_t
#else
# define MODE_T int
#endif
#if !defined(HAVE_STRCASECMP)
# if defined(HAVE_STRICMP)
# define strcasecmp stricmp
# else
# define strcasecmp strcmp
# endif
#endif
#if !defined(HAVE_STRNCASECMP)
# if defined(HAVE_STRNICMP)
# define strncasecmp strnicmp
# else
# define strncasecmp strncmp
# endif
#endif
#ifndef STDIN_FILENO #ifndef STDIN_FILENO
# define STDIN_FILENO (fileno(stdin)) # define STDIN_FILENO (fileno(stdin))
#endif #endif
@@ -285,6 +238,14 @@ typedef RETSIGTYPE (SIGTYPEENTRY *sig_type)(int);
#endif #endif
#if !defined(HAVE_STRCASECMP) && defined(HAVE_STRICMP)
# define strcasecmp stricmp
#endif
#if !defined(HAVE_STRNCASECMP) && defined(HAVE_STRNICMP)
# define strncasecmp strnicmp
#endif
#if !defined(S_IWUSR) && defined(_S_IWUSR) #if !defined(S_IWUSR) && defined(_S_IWUSR)
# define S_IWUSR _S_IWUSR # define S_IWUSR _S_IWUSR
#elif !defined(S_IWUSR) && defined(_S_IWRITE) #elif !defined(S_IWUSR) && defined(_S_IWRITE)
@@ -308,14 +269,14 @@ typedef RETSIGTYPE (SIGTYPEENTRY *sig_type)(int);
# if defined(S_IFMT) && defined(S_IFREG) # if defined(S_IFMT) && defined(S_IFREG)
# define S_ISREG(m) (((m) & S_IFMT) == S_IFREG) # define S_ISREG(m) (((m) & S_IFMT) == S_IFREG)
# else # else
# error S_ISREG # error "S_ISREG"
# endif # endif
#endif #endif
#if !defined(S_ISDIR) #if !defined(S_ISDIR)
# if defined(S_IFMT) && defined(S_IFDIR) # if defined(S_IFMT) && defined(S_IFDIR)
# define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR) # define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR)
# else # else
# error S_ISDIR # error "S_ISDIR"
# endif # endif
#endif #endif
#if !defined(S_ISCHR) #if !defined(S_ISCHR)
@@ -326,32 +287,18 @@ typedef RETSIGTYPE (SIGTYPEENTRY *sig_type)(int);
// avoid warnings about shadowing global functions // avoid warnings about shadowing global functions
#undef index
#define basename upx_basename #define basename upx_basename
#define index upx_index #define index upx_index
#define outp upx_outp #define outp upx_outp
#undef PAGE_MASK
#if 0 #undef PAGE_SIZE
# 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 #undef __attribute_packed
#if defined(__GNUC__) #if (ACC_CC_GNUC || ACC_CC_INTELC || ACC_CC_PATHSCALE)
# if 1 && defined(__i386__) # if (1 && (ACC_ARCH_I386))
# define __attribute_packed # define __attribute_packed
# else # else
# define __attribute_packed __attribute__((__packed__,__aligned__(1))) # define __attribute_packed __attribute__((__packed__,__aligned__(1)))
@@ -360,61 +307,49 @@ typedef RETSIGTYPE (SIGTYPEENTRY *sig_type)(int);
# define __attribute_packed # define __attribute_packed
#endif #endif
#undef NOTHROW
#if defined(__cplusplus)
# define NOTHROW throw()
#else
# define NOTHROW
#endif
/*************************************************************************
// file io
**************************************************************************/
#if defined(HAVE_SETMODE)
# if !defined(O_BINARY)
# error "setmode without O_BINARY"
# endif
# define USE_SETMODE 1
#endif
#if !defined(O_BINARY) #if !defined(O_BINARY)
# define O_BINARY 0 # define O_BINARY 0
#endif #endif
#if defined(__DMC__) #ifndef OPTIONS_VAR
# undef tell # define OPTIONS_VAR "UPX"
#endif
#if defined(__DJGPP__)
# undef sopen
# undef USE_SETMODE
#endif #endif
/************************************************************************* /*************************************************************************
// memory util //
**************************************************************************/ **************************************************************************/
#undef UNUSED #define UNUSED(var) ACC_UNUSED(var)
#define COMPILE_TIME_ASSERT(e) ACC_COMPILE_TIME_ASSERT(e)
#if 1 #if 1
# define UNUSED(var) ((void) &(var)) # define __COMPILE_TIME_ASSERT_ALIGNOF_SIZEOF(a,b) { \
#elif 1 && defined(__GNUC__) typedef a acc_tmp_a_t; typedef b acc_tmp_b_t; \
# define UNUSED(var) { typedef int __upx_unused[sizeof(var) ? 1 : -1]; } struct acc_tmp_t { acc_tmp_b_t x; acc_tmp_a_t y; acc_tmp_b_t z[7]; } __attribute_packed; \
#elif 0 COMPILE_TIME_ASSERT(sizeof(struct acc_tmp_t) == 8*sizeof(b)+sizeof(a)) \
# define UNUSED(var) do { } while (!sizeof(var)) }
#elif defined(__BORLANDC__)
# define UNUSED(parm) ((void)(parm))
#else #else
# define UNUSED(parm) (parm = parm) # define __COMPILE_TIME_ASSERT_ALIGNOF_SIZEOF(a,b) { \
struct acc_tmp_t { b x; a y; b z[7]; } __attribute_packed; \
COMPILE_TIME_ASSERT(sizeof(struct acc_tmp_t) == 8*sizeof(b)+sizeof(a)) \
}
#endif #endif
#define HIGH(array) ((unsigned) (sizeof(array)/sizeof((array)[0]))) #if defined(__acc_alignof)
# define COMPILE_TIME_ASSERT_ALIGNOF(a,b) \
__COMPILE_TIME_ASSERT_ALIGNOF_SIZEOF(a,b) \
COMPILE_TIME_ASSERT(__acc_alignof(a) == sizeof(b))
#else
# define COMPILE_TIME_ASSERT_ALIGNOF(a,b) \
__COMPILE_TIME_ASSERT_ALIGNOF_SIZEOF(a,b)
#endif
#define TABLESIZE(table) ((sizeof(table)/sizeof((table)[0])))
#define ALIGN_DOWN(a,b) (((a) / (b)) * (b)) #define ALIGN_DOWN(a,b) (((a) / (b)) * (b))
#define ALIGN_UP(a,b) ALIGN_DOWN((a) + ((b) - 1), b) #define ALIGN_UP(a,b) ALIGN_DOWN((a) + ((b) - 1), b)
#define ALIGN_GAP(a,b) (ALIGN_UP(a,b) - (a))
#define UPX_MAX(a,b) ((a) >= (b) ? (a) : (b)) #define UPX_MAX(a,b) ((a) >= (b) ? (a) : (b))
#define UPX_MIN(a,b) ((a) <= (b) ? (a) : (b)) #define UPX_MIN(a,b) ((a) <= (b) ? (a) : (b))
@@ -455,12 +390,10 @@ inline void operator delete[](void *p)
// An 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
// and behaves exactly like an array "var[]".
#define Array(type, var, size) \ #define Array(type, var, size) \
assert((int)(size) > 0); \ assert((int)(size) > 0); \
MemBuffer var ## _membuf((size)*(sizeof(type))); \ MemBuffer var ## _membuf((size)*(sizeof(type))); \
type * const & var = ((type *) var ## _membuf.getVoidPtr()) type * const var = ((type *) var ## _membuf.getVoidPtr())
#define ByteArray(var, size) Array(unsigned char, var, size) #define ByteArray(var, size) Array(unsigned char, var, size)
@@ -493,10 +426,14 @@ inline void operator delete[](void *p)
#define M_NRV2E_LE32 8 #define M_NRV2E_LE32 8
#define M_NRV2E_8 9 #define M_NRV2E_8 9
#define M_NRV2E_LE16 10 #define M_NRV2E_LE16 10
#define M_CL1B_LE32 11
#define M_CL1B_8 12
#define M_CL1B_LE16 13
#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) #define M_IS_NRV2E(x) ((x) >= M_NRV2E_LE32 && (x) <= M_NRV2E_LE16)
#define M_IS_CL1B(x) ((x) >= M_CL1B_LE32 && (x) <= M_CL1B_LE16)
// Executable formats. Note: big endian types are >= 128. // Executable formats. Note: big endian types are >= 128.
@@ -504,7 +441,7 @@ inline void operator delete[](void *p)
#define UPX_F_DOS_SYS 2 #define UPX_F_DOS_SYS 2
#define UPX_F_DOS_EXE 3 #define UPX_F_DOS_EXE 3
#define UPX_F_DJGPP2_COFF 4 #define UPX_F_DJGPP2_COFF 4
#define UPX_F_WC_LE 5 #define UPX_F_WATCOM_LE 5
#define UPX_F_VXD_LE 6 #define UPX_F_VXD_LE 6
#define UPX_F_DOS_EXEH 7 /* OBSOLETE */ #define UPX_F_DOS_EXEH 7 /* OBSOLETE */
#define UPX_F_TMT_ADAM 8 #define UPX_F_TMT_ADAM 8
@@ -518,8 +455,17 @@ inline void operator delete[](void *p)
#define UPX_F_BVMLINUZ_i386 16 #define UPX_F_BVMLINUZ_i386 16
#define UPX_F_ELKS_8086 17 #define UPX_F_ELKS_8086 17
#define UPX_F_PS1_EXE 18 #define UPX_F_PS1_EXE 18
#define UPX_F_VMLINUX_i386 19
#define UPX_F_LINUX_ELFI_i386 20
#define UPX_F_WINCE_ARM_PE 21
#define UPX_F_LINUX_ELF64_AMD 22
#define UPX_F_PLAIN_TEXT 127
#define UPX_F_ATARI_TOS 129 #define UPX_F_ATARI_TOS 129
#define UPX_F_SOLARIS_SPARC 130 #define UPX_F_SOLARIS_SPARC 130
#define UPX_F_MACH_PPC32 131
#define UPX_F_LINUX_ELFPPC32 132
#define UPX_MAGIC_LE32 0x21585055 /* "UPX!" */ #define UPX_MAGIC_LE32 0x21585055 /* "UPX!" */
@@ -546,8 +492,8 @@ inline void operator delete[](void *p)
extern const char *progname; extern const char *progname;
void init_options(struct options_t *o); void init_options(struct options_t *o);
bool set_ec(int ec); bool set_ec(int ec);
#if defined(__GNUC__) #if (ACC_CC_GNUC || ACC_CC_LLVM || ACC_CC_PATHSCALE)
void e_exit(int ec) __attribute__((noreturn)); void e_exit(int ec) __attribute__((__noreturn__));
#else #else
void e_exit(int ec); void e_exit(int ec);
#endif #endif
@@ -558,27 +504,27 @@ 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 std::exception *e); void printUnhandledException(const char *iname, const std::exception *e);
#if defined(__GNUC__) #if (ACC_CC_GNUC || ACC_CC_LLVM || ACC_CC_PATHSCALE)
void printErr(const char *iname, const char *format, ...) void __acc_cdecl_va printErr(const char *iname, const char *format, ...)
__attribute__((format(printf,2,3))); __attribute__((__format__(__printf__,2,3)));
void printWarn(const char *iname, const char *format, ...) void __acc_cdecl_va printWarn(const char *iname, const char *format, ...)
__attribute__((format(printf,2,3))); __attribute__((__format__(__printf__,2,3)));
#else #else
void printErr(const char *iname, const char *format, ...); void __acc_cdecl_va printErr(const char *iname, const char *format, ...);
void printWarn(const char *iname, const char *format, ...); void __acc_cdecl_va printWarn(const char *iname, const char *format, ...);
#endif #endif
#if defined(__GNUC__) #if (ACC_CC_GNUC || ACC_CC_LLVM || ACC_CC_PATHSCALE)
void infoWarning(const char *format, ...) void __acc_cdecl_va infoWarning(const char *format, ...)
__attribute__((format(printf,1,2))); __attribute__((__format__(__printf__,1,2)));
void infoHeader(const char *format, ...) void __acc_cdecl_va infoHeader(const char *format, ...)
__attribute__((format(printf,1,2))); __attribute__((__format__(__printf__,1,2)));
void info(const char *format, ...) void __acc_cdecl_va info(const char *format, ...)
__attribute__((format(printf,1,2))); __attribute__((__format__(__printf__,1,2)));
#else #else
void infoWarning(const char *format, ...); void __acc_cdecl_va infoWarning(const char *format, ...);
void infoHeader(const char *format, ...); void __acc_cdecl_va infoHeader(const char *format, ...);
void info(const char *format, ...); void __acc_cdecl_va info(const char *format, ...);
#endif #endif
void infoHeader(); void infoHeader();
void infoWriting(const char *what, long size); void infoWriting(const char *what, long size);
@@ -618,6 +564,13 @@ int upx_test_overlap ( const upx_bytep buf, upx_uint src_off,
#endif /* __cplusplus */ #endif /* __cplusplus */
#if (ACC_OS_CYGWIN || ACC_OS_DOS16 || ACC_OS_DOS32 || ACC_OS_EMX || ACC_OS_OS2 || ACC_OS_OS216 || ACC_OS_WIN16 || ACC_OS_WIN32 || ACC_OS_WIN64)
# if defined(INVALID_HANDLE_VALUE) || defined(MAKEWORD) || defined(RT_CURSOR)
# error "something pulled in <windows.h>"
# endif
#endif
#endif /* already included */ #endif /* already included */
View File
-229
View File
@@ -1,229 +0,0 @@
/* pseudo <config.h> for Linux */
#ifndef __UPX_CONFIG_H
#define __UPX_CONFIG_H
/* $TOP$ */
/* Define to empty if the keyword does not work. */
/* #undef const */
/* Define if your C compiler doesn't accept -c and -o together. */
/* #undef NO_MINUS_C_MINUS_O */
/* Define as the return type of signal handlers (int or void). */
#define RETSIGTYPE void
/* Define to `unsigned' if <sys/types.h> doesn't define. */
/* #undef size_t */
/* Define if you have the ANSI C header files. */
#define STDC_HEADERS 1
/* Define if you can safely include both <sys/time.h> and <time.h>. */
#define TIME_WITH_SYS_TIME 1
/* Define if your memcmp is broken. */
/* #undef NO_MEMCMP */
/* Define to `long' if <stddef.h> doesn't define. */
/* #undef ptrdiff_t */
/* Define when using the dmalloc package. */
/* #undef WITH_DMALLOC */
/* Define if you have the access function. */
#define HAVE_ACCESS 1
/* Define if you have the atoi function. */
#define HAVE_ATOI 1
/* Define if you have the chmod function. */
#define HAVE_CHMOD 1
/* Define if you have the chown function. */
#define HAVE_CHOWN 1
/* Define if you have the ctime function. */
#define HAVE_CTIME 1
/* Define if you have the difftime function. */
#define HAVE_DIFFTIME 1
/* Define if you have the fchmod function. */
#define HAVE_FCHMOD 1
/* Define if you have the fileno function. */
#define HAVE_FILENO 1
/* Define if you have the fstat function. */
#define HAVE_FSTAT 1
/* Define if you have the XXX function. */
#define HAVE_GETPID 1
/* Define if you have the XXX function. */
#define HAVE_GETTIMEOFDAY 1
/* Define if you have the getumask function. */
/* #undef HAVE_GETUMASK */
/* Define if you have the gmtime function. */
#define HAVE_GMTIME 1
/* Define if you have the index function. */
#define HAVE_INDEX 1
/* Define if you have the isatty function. */
#define HAVE_ISATTY 1
/* Define if you have the lstat function. */
#define HAVE_LSTAT 1
/* Define if you have the localtime function. */
#define HAVE_LOCALTIME 1
/* Define if you have the memcmp function. */
#define HAVE_MEMCMP 1
/* Define if you have the memcpy function. */
#define HAVE_MEMCPY 1
/* Define if you have the memmove function. */
#define HAVE_MEMMOVE 1
/* Define if you have the memset function. */
#define HAVE_MEMSET 1
/* Define if you have the mktime function. */
#define HAVE_MKTIME 1
/* Define if you have the setmode function. */
/* #undef HAVE_SETMODE */
/* Define if you have the stat function. */
#define HAVE_STAT 1
/* Define if you have the strcasecmp function. */
#define HAVE_STRCASECMP 1
/* Define if you have the strchr function. */
#define HAVE_STRCHR 1
/* Define if you have the strdup function. */
#define HAVE_STRDUP 1
/* Define if you have the strftime function. */
#define HAVE_STRFTIME 1
/* Define if you have the stricmp function. */
/* #undef HAVE_STRICMP */
/* Define if you have the strncasecmp function. */
#define HAVE_STRNCASECMP 1
/* Define if you have the strnicmp function. */
/* #undef HAVE_STRNICMP */
/* Define if you have the strstr function. */
#define HAVE_STRSTR 1
/* Define if you have the tzset function. */
#define HAVE_TZSET 1
/* Define if you have the umask function. */
#define HAVE_UMASK 1
/* Define if you have the utime function. */
#define HAVE_UTIME 1
/* Define if you have the vsnprintf function. */
#define HAVE_VSNPRINTF 1
/* Define if you have the <assert.h> header file. */
#define HAVE_ASSERT_H 1
/* Define if you have the <ctype.h> header file. */
#define HAVE_CTYPE_H 1
/* Define if you have the <curses.h> header file. */
#define HAVE_CURSES_H 1
/* Define if you have the <limits.h> header file. */
#define HAVE_LIMITS_H 1
/* Define if you have the <linux/kd.h> header file. */
#define HAVE_LINUX_KD_H 1
/* Define if you have the <linux/kdev_t.h> header file. */
#define HAVE_LINUX_KDEV_T_H 1
/* Define if you have the <linux/major.h> header file. */
#define HAVE_LINUX_MAJOR_H 1
/* Define if you have the <memory.h> header file. */
#define HAVE_MEMORY_H 1
/* Define if you have the <ncurses.h> header file. */
#define HAVE_NCURSES_H 1
/* Define if you have the <signal.h> header file. */
#define HAVE_SIGNAL_H 1
/* Define if you have the <stddef.h> header file. */
#define HAVE_STDDEF_H 1
/* Define if you have the <stdint.h> header file. */
#define HAVE_STDINT_H 1
/* Define if you have the <sys/param.h> header file. */
#define HAVE_SYS_PARAM_H 1
/* Define if you have the <sys/resource.h> header file. */
#define HAVE_SYS_RESOURCE_H 1
/* Define if you have the <sys/time.h> header file. */
#define HAVE_SYS_TIME_H 1
/* Define if you have the <sys/times.h> header file. */
#define HAVE_SYS_TIMES_H 1
/* Define if you have the <sys/utime.h> header file. */
/* #undef HAVE_SYS_UTIME_H */
/* Define if you have the <time.h> header file. */
#define HAVE_TIME_H 1
/* Define if you have the <unistd.h> header file. */
#define HAVE_UNISTD_H 1
/* Define if you have the <utime.h> header file. */
#define HAVE_UTIME_H 1
/* $BOTTOM$ */
#if defined(HAVE_GMTIME) && !defined(TIME_WITH_SYS_TIME)
# undef /**/ HAVE_GMTIME
#endif
#if defined(HAVE_LOCALTIME) && !defined(TIME_WITH_SYS_TIME)
# undef /**/ HAVE_LOCALTIME
#endif
#if defined(HAVE_STRFTIME) && !defined(TIME_WITH_SYS_TIME)
# undef /**/ HAVE_STRFTIME
#endif
#if defined(HAVE_SYS_RESOURCE_H) && !defined(TIME_WITH_SYS_TIME)
# undef /**/ HAVE_SYS_RESOURCE_H
#endif
#if defined(HAVE_SYS_TIMES_H) && !defined(TIME_WITH_SYS_TIME)
# undef /**/ HAVE_SYS_TIMES_H
#endif
#endif /* already included */
/*
vi:ts=4
*/
-226
View File
@@ -1,226 +0,0 @@
/* pseudo <config.h> for sparc-sun-solaris2.8 */
#ifndef __UPX_CONFIG_H
#define __UPX_CONFIG_H
/* $TOP$ */
/* Define to empty if the keyword does not work. */
/* #undef const */
/* Define if your C compiler doesn't accept -c and -o together. */
/* #undef NO_MINUS_C_MINUS_O */
/* Define as the return type of signal handlers (int or void). */
#define RETSIGTYPE void
/* Define to `unsigned' if <sys/types.h> doesn't define. */
/* #undef size_t */
/* Define if you have the ANSI C header files. */
#define STDC_HEADERS 1
/* Define if you can safely include both <sys/time.h> and <time.h>. */
#define TIME_WITH_SYS_TIME 1
/* Define if your memcmp is broken. */
/* #undef NO_MEMCMP */
/* Define to `long' if <stddef.h> doesn't define. */
/* #undef ptrdiff_t */
/* Define when using the dmalloc package. */
/* #undef WITH_DMALLOC */
/* Define if you have the access function. */
#define HAVE_ACCESS 1
/* Define if you have the atoi function. */
#define HAVE_ATOI 1
/* Define if you have the chmod function. */
#define HAVE_CHMOD 1
/* Define if you have the chown function. */
#define HAVE_CHOWN 1
/* Define if you have the ctime function. */
#define HAVE_CTIME 1
/* Define if you have the difftime function. */
#define HAVE_DIFFTIME 1
/* Define if you have the fchmod function. */
#define HAVE_FCHMOD 1
/* Define if you have the fileno function. */
#define HAVE_FILENO 1
/* Define if you have the fstat function. */
#define HAVE_FSTAT 1
/* Define if you have the XXX function. */
#define HAVE_GETPID 1
/* Define if you have the XXX function. */
#define HAVE_GETTIMEOFDAY 1
/* Define if you have the getumask function. */
/* #undef HAVE_GETUMASK */
/* Define if you have the gmtime function. */
#define HAVE_GMTIME 1
/* Define if you have the index function. */
#define HAVE_INDEX 1
/* Define if you have the isatty function. */
#define HAVE_ISATTY 1
/* Define if you have the lstat function. */
#define HAVE_LSTAT 1
/* Define if you have the localtime function. */
#define HAVE_LOCALTIME 1
/* Define if you have the memcmp function. */
#define HAVE_MEMCMP 1
/* Define if you have the memcpy function. */
#define HAVE_MEMCPY 1
/* Define if you have the memmove function. */
#define HAVE_MEMMOVE 1
/* Define if you have the memset function. */
#define HAVE_MEMSET 1
/* Define if you have the mktime function. */
#define HAVE_MKTIME 1
/* Define if you have the setmode function. */
/* #undef HAVE_SETMODE */
/* Define if you have the stat function. */
#define HAVE_STAT 1
/* Define if you have the strcasecmp function. */
#define HAVE_STRCASECMP 1
/* Define if you have the strchr function. */
#define HAVE_STRCHR 1
/* Define if you have the strdup function. */
#define HAVE_STRDUP 1
/* Define if you have the strftime function. */
#define HAVE_STRFTIME 1
/* Define if you have the stricmp function. */
/* #undef HAVE_STRICMP */
/* Define if you have the strncasecmp function. */
#define HAVE_STRNCASECMP 1
/* Define if you have the strnicmp function. */
/* #undef HAVE_STRNICMP */
/* Define if you have the strstr function. */
#define HAVE_STRSTR 1
/* Define if you have the tzset function. */
#define HAVE_TZSET 1
/* Define if you have the umask function. */
#define HAVE_UMASK 1
/* Define if you have the utime function. */
#define HAVE_UTIME 1
/* Define if you have the vsnprintf function. */
#define HAVE_VSNPRINTF 1
/* Define if you have the <assert.h> header file. */
#define HAVE_ASSERT_H 1
/* Define if you have the <ctype.h> header file. */
#define HAVE_CTYPE_H 1
/* Define if you have the <curses.h> header file. */
#define HAVE_CURSES_H 1
/* Define if you have the <limits.h> header file. */
#define HAVE_LIMITS_H 1
/* Define if you have the <linux/kd.h> header file. */
#define HAVE_LINUX_KD_H 1
/* Define if you have the <linux/kdev_t.h> header file. */
#define HAVE_LINUX_KDEV_T_H 1
/* Define if you have the <linux/major.h> header file. */
#define HAVE_LINUX_MAJOR_H 1
/* Define if you have the <memory.h> header file. */
#define HAVE_MEMORY_H 1
/* Define if you have the <ncurses.h> header file. */
#define HAVE_NCURSES_H 1
/* Define if you have the <signal.h> header file. */
#define HAVE_SIGNAL_H 1
/* Define if you have the <stddef.h> header file. */
#define HAVE_STDDEF_H 1
/* Define if you have the <sys/param.h> header file. */
#define HAVE_SYS_PARAM_H 1
/* Define if you have the <sys/resource.h> header file. */
#define HAVE_SYS_RESOURCE_H 1
/* Define if you have the <sys/time.h> header file. */
#define HAVE_SYS_TIME_H 1
/* Define if you have the <sys/times.h> header file. */
#define HAVE_SYS_TIMES_H 1
/* Define if you have the <sys/utime.h> header file. */
/* #undef HAVE_SYS_UTIME_H */
/* Define if you have the <time.h> header file. */
#define HAVE_TIME_H 1
/* Define if you have the <unistd.h> header file. */
#define HAVE_UNISTD_H 1
/* Define if you have the <utime.h> header file. */
#define HAVE_UTIME_H 1
/* $BOTTOM$ */
#if defined(HAVE_GMTIME) && !defined(TIME_WITH_SYS_TIME)
# undef /**/ HAVE_GMTIME
#endif
#if defined(HAVE_LOCALTIME) && !defined(TIME_WITH_SYS_TIME)
# undef /**/ HAVE_LOCALTIME
#endif
#if defined(HAVE_STRFTIME) && !defined(TIME_WITH_SYS_TIME)
# undef /**/ HAVE_STRFTIME
#endif
#if defined(HAVE_SYS_RESOURCE_H) && !defined(TIME_WITH_SYS_TIME)
# undef /**/ HAVE_SYS_RESOURCE_H
#endif
#if defined(HAVE_SYS_TIMES_H) && !defined(TIME_WITH_SYS_TIME)
# undef /**/ HAVE_SYS_TIMES_H
#endif
#endif /* already included */
/*
vi:ts=4
*/
+12 -9
View File
@@ -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-2002 Markus Franz Xaver Johannes Oberhumer Copyright (C) 1996-2004 Markus Franz Xaver Johannes Oberhumer
Copyright (C) 1996-2002 Laszlo Molnar Copyright (C) 1996-2004 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
@@ -34,8 +34,9 @@
#undef USE_CONSOLE #undef USE_CONSOLE
#undef USE_ANSI #undef USE_ANSI
#undef USE_SCREEN #undef USE_SCREEN
#undef USE_SCREEN_VCSA
#undef USE_SCREEN_CURSES #undef USE_SCREEN_CURSES
#undef USE_SCREEN_VCSA
#undef USE_SCREEN_WIN32
#undef USE_FRAMES #undef USE_FRAMES
#if defined(WITH_GUI) && !defined(NO_CONSOLE) #if defined(WITH_GUI) && !defined(NO_CONSOLE)
@@ -57,10 +58,12 @@
#if 1 && defined(__DJGPP__) #if 1 && defined(__DJGPP__)
# define USE_SCREEN # define USE_SCREEN
#endif #elif 1 && (ACC_OS_CYGWIN || ACC_OS_WIN32 || ACC_OS_WIN64)
#if 1 && defined(__MFX_WIN32)
# define USE_SCREEN # define USE_SCREEN
# define USE_SCREEN_WIN32
#elif 1 && (ACC_OS_EMX && defined(__RSXNT__))
# define USE_SCREEN
# define USE_SCREEN_WIN32
#endif #endif
@@ -120,10 +123,10 @@ console_t;
#if defined(__GNUC__) #if defined(__GNUC__)
void con_fprintf(FILE *f, const char *format, ...) void __acc_cdecl_va con_fprintf(FILE *f, const char *format, ...)
__attribute__((format(printf,2,3))); __attribute__((__format__(printf,2,3)));
#else #else
void con_fprintf(FILE *f, const char *format, ...); void __acc_cdecl_va con_fprintf(FILE *f, const char *format, ...);
#endif #endif
+15 -13
View File
@@ -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-2002 Markus Franz Xaver Johannes Oberhumer Copyright (C) 1996-2004 Markus Franz Xaver Johannes Oberhumer
Copyright (C) 1996-2002 Laszlo Molnar Copyright (C) 1996-2004 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
@@ -35,7 +35,7 @@
long Throwable::counter = 0; long Throwable::counter = 0;
Throwable::Throwable(const char *m, int e, bool w) Throwable::Throwable(const char *m, int e, bool w) NOTHROW
: super(), msg(NULL), err(e), is_warning(w) : super(), msg(NULL), err(e), is_warning(w)
{ {
if (m) if (m)
@@ -47,7 +47,7 @@ Throwable::Throwable(const char *m, int e, bool w)
} }
Throwable::Throwable(Throwable const &other) Throwable::Throwable(const Throwable &other) NOTHROW
: super(other), msg(NULL), err(other.err), is_warning(other.is_warning) : super(other), msg(NULL), err(other.err), is_warning(other.is_warning)
{ {
if (other.msg) if (other.msg)
@@ -174,22 +174,24 @@ void throwEOFException(const char *msg, int e)
// //
**************************************************************************/ **************************************************************************/
const char *prettyName(const char *n) const char *prettyName(const char *n) NOTHROW
{ {
if (n == NULL) if (n == NULL)
return ""; return "(null)";
while (*n >= '0' && *n <= '9') // gcc while (*n)
{
if (*n >= '0' && *n <= '9') // Linux ABI
n++; n++;
if (strncmp(n, "class ", 6) == 0) // Visual C++ else if (*n == ' ')
n++;
else if (strncmp(n, "class ", 6) == 0) // Visual C++
n += 6; n += 6;
else
break;
}
return n; return n;
} }
const char *prettyName(const std::type_info &ti)
{
return prettyName(ti.name());
}
/* /*
vi:ts=4:et vi:ts=4:et
+25 -29
View File
@@ -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-2002 Markus Franz Xaver Johannes Oberhumer Copyright (C) 1996-2004 Markus Franz Xaver Johannes Oberhumer
Copyright (C) 1996-2002 Laszlo Molnar Copyright (C) 1996-2004 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
@@ -31,8 +31,7 @@
#ifdef __cplusplus #ifdef __cplusplus
const char *prettyName(const char *n); const char *prettyName(const char *n) NOTHROW;
const char *prettyName(const std::type_info &ti);
/************************************************************************* /*************************************************************************
@@ -43,13 +42,13 @@ class Throwable : public std::exception
{ {
typedef std::exception super; 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) NOTHROW;
public: public:
Throwable(Throwable const &); Throwable(const Throwable &) NOTHROW;
virtual ~Throwable() NOTHROW; virtual ~Throwable() NOTHROW;
const char *getMsg() const { return msg; } const char *getMsg() const NOTHROW { return msg; }
int getErrno() const { return err; } int getErrno() const NOTHROW { return err; }
bool isWarning() const { return is_warning; } bool isWarning() const NOTHROW { return is_warning; }
private: private:
char *msg; char *msg;
int err; int err;
@@ -58,12 +57,9 @@ protected:
private: private:
// disable assignment // disable assignment
Throwable& operator= (Throwable const &); Throwable& operator= (const Throwable &);
// disable dynamic allocation // disable dynamic allocation
#ifndef new DISABLE_NEW_DELETE
static void *operator new (size_t); // {}
static void *operator new[] (size_t); // {}
#endif
private: private:
static long counter; // for debugging static long counter; // for debugging
@@ -75,7 +71,7 @@ class Exception : public Throwable
{ {
typedef Throwable super; typedef Throwable super;
public: public:
Exception(const char *m = 0, int e = 0, bool w = false) : super(m,e,w) { } Exception(const char *m = 0, int e = 0, bool w = false) NOTHROW : super(m,e,w) { }
}; };
@@ -84,7 +80,7 @@ class Error : public Throwable
{ {
typedef Throwable super; typedef Throwable super;
public: public:
Error(const char *m = 0, int e = 0) : super(m,e) { } Error(const char *m = 0, int e = 0) NOTHROW : super(m,e) { }
}; };
@@ -96,7 +92,7 @@ class OutOfMemoryException : public Exception
{ {
typedef Exception super; typedef Exception super;
public: public:
OutOfMemoryException(const char *m = 0, int e = 0) : super(m,e) { } OutOfMemoryException(const char *m = 0, int e = 0) NOTHROW : super(m,e) { }
}; };
@@ -104,7 +100,7 @@ class IOException : public Exception
{ {
typedef Exception super; typedef Exception super;
public: public:
IOException(const char *m = 0, int e = 0) : super(m,e) { } IOException(const char *m = 0, int e = 0) NOTHROW : super(m,e) { }
}; };
@@ -112,7 +108,7 @@ class EOFException : public IOException
{ {
typedef IOException super; typedef IOException super;
public: public:
EOFException(const char *m = 0, int e = 0) : super(m,e) { } EOFException(const char *m = 0, int e = 0) NOTHROW : super(m,e) { }
}; };
@@ -120,7 +116,7 @@ class FileNotFoundException : public IOException
{ {
typedef IOException super; typedef IOException super;
public: public:
FileNotFoundException(const char *m = 0, int e = 0) : super(m,e) { } FileNotFoundException(const char *m = 0, int e = 0) NOTHROW : super(m,e) { }
}; };
@@ -128,7 +124,7 @@ class FileAlreadyExistsException : public IOException
{ {
typedef IOException super; typedef IOException super;
public: public:
FileAlreadyExistsException(const char *m = 0, int e = 0) : super(m,e) { } FileAlreadyExistsException(const char *m = 0, int e = 0) NOTHROW : super(m,e) { }
}; };
@@ -140,35 +136,35 @@ class OverlayException : public Exception
{ {
typedef Exception super; typedef Exception super;
public: public:
OverlayException(const char *m = 0, bool w = false) : super(m,0,w) { } OverlayException(const char *m = 0, bool w = false) NOTHROW : super(m,0,w) { }
}; };
class CantPackException : public Exception class CantPackException : public Exception
{ {
typedef Exception super; typedef Exception super;
public: public:
CantPackException(const char *m = 0, bool w = false) : super(m,0,w) { } CantPackException(const char *m = 0, bool w = false) NOTHROW : super(m,0,w) { }
}; };
class UnknownExecutableFormatException : public CantPackException class UnknownExecutableFormatException : public CantPackException
{ {
typedef CantPackException super; typedef CantPackException super;
public: public:
UnknownExecutableFormatException(const char *m = 0, bool w = false) : super(m,w) { } UnknownExecutableFormatException(const char *m = 0, bool w = false) NOTHROW : super(m,w) { }
}; };
class AlreadyPackedException : public CantPackException class AlreadyPackedException : public CantPackException
{ {
typedef CantPackException super; typedef CantPackException super;
public: public:
AlreadyPackedException(const char *m = 0) : super(m) { is_warning = true; } AlreadyPackedException(const char *m = 0) NOTHROW : super(m) { is_warning = true; }
}; };
class NotCompressibleException : public CantPackException class NotCompressibleException : public CantPackException
{ {
typedef CantPackException super; typedef CantPackException super;
public: public:
NotCompressibleException(const char *m = 0) : super(m) { } NotCompressibleException(const char *m = 0) NOTHROW : super(m) { }
}; };
@@ -176,14 +172,14 @@ class CantUnpackException : public Exception
{ {
typedef Exception super; typedef Exception super;
public: public:
CantUnpackException(const char *m = 0, bool w = false) : super(m,0,w) { } CantUnpackException(const char *m = 0, bool w = false) NOTHROW : super(m,0,w) { }
}; };
class NotPackedException : public CantUnpackException class NotPackedException : public CantUnpackException
{ {
typedef CantUnpackException super; typedef CantUnpackException super;
public: public:
NotPackedException(const char *m = 0) : super(m,true) { } NotPackedException(const char *m = 0) NOTHROW : super(m,true) { }
}; };
@@ -195,7 +191,7 @@ class InternalError : public Error
{ {
typedef Error super; typedef Error super;
public: public:
InternalError(const char *m = 0) : super(m,0) { } InternalError(const char *m = 0) NOTHROW : super(m,0) { }
}; };
+35 -60
View File
@@ -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-2002 Markus Franz Xaver Johannes Oberhumer Copyright (C) 1996-2004 Markus Franz Xaver Johannes Oberhumer
Copyright (C) 1996-2002 Laszlo Molnar Copyright (C) 1996-2004 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
@@ -40,13 +40,15 @@ void File::chmod(const char *name, int mode)
#if defined(HAVE_CHMOD) #if defined(HAVE_CHMOD)
if (::chmod(name,mode) != 0) if (::chmod(name,mode) != 0)
throwIOException(name,errno); throwIOException(name,errno);
#else
UNUSED(name); UNUSED(mode);
#endif #endif
} }
void File::rename(const char *old_, const char *new_) void File::rename(const char *old_, const char *new_)
{ {
#if 1 && defined(__DJGPP__) #if defined(__DJGPP__)
if (::_rename(old_,new_) != 0) if (::_rename(old_,new_) != 0)
#else #else
if (::rename(old_,new_) != 0) if (::rename(old_,new_) != 0)
@@ -128,29 +130,13 @@ void FileBase::closex()
int FileBase::read(void *buf, int len) int FileBase::read(void *buf, int len)
{ {
int l;
if (!isOpen() || len < 0) if (!isOpen() || len < 0)
throwIOException("bad read"); throwIOException("bad read");
if (len == 0) errno = 0;
return 0; long l = acc_safe_hread(_fd, buf, len);
for (;;) if (errno)
{
#if 1 && defined(__DJGPP__)
l = ::_read(_fd, buf, len);
#else
l = ::read(_fd, buf, len);
#endif
if (l < 0)
{
#if defined(EINTR)
if (errno == EINTR)
continue;
#endif
throwIOException("read error",errno); throwIOException("read error",errno);
} return (int) l;
break;
}
return l;
} }
@@ -165,26 +151,12 @@ int FileBase::readx(void *buf, int len)
void FileBase::write(const void *buf, int len) void FileBase::write(const void *buf, int len)
{ {
int l;
if (!isOpen() || len < 0) if (!isOpen() || len < 0)
throwIOException("bad write"); throwIOException("bad write");
if (len == 0) errno = 0;
return; long l = acc_safe_hwrite(_fd, buf, len);
for (;;)
{
#if 1 && defined(__DJGPP__)
l = ::_write(_fd,buf,len);
#else
l = ::write(_fd,buf,len);
#endif
#if defined(EINTR)
if (l < 0 && errno == EINTR)
continue;
#endif
if (l != len) if (l != len)
throwIOException("write error",errno); throwIOException("write error",errno);
break;
}
} }
@@ -259,14 +231,16 @@ int InputFile::readx(void *buf, int len)
int InputFile::read(MemBuffer *buf, int len) int InputFile::read(MemBuffer *buf, int len)
{ {
buf->checkState();
assert((unsigned)len <= buf->getSize()); assert((unsigned)len <= buf->getSize());
return super::read(buf->getVoidPtr(), len); return read(buf->getVoidPtr(), len);
} }
int InputFile::readx(MemBuffer *buf, int len) int InputFile::readx(MemBuffer *buf, int len)
{ {
buf->checkState();
assert((unsigned)len <= buf->getSize()); assert((unsigned)len <= buf->getSize());
return super::readx(buf->getVoidPtr(), len); return read(buf->getVoidPtr(), len);
} }
@@ -335,29 +309,16 @@ void OutputFile::sopen(const char *name, int flags, int shflags, int mode)
bool OutputFile::openStdout(int flags, bool force) bool OutputFile::openStdout(int flags, bool force)
{ {
close(); close();
if (!force) int fd = STDOUT_FILENO;
{ if (!force && acc_isatty(fd))
if (!isafile(STDOUT_FILENO))
return false; return false;
}
_fd = STDOUT_FILENO;
_name = "<stdout>"; _name = "<stdout>";
_flags = flags; _flags = flags;
_shflags = -1; _shflags = -1;
_mode = 0; _mode = 0;
if (flags != 0) if (flags && acc_set_binmode(fd, 1) == -1)
{ throwIOException(_name, errno);
assert(flags == O_BINARY); _fd = fd;
#if defined(__MINT__)
__set_binmode(stdout, 1);
#elif defined(HAVE_SETMODE) && defined(USE_SETMODE)
if (setmode(_fd, O_BINARY) == -1)
throwIOException(_name,errno);
#if defined(__DJGPP__)
__djgpp_set_ctrl_c(1);
#endif
#endif
}
return true; return true;
} }
@@ -369,13 +330,27 @@ void OutputFile::write(const void *buf, int len)
} }
void OutputFile::write(const MemBuffer *buf, int len)
{
buf->checkState();
assert((unsigned)len <= buf->getSize());
write(buf->getVoidPtr(), len);
}
void OutputFile::write(const MemBuffer &buf, int len)
{
write(&buf, len);
}
void OutputFile::dump(const char *name, const void *buf, int len, int flags) void OutputFile::dump(const char *name, const void *buf, int len, int flags)
{ {
if (flags < 0) if (flags < 0)
flags = O_CREAT | O_BINARY | O_TRUNC; flags = O_CREAT | O_BINARY | O_TRUNC;
flags |= O_WRONLY; flags |= O_WRONLY;
OutputFile f; OutputFile f;
f.open(name, flags, 0666); f.open(name, flags, 0600);
f.write(buf, len); f.write(buf, len);
f.closex(); f.closex();
} }
+8 -5
View File
@@ -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-2002 Markus Franz Xaver Johannes Oberhumer Copyright (C) 1996-2004 Markus Franz Xaver Johannes Oberhumer
Copyright (C) 1996-2002 Laszlo Molnar Copyright (C) 1996-2004 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
@@ -38,6 +38,9 @@ class MemBuffer;
class File class File
{ {
protected:
File() { }
virtual ~File() { }
public: public:
static void chmod(const char *name, int mode); static void chmod(const char *name, int mode);
static void rename(const char *old_, const char *new_); static void rename(const char *old_, const char *new_);
@@ -123,10 +126,11 @@ public:
virtual bool openStdout(int flags=0, bool force=false); virtual bool openStdout(int flags=0, bool force=false);
virtual void write(const void *buf, int len); virtual void write(const void *buf, int len);
virtual void write(const MemBuffer *buf, int len);
virtual void write(const MemBuffer &buf, int len);
off_t getBytesWritten() const { return bytes_written; } off_t getBytesWritten() const { return bytes_written; }
#if (UPX_VERSION_HEX >= 0x019000)
// FIXME - these won't work when using the `--stdout' option // FIXME - these won't work when using the `--stdout' option
virtual void seek(off_t off, int whence) virtual void seek(off_t off, int whence)
{ {
@@ -139,7 +143,6 @@ public:
write(buf, len); write(buf, len);
bytes_written -= len; // restore bytes_written -= len; // restore
} }
#endif
// util // util
static void dump(const char *name, const void *buf, int len, int flags=-1); static void dump(const char *name, const void *buf, int len, int flags=-1);
@@ -153,7 +156,7 @@ protected:
// //
**************************************************************************/ **************************************************************************/
#if 0 #if 0 /* NOT USED */
class MemoryOutputFile : public FileBase class MemoryOutputFile : public FileBase
{ {
typedef FileBase super; typedef FileBase super;
+3 -3
View File
@@ -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-2002 Markus Franz Xaver Johannes Oberhumer Copyright (C) 1996-2004 Markus Franz Xaver Johannes Oberhumer
Copyright (C) 1996-2002 Laszlo Molnar Copyright (C) 1996-2004 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 -2
View File
@@ -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-2002 Markus Franz Xaver Johannes Oberhumer Copyright (C) 1996-2004 Markus Franz Xaver Johannes Oberhumer
Copyright (C) 1996-2002 Laszlo Molnar Copyright (C) 1996-2004 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
+42 -2
View File
@@ -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-2002 Markus Franz Xaver Johannes Oberhumer Copyright (C) 1996-2004 Markus Franz Xaver Johannes Oberhumer
Copyright (C) 1996-2002 Laszlo Molnar Copyright (C) 1996-2004 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
@@ -383,6 +383,46 @@ static int s_ct32_e8e9_bswap_be(Filter *f)
#undef CT32 #undef CT32
/*************************************************************************
// 24-bit ARM calltrick ("naive")
**************************************************************************/
#define CT24ARM(f, cond, addvalue, get, set) \
upx_byte *b = f->buf; \
upx_byte *b_end = b + f->buf_len - 4; \
do { \
if (cond) \
{ \
unsigned a = (unsigned) (b - f->buf); \
f->lastcall = a; \
set(b, get(b) + (addvalue)); \
f->calls++; \
} \
b += 4; \
} while (b < b_end); \
if (f->lastcall) f->lastcall += 4; \
return 0;
#define ARMCT_COND (((b[3] & 0x0f) == 0x0b))
static int f_ct24arm_le(Filter *f)
{
CT24ARM(f, ARMCT_COND, a / 4 + f->addvalue, get_le24, set_le24)
}
static int u_ct24arm_le(Filter *f)
{
CT24ARM(f, ARMCT_COND, 0 - a / 4 - f->addvalue, get_le24, set_le24)
}
static int s_ct24arm_le(Filter *f)
{
CT24ARM(f, ARMCT_COND, a + f->addvalue, get_le24, set_dummy)
}
#undef CT24ARM
#undef ARMCT_COND
/* /*
vi:ts=4:et:nowrap vi:ts=4:et:nowrap
+10 -3
View File
@@ -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-2002 Markus Franz Xaver Johannes Oberhumer Copyright (C) 1996-2004 Markus Franz Xaver Johannes Oberhumer
Copyright (C) 1996-2002 Laszlo Molnar Copyright (C) 1996-2004 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
@@ -36,11 +36,11 @@ static int F(Filter *f)
#ifdef U #ifdef U
// filter // filter
upx_byte *b = f->buf; upx_byte *b = f->buf;
const unsigned addvalue = f->addvalue;
#else #else
// scan // scan
const upx_byte *b = f->buf; const upx_byte *b = f->buf;
#endif #endif
const unsigned addvalue = f->addvalue;
const unsigned size = f->buf_len; const unsigned size = f->buf_len;
unsigned ic, jc, kc; unsigned ic, jc, kc;
@@ -52,6 +52,11 @@ static int F(Filter *f)
unsigned char buf[256]; unsigned char buf[256];
memset(buf,0,256); memset(buf,0,256);
// A call to a destination that is inside the buffer
// will be rewritten and marked with cto8 as first byte.
// So, a call to a destination that is outside the buffer
// must not conflict with the mark.
// Note that unsigned comparison checks both edges of buffer.
for (ic = 0; ic < size - 5; ic++) for (ic = 0; ic < size - 5; ic++)
if (COND(b,ic) && get_le32(b+ic+1)+ic+1 >= size) if (COND(b,ic) && get_le32(b+ic+1)+ic+1 >= size)
{ {
@@ -74,6 +79,8 @@ static int F(Filter *f)
// try to detect 'real' calls only // try to detect 'real' calls only
if (jc < size) if (jc < size)
{ {
if ((1u<<24)<=(jc+addvalue)) // hi 8 bits won't be cto8
return 1; // fail - buffer not restored
#ifdef U #ifdef U
set_be32(b+ic+1,jc+addvalue+cto); set_be32(b+ic+1,jc+addvalue+cto);
#endif #endif
+8 -7
View File
@@ -2,9 +2,9 @@
This file is part of the UPX executable compressor. This file is part of the UPX executable compressor.
Copyright (C) 1996-2002 Markus Franz Xaver Johannes Oberhumer Copyright (C) 1996-2004 Markus Franz Xaver Johannes Oberhumer
Copyright (C) 1996-2002 Laszlo Molnar Copyright (C) 1996-2004 Laszlo Molnar
Copyright (C) 2000-2002 John F. Reiser Copyright (C) 2000-2004 John F. Reiser
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
@@ -40,11 +40,11 @@ static int F(Filter *f)
#ifdef U #ifdef U
// filter // filter
upx_byte *b = f->buf; upx_byte *b = f->buf;
const unsigned addvalue = f->addvalue;
#else #else
// scan // scan
const upx_byte *b = f->buf; const upx_byte *b = f->buf;
#endif #endif
const unsigned addvalue = f->addvalue;
const unsigned size = f->buf_len; const unsigned size = f->buf_len;
unsigned ic, jc, kc; unsigned ic, jc, kc;
@@ -78,6 +78,8 @@ static int F(Filter *f)
// try to detect 'real' calls only // try to detect 'real' calls only
if (jc < size) if (jc < size)
{ {
if ((1u<<24)<=(jc+addvalue)) // hi 8 bits won't be cto8
return 1; // fail - buffer not restored
#ifdef U #ifdef U
set_be32(b+ic+1,jc+addvalue+cto); set_be32(b+ic+1,jc+addvalue+cto);
#endif #endif
@@ -134,8 +136,7 @@ static int U(Filter *f)
const unsigned size5 = f->buf_len - 5; const unsigned size5 = f->buf_len - 5;
const unsigned addvalue = f->addvalue; const unsigned addvalue = f->addvalue;
const unsigned cto = (unsigned)f->cto << 24; const unsigned cto = (unsigned)f->cto << 24;
unsigned lastcall = 0; // unsigned lastcall = 0; // lastcall is not used in COND macro
unsigned ic, jc; unsigned ic, jc;
for (ic = 0; ic < size5; ic++) for (ic = 0; ic < size5; ic++)
@@ -147,7 +148,7 @@ static int U(Filter *f)
set_le32(b+ic+1,jc-ic-1-addvalue-cto); set_le32(b+ic+1,jc-ic-1-addvalue-cto);
f->calls++; f->calls++;
ic += 4; ic += 4;
f->lastcall = lastcall = ic+1; f->lastcall = ic+1;
} }
else else
f->noncalls++; f->noncalls++;
+8 -3
View File
@@ -2,9 +2,9 @@
This file is part of the UPX executable compressor. This file is part of the UPX executable compressor.
Copyright (C) 1996-2002 Markus Franz Xaver Johannes Oberhumer Copyright (C) 1996-2004 Markus Franz Xaver Johannes Oberhumer
Copyright (C) 1996-2002 Laszlo Molnar Copyright (C) 1996-2004 Laszlo Molnar
Copyright (C) 2000-2002 John F. Reiser Copyright (C) 2000-2004 John F. Reiser
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
@@ -30,6 +30,10 @@
*/ */
#if (ACC_CC_MSC && (_MSC_VER >= 1000 && _MSC_VER < 1300))
# pragma warning(disable: 4702) // W4: unreachable code
#endif
/************************************************************************* /*************************************************************************
// filter / scan // filter / scan
@@ -131,6 +135,7 @@ static int F(Filter *f)
{ {
buf[b[ic+1]] |= 1; buf[b[ic+1]] |= 1;
} }
UNUSED(which);
if (getcto(f, buf) < 0) if (getcto(f, buf) < 0)
return -1; return -1;
+6 -4
View File
@@ -2,9 +2,9 @@
This file is part of the UPX executable compressor. This file is part of the UPX executable compressor.
Copyright (C) 1996-2002 Markus Franz Xaver Johannes Oberhumer Copyright (C) 1996-2004 Markus Franz Xaver Johannes Oberhumer
Copyright (C) 1996-2002 Laszlo Molnar Copyright (C) 1996-2004 Laszlo Molnar
Copyright (C) 2000-2002 John F. Reiser Copyright (C) 2000-2004 John F. Reiser
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
@@ -40,11 +40,11 @@ static int F(Filter *f)
#ifdef U #ifdef U
// filter // filter
upx_byte *b = f->buf; upx_byte *b = f->buf;
const unsigned addvalue = f->addvalue;
#else #else
// scan // scan
const upx_byte *b = f->buf; const upx_byte *b = f->buf;
#endif #endif
const unsigned addvalue = f->addvalue;
const unsigned size = f->buf_len; const unsigned size = f->buf_len;
unsigned const id = f->id; unsigned const id = f->id;
@@ -79,6 +79,8 @@ static int F(Filter *f)
// try to detect 'real' calls only // try to detect 'real' calls only
if (jc < size) if (jc < size)
{ {
if ((1u<<24)<=(jc+addvalue)) // hi 8 bits won't be cto8
return 1; // fail - buffer not restored
#ifdef U #ifdef U
set_be32(b+ic+1,jc+addvalue+cto); set_be32(b+ic+1,jc+addvalue+cto);
#endif #endif
+2 -2
View File
@@ -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-2002 Markus Franz Xaver Johannes Oberhumer Copyright (C) 1996-2004 Markus Franz Xaver Johannes Oberhumer
Copyright (C) 1996-2002 Laszlo Molnar Copyright (C) 1996-2004 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
+2 -2
View File
@@ -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-2002 Markus Franz Xaver Johannes Oberhumer Copyright (C) 1996-2004 Markus Franz Xaver Johannes Oberhumer
Copyright (C) 1996-2002 Laszlo Molnar Copyright (C) 1996-2004 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
+155
View File
@@ -0,0 +1,155 @@
/* ppcbxx.h -- PowerPC Branch trick
This file is part of the UPX executable compressor.
Copyright (C) 1996-2004 Markus Franz Xaver Johannes Oberhumer
Copyright (C) 1996-2004 Laszlo Molnar
Copyright (C) 2004-2005 John F. Reiser
All Rights Reserved.
UPX and the UCL library are free software; you can redistribute them
and/or modify them under the terms of the GNU General Public License as
published by the Free Software Foundation; either version 2 of
the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; see the file COPYING.
If not, write to the Free Software Foundation, Inc.,
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
Markus F.X.J. Oberhumer Laszlo Molnar
<mfx@users.sourceforge.net> <ml1050@users.sourceforge.net>
John F. Reiser
<jreiser@users.sourceforge.net>
*/
/*************************************************************************
// filter / scan
**************************************************************************/
#define W_CTO 4 /* width of cto; must match stub/ppc_bxx.S */
static int F(Filter *f)
{
#ifdef U
// filter
upx_byte *b = f->buf;
const unsigned addvalue = f->addvalue;
#else
// scan
const upx_byte *b = f->buf;
#endif
const unsigned size = umin(f->buf_len, -(~0u<<(32 - (6+ W_CTO))));
const unsigned size4 = size -4;
unsigned ic;
unsigned calls = 0, noncalls = 0;
unsigned lastnoncall = size, lastcall = 0;
// find 26-2-W_CTO bits of displacements that contain no targets
{
unsigned char buf[256];
unsigned short wbuf[256];
const size_t WW = (size_t)0 - (~(size_t)0) << W_CTO; // ???
memset(wbuf, 0, sizeof(wbuf));
memset(buf , 0, WW);
memset(buf + WW, 1, 256 - WW);
for (ic = 0; ic<=size4; ic+=4) if (COND(b,ic)) {
unsigned const off = (int)(get_be32(b+ic)<<6) >>6;
if (size <= (off & (~0u<<2))+ic) {
buf[(~(~0u<<W_CTO)) & (off>>(26 - W_CTO))] |= 1;
++wbuf[0xff&(off>>18)];
}
}
if (getcto(f, buf) < 0) {
if (0!=W_CTO) // FIXME: what is this ???
return -1;
f->cto = 0;
}
}
const unsigned char cto8 = f->cto;
#ifdef U
const unsigned cto = (unsigned)f->cto << (24+2 - W_CTO);
#endif
for (ic = 0; ic<=size4; ic+=4) if (COND(b,ic)) {
unsigned const word = get_be32(b+ic);
unsigned const off = (int)(word<<6) >>6;
unsigned const jc = (off & (~0u<<2))+ic;
// try to detect 'real' calls only
if (jc < size) {
#ifdef U
set_be32(b+ic,(0xfc000003&word) | (jc+addvalue+cto));
#endif
calls++;
lastcall = ic;
}
else {
assert(0==W_CTO // FIXME: what is this ???
|| (~(~0u<<W_CTO) & (word>>(24+2 - W_CTO))) != cto8); // this should not happen
lastnoncall = ic;
noncalls++;
}
}
f->calls = calls;
f->noncalls = noncalls;
f->lastcall = lastcall;
#if 0
printf("\ncalls=%d noncalls=%d text_size=%x calltrickoffset=%x\n",
calls,noncalls,size,cto8);
#endif
return 0;
}
/*************************************************************************
// unfilter
**************************************************************************/
#ifdef U
static int U(Filter *f)
{
upx_byte *b = f->buf;
const unsigned size4 = umin(f->buf_len - 4, -(~0u<<(32 - (6+ W_CTO))));
const unsigned addvalue = f->addvalue;
unsigned ic;
for (ic = 0; ic<=size4; ic+=4) if (COND(b,ic)) {
unsigned const word = get_be32(b+ic);
if ((~(~0u<<W_CTO) & (word>>(24+2 - W_CTO))) == f->cto) {
unsigned const jc = word & (~(~0u<<(26 - W_CTO)) & (~0u<<2));
set_be32(b+ic, (0xfc000003&word)|(0x03fffffc&(jc-ic-addvalue)));
f->calls++;
f->lastcall = ic;
}
else {
f->noncalls++;
}
}
return 0;
}
#endif
#undef F
#undef U
#undef W_CTO
/*
vi:ts=4:et:nowrap
*/
+2 -2
View File
@@ -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-2002 Markus Franz Xaver Johannes Oberhumer Copyright (C) 1996-2004 Markus Franz Xaver Johannes Oberhumer
Copyright (C) 1996-2002 Laszlo Molnar Copyright (C) 1996-2004 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
+2 -2
View File
@@ -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-2002 Markus Franz Xaver Johannes Oberhumer Copyright (C) 1996-2004 Markus Franz Xaver Johannes Oberhumer
Copyright (C) 1996-2002 Laszlo Molnar Copyright (C) 1996-2004 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
+2 -2
View File
@@ -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-2002 Markus Franz Xaver Johannes Oberhumer Copyright (C) 1996-2004 Markus Franz Xaver Johannes Oberhumer
Copyright (C) 1996-2002 Laszlo Molnar Copyright (C) 1996-2004 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
+2 -2
View File
@@ -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-2002 Markus Franz Xaver Johannes Oberhumer Copyright (C) 1996-2004 Markus Franz Xaver Johannes Oberhumer
Copyright (C) 1996-2002 Laszlo Molnar Copyright (C) 1996-2004 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
+2 -2
View File
@@ -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-2002 Markus Franz Xaver Johannes Oberhumer Copyright (C) 1996-2004 Markus Franz Xaver Johannes Oberhumer
Copyright (C) 1996-2002 Laszlo Molnar Copyright (C) 1996-2004 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
+28 -3
View File
@@ -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-2002 Markus Franz Xaver Johannes Oberhumer Copyright (C) 1996-2004 Markus Franz Xaver Johannes Oberhumer
Copyright (C) 1996-2002 Laszlo Molnar Copyright (C) 1996-2004 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
@@ -29,6 +29,12 @@
#include "conf.h" #include "conf.h"
#include "filter.h" #include "filter.h"
static unsigned
umin(unsigned const a, unsigned const b)
{
return (a<=b) ? a : b;
}
#define set_dummy(p, v) ((void)0) #define set_dummy(p, v) ((void)0)
#define get_8(p) (*(p)) #define get_8(p) (*(p))
@@ -145,6 +151,19 @@
#undef COND_CALL #undef COND_CALL
/*************************************************************************
// PowerPC branch [incl. call] trick
**************************************************************************/
#define COND(b,x) (18==(get_be32(b+x)>>26))
#define F f_ppcbxx
#define U u_ppcbxx
#include "filter/ppcbxx.h"
#define F s_ppcbxx
#include "filter/ppcbxx.h"
#undef COND
/************************************************************************* /*************************************************************************
// database for use in class Filter // database for use in class Filter
**************************************************************************/ **************************************************************************/
@@ -205,6 +224,9 @@ const FilterImp::FilterEntry FilterImp::filters[] = {
{ 0x46, 6, 0x00ffffff, f_ctok32_e8e9_bswap_le, u_ctok32_e8e9_bswap_le, s_ctok32_e8e9_bswap_le }, { 0x46, 6, 0x00ffffff, f_ctok32_e8e9_bswap_le, u_ctok32_e8e9_bswap_le, s_ctok32_e8e9_bswap_le },
{ 0x49, 6, 0x00ffffff, f_ctok32_e8e9_bswap_le, u_ctok32_e8e9_bswap_le, s_ctok32_e8e9_bswap_le }, { 0x49, 6, 0x00ffffff, f_ctok32_e8e9_bswap_le, u_ctok32_e8e9_bswap_le, s_ctok32_e8e9_bswap_le },
// 24-bit calltrick for arm
{ 0x50, 8, 0x01ffffff, f_ct24arm_le, u_ct24arm_le, s_ct24arm_le },
// 32-bit cto calltrick with jmp and jcc(swap 0x0f/0x8Y) and relative renumbering // 32-bit cto calltrick with jmp and jcc(swap 0x0f/0x8Y) and relative renumbering
{ 0x80, 8, 0x00ffffff, f_ctojr32_e8e9_bswap_le, u_ctojr32_e8e9_bswap_le, s_ctojr32_e8e9_bswap_le }, { 0x80, 8, 0x00ffffff, f_ctojr32_e8e9_bswap_le, u_ctojr32_e8e9_bswap_le, s_ctojr32_e8e9_bswap_le },
{ 0x81, 8, 0x00ffffff, f_ctojr32_e8e9_bswap_le, u_ctojr32_e8e9_bswap_le, s_ctojr32_e8e9_bswap_le }, { 0x81, 8, 0x00ffffff, f_ctojr32_e8e9_bswap_le, u_ctojr32_e8e9_bswap_le, s_ctojr32_e8e9_bswap_le },
@@ -230,9 +252,12 @@ const FilterImp::FilterEntry FilterImp::filters[] = {
{ 0xb1,99, 0, f_sub32_2, u_sub32_2, s_sub32_2 }, { 0xb1,99, 0, f_sub32_2, u_sub32_2, s_sub32_2 },
{ 0xb2,99, 0, f_sub32_3, u_sub32_3, s_sub32_3 }, { 0xb2,99, 0, f_sub32_3, u_sub32_3, s_sub32_3 },
{ 0xb3,99, 0, f_sub32_4, u_sub32_4, s_sub32_4 }, { 0xb3,99, 0, f_sub32_4, u_sub32_4, s_sub32_4 },
// PowerPC branch+call trick
{ 0xd0, 8, 0, f_ppcbxx, u_ppcbxx, s_ppcbxx },
}; };
const int FilterImp::n_filters = HIGH(filters); const int FilterImp::n_filters = TABLESIZE(filters);
/* /*
+51 -42
View File
@@ -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-2002 Markus Franz Xaver Johannes Oberhumer Copyright (C) 1996-2006 Markus Franz Xaver Johannes Oberhumer
Copyright (C) 1996-2002 Laszlo Molnar Copyright (C) 1996-2006 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
@@ -48,11 +48,11 @@ 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, 2002\n" " Copyright (C) 1996,1997,1998,1999,2000,2001,2002,2003,2004,2005,2006\n"
"UPX %-12s Markus F.X.J. Oberhumer & Laszlo Molnar %20s\n\n", "UPX %-10s Markus Oberhumer, Laszlo Molnar & John Reiser %14s\n\n",
#if defined(__MFX_DOS) #if (ACC_OS_DOS16 || ACC_OS_DOS32)
V("d"), V("d"),
#elif defined(__MFX_WIN32) #elif (ACC_OS_WIN16 || ACC_OS_WIN32 || ACC_OS_WIN64)
V("w"), V("w"),
#elif 0 && defined(__linux__) #elif 0 && defined(__linux__)
V("l"), V("l"),
@@ -62,6 +62,8 @@ void show_head(void)
UPX_VERSION_DATE); UPX_VERSION_DATE);
fg = con_fg(f,fg); fg = con_fg(f,fg);
#undef V #undef V
UNUSED(fg);
} }
@@ -103,7 +105,7 @@ void show_help(int x)
" -d decompress -l list compressed file\n" " -d decompress -l list compressed file\n"
" -t test compressed file -V display version number\n" " -t test compressed file -V display version number\n"
" -h give %s help -L display software license\n%s", " -h give %s help -L display software license\n%s",
x == 0 ? "" : " --best compress best (can be very slow for big files)\n", x == 0 ? "" : " --best compress best (can be slow for big files)\n",
x == 0 ? "more" : "this", x == 0 ? "" : "\n"); x == 0 ? "more" : "this", x == 0 ? "" : "\n");
fg = con_fg(f,FG_YELLOW); fg = con_fg(f,FG_YELLOW);
@@ -138,17 +140,15 @@ void show_help(int x)
fg = con_fg(f,fg); fg = con_fg(f,fg);
con_fprintf(f, con_fprintf(f,
" --overlay=copy copy any extra data attached to the file [default]\n" " --overlay=copy copy any extra data attached to the file [default]\n"
" --overlay=strip strip any extra data attached to the file [dangerous]\n" " --overlay=strip strip any extra data attached to the file [DANGEROUS]\n"
" --overlay=skip don't compress a file with an overlay\n" " --overlay=skip don't compress a file with an overlay\n"
"\n"); "\n");
#if 1
fg = con_fg(f,FG_YELLOW); fg = con_fg(f,FG_YELLOW);
con_fprintf(f,"Options for atari/tos:\n"); con_fprintf(f,"Options for atari/tos:\n");
fg = con_fg(f,fg); fg = con_fg(f,fg);
con_fprintf(f, con_fprintf(f,
" --all-methods try all available compression methods\n" " --all-methods try all available compression methods\n"
"\n"); "\n");
#endif
fg = con_fg(f,FG_YELLOW); fg = con_fg(f,FG_YELLOW);
con_fprintf(f,"Options for djgpp2/coff:\n"); con_fprintf(f,"Options for djgpp2/coff:\n");
fg = con_fg(f,fg); fg = con_fg(f,fg);
@@ -190,16 +190,15 @@ void show_help(int x)
" --script=/path/upxX use path/upxX as decompressor\n" " --script=/path/upxX use path/upxX as decompressor\n"
"\n"); "\n");
#endif #endif
#if 1
fg = con_fg(f,FG_YELLOW); fg = con_fg(f,FG_YELLOW);
con_fprintf(f,"Options for ps1/exe:\n"); con_fprintf(f,"Options for ps1/exe:\n");
fg = con_fg(f,fg); fg = con_fg(f,fg);
con_fprintf(f, con_fprintf(f,
" --all-methods try all available compression methods\n" " --all-methods try all available compression methods\n"
" --no-align don't align to mode2 sector format\n" " --8-bit uses 8 bit size compression [default: 32 bit]\n"
" --console-run enables client/host transfer compatibility\n"
" --no-align don't align to 2048 bytes [enables: --console-run]\n"
"\n"); "\n");
#endif
#if 1
fg = con_fg(f,FG_YELLOW); fg = con_fg(f,FG_YELLOW);
con_fprintf(f,"Options for tmt/adam:\n"); con_fprintf(f,"Options for tmt/adam:\n");
fg = con_fg(f,fg); fg = con_fg(f,fg);
@@ -207,16 +206,13 @@ void show_help(int x)
" --all-methods try all available compression methods\n" " --all-methods try all available compression methods\n"
" --all-filters try all available preprocessing filters\n" " --all-filters try all available preprocessing filters\n"
"\n"); "\n");
#endif
#if 1
fg = con_fg(f,FG_YELLOW); fg = con_fg(f,FG_YELLOW);
con_fprintf(f,"Options for [b]vmlinuz/386\n"); con_fprintf(f,"Options for vmlinuz/386\n");
fg = con_fg(f,fg); fg = con_fg(f,fg);
con_fprintf(f, con_fprintf(f,
" --all-methods try all available compression methods\n" " --all-methods try all available compression methods\n"
" --all-filters try all available preprocessing filters\n" " --all-filters try all available preprocessing filters\n"
"\n"); "\n");
#endif
fg = con_fg(f,FG_YELLOW); fg = con_fg(f,FG_YELLOW);
con_fprintf(f,"Options for watcom/le:\n"); con_fprintf(f,"Options for watcom/le:\n");
fg = con_fg(f,fg); fg = con_fg(f,fg);
@@ -247,25 +243,34 @@ void show_help(int x)
con_fprintf(f,"This version supports:\n"); con_fprintf(f,"This version supports:\n");
fg = con_fg(f,fg); fg = con_fg(f,fg);
con_fprintf(f," " con_fprintf(f," "
"atari/tos, " // TODO:
"bvmlinuz/386, " // support for mach/ppc32
"djgpp2/coff, " // support for linux elf/ppc32
"dos/com, " // support for linux elf/amd64
"dos/exe, " " arm/pe,"
"dos/sys,\n " " atari/tos,"
//"elks/8086, " " bvmlinuz/386,"
"linux/386, " " djgpp2/coff,"
"linux/elf386, " " dos/com,"
"linux/sh386, " " dos/exe,"
"ps1/exe, " " dos/sys,"
"rtm32/pe, " "\n "
"tmt/adam,\n " //" elks/8086,"
"vmlinuz/386, " " linux/amd64,"
"watcom/le, " " linux/i386,"
//"win16/ne, " " linux/ppc32,"
"win32/pe" " mach/ppc32,"
" ps1/exe,"
" rtm32/pe,"
"\n "
" tmt/adam,"
" vmlinux/386,"
" vmlinuz/386,"
" watcom/le,"
//" win16/ne,"
" win32/pe"
"\n\nUPX comes with ABSOLUTELY NO WARRANTY; for details visit http://upx.sf.net\n" "\n\nUPX comes with ABSOLUTELY NO WARRANTY; for details visit http://upx.sf.net\n"
//"\n\nUPX comes with ABSOLUTELY NO WARRANTY; for details type `upx -L'.\n" // "\n\nUPX comes with ABSOLUTELY NO WARRANTY; for details type `upx -L'.\n"
""); "");
@@ -281,6 +286,8 @@ void show_help(int x)
"\n"); "\n");
fg = con_fg(f,fg); fg = con_fg(f,fg);
#endif #endif
UNUSED(fg);
} }
@@ -320,6 +327,8 @@ void show_license(void)
" <mfx@users.sourceforge.net> <ml1050@users.sourceforge.net>\n" " <mfx@users.sourceforge.net> <ml1050@users.sourceforge.net>\n"
); );
fg = con_fg(f,fg); fg = con_fg(f,fg);
UNUSED(fg);
} }
@@ -332,8 +341,8 @@ void show_version(int x)
FILE *f = stdout; FILE *f = stdout;
UNUSED(x); UNUSED(x);
#if 0 && defined(__GNUC__) #if (0 && ACC_CC_GNUC)
fprintf(f,"upx %s (gcc 0x%lx)\n", UPX_VERSION_STRING, __GNUC_VERSION_HEX__); fprintf(f,"upx %s (gcc 0x%06lx)\n", UPX_VERSION_STRING, ACC_CC_GNUC);
#else #else
fprintf(f,"upx %s\n", UPX_VERSION_STRING); fprintf(f,"upx %s\n", UPX_VERSION_STRING);
#endif #endif
@@ -343,10 +352,10 @@ void show_version(int x)
#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-2002 Markus Franz Xaver Johannes Oberhumer\n"); fprintf(f,"Copyright (C) 1996-2006 Markus Franz Xaver Johannes Oberhumer\n");
fprintf(f,"Copyright (C) 1996-2002 Laszlo Molnar\n"); fprintf(f,"Copyright (C) 1996-2006 Laszlo Molnar\n");
fprintf(f,"Copyright (C) 2000-2002 John F. Reiser\n"); fprintf(f,"Copyright (C) 2000-2006 John F. Reiser\n");
fprintf(f,"Copyright (C) 2002 Jens Medoch\n"); fprintf(f,"Copyright (C) 2002-2006 Jens Medoch\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);
} }
+2 -2
View File
@@ -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-2002 Markus Franz Xaver Johannes Oberhumer Copyright (C) 1996-2004 Markus Franz Xaver Johannes Oberhumer
Copyright (C) 1996-2002 Laszlo Molnar Copyright (C) 1996-2004 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
+4 -4
View File
@@ -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-2002 Markus Franz Xaver Johannes Oberhumer Copyright (C) 1996-2004 Markus Franz Xaver Johannes Oberhumer
Copyright (C) 1996-2002 Laszlo Molnar Copyright (C) 1996-2004 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
@@ -219,8 +219,8 @@ protected:
private: private:
// disable copy and assignment // disable copy and assignment
LeFile(LeFile const &); // {} LeFile(const LeFile &); // {}
LeFile& operator= (LeFile const &); // { return *this; } LeFile& operator= (const LeFile &); // { return *this; }
}; };
+53 -25
View File
@@ -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-2002 Markus Franz Xaver Johannes Oberhumer Copyright (C) 1996-2005 Markus Franz Xaver Johannes Oberhumer
Copyright (C) 1996-2002 Laszlo Molnar Copyright (C) 1996-2005 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,33 +22,47 @@
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 markus@oberhumer.com ml1050@users.sourceforge.net
*/ */
#include "conf.h" #include "conf.h"
#include "linker.h" #include "linker.h"
class LinkerLabel
{
enum { LINKER_MAX_LABEL_LEN = 32 };
char label[LINKER_MAX_LABEL_LEN + 1];
public:
unsigned set(const char *l)
{
strncpy(label, l, sizeof(label));
return strlen(label) + 1;
}
operator const char *() const { return label; }
};
struct Linker::section struct Linker::section
{ {
int istart; int istart;
int ostart; int ostart;
int len; int len;
char name[8]; LinkerLabel name;
}; };
struct Linker::jump struct Linker::jump
{ {
int pos; int pos;
int len; int len;
char tsect[8];
int toffs; int toffs;
LinkerLabel tsect;
}; };
Linker::Linker(const void *pdata, int plen, int pinfo) Linker::Linker(const void *pdata, int plen, int pinfo)
{ {
iloader = new char[(ilen = plen) + 4096]; iloader = new char[(ilen = plen) + 8192];
memcpy(iloader,pdata,plen); memcpy(iloader,pdata,plen);
oloader = new char[plen]; oloader = new char[plen];
olen = 0; olen = 0;
@@ -57,18 +71,19 @@ Linker::Linker(const void *pdata, int plen, int pinfo)
info = pinfo; info = pinfo;
njumps = nsections = frozen = 0; njumps = nsections = frozen = 0;
jumps = new jump[200]; jumps = new jump[200];
sections = new section[200]; #define NSECTIONS 550
sections = new section[NSECTIONS];
char *p = iloader + info; char *p = iloader + info;
while (get32(p) != (unsigned)(-1)) while (get32(p) != (unsigned)(-1))
{ {
if (get32(p)) if (get32(p))
{ {
memcpy(sections[nsections].name,p,8); p += sections[nsections].name.set(p);
sections[nsections].istart = get32(p+8); sections[nsections].istart = get32(p);
sections[nsections++].ostart = -1; sections[nsections++].ostart = -1;
p += 12; p += 4;
assert(nsections < 200); assert(nsections < NSECTIONS);
} }
else else
{ {
@@ -78,9 +93,9 @@ Linker::Linker(const void *pdata, int plen, int pinfo)
jumps[njumps].pos = l+1; jumps[njumps].pos = l+1;
jumps[njumps].len = get32(p+4)-jumps[njumps].pos; jumps[njumps].len = get32(p+4)-jumps[njumps].pos;
memcpy(jumps[njumps].tsect,p+8,8); p += 8 + jumps[njumps].tsect.set(p + 8);
jumps[njumps++].toffs = get32(p+16); jumps[njumps++].toffs = get32(p);
p += 20; p += 4;
assert(njumps < 200); assert(njumps < 200);
} }
} }
@@ -111,11 +126,21 @@ static int hex(char c)
return (c & 0xf) + (c > '9' ? 9 : 0); return (c & 0xf) + (c > '9' ? 9 : 0);
} }
int Linker::addSection(const char *sect) int Linker::addSection(const char *psect)
{ {
int ic; if (psect[0] == 0)
while (*sect) return olen;
char *begin = strdup(psect);
char *end = begin + strlen(begin);
for (char *sect = begin; sect < end; )
{ {
for (char *tokend = sect; *tokend; tokend++)
if (*tokend == ' ' || *tokend == ',')
{
*tokend = 0;
break;
}
if (*sect == '+') // alignment if (*sect == '+') // alignment
{ {
if (sect[1] == '0') if (sect[1] == '0')
@@ -130,19 +155,22 @@ int Linker::addSection(const char *sect)
} }
else else
{ {
int ic;
for (ic = 0; ic < nsections; ic++) for (ic = 0; ic < nsections; ic++)
if (memcmp(sect,sections[ic].name,8) == 0) if (strcmp(sect, sections[ic].name) == 0)
{ {
memcpy(oloader+olen,iloader+sections[ic].istart,sections[ic].len); memcpy(oloader+olen,iloader+sections[ic].istart,sections[ic].len);
sections[ic].ostart = olen; sections[ic].ostart = olen;
olen += sections[ic].len; olen += sections[ic].len;
break; break;
} }
//printf("%8.8s",sect); if (ic == nsections)
assert(ic!=nsections); printf("%s", sect);
assert(ic != nsections);
} }
sect += 8; sect += strlen(sect) + 1;
} }
free(begin);
return olen; return olen;
} }
@@ -150,11 +178,11 @@ int Linker::addSection(const char *sect)
void Linker::addSection(const char *sname, const void *sdata, unsigned len) void Linker::addSection(const char *sname, const void *sdata, unsigned len)
{ {
// add a new section - can be used for adding stuff like ident or header // add a new section - can be used for adding stuff like ident or header
memcpy(sections[nsections].name,sname,8); sections[nsections].name.set(sname);
sections[nsections].istart = ilen; sections[nsections].istart = ilen;
sections[nsections].len = len; sections[nsections].len = len;
sections[nsections++].ostart = olen; sections[nsections++].ostart = olen;
assert(nsections < 200); assert(nsections < NSECTIONS);
memcpy(iloader+ilen,sdata,len); memcpy(iloader+ilen,sdata,len);
ilen += len; ilen += len;
} }
@@ -176,7 +204,7 @@ const char *Linker::getLoader(int *llen)
continue; continue;
for (kc = 0; kc < nsections-1; kc++) for (kc = 0; kc < nsections-1; kc++)
if (memcmp(jumps[ic].tsect,sections[kc].name,8) == 0) if (strcmp(jumps[ic].tsect,sections[kc].name) == 0)
break; break;
assert(kc!=nsections-1); assert(kc!=nsections-1);
@@ -202,7 +230,7 @@ int Linker::getSection(const char *name, int *slen) const
if (!frozen) if (!frozen)
return -1; return -1;
for (int ic = 0; ic < nsections; ic++) for (int ic = 0; ic < nsections; ic++)
if (memcmp(name,sections[ic].name,8) == 0) if (strcmp(name, sections[ic].name) == 0)
{ {
if (slen) if (slen)
*slen = sections[ic].len; *slen = sections[ic].len;
+6 -6
View File
@@ -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-2002 Markus Franz Xaver Johannes Oberhumer Copyright (C) 1996-2004 Markus Franz Xaver Johannes Oberhumer
Copyright (C) 1996-2002 Laszlo Molnar Copyright (C) 1996-2004 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
@@ -64,8 +64,8 @@ private:
private: private:
// disable copy and assignment // disable copy and assignment
Linker(Linker const &); // {} Linker(const Linker &); // {}
Linker& operator= (Linker const &); // { return *this; } Linker& operator= (const Linker &); // { return *this; }
}; };
@@ -83,8 +83,8 @@ protected:
private: private:
// disable copy and assignment // disable copy and assignment
BeLinker(BeLinker const &); // {} BeLinker(const BeLinker &); // {}
BeLinker& operator= (BeLinker const &); // { return *this; } BeLinker& operator= (const BeLinker &); // { return *this; }
}; };
+209 -156
View File
@@ -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-2002 Markus Franz Xaver Johannes Oberhumer Copyright (C) 1996-2006 Markus Franz Xaver Johannes Oberhumer
Copyright (C) 1996-2002 Laszlo Molnar Copyright (C) 1996-2006 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
@@ -56,24 +56,26 @@ void init_options(struct options_t *o)
o->overlay = -1; o->overlay = -1;
o->console = CON_FILE; o->console = CON_FILE;
#if defined(__MFX_DOS) || defined(__MFX_WIN) #if defined(__DJGPP__)
o->console = CON_INIT;
#elif defined(USE_SCREEN_WIN32)
o->console = CON_INIT; o->console = CON_INIT;
#elif 1 && defined(__linux__) #elif 1 && defined(__linux__)
o->console = CON_INIT; o->console = CON_INIT;
#endif #endif
o->verbose = 2; o->verbose = 2;
o->w32pe.compress_exports = 1; o->win32_pe.compress_exports = 1;
o->w32pe.compress_icons = 2; o->win32_pe.compress_icons = 2;
o->w32pe.compress_resources = -1; o->win32_pe.compress_resources = -1;
for (unsigned i = 0; i < HIGH(opt->w32pe.compress_rt); i++) for (unsigned i = 0; i < TABLESIZE(o->win32_pe.compress_rt); i++)
opt->w32pe.compress_rt[i] = -1; o->win32_pe.compress_rt[i] = -1;
opt->w32pe.compress_rt[24] = false; // 24 == RT_MANIFEST o->win32_pe.compress_rt[24] = false; // 24 == RT_MANIFEST
o->w32pe.strip_relocs = -1; o->win32_pe.strip_relocs = -1;
} }
static struct options_t global_options; static struct options_t global_options;
struct options_t * volatile opt = &global_options; struct options_t *opt = &global_options;
static int done_output_name = 0; static int done_output_name = 0;
static int done_script_name = 0; static int done_script_name = 0;
@@ -92,7 +94,7 @@ static int exit_code = EXIT_OK;
**************************************************************************/ **************************************************************************/
#if defined(__GNUC__) #if defined(__GNUC__)
static void do_exit(void) __attribute__((noreturn)); static void do_exit(void) __attribute__((__noreturn__));
#endif #endif
static void do_exit(void) static void do_exit(void)
{ {
@@ -206,7 +208,7 @@ void e_envopt(const char *n)
#endif /* defined(OPTIONS_VAR) */ #endif /* defined(OPTIONS_VAR) */
RETSIGTYPE SIGTYPEENTRY e_sighandler(int signum) void __acc_cdecl_sighandler e_sighandler(int signum)
{ {
UNUSED(signum); UNUSED(signum);
e_exit(EXIT_FATAL); e_exit(EXIT_FATAL);
@@ -278,7 +280,7 @@ static void set_term(FILE *f)
if (f) if (f)
con_term = f; con_term = f;
else else
con_term = isafile(STDIN_FILENO) ? stderr : stdout; con_term = acc_isatty(STDIN_FILENO) ? stderr : stdout;
} }
@@ -319,7 +321,7 @@ static void set_output_name(const char *n, bool allow_m)
fprintf(stderr,"%s: missing output name\n",argv0); fprintf(stderr,"%s: missing output name\n",argv0);
e_usage(); e_usage();
} }
if (strlen(n) >= PATH_MAX - 4) if (strlen(n) >= ACC_FN_PATH_MAX - 4)
{ {
fprintf(stderr,"%s: output name too long\n",argv0); fprintf(stderr,"%s: output name too long\n",argv0);
e_usage(); e_usage();
@@ -342,12 +344,12 @@ 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) >= (size_t)opt->unix.SCRIPT_MAX - 3) if (strlen(n) >= (size_t)opt->o_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();
} }
opt->unix.script_name = n; opt->o_unix.script_name = n;
done_script_name++; done_script_name++;
} }
@@ -401,7 +403,7 @@ char* prepare_shortopts(char *buf, const char *n,
template <class T> template <class T>
int getoptvar(T *var, T minval, T maxval) int getoptvar(T *var, const T minval, const T maxval)
{ {
const char *p = mfx_optarg; const char *p = mfx_optarg;
char *endptr; char *endptr;
@@ -441,7 +443,7 @@ static int do_option(int optc, const char *arg)
set_cmd(CMD_DECOMPRESS); set_cmd(CMD_DECOMPRESS);
break; break;
case 'D': case 'D':
opt->debug++; opt->debug.debug_level++;
break; break;
case 'f': case 'f':
opt->force++; opt->force++;
@@ -528,12 +530,30 @@ static int do_option(int optc, const char *arg)
opt->method = -1; opt->method = -1;
opt->all_filters = true; opt->all_filters = true;
opt->filter = -1; opt->filter = -1;
opt->crp.m_size = 999999;
/* fallthrough */ /* fallthrough */
case 900: // --best case 900: // --best
if (!set_method(-1, 10)) if (!set_method(-1, 10))
e_method(opt->method, 10); e_method(opt->method, 10);
break; break;
// debug
case 542:
if (!mfx_optarg || strlen(mfx_optarg) != 4)
e_optarg(arg);
memcpy(opt->debug.fake_stub_version, mfx_optarg, 4);
break;
case 543:
if (!mfx_optarg || strlen(mfx_optarg) != 4)
e_optarg(arg);
memcpy(opt->debug.fake_stub_year, mfx_optarg, 4);
break;
case 544:
if (!mfx_optarg || !mfx_optarg[0])
e_optarg(arg);
opt->debug.dump_stub_loader = mfx_optarg;
break;
// misc // misc
case 512: case 512:
opt->console = CON_FILE; opt->console = CON_FILE;
@@ -563,6 +583,7 @@ static int do_option(int optc, const char *arg)
case 522: // --no-filter case 522: // --no-filter
opt->filter = 0; opt->filter = 0;
opt->all_filters = false; opt->all_filters = false;
opt->no_filter = true;
break; break;
case 523: // --all-filters case 523: // --all-filters
opt->all_filters = true; opt->all_filters = true;
@@ -592,7 +613,7 @@ 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:
if (getoptvar(&opt->crp.m_size, 10000u, (unsigned)999999u) != 0) if (getoptvar(&opt->crp.m_size, 10000u, 999999u) != 0)
e_optval("--crp-ms="); e_optval("--crp-ms=");
break; break;
// backup // backup
@@ -645,58 +666,74 @@ static int do_option(int optc, const char *arg)
break; break;
// //
case 600: case 600:
opt->dos.force_stub = true; opt->dos_exe.force_stub = true;
break; break;
case 601: case 601:
opt->dos.no_reloc = true; opt->dos_exe.no_reloc = true;
break; break;
case 610: case 610:
opt->djgpp2.coff = true; opt->djgpp2_coff.coff = true;
break; break;
case 620: case 620:
opt->wcle.le = true; opt->watcom_le.le = true;
break; break;
case 630: case 630:
opt->w32pe.compress_exports = 1; opt->win32_pe.compress_exports = 1;
getoptvar(&opt->w32pe.compress_exports, 0, 1); getoptvar(&opt->win32_pe.compress_exports, 0, 1);
//printf("compress_exports: %d\n", opt->w32pe.compress_exports); //printf("compress_exports: %d\n", opt->win32_pe.compress_exports);
break; break;
case 631: case 631:
opt->w32pe.compress_icons = 1; opt->win32_pe.compress_icons = 1;
getoptvar(&opt->w32pe.compress_icons, 0, 2); getoptvar(&opt->win32_pe.compress_icons, 0, 2);
//printf("compress_icons: %d\n", opt->w32pe.compress_icons); //printf("compress_icons: %d\n", opt->win32_pe.compress_icons);
break; break;
case 632: case 632:
opt->w32pe.compress_resources = true; opt->win32_pe.compress_resources = true;
if (mfx_optarg && strcmp(mfx_optarg,"0") == 0) if (mfx_optarg && strcmp(mfx_optarg,"0") == 0)
opt->w32pe.compress_resources = false; opt->win32_pe.compress_resources = false;
//printf("compress_resources: %d\n", opt->w32pe.compress_resources); //printf("compress_resources: %d\n", opt->win32_pe.compress_resources);
break; break;
case 633: case 633:
opt->w32pe.strip_relocs = 1; // opt->win32_pe.strip_loadconf - OBSOLETE - IGNORED
break;
case 634:
opt->win32_pe.strip_relocs = 1;
if (mfx_optarg && strcmp(mfx_optarg,"0") == 0) if (mfx_optarg && strcmp(mfx_optarg,"0") == 0)
opt->w32pe.strip_relocs = 0; opt->win32_pe.strip_relocs = 0;
//printf("strip_relocs: %d\n", opt->w32pe.strip_relocs); //printf("strip_relocs: %d\n", opt->win32_pe.strip_relocs);
break; break;
case 650: case 650:
opt->tos.split_segments = true; opt->atari_tos.split_segments = true;
break; break;
case 660: case 660:
getoptvar(&opt->unix.blocksize, 8192u, ~0u); getoptvar(&opt->o_unix.blocksize, 8192u, ~0u);
break; break;
case 661: case 661:
opt->unix.force_execve = true; opt->o_unix.force_execve = true;
break; break;
case 662: case 662:
opt->unix.script_name = "/usr/local/lib/upx/upxX"; opt->o_unix.script_name = "/usr/local/lib/upx/upxX";
if (mfx_optarg && mfx_optarg[0]) if (mfx_optarg && mfx_optarg[0])
set_script_name(mfx_optarg,1); set_script_name(mfx_optarg,1);
break; break;
case 663: case 663:
opt->unix.ptinterp = true; opt->o_unix.is_ptinterp = true;
break;
case 664:
opt->o_unix.use_ptinterp = true;
break;
case 665:
opt->o_unix.make_ptinterp = true;
break; break;
case 670: case 670:
opt->ps1.no_align = true; opt->ps1_exe.boot_only = true;
break;
case 671:
opt->ps1_exe.no_align = true;
opt->ps1_exe.boot_only = false;
break;
case 672:
opt->ps1_exe.do_8bit = true;
break; break;
case '\0': case '\0':
@@ -724,6 +761,7 @@ static const struct mfx_option longopts[] =
{"decompress", 0, 0, 'd'}, // decompress {"decompress", 0, 0, 'd'}, // decompress
{"fast", 0x10, 0, '1'}, // compress faster {"fast", 0x10, 0, '1'}, // compress faster
{"fileinfo", 0x10, 0, 902}, // display info about file {"fileinfo", 0x10, 0, 902}, // display info about file
{"file-info", 0x10, 0, 902}, // display info about file
{"help", 0, 0, 'h'+256}, // give help {"help", 0, 0, 'h'+256}, // give help
{"license", 0, 0, 'L'}, // display software license {"license", 0, 0, 'L'}, // display software license
{"list", 0, 0, 'l'}, // list compressed exe {"list", 0, 0, 'l'}, // list compressed exe
@@ -732,7 +770,6 @@ static const struct mfx_option longopts[] =
{"version", 0, 0, 'V'+256}, // display version number {"version", 0, 0, 'V'+256}, // display version number
// options // options
{"debug", 0x10, 0, 'D'},
{"force", 0, 0, 'f'}, // force overwrite of output files {"force", 0, 0, 'f'}, // force overwrite of output files
{"force-compress", 0, 0, 'f'}, // and compression of suspicious files {"force-compress", 0, 0, 'f'}, // and compression of suspicious files
{"info", 0, 0, 'i'}, // info mode {"info", 0, 0, 'i'}, // info mode
@@ -748,6 +785,12 @@ static const struct mfx_option longopts[] =
#endif #endif
{"verbose", 0, 0, 'v'}, // verbose mode {"verbose", 0, 0, 'v'}, // verbose mode
// debug options
{"debug", 0x10, 0, 'D'},
{"dump-stub-loader" ,0x31, 0, 544}, // for internal debugging
{"fake-stub-version",0x31, 0, 542}, // for internal debugging
{"fake-stub-year" ,0x31, 0, 543}, // for internal debugging
// backup options // backup options
{"backup", 0, 0, 'k'}, {"backup", 0, 0, 'k'},
{"keep", 0, 0, 'k'}, {"keep", 0, 0, 'k'},
@@ -805,16 +848,21 @@ static const struct mfx_option longopts[] =
#if 0 #if 0
{"script", 0x31, 0, 662}, // --script= {"script", 0x31, 0, 662}, // --script=
#endif #endif
{"ptinterp", 0, 0, 663}, // linux/elf386 PT_INTERP program {"is_ptinterp", 0, 0, 663}, // linux/elf386 PT_INTERP program
{"use_ptinterp", 0, 0, 664}, // linux/elf386 PT_INTERP program
{"make_ptinterp", 0, 0, 665}, // linux/elf386 PT_INTERP program
// watcom/le // watcom/le
{"le", 0, 0, 620}, // produce LE output {"le", 0, 0, 620}, // produce LE output
// win32/pe // win32/pe
{"compress-exports", 2, 0, 630}, {"compress-exports", 2, 0, 630},
{"compress-icons", 2, 0, 631}, {"compress-icons", 2, 0, 631},
{"compress-resources", 2, 0, 632}, {"compress-resources", 2, 0, 632},
{"strip-relocs", 2, 0, 633}, {"strip-loadconf", 0x12, 0, 633}, // OBSOLETE - IGNORED
{"strip-relocs", 0x12, 0, 634},
// ps1/exe // ps1/exe
{"no-align", 0x10, 0, 670}, {"boot-only", 0x10, 0, 670},
{"no-align", 0x10, 0, 671},
{"8-bit", 0x10, 0, 672},
{ NULL, 0, NULL, 0 } { NULL, 0, NULL, 0 }
}; };
@@ -878,11 +926,21 @@ static const struct mfx_option longopts[] =
{"mono", 0, 0, 513}, {"mono", 0, 0, 513},
{"color", 0, 0, 514}, {"color", 0, 0, 514},
// compression runtime parameters
{"crp-cf", 0x31, 0, 531},
{"crp-sl", 0x31, 0, 532},
{"crp-hl", 0x31, 0, 533},
{"crp-pl", 0x31, 0, 534},
{"crp-mo", 0x31, 0, 535},
{"crp-mm", 0x31, 0, 536},
{"crp-ms", 0x31, 0, 537},
// win32/pe // win32/pe
{"compress-exports", 2, 0, 630}, {"compress-exports", 2, 0, 630},
{"compress-icons", 2, 0, 631}, {"compress-icons", 2, 0, 631},
{"compress-resources", 2, 0, 632}, {"compress-resources", 2, 0, 632},
{"strip-relocs", 2, 0, 633}, {"strip-loadconf", 0x12, 0, 633}, // OBSOLETE - IGNORED
{"strip-relocs", 0x12, 0, 634},
{ NULL, 0, NULL, 0 } { NULL, 0, NULL, 0 }
}; };
@@ -997,103 +1055,112 @@ static void first_options(int argc, char **argv)
// assert a sane architecture and compiler // assert a sane architecture and compiler
**************************************************************************/ **************************************************************************/
template <class T> struct TestBELE {
static int test(void)
{
T allbits; allbits = 0; allbits -= 1;
T v1; v1 = 1; v1 *= 2; v1 -= 1;
T v2; v2 = 1;
assert( (v1 == v2)); assert(!(v1 != v2));
assert( (v1 <= v2)); assert( (v1 >= v2));
assert(!(v1 < v2)); assert(!(v1 > v2));
v2 ^= allbits;
assert(!(v1 == v2)); assert( (v1 != v2));
assert( (v1 <= v2)); assert(!(v1 >= v2));
assert( (v1 < v2)); assert(!(v1 > v2));
v2 += 2;
assert(v1 == 1); assert(v2 == 0);
v1 <<= 1; v1 |= v2; v1 >>= 1; v2 &= v1; v2 /= v1; v2 *= v1;
assert(v1 == 1); assert(v2 == 0);
return (v1 ^ v2) == 1;
}};
#define ACC_WANT_ACC_CHK_CH 1
#undef ACCCHK_ASSERT
#include "miniacc.h"
void upx_sanity_check(void) void upx_sanity_check(void)
{ {
COMPILE_TIME_ASSERT(sizeof(char) == 1); #define ACC_WANT_ACC_CHK_CH 1
COMPILE_TIME_ASSERT(sizeof(short) == 2); #undef ACCCHK_ASSERT
COMPILE_TIME_ASSERT(sizeof(int) == 4); #define ACCCHK_ASSERT(expr) ACC_COMPILE_TIME_ASSERT(expr)
COMPILE_TIME_ASSERT(sizeof(long) >= 4); #include "miniacc.h"
COMPILE_TIME_ASSERT(sizeof(void *) >= 4); #undef ACCCHK_ASSERT
COMPILE_TIME_ASSERT(sizeof(long) >= sizeof(void *));
COMPILE_TIME_ASSERT(sizeof(upx_int64l) >= 8); COMPILE_TIME_ASSERT(sizeof(char) == 1)
COMPILE_TIME_ASSERT(sizeof(upx_int64l) >= sizeof(long)); COMPILE_TIME_ASSERT(sizeof(short) == 2)
COMPILE_TIME_ASSERT(sizeof(upx_int64l) == sizeof(upx_uint64l)); COMPILE_TIME_ASSERT(sizeof(int) == 4)
COMPILE_TIME_ASSERT(sizeof(long) >= 4)
COMPILE_TIME_ASSERT(sizeof(void *) >= 4)
COMPILE_TIME_ASSERT(sizeof(off_t) >= sizeof(long)); COMPILE_TIME_ASSERT(sizeof(off_t) >= sizeof(long))
COMPILE_TIME_ASSERT(((off_t) -1) < 0); COMPILE_TIME_ASSERT(((off_t) -1) < 0)
COMPILE_TIME_ASSERT(sizeof(ptrdiff_t) >= sizeof(int));
COMPILE_TIME_ASSERT(((ptrdiff_t) -1) < 0);
COMPILE_TIME_ASSERT(sizeof(size_t) >= sizeof(int));
COMPILE_TIME_ASSERT(((size_t) -1) > 0);
COMPILE_TIME_ASSERT(sizeof(BE16) == 2); COMPILE_TIME_ASSERT(sizeof(BE16) == 2)
COMPILE_TIME_ASSERT(sizeof(BE32) == 4); COMPILE_TIME_ASSERT(sizeof(BE32) == 4)
COMPILE_TIME_ASSERT(sizeof(LE16) == 2); COMPILE_TIME_ASSERT(sizeof(BE64) == 8)
COMPILE_TIME_ASSERT(sizeof(LE32) == 4); COMPILE_TIME_ASSERT(sizeof(LE16) == 2)
COMPILE_TIME_ASSERT(sizeof(LE32) == 4)
COMPILE_TIME_ASSERT(sizeof(LE64) == 8)
#if defined(__GNUC__) COMPILE_TIME_ASSERT_ALIGNOF(BE16, char)
COMPILE_TIME_ASSERT(__alignof__(BE16) == 1); COMPILE_TIME_ASSERT_ALIGNOF(BE32, char)
COMPILE_TIME_ASSERT(__alignof__(BE32) == 1); COMPILE_TIME_ASSERT_ALIGNOF(BE64, char)
COMPILE_TIME_ASSERT(__alignof__(LE16) == 1); COMPILE_TIME_ASSERT_ALIGNOF(LE16, char)
COMPILE_TIME_ASSERT(__alignof__(LE32) == 1); COMPILE_TIME_ASSERT_ALIGNOF(LE32, char)
#endif COMPILE_TIME_ASSERT_ALIGNOF(LE64, char)
#if !defined(__WATCOMC__) COMPILE_TIME_ASSERT(sizeof(UPX_VERSION_STRING4) == 4 + 1)
struct align_assertion_1a_t
{
struct foo_t {
char c1;
LE16 v[4];
} __attribute_packed;
foo_t d[3];
} __attribute_packed;
struct align_assertion_1b_t
{
struct foo_t {
char c1;
char v[4*2];
} __attribute_packed;
foo_t d[3];
} __attribute_packed;
struct align_assertion_2a_t
{
struct foo_t {
char c1;
LE32 v[4];
} __attribute_packed;
foo_t d[3];
} __attribute_packed;
struct align_assertion_2b_t
{
struct foo_t {
char c1;
char v[4*4];
} __attribute_packed;
foo_t d[3];
} __attribute_packed;
//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_2a_t));
//printf("%d\n", (int) sizeof(align_assertion_2b_t));
COMPILE_TIME_ASSERT(sizeof(align_assertion_1a_t) == sizeof(align_assertion_1b_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_2a_t) == 3*17);
#endif
COMPILE_TIME_ASSERT(sizeof(UPX_VERSION_STRING4) == 4 + 1);
assert(strlen(UPX_VERSION_STRING4) == 4); assert(strlen(UPX_VERSION_STRING4) == 4);
assert(memcmp(UPX_VERSION_STRING4, UPX_VERSION_STRING, 4) == 0); assert(memcmp(UPX_VERSION_STRING4, UPX_VERSION_STRING, 4) == 0);
COMPILE_TIME_ASSERT(sizeof(UPX_VERSION_YEAR) == 4 + 1)
assert(strlen(UPX_VERSION_YEAR) == 4);
assert(memcmp(UPX_VERSION_DATE_ISO, UPX_VERSION_YEAR, 4) == 0);
assert(memcmp(UPX_VERSION_DATE + strlen(UPX_VERSION_DATE) - 4, UPX_VERSION_YEAR, 4) == 0);
const unsigned char dd[4] = { 0xff, 0xfe, 0xfd, 0xfc }; #if 1
assert(get_be16(dd) == 0xfffe); # if 1 && !defined(UPX_OFFICIAL_BUILD)
assert(get_be16_signed(dd) == -2); assert(TestBELE<LE16>::test());
assert(get_be24(dd) == 0xfffefd); assert(TestBELE<LE32>::test());
assert(get_be24_signed(dd) == -259); assert(TestBELE<LE64>::test());
assert(get_be32(dd) == 0xfffefdfc); assert(TestBELE<BE16>::test());
assert(get_be32_signed(dd) == -66052); assert(TestBELE<BE32>::test());
assert(get_le16(dd) == 0xfeff); assert(TestBELE<BE64>::test());
assert(get_le16_signed(dd) == -257); # endif
assert(get_le24(dd) == 0xfdfeff); {
assert(get_le24_signed(dd) == -131329); static const unsigned char dd[32] = { 0, 0, 0, 0, 0, 0, 0,
assert(get_le32(dd) == 0xfcfdfeff); 0xff, 0xfe, 0xfd, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8,
assert(get_le32_signed(dd) == -50462977); 0, 0, 0, 0,
assert(find_be16(dd, sizeof(dd), 0xfffe) == 0); 0x7f, 0x7e, 0x7d, 0x7c, 0x7b, 0x7a, 0x79, 0x78,
assert(find_le16(dd, sizeof(dd), 0xfeff) == 0); 0, 0, 0, 0, 0 };
assert(find_be32(dd, sizeof(dd), 0xfffefdfc) == 0); const unsigned char *d;
assert(find_le32(dd, sizeof(dd), 0xfcfdfeff) == 0); d = dd + 7;
assert(upx_adler32(d, 4) == 0x09f003f7);
assert(upx_adler32(d, 4, 0) == 0x09ec03f6);
assert(upx_adler32(d, 4, 1) == 0x09f003f7);
assert(get_be16(d) == 0xfffe);
assert(get_be16_signed(d) == -2);
assert(get_be24(d) == 0xfffefd);
assert(get_be24_signed(d) == -259);
assert(get_be32(d) == 0xfffefdfc);
assert(get_be32_signed(d) == -66052);
assert(get_le16(d) == 0xfeff);
assert(get_le16_signed(d) == -257);
assert(get_le24(d) == 0xfdfeff);
assert(get_le24_signed(d) == -131329);
assert(get_le32(d) == 0xfcfdfeff);
assert(get_le32_signed(d) == -50462977);
assert(find_be16(d, 2, 0xfffe) == 0);
assert(find_le16(d, 2, 0xfeff) == 0);
assert(find_be32(d, 4, 0xfffefdfc) == 0);
assert(find_le32(d, 4, 0xfcfdfeff) == 0);
d += 12;
assert(get_be16_signed(d) == 32638);
assert(get_be24_signed(d) == 8355453);
assert(get_be32_signed(d) == 2138996092);
}
#endif
} }
@@ -1103,7 +1170,7 @@ void upx_sanity_check(void)
#if !defined(WITH_GUI) #if !defined(WITH_GUI)
int main(int argc, char *argv[]) int __acc_cdecl_main main(int argc, char *argv[])
{ {
int i; int i;
static char default_argv0[] = "upx"; static char default_argv0[] = "upx";
@@ -1113,15 +1180,7 @@ int main(int argc, char *argv[])
// LFN=n may cause problems with 2.03's _rename and mkdir under WinME // LFN=n may cause problems with 2.03's _rename and mkdir under WinME
putenv("LFN=y"); putenv("LFN=y");
#endif #endif
#if defined(__EMX__) acc_wildargv(&argc, &argv);
_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);
@@ -1129,7 +1188,7 @@ int main(int argc, char *argv[])
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];
#if defined(DOSISH) #if (ACC_OS_CYGWIN || ACC_OS_DOS16 || ACC_OS_DOS32 || ACC_OS_EMX || ACC_OS_TOS || ACC_OS_WIN16 || ACC_OS_WIN32 || ACC_OS_WIN64)
{ {
char *prog = fn_basename(argv0); char *prog = fn_basename(argv0);
char *p; char *p;
@@ -1150,6 +1209,8 @@ int main(int argc, char *argv[])
#else #else
progname = fn_basename(argv0); progname = fn_basename(argv0);
#endif #endif
while (progname[0] == '.' && progname[1] == '/' && progname[2])
progname += 2;
set_term(stderr); set_term(stderr);
@@ -1188,7 +1249,7 @@ int main(int argc, char *argv[])
i = get_options(argc,argv); i = get_options(argc,argv);
assert(i <= argc); assert(i <= argc);
set_term(0); set_term(NULL);
// cmdline_cmd = opt->cmd; // cmdline_cmd = opt->cmd;
switch (opt->cmd) switch (opt->cmd)
{ {
@@ -1249,27 +1310,19 @@ 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_HEX < 0x020000) #if 0 && (UPX_VERSION_HEX < 0x020000)
{ {
FILE *f = stdout; FILE *f = stdout;
int fg = con_fg(f,FG_RED); int fg = con_fg(f,FG_RED);
con_fprintf(f,"\nWARNING: this is an unstable beta version - use for testing only! Really.\n"); con_fprintf(f,"\nWARNING: this is an unstable beta version - use for testing only! Really.\n");
fg = con_fg(f,fg); fg = con_fg(f,fg);
} UNUSED(fg);
#endif
#if 0 && !defined(WITH_NRV)
{
FILE *f = stdout;
int fg = con_fg(f,FG_GREEN);
con_fprintf(f,"\nINFO: this version does not use the NRV library - compression ratio is worse\n");
fg = con_fg(f,fg);
} }
#endif #endif
#if 0 && defined(__GLIBC__) #if 0 && defined(__GLIBC__)
//malloc_stats(); //malloc_stats();
#endif #endif
do_exit();
return exit_code; return exit_code;
} }
+145 -51
View File
@@ -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-2002 Markus Franz Xaver Johannes Oberhumer Copyright (C) 1996-2004 Markus Franz Xaver Johannes Oberhumer
Copyright (C) 1996-2002 Laszlo Molnar Copyright (C) 1996-2004 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
@@ -34,11 +34,40 @@
// //
**************************************************************************/ **************************************************************************/
MemBuffer::MemBuffer(unsigned size) : static int use_mcheck = -1;
ptr(NULL), alloc_ptr(NULL), alloc_size(0)
static int mcheck_init()
{ {
if (size > 0) if (use_mcheck < 0)
alloc(size, 0); {
use_mcheck = 1;
#if defined(WITH_VALGRIND) && defined(RUNNING_ON_VALGRIND)
if (RUNNING_ON_VALGRIND)
{
//fprintf(stderr, "upx: detected RUNNING_ON_VALGRIND\n");
use_mcheck = 0;
}
#endif
}
return use_mcheck;
}
/*************************************************************************
//
**************************************************************************/
MemBuffer::MemBuffer() :
b(NULL), b_size(0)
{
if (use_mcheck < 0)
mcheck_init();
}
MemBuffer::MemBuffer(unsigned size) :
b(NULL), b_size(0)
{
alloc(size);
} }
@@ -49,59 +78,124 @@ MemBuffer::~MemBuffer()
void MemBuffer::dealloc() void MemBuffer::dealloc()
{ {
if (alloc_ptr) if (b)
::free(alloc_ptr);
alloc_ptr = ptr = NULL;
alloc_size = 0;
}
unsigned MemBuffer::getSize() const
{
if (!alloc_ptr)
return 0;
unsigned size = alloc_size - (ptr - alloc_ptr);
assert((int)size > 0);
return size;
}
void MemBuffer::alloc(unsigned size, unsigned base_offset)
{
// NOTE: we don't automaticlly free a used buffer
assert(alloc_ptr == NULL);
assert((int)size > 0);
size = base_offset + size;
alloc_ptr = (unsigned char *) malloc(size);
if (!alloc_ptr)
{ {
//throw bad_alloc(); checkState();
throwCantPack("out of memory"); if (use_mcheck)
//exit(1); {
// remove magic constants
set_be32(b - 8, 0);
set_be32(b - 4, 0);
set_be32(b + b_size, 0);
set_be32(b + b_size + 4, 0);
//
::free(b - 16);
} }
alloc_size = size; else
ptr = alloc_ptr + base_offset; ::free(b);
b = NULL;
b_size = 0;
}
else
assert(b_size == 0);
}
void MemBuffer::allocForCompression(unsigned uncompressed_size, unsigned extra)
{
assert((int)uncompressed_size > 0);
assert((int)extra >= 0);
unsigned size = uncompressed_size + uncompressed_size/8 + 256 + extra;
alloc(size);
}
void MemBuffer::allocForUncompression(unsigned uncompressed_size, unsigned extra)
{
assert((int)uncompressed_size > 0);
assert((int)extra >= 0);
unsigned size = uncompressed_size + extra;
// size += 512; // 512 safety bytes
// INFO: 3 bytes are the allowed overrun for the i386 asm_fast decompressors
#if (ACC_ARCH_I386)
size += 3;
#endif
alloc(size);
}
void MemBuffer::fill(unsigned off, unsigned len, int value)
{
checkState();
assert((int)off >= 0);
assert((int)len >= 0);
assert(off <= b_size);
assert(len <= b_size);
assert(off + len <= b_size);
if (len > 0)
memset(b + off, value, len);
}
/*************************************************************************
//
**************************************************************************/
#define PTR(p) ((unsigned) ((acc_uintptr_t)(p) & 0xffffffff))
#define MAGIC1(p) (PTR(p) ^ 0xfefdbeeb)
#define MAGIC2(p) (PTR(p) ^ 0xfefdbeeb ^ 0x80024001)
unsigned MemBuffer::global_alloc_counter = 0;
void MemBuffer::checkState() const
{
if (!b)
throwInternalError("block not allocated");
if (use_mcheck)
{
if (get_be32(b - 4) != MAGIC1(b))
throwInternalError("memory clobbered before allocated block 1");
if (get_be32(b - 8) != b_size)
throwInternalError("memory clobbered before allocated block 2");
if (get_be32(b + b_size) != MAGIC2(b))
throwInternalError("memory clobbered past end of allocated block");
}
assert((int)b_size > 0);
} }
void MemBuffer::alloc(unsigned size) void MemBuffer::alloc(unsigned size)
{ {
alloc(size, 0); if (use_mcheck < 0)
} mcheck_init();
// NOTE: we don't automatically free a used buffer
void MemBuffer::allocForCompression(unsigned uncompressed_size) assert(b == NULL);
{ assert(b_size == 0);
assert((int)uncompressed_size > 0); //
alloc(uncompressed_size + uncompressed_size/8 + 256, 0); assert((int)size > 0);
} unsigned total = use_mcheck ? size + 32 : size;
assert((int)total > 0);
unsigned char *p = (unsigned char *) malloc(total);
void MemBuffer::allocForUncompression(unsigned uncompressed_size) if (!p)
{ {
assert((int)uncompressed_size > 0); //throw bad_alloc();
//alloc(uncompressed_size + 3 + 512, 0); // 512 safety bytes throw OutOfMemoryException("out of memory");
alloc(uncompressed_size + 3, 0); // 3 bytes for asm_fast decompresion //exit(1);
}
b_size = size;
if (use_mcheck)
{
b = p + 16;
// store magic constants to detect buffer overruns
set_be32(b - 8, b_size);
set_be32(b - 4, MAGIC1(b));
set_be32(b + b_size, MAGIC2(b));
set_be32(b + b_size + 4, global_alloc_counter++);
}
else
b = p ;
} }
+22 -27
View File
@@ -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-2002 Markus Franz Xaver Johannes Oberhumer Copyright (C) 1996-2004 Markus Franz Xaver Johannes Oberhumer
Copyright (C) 1996-2002 Laszlo Molnar Copyright (C) 1996-2004 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
@@ -37,46 +37,41 @@
class MemBuffer class MemBuffer
{ {
public: public:
MemBuffer(unsigned size=0); MemBuffer();
MemBuffer(unsigned size);
~MemBuffer(); ~MemBuffer();
void alloc(unsigned size); void alloc(unsigned size);
void allocForCompression(unsigned uncompressed_size); void allocForCompression(unsigned uncompressed_size, unsigned extra=0);
void allocForUncompression(unsigned uncompressed_size); void allocForUncompression(unsigned uncompressed_size, unsigned extra=0);
void dealloc(); void dealloc();
const unsigned char *getBuf() const { return ptr; } void checkState() const;
unsigned getSize() const;
operator unsigned char * () { return ptr; } unsigned getSize() const { return b_size; }
//operator const unsigned char * () const { return ptr; }
void *getVoidPtr() { return (void *) ptr; } operator unsigned char * () { return b; }
const void *getVoidPtr() const { return (const void *) ptr; } //operator const unsigned char * () const { return b; }
void *getVoidPtr() { return (void *) b; }
const void *getVoidPtr() const { return (const void *) b; }
void fill(unsigned off, unsigned len, int value);
void clear(unsigned off, unsigned len) { fill(off, len, 0); }
void clear() { fill(0, b_size, 0); }
private: private:
void alloc(unsigned size, unsigned base_offset); unsigned char *b;
unsigned b_size;
protected: static unsigned global_alloc_counter;
unsigned char *ptr;
unsigned char *alloc_ptr;
unsigned alloc_size;
private:
// disable copy and assignment // disable copy and assignment
MemBuffer(MemBuffer const &); // {} MemBuffer(const MemBuffer &); // {}
MemBuffer& operator= (MemBuffer const &); // { return *this; } MemBuffer& operator= (const MemBuffer &); // { return *this; }
// disable dynamic allocation // disable dynamic allocation
#ifndef new DISABLE_NEW_DELETE
static void *operator new (size_t); // {}
static void *operator new[] (size_t); // {}
#endif
#ifndef delete
//static void operator delete (void *) {}
//static void operator delete[] (void *) {}
#endif
}; };
#endif /* already included */ #endif /* already included */
+6357
View File
File diff suppressed because it is too large Load Diff
+27 -15
View File
@@ -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-2002 Markus Franz Xaver Johannes Oberhumer Copyright (C) 1996-2004 Markus Franz Xaver Johannes Oberhumer
Copyright (C) 1996-2002 Laszlo Molnar Copyright (C) 1996-2004 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
@@ -66,9 +66,9 @@ void printClearLine(FILE *f)
static void pr_print(bool c, const char *msg) static void pr_print(bool c, const char *msg)
{ {
if (c && !opt->to_stdout) if (c && !opt->to_stdout)
con_fprintf(stderr,msg); con_fprintf(stderr, "%s", msg);
else else
fprintf(stderr,msg); fprintf(stderr, "%s", msg);
} }
static void pr_error(const char *iname, const char *msg, bool is_warning) static void pr_error(const char *iname, const char *msg, bool is_warning)
@@ -88,7 +88,7 @@ static void pr_error(const char *iname, const char *msg, bool is_warning)
// This hack is needed, otherwise error messages may get lost // This hack is needed, otherwise error messages may get lost
// when the cursor is not yet at the bottom of the screen. // when the cursor is not yet at the bottom of the screen.
// At least I can use some colors then... // At least I can use some colors then...
bool c = isatty(STDERR_FILENO) ? 1 : 0; bool c = acc_isatty(STDERR_FILENO) ? 1 : 0;
int fg = con_fg(stderr,FG_BRTRED); int fg = con_fg(stderr,FG_BRTRED);
upx_snprintf(buf+strlen(buf),sizeof(buf)-strlen(buf),"%s: ", progname); upx_snprintf(buf+strlen(buf),sizeof(buf)-strlen(buf),"%s: ", progname);
@@ -103,23 +103,35 @@ static void pr_error(const char *iname, const char *msg, bool is_warning)
fg = con_fg(stderr,fg); fg = con_fg(stderr,fg);
UNUSED(is_warning); UNUSED(is_warning);
UNUSED(fg);
} }
void printErr(const char *iname, const Throwable *e) void printErr(const char *iname, const Throwable *e)
{ {
char buf[1024]; char buf[1024];
size_t l;
upx_snprintf(buf, sizeof(buf), "%s", prettyName(typeid(*e))); upx_snprintf(buf, sizeof(buf), "%s", prettyName(typeid(*e).name()));
if (e->getMsg()) l = strlen(buf);
upx_snprintf(buf+strlen(buf),sizeof(buf)-strlen(buf),": %s", e->getMsg()); if (l < sizeof(buf) && e->getMsg())
if (e->getErrno()) upx_snprintf(buf+l, sizeof(buf)-l, ": %s", e->getMsg());
upx_snprintf(buf+strlen(buf),sizeof(buf)-strlen(buf),": %s", strerror(e->getErrno())); l = strlen(buf);
if (l < sizeof(buf) && e->getErrno()) {
upx_snprintf(buf+l, sizeof(buf)-l, ": %s", strerror(e->getErrno()));
#if 1
// some compilers (e.g. Borland C++) put a trailing '\n'
// into strerror() result
l = strlen(buf);
while (l-- > 0 && (buf[l] == '\n' || buf[l] == ' '))
buf[l] = 0;
#endif
}
pr_error(iname,buf,e->isWarning()); pr_error(iname,buf,e->isWarning());
} }
void printErr(const char *iname, const char *format, ...) void __acc_cdecl_va printErr(const char *iname, const char *format, ...)
{ {
va_list args; va_list args;
char buf[1024]; char buf[1024];
@@ -132,7 +144,7 @@ void printErr(const char *iname, const char *format, ...)
} }
void printWarn(const char *iname, const char *format, ...) void __acc_cdecl_va printWarn(const char *iname, const char *format, ...)
{ {
va_list args; va_list args;
char buf[1024]; char buf[1024];
@@ -189,7 +201,7 @@ void infoHeader()
info_header = 0; info_header = 0;
} }
void infoHeader(const char *format, ...) void __acc_cdecl_va infoHeader(const char *format, ...)
{ {
if (opt->info_mode <= 0) if (opt->info_mode <= 0)
return; return;
@@ -203,7 +215,7 @@ void infoHeader(const char *format, ...)
} }
void info(const char *format, ...) void __acc_cdecl_va info(const char *format, ...)
{ {
if (opt->info_mode <= 0) if (opt->info_mode <= 0)
return; return;
@@ -218,7 +230,7 @@ void info(const char *format, ...)
} }
void infoWarning(const char *format, ...) void __acc_cdecl_va infoWarning(const char *format, ...)
{ {
if (opt->info_mode <= 0) if (opt->info_mode <= 0)
{ {
+40 -30
View File
@@ -21,11 +21,22 @@
Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
#include "tailor.h"
#undef PROGNAME
#if 0
#ifndef EOF #ifndef EOF
#include <stdio.h> #include <stdio.h>
#include <string.h> #include <string.h>
#endif #endif
#define PROGNAME(x) (x)
#else
#include "conf.h"
static const char *my_progname(const char *argv0)
{
return progname ? progname : argv0;
}
#define PROGNAME(x) my_progname(x)
#endif
/* If GETOPT_COMPAT is defined, `+' as well as `--' can introduce a /* If GETOPT_COMPAT is defined, `+' as well as `--' can introduce a
@@ -54,8 +65,6 @@
#define optind mfx_optind #define optind mfx_optind
#define opterr mfx_opterr #define opterr mfx_opterr
#define optopt mfx_optopt #define optopt mfx_optopt
#define my_index strchr
#define my_strlen strlen
#undef BAD_OPTION #undef BAD_OPTION
/* For communication from `getopt' to the caller. /* For communication from `getopt' to the caller.
@@ -167,7 +176,7 @@ static int last_nonopt;
static void exchange (char **argv) static void exchange (char **argv)
{ {
char *temp, **first, **last; char *temp; char **first, **last;
/* Reverse all the elements [first_nonopt, optind) */ /* Reverse all the elements [first_nonopt, optind) */
first = &argv[first_nonopt]; first = &argv[first_nonopt];
@@ -382,15 +391,10 @@ static int _getopt_internal (int argc, char **argv, const char *optstring,
int indfound = 0; int indfound = 0;
int needexact = 0; int needexact = 0;
#if defined(DOSISH)
/* allow `--option#value' because you cannout assign a '=' /* allow `--option#value' because you cannout assign a '='
to an environment variable under DOS command.com */ to an environment variable under DOS command.com */
while (*s && *s != '=' && * s != '#') while (*s && *s != '=' && * s != '#')
s++; s++;
#else
while (*s && *s != '=')
s++;
#endif
/* Test all options for either exact match or abbreviated matches. */ /* Test all options for either exact match or abbreviated matches. */
for (p = longopts, option_index = 0; p->name; for (p = longopts, option_index = 0; p->name;
@@ -399,7 +403,7 @@ static int _getopt_internal (int argc, char **argv, const char *optstring,
{ {
if (p->has_arg & 0x10) if (p->has_arg & 0x10)
needexact = 1; needexact = 1;
if ((unsigned) (s - nextchar) == my_strlen (p->name)) if ((unsigned) (s - nextchar) == strlen (p->name))
{ {
/* Exact match found. */ /* Exact match found. */
pfound = p; pfound = p;
@@ -423,8 +427,8 @@ static int _getopt_internal (int argc, char **argv, const char *optstring,
{ {
if (opterr) if (opterr)
fprintf (stderr, "%s: unrecognized option `%s'\n", fprintf (stderr, "%s: unrecognized option `%s'\n",
argv[0], argv[optind]); PROGNAME(argv[0]), argv[optind]);
nextchar += my_strlen (nextchar); nextchar += strlen (nextchar);
optind++; optind++;
return BAD_OPTION; return BAD_OPTION;
} }
@@ -432,8 +436,8 @@ static int _getopt_internal (int argc, char **argv, const char *optstring,
{ {
if (opterr) if (opterr)
fprintf (stderr, "%s: option `%s' is ambiguous\n", fprintf (stderr, "%s: option `%s' is ambiguous\n",
argv[0], argv[optind]); PROGNAME(argv[0]), argv[optind]);
nextchar += my_strlen (nextchar); nextchar += strlen (nextchar);
optind++; optind++;
return BAD_OPTION; return BAD_OPTION;
} }
@@ -459,14 +463,14 @@ static int _getopt_internal (int argc, char **argv, const char *optstring,
/* --option */ /* --option */
fprintf (stderr, fprintf (stderr,
"%s: option `--%s' doesn't allow an argument\n", "%s: option `--%s' doesn't allow an argument\n",
argv[0], pfound->name); PROGNAME(argv[0]), pfound->name);
else else
/* +option or -option */ /* +option or -option */
fprintf (stderr, fprintf (stderr,
"%s: option `%c%s' doesn't allow an argument\n", "%s: option `%c%s' doesn't allow an argument\n",
argv[0], argv[optind - 1][0], pfound->name); PROGNAME(argv[0]), argv[optind - 1][0], pfound->name);
} }
nextchar += my_strlen (nextchar); nextchar += strlen (nextchar);
return BAD_OPTION; return BAD_OPTION;
} }
} }
@@ -482,13 +486,13 @@ static int _getopt_internal (int argc, char **argv, const char *optstring,
{ {
if (opterr) if (opterr)
fprintf (stderr, "%s: option `--%s%s' requires an argument\n", fprintf (stderr, "%s: option `--%s%s' requires an argument\n",
argv[0], pfound->name, PROGNAME(argv[0]), pfound->name,
(pfound->has_arg & 0x20) ? "=" : ""); (pfound->has_arg & 0x20) ? "=" : "");
nextchar += my_strlen (nextchar); nextchar += strlen (nextchar);
return optstring[0] == ':' ? ':' : BAD_OPTION; return optstring[0] == ':' ? ':' : BAD_OPTION;
} }
} }
nextchar += my_strlen (nextchar); nextchar += strlen (nextchar);
if (longind != NULL) if (longind != NULL)
*longind = option_index; *longind = option_index;
if (pfound->flag) if (pfound->flag)
@@ -506,31 +510,31 @@ static int _getopt_internal (int argc, char **argv, const char *optstring,
#ifdef GETOPT_COMPAT #ifdef GETOPT_COMPAT
|| argv[optind][0] == '+' || argv[optind][0] == '+'
#endif /* GETOPT_COMPAT */ #endif /* GETOPT_COMPAT */
|| my_index (optstring, *nextchar) == NULL) || strchr (optstring, *nextchar) == NULL)
{ {
if (opterr) if (opterr)
{ {
if (argv[optind][1] == '-') if (argv[optind][1] == '-')
/* --option */ /* --option */
fprintf (stderr, "%s: unrecognized option `--%s'\n", fprintf (stderr, "%s: unrecognized option `--%s'\n",
argv[0], nextchar); PROGNAME(argv[0]), nextchar);
else else
/* +option or -option */ /* +option or -option */
fprintf (stderr, "%s: unrecognized option `%c%s'\n", fprintf (stderr, "%s: unrecognized option `%c%s'\n",
argv[0], argv[optind][0], nextchar); PROGNAME(argv[0]), argv[optind][0], nextchar);
} }
nextchar = empty_string; nextchar = empty_string;
optind++; optind++;
return BAD_OPTION; return BAD_OPTION;
} }
ambig = ambig; (void) &ambig; /* UNUSED */
} }
/* Look at and handle the next option-character. */ /* Look at and handle the next option-character. */
{ {
char c = *nextchar++; char c = *nextchar++;
const char *temp = my_index (optstring, c); const char *temp = strchr (optstring, c);
/* Increment `optind' when we start to process its last character. */ /* Increment `optind' when we start to process its last character. */
if (*nextchar == '\0') if (*nextchar == '\0')
@@ -543,12 +547,12 @@ static int _getopt_internal (int argc, char **argv, const char *optstring,
#if 0 #if 0
if (c < 040 || c >= 0177) if (c < 040 || c >= 0177)
fprintf (stderr, "%s: unrecognized option, character code 0%o\n", fprintf (stderr, "%s: unrecognized option, character code 0%o\n",
argv[0], c); PROGNAME(argv[0]), c);
else else
fprintf (stderr, "%s: unrecognized option `-%c'\n", argv[0], c); fprintf (stderr, "%s: unrecognized option `-%c'\n", PROGNAME(argv[0]), c);
#else #else
/* 1003.2 specifies the format of this message. */ /* 1003.2 specifies the format of this message. */
fprintf (stderr, "%s: illegal option -- %c\n", argv[0], c); fprintf (stderr, "%s: illegal option -- %c\n", PROGNAME(argv[0]), c);
#endif #endif
} }
optopt = c; optopt = c;
@@ -584,11 +588,11 @@ static int _getopt_internal (int argc, char **argv, const char *optstring,
{ {
#if 0 #if 0
fprintf (stderr, "%s: option `-%c' requires an argument\n", fprintf (stderr, "%s: option `-%c' requires an argument\n",
argv[0], c); PROGNAME(argv[0]), c);
#else #else
/* 1003.2 specifies the format of this message. */ /* 1003.2 specifies the format of this message. */
fprintf (stderr, "%s: option requires an argument -- %c\n", fprintf (stderr, "%s: option requires an argument -- %c\n",
argv[0], c); PROGNAME(argv[0]), c);
#endif #endif
} }
optopt = c; optopt = c;
@@ -694,3 +698,9 @@ main (argc, argv)
} }
#endif /* TEST */ #endif /* TEST */
/*
vi:ts=4:et:nowrap
*/
+3 -3
View File
@@ -19,7 +19,7 @@
#define __MFX_GETOPT_H 1 #define __MFX_GETOPT_H 1
#ifdef __cplusplus #ifdef __cplusplus
//extern "C" { /* extern "C" { */
#endif #endif
/* For communication from `getopt' to the caller. /* For communication from `getopt' to the caller.
@@ -96,7 +96,7 @@ int mfx_getopt_long(int argc, char **argv, const char *shortopts,
const struct mfx_option *longopts, int *longind); const struct mfx_option *longopts, int *longind);
#ifdef __cplusplus #ifdef __cplusplus
//} /* } */
#endif #endif
#endif /* _GETOPT_H */ #endif /* __MFX_GETOPT_H */
+28 -16
View File
@@ -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-2002 Markus Franz Xaver Johannes Oberhumer Copyright (C) 1996-2004 Markus Franz Xaver Johannes Oberhumer
Copyright (C) 1996-2002 Laszlo Molnar Copyright (C) 1996-2004 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
@@ -51,11 +51,11 @@ struct options_t {
int filter; // preferred filter from Packer::getFilters() int filter; // preferred filter from Packer::getFilters()
bool all_methods; // try all available compression methods ? bool all_methods; // try all available compression methods ?
bool all_filters; // try all available filters ? bool all_filters; // try all available filters ?
bool no_filter; // force no filter
// other options // other options
int backup; int backup;
int console; int console;
int debug;
int force; int force;
int info_mode; int info_mode;
bool ignorewarn; bool ignorewarn;
@@ -66,6 +66,14 @@ struct options_t {
int verbose; int verbose;
bool to_stdout; bool to_stdout;
// debug options
struct {
int debug_level;
const char *dump_stub_loader;
char fake_stub_version[4+1]; // for internal debugging
char fake_stub_year[4+1]; // for internal debugging
} debug;
// overlay handling // overlay handling
enum { enum {
SKIP_OVERLAY = 0, SKIP_OVERLAY = 0,
@@ -99,38 +107,42 @@ struct options_t {
// options for various executable formats // options for various executable formats
struct { struct {
bool force_stub; bool split_segments;
bool no_reloc; } atari_tos;
} dos;
struct { struct {
bool coff; bool coff;
} djgpp2; } djgpp2_coff;
struct { struct {
bool force_stub;
bool no_reloc;
} dos_exe;
struct {
bool boot_only;
bool no_align; bool no_align;
} ps1; bool do_8bit;
struct { } ps1_exe;
bool split_segments;
} tos;
struct { struct {
unsigned blocksize; unsigned blocksize;
bool force_execve; // force the linux/386 execve format bool force_execve; // force the linux/386 execve format
bool ptinterp; // is PT_INTERP, so don't adjust auxv_t bool is_ptinterp; // is PT_INTERP, so don't adjust auxv_t
bool use_ptinterp; // use PT_INTERP /opt/upx/run
bool make_ptinterp; // make PT_INTERP [ignore current file!]
enum { SCRIPT_MAX = 32 }; enum { SCRIPT_MAX = 32 };
const char *script_name; const char *script_name;
} unix; } o_unix;
struct { struct {
bool le; bool le;
} wcle; } watcom_le;
struct { struct {
int compress_exports; int compress_exports;
int compress_icons; int compress_icons;
int compress_resources; int compress_resources;
signed char compress_rt[25]; // 25 == RT_LAST signed char compress_rt[25]; // 25 == RT_LAST
int strip_relocs; int strip_relocs;
} w32pe; } win32_pe;
}; };
extern struct options_t * volatile opt; extern struct options_t *opt;
#endif /* already included */ #endif /* already included */
+2468
View File
File diff suppressed because it is too large Load Diff
+253
View File
@@ -0,0 +1,253 @@
/* p_armpe.h --
This file is part of the UPX executable compressor.
Copyright (C) 1996-2004 Markus Franz Xaver Johannes Oberhumer
Copyright (C) 1996-2004 Laszlo Molnar
All Rights Reserved.
UPX and the UCL library are free software; you can redistribute them
and/or modify them under the terms of the GNU General Public License as
published by the Free Software Foundation; either version 2 of
the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; see the file COPYING.
If not, write to the Free Software Foundation, Inc.,
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
Markus F.X.J. Oberhumer Laszlo Molnar
markus@oberhumer.com ml1050@users.sourceforge.net
*/
#ifndef __UPX_P_ARMPE_H
#define __UPX_P_ARMPE_H
class PackArmPe_Interval;
class PackArmPe_Reloc;
class PackArmPe_Resource;
class PackArmPe_Export;
/*************************************************************************
// arm/pe
**************************************************************************/
class PackArmPe : public Packer
{
typedef Packer super;
public:
PackArmPe(InputFile *f);
~PackArmPe();
virtual int getVersion() const { return 13; }
virtual int getFormat() const { return UPX_F_WINCE_ARM_PE; }
virtual const char *getName() const { return "arm/pe"; }
virtual const int *getCompressionMethods(int method, int level) const;
virtual const int *getFilters() const;
virtual void pack(OutputFile *fo);
virtual void unpack(OutputFile *fo);
virtual bool canPack();
virtual int canUnpack();
// unpacker capabilities
virtual bool canUnpackVersion(int version) const
{ return version == 13; }
protected:
virtual int readFileHeader();
virtual bool testUnpackVersion(int version) const;
virtual int buildLoader(const Filter *ft);
unsigned pe_offset;
unsigned processImports();
void processImports(unsigned);
void rebuildImports(upx_byte *&);
upx_byte *oimport;
unsigned soimport;
upx_byte *oimpdlls;
unsigned soimpdlls;
void processRelocs();
void processRelocs(PackArmPe_Reloc *);
void rebuildRelocs(upx_byte *&);
upx_byte *orelocs;
unsigned sorelocs;
upx_byte *oxrelocs;
unsigned soxrelocs;
void processExports(PackArmPe_Export *);
void processExports(PackArmPe_Export *,unsigned);
void rebuildExports();
upx_byte *oexport;
unsigned soexport;
void processResources(PackArmPe_Resource *);
void processResources(PackArmPe_Resource *, unsigned);
void rebuildResources(upx_byte *&);
upx_byte *oresources;
unsigned soresources;
void processTls(PackArmPe_Interval *);
void processTls(PackArmPe_Reloc *,const PackArmPe_Interval *,unsigned);
void rebuildTls();
upx_byte *otls;
unsigned sotls;
unsigned stripDebug(unsigned);
unsigned icondir_offset;
int icondir_count;
bool importbyordinal;
bool kernel32ordinal;
unsigned tlsindex;
unsigned rvamin;
unsigned cimports; // rva of preprocessed imports
unsigned crelocs; // rva of preprocessed fixups
int big_relocs;
bool use_thumb_stub;
struct pe_header_t
{
// 0x0
char _[4]; // pemagic
LE16 cpu;
LE16 objects;
char __[12]; // timestamp + reserved
LE16 opthdrsize;
LE16 flags;
// optional header
char ___[4]; // coffmagic + linkerversion
LE32 codesize;
// 0x20
LE32 datasize;
LE32 bsssize;
LE32 entry;
LE32 codebase;
// 0x30
LE32 database;
// nt specific fields
LE32 imagebase;
LE32 objectalign;
LE32 filealign; // should set to 0x200 ?
// 0x40
char ____[16]; // versions
// 0x50
LE32 imagesize;
LE32 headersize;
LE32 chksum; // should set to 0
LE16 subsystem;
LE16 dllflags;
// 0x60
char _____[20]; // stack + heap sizes
// 0x74
LE32 ddirsentries; // usually 16
struct ddirs_t
{
LE32 vaddr;
LE32 size;
}
__attribute_packed;
struct ddirs_t ddirs[16];
}
__attribute_packed;
struct pe_section_t
{
char name[8];
LE32 vsize;
LE32 vaddr;
LE32 size;
LE32 rawdataptr;
char _[12];
LE32 flags;
}
__attribute_packed;
pe_header_t ih, oh;
pe_section_t *isection;
static unsigned virta2objnum (unsigned, pe_section_t *, unsigned);
unsigned tryremove (unsigned, unsigned);
enum {
PEDIR_EXPORT = 0,
PEDIR_IMPORT = 1,
PEDIR_RESOURCE = 2,
PEDIR_EXCEPTION = 3, // Exception table
PEDIR_SEC = 4, // Certificate table (file pointer)
PEDIR_RELOC = 5,
PEDIR_DEBUG = 6,
PEDIR_COPYRIGHT = 7, // Architecture-specific data
PEDIR_GLOBALPTR = 8, // Global pointer
PEDIR_TLS = 9,
PEDIR_LOADCONF = 10, // Load Config Table
PEDIR_BOUNDIM = 11,
PEDIR_IAT = 12,
PEDIR_DELAYIMP = 13, // Delay Import Descriptor
PEDIR_COMRT = 14 // Com+ Runtime Header
};
enum {
PEFL_CODE = 0x20,
PEFL_DATA = 0x40,
PEFL_BSS = 0x80,
PEFL_INFO = 0x200,
PEFL_EXTRELS = 0x01000000, // extended relocations
PEFL_DISCARD = 0x02000000,
PEFL_NOCACHE = 0x04000000,
PEFL_NOPAGE = 0x08000000,
PEFL_SHARED = 0x10000000,
PEFL_EXEC = 0x20000000,
PEFL_READ = 0x40000000,
PEFL_WRITE = 0x80000000
};
enum {
RELOCS_STRIPPED = 0x0001,
EXECUTABLE = 0x0002,
LNUM_STRIPPED = 0x0004,
LSYMS_STRIPPED = 0x0008,
AGGRESSIVE_TRIM = 0x0010,
TWO_GIGS_AWARE = 0x0020,
FLITTLE_ENDIAN = 0x0080,
BITS_32_MACHINE = 0x0100,
DEBUG_STRIPPED = 0x0200,
REMOVABLE_SWAP = 0x0400,
SYSTEM_PROGRAM = 0x1000,
DLL_FLAG = 0x2000,
FBIG_ENDIAN = 0x8000
};
// predefined resource types
enum {
RT_CURSOR = 1, RT_BITMAP, RT_ICON, RT_MENU, RT_DIALOG, RT_STRING,
RT_FONTDIR, RT_FONT, RT_ACCELERATOR, RT_RCDATA, RT_MESSAGETABLE,
RT_GROUP_CURSOR, RT_GROUP_ICON = 14, RT_VERSION = 16, RT_DLGINCLUDE,
RT_PLUGPLAY = 19, RT_VXD, RT_ANICURSOR, RT_ANIICON, RT_HTML,
RT_MANIFEST, RT_LAST
};
};
#endif /* already included */
/*
vi:ts=4:et
*/
+8 -8
View File
@@ -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-2002 Markus Franz Xaver Johannes Oberhumer Copyright (C) 1996-2004 Markus Franz Xaver Johannes Oberhumer
Copyright (C) 1996-2002 Laszlo Molnar Copyright (C) 1996-2004 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 markus@oberhumer.com ml1050@users.sourceforge.net
*/ */
@@ -142,15 +142,15 @@ void PackCom::patchLoader(OutputFile *fo,
int PackCom::buildLoader(const Filter *ft) int PackCom::buildLoader(const Filter *ft)
{ {
initLoader(nrv2b_loader,sizeof(nrv2b_loader)); initLoader(nrv2b_loader,sizeof(nrv2b_loader));
addLoader("COMMAIN1""COMSUBSI", addLoader("COMMAIN1,COMSUBSI",
ph.first_offset_found == 1 ? "COMSBBBP" : "", ph.first_offset_found == 1 ? "COMSBBBP" : "",
"COMPSHDI", "COMPSHDI",
ft->id ? "COMCALLT" : "", ft->id ? "COMCALLT" : "",
"COMMAIN2""UPX1HEAD""COMCUTPO""NRV2B160", "COMMAIN2,UPX1HEAD,COMCUTPO,NRV2B160",
ft->id ? "NRVDDONE" : "NRVDRETU", ft->id ? "NRVDDONE" : "NRVDRETU",
"NRVDECO1", "NRVDECO1",
ph.max_offset_found <= 0xd00 ? "NRVLED00" : "NRVGTD00", ph.max_offset_found <= 0xd00 ? "NRVLED00" : "NRVGTD00",
"NRVDECO2""NRV2B169", "NRVDECO2,NRV2B169",
NULL NULL
); );
if (ft->id) if (ft->id)
@@ -170,7 +170,7 @@ void PackCom::addFilter16(int filter_id)
if (filter_id % 3 == 0) if (filter_id % 3 == 0)
addLoader("CALLTR16", addLoader("CALLTR16",
filter_id < 4 ? "CT16SUB0" : "", filter_id < 4 ? "CT16SUB0" : "",
filter_id < 4 ? "" : (opt->cpu == opt->CPU_8086 ? "CT16I086" : "CT16I286""CT16SUB0"), filter_id < 4 ? "" : (opt->cpu == opt->CPU_8086 ? "CT16I086" : "CT16I286,CT16SUB0"),
"CALLTRI2", "CALLTRI2",
getFormat() == UPX_F_DOS_COM ? "CORETURN" : "", getFormat() == UPX_F_DOS_COM ? "CORETURN" : "",
NULL NULL
@@ -180,7 +180,7 @@ void PackCom::addFilter16(int filter_id)
"CALLTRI5", "CALLTRI5",
getFormat() == UPX_F_DOS_COM ? "CT16JEND" : "CT16JUL2", getFormat() == UPX_F_DOS_COM ? "CT16JEND" : "CT16JUL2",
filter_id < 4 ? "CT16SUB1" : "", filter_id < 4 ? "CT16SUB1" : "",
filter_id < 4 ? "" : (opt->cpu == opt->CPU_8086 ? "CT16I087" : "CT16I287""CT16SUB1"), filter_id < 4 ? "" : (opt->cpu == opt->CPU_8086 ? "CT16I087" : "CT16I287,CT16SUB1"),
"CALLTRI6", "CALLTRI6",
NULL NULL
); );
+3 -3
View File
@@ -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-2002 Markus Franz Xaver Johannes Oberhumer Copyright (C) 1996-2004 Markus Franz Xaver Johannes Oberhumer
Copyright (C) 1996-2002 Laszlo Molnar Copyright (C) 1996-2004 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
@@ -52,7 +52,7 @@ public:
virtual int canUnpack(); virtual int canUnpack();
protected: protected:
virtual const unsigned getCallTrickOffset() const { return 0x100; } virtual unsigned getCallTrickOffset() const { return 0x100; }
protected: protected:
virtual int buildLoader(const Filter *ft); virtual int buildLoader(const Filter *ft);
+98 -68
View File
@@ -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-2002 Markus Franz Xaver Johannes Oberhumer Copyright (C) 1996-2004 Markus Franz Xaver Johannes Oberhumer
Copyright (C) 1996-2002 Laszlo Molnar Copyright (C) 1996-2004 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 markus@oberhumer.com ml1050@users.sourceforge.net
*/ */
@@ -32,11 +32,10 @@
#include "packer.h" #include "packer.h"
#include "p_djgpp2.h" #include "p_djgpp2.h"
static const
#include "stub/stubify.h"
static const static const
#include "stub/l_djgpp2.h" #include "stub/l_djgpp2.h"
static const
#include "stub/stubify.h"
/************************************************************************* /*************************************************************************
@@ -49,10 +48,12 @@ PackDjgpp2::PackDjgpp2(InputFile *f) :
COMPILE_TIME_ASSERT(sizeof(external_scnhdr_t) == 40); COMPILE_TIME_ASSERT(sizeof(external_scnhdr_t) == 40);
COMPILE_TIME_ASSERT(sizeof(coff_header_t) == 0xa8); 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) COMPILE_TIME_ASSERT_ALIGNOF(external_scnhdr_t, char)
COMPILE_TIME_ASSERT_ALIGNOF(coff_header_t, char)
COMPILE_TIME_ASSERT(STUBIFY_STUB_ADLER32 == 0xbf689ba8);
COMPILE_TIME_ASSERT(STUBIFY_STUB_CRC32 == 0x2ae982b2);
//printf("0x%08x\n", upx_adler32(stubify_stub, sizeof(stubify_stub))); //printf("0x%08x\n", upx_adler32(stubify_stub, sizeof(stubify_stub)));
assert(upx_adler32(stubify_stub, sizeof(stubify_stub)) == STUBIFY_STUB_ADLER32); //assert(upx_adler32(stubify_stub, sizeof(stubify_stub)) == STUBIFY_STUB_ADLER32);
#endif
} }
@@ -84,8 +85,8 @@ unsigned PackDjgpp2::findOverlapOverhead(const upx_bytep buf,
int PackDjgpp2::buildLoader(const Filter *ft) int PackDjgpp2::buildLoader(const Filter *ft)
{ {
// prepare loader // prepare loader
initLoader(nrv_loader,sizeof(nrv_loader)); initLoader(nrv_loader, sizeof(nrv_loader));
addLoader("IDENTSTR""DJ2MAIN1", addLoader("IDENTSTR,DJ2MAIN1",
ft->id ? "DJCALLT1" : "", ft->id ? "DJCALLT1" : "",
"DJ2MAIN2", "DJ2MAIN2",
getDecompressor(), getDecompressor(),
@@ -95,10 +96,10 @@ int PackDjgpp2::buildLoader(const Filter *ft)
if (ft->id) if (ft->id)
{ {
assert(ft->calls > 0); assert(ft->calls > 0);
addLoader("DJCALLT2",NULL); addLoader("DJCALLT2", NULL);
addFilter32(ft->id); addFilter32(ft->id);
} }
addLoader("DJRETURN+40DXXXXUPX1HEAD",NULL); addLoader("DJRETURN,+40DXXXX,UPX1HEAD", NULL);
return getLoaderSize(); return getLoaderSize();
} }
@@ -109,18 +110,18 @@ int PackDjgpp2::buildLoader(const Filter *ft)
void PackDjgpp2::handleStub(OutputFile *fo) void PackDjgpp2::handleStub(OutputFile *fo)
{ {
if (fo && !opt->djgpp2.coff) if (fo && !opt->djgpp2_coff.coff)
{ {
if (coff_offset > 0) if (coff_offset > 0)
{ {
// copy stub from exe // copy stub from exe
Packer::handleStub(fi,fo,coff_offset); Packer::handleStub(fi, fo, coff_offset);
} }
else else
{ {
// "stubify" stub // "stubify" stub
info("Adding stub: %ld bytes", (long)sizeof(stubify_stub)); info("Adding stub: %ld bytes", (long)sizeof(stubify_stub));
fo->write(stubify_stub,sizeof(stubify_stub)); fo->write(stubify_stub, sizeof(stubify_stub));
} }
} }
} }
@@ -132,14 +133,14 @@ static bool is_dlm(InputFile *fi, long coff_offset)
long off; long off;
try { try {
fi->seek(coff_offset,SEEK_SET); fi->seek(coff_offset, SEEK_SET);
fi->readx(buf,4); fi->readx(buf, 4);
off = get_le32(buf); off = get_le32(buf);
if (off < 0 || off > coff_offset + 4) if (off < 0 || off > coff_offset + 4)
return false; return false;
fi->seek(off,SEEK_SET); fi->seek(off, SEEK_SET);
fi->readx(buf,4); fi->readx(buf, 4);
if (memcmp(buf,"DLMF",4) == 0) if (memcmp(buf, "DLMF", 4) == 0)
return true; return true;
} catch (const IOException&) { } catch (const IOException&) {
} }
@@ -158,7 +159,7 @@ static void handle_allegropak(InputFile *fi, OutputFile *fo)
if (memcmp(buf, "slh+", 4) != 0) if (memcmp(buf, "slh+", 4) != 0)
return; return;
pfsize = get_be32_signed(buf+4); pfsize = get_be32_signed(buf+4);
if (pfsize <= 8 || pfsize >= fi->st.st_size) if (pfsize <= 8 || (off_t) pfsize >= (off_t) fi->st.st_size)
return; return;
fi->seek(-pfsize, SEEK_END); fi->seek(-pfsize, SEEK_END);
} catch (const IOException&) { } catch (const IOException&) {
@@ -179,25 +180,25 @@ int PackDjgpp2::readFileHeader()
unsigned char hdr[0x1c]; unsigned char hdr[0x1c];
unsigned char magic[8]; unsigned char magic[8];
fi->seek(0,SEEK_SET); fi->seek(0, SEEK_SET);
fi->readx(hdr,sizeof(hdr)); fi->readx(hdr, sizeof(hdr));
if (get_le16(hdr) == 0x5a4d) // MZ exe signature, stubbed? if (get_le16(hdr) == 0x5a4d) // MZ exe signature, stubbed?
{ {
coff_offset = 512 * get_le16(hdr+4); coff_offset = 512 * get_le16(hdr+4);
if (get_le16(hdr+2) != 0) if (get_le16(hdr+2) != 0)
coff_offset += get_le16(hdr+2) - 512; coff_offset += get_le16(hdr+2) - 512;
fi->seek(512,SEEK_SET); fi->seek(512, SEEK_SET);
fi->readx(magic,8); fi->readx(magic, 8);
if (memcmp("go32stub",magic,8) != 0) if (memcmp("go32stub", magic, 8) != 0)
return 0; // not V2 image return 0; // not V2 image
fi->seek(coff_offset,SEEK_SET); fi->seek(coff_offset, SEEK_SET);
if (fi->read(&coff_hdr,sizeof(coff_hdr)) != sizeof(coff_hdr)) if (fi->read(&coff_hdr, sizeof(coff_hdr)) != sizeof(coff_hdr))
throwCantPack("skipping djgpp symlink"); throwCantPack("skipping djgpp symlink");
} }
else else
{ {
fi->seek(coff_offset,SEEK_SET); fi->seek(coff_offset, SEEK_SET);
fi->readx(&coff_hdr,0xa8); fi->readx(&coff_hdr, 0xa8);
} }
if (coff_hdr.f_magic != 0x014c) // I386MAGIC if (coff_hdr.f_magic != 0x014c) // I386MAGIC
return 0; return 0;
@@ -220,7 +221,7 @@ void PackDjgpp2::stripDebug()
coff_hdr.f_symptr = 0; coff_hdr.f_symptr = 0;
coff_hdr.f_nsyms = 0; coff_hdr.f_nsyms = 0;
coff_hdr.f_flags = 0x10f; // 0x100: "32 bit machine: LSB first" coff_hdr.f_flags = 0x10f; // 0x100: "32 bit machine: LSB first"
memset(text->misc,0,12); memset(text->misc, 0, 12);
} }
@@ -232,7 +233,7 @@ bool PackDjgpp2::canPack()
{ {
if (!readFileHeader()) if (!readFileHeader())
return false; return false;
if (is_dlm(fi,coff_offset)) if (is_dlm(fi, coff_offset))
throwCantPack("can't handle DLM"); throwCantPack("can't handle DLM");
if (opt->force == 0) if (opt->force == 0)
@@ -269,28 +270,25 @@ void PackDjgpp2::pack(OutputFile *fo)
// read file // read file
const unsigned size = text->size + data->size; const unsigned size = text->size + data->size;
const unsigned tpos = text->scnptr; const unsigned tpos = text->scnptr;
const unsigned usize = size + (tpos & 0x1ff); const unsigned hdrsize = 20 + 28 + sizeof(external_scnhdr_t) * coff_hdr.f_nscns;
const unsigned hdrsize = 20 + 28 + (40 * coff_hdr.f_nscns); const unsigned usize = size + hdrsize;
if (hdrsize < sizeof(coff_hdr) || hdrsize > tpos) if (hdrsize < sizeof(coff_hdr) || hdrsize > tpos)
throwCantPack("coff header error"); throwCantPack("coff header error");
if (hdrsize > (tpos & 0x1ff))
throwCantPack("unsupported coff header");
ibuf.alloc(usize); ibuf.alloc(usize);
obuf.allocForCompression(usize); obuf.allocForCompression(usize);
fi->seek(coff_offset,SEEK_SET); fi->seek(coff_offset, SEEK_SET);
fi->readx(ibuf,hdrsize); // orig. coff header fi->readx(ibuf, hdrsize); // orig. coff header
memset(ibuf + hdrsize, 0, tpos - hdrsize); fi->seek(coff_offset + tpos, SEEK_SET);
fi->seek(coff_offset+tpos,SEEK_SET); fi->readx(ibuf + hdrsize, size);
fi->readx(ibuf + (tpos & 0x1ff),size);
// prepare packheader // prepare packheader
ph.u_len = usize; ph.u_len = usize;
// prepare filter // prepare filter
Filter ft(ph.level); Filter ft(ph.level);
ft.buf_len = usize - data->size; ft.buf_len = usize - data->size;
ft.addvalue = text->vaddr & ~0x1ff; ft.addvalue = text->vaddr - hdrsize;
// compress // compress
compressWithFilters(&ft, 512); compressWithFilters(&ft, 512);
@@ -309,16 +307,21 @@ void PackDjgpp2::pack(OutputFile *fo)
// prepare loader // prepare loader
MemBuffer loader(lsize); MemBuffer loader(lsize);
memcpy(loader,getLoader(),lsize); memcpy(loader, getLoader(), lsize);
// patch loader // patch loader
patchPackHeader(loader,lsize); patchPackHeader(loader, lsize);
patch_le32(loader,lsize,"ENTR",coff_hdr.a_entry); patch_le32(loader, lsize, "ENTR", coff_hdr.a_entry);
patchFilter32(loader, lsize, &ft); patchFilter32(loader, lsize, &ft);
patch_le32(loader,lsize,"BSSL",ph.overlap_overhead/4); patch_le32(loader, lsize, "BSSL", ph.overlap_overhead / 4);
assert(bss->vaddr == ((size + 0x1ff) &~ 0x1ff) + (text->vaddr &~ 0x1ff)); assert(bss->vaddr == ((size + 0x1ff) &~ 0x1ff) + (text->vaddr &~ 0x1ff));
patch_le32(loader,lsize,"OUTP",text->vaddr &~ 0x1ff); patch_le32(loader, lsize, "OUTP", text->vaddr - hdrsize);
patch_le32(loader,lsize,"INPP",data->vaddr); patch_le32(loader, lsize, "INPP", data->vaddr);
// we should not overwrite our decompressor during unpacking
// the original coff header (which is put just before the
// beginning of the original .text section)
assert(text->vaddr > hdrsize + lsize + sizeof(coff_hdr));
// patch coff header #3 // patch coff header #3
text->vaddr = sizeof(coff_hdr); text->vaddr = sizeof(coff_hdr);
@@ -327,13 +330,13 @@ void PackDjgpp2::pack(OutputFile *fo)
bss->size -= ph.overlap_overhead; bss->size -= ph.overlap_overhead;
// because of a feature (bug?) in stub.asm we need some padding // because of a feature (bug?) in stub.asm we need some padding
memcpy(obuf+data->size,"UPX",3); memcpy(obuf+data->size, "UPX", 3);
data->size = ALIGN_UP(data->size,4); data->size = ALIGN_UP(data->size, 4);
// write coff header, loader and compressed file // write coff header, loader and compressed file
fo->write(&coff_hdr,sizeof(coff_hdr)); fo->write(&coff_hdr, sizeof(coff_hdr));
fo->write(loader,lsize); fo->write(loader, lsize);
fo->write(obuf,data->size); fo->write(obuf, data->size);
#if 0 #if 0
printf("%-13s: coff hdr : %8ld bytes\n", getName(), (long) sizeof(coff_hdr)); printf("%-13s: coff hdr : %8ld bytes\n", getName(), (long) sizeof(coff_hdr));
printf("%-13s: loader : %8ld bytes\n", getName(), (long) lsize); printf("%-13s: loader : %8ld bytes\n", getName(), (long) lsize);
@@ -345,7 +348,7 @@ void PackDjgpp2::pack(OutputFile *fo)
// handle overlay // handle overlay
// FIXME: only Allegro pakfiles are supported // FIXME: only Allegro pakfiles are supported
handle_allegropak(fi,fo); handle_allegropak(fi, fo);
// finally check the compression ratio // finally check the compression ratio
if (!checkFinalCompressionRatio(fo)) if (!checkFinalCompressionRatio(fo))
@@ -361,7 +364,7 @@ int PackDjgpp2::canUnpack()
{ {
if (!readFileHeader()) if (!readFileHeader())
return false; return false;
if (is_dlm(fi,coff_offset)) if (is_dlm(fi, coff_offset))
throwCantUnpack("can't handle DLM"); throwCantUnpack("can't handle DLM");
fi->seek(coff_offset, SEEK_SET); fi->seek(coff_offset, SEEK_SET);
return readPackHeader(1024) ? 1 : -1; return readPackHeader(1024) ? 1 : -1;
@@ -379,19 +382,30 @@ void PackDjgpp2::unpack(OutputFile *fo)
ibuf.alloc(ph.c_len); ibuf.alloc(ph.c_len);
obuf.allocForUncompression(ph.u_len); obuf.allocForUncompression(ph.u_len);
fi->seek(coff_offset + ph.buf_offset + ph.getPackHeaderSize(),SEEK_SET); fi->seek(coff_offset + ph.buf_offset + ph.getPackHeaderSize(), SEEK_SET);
fi->readx(ibuf,ph.c_len); fi->readx(ibuf, ph.c_len);
// decompress // decompress
decompress(ibuf,obuf); decompress(ibuf, obuf);
coff_header_t *chdr = (coff_header_t*) obuf.getVoidPtr();
text = chdr->sh;
data = text + 1;
const unsigned hdrsize = 20 + 28
+ sizeof(external_scnhdr_t) * chdr->f_nscns;
unsigned addvalue;
if (ph.version >= 14)
addvalue = text->vaddr - hdrsize;
else
addvalue = text->vaddr &~ 0x1ff; // for old versions
// unfilter // unfilter
if (ph.filter) if (ph.filter)
{ {
memcpy(&coff_hdr,obuf,sizeof(coff_hdr));
Filter ft(ph.level); Filter ft(ph.level);
ft.init(ph.filter, text->vaddr &~ 0x1ff); ft.init(ph.filter, addvalue);
ft.cto = (unsigned char) ph.filter_cto; ft.cto = (unsigned char) ph.filter_cto;
if (ph.version < 11) if (ph.version < 11)
{ {
@@ -402,18 +416,34 @@ void PackDjgpp2::unpack(OutputFile *fo)
ft.unfilter(obuf, ph.u_len - data->size); ft.unfilter(obuf, ph.u_len - data->size);
} }
if (ph.version < 14)
{
// fixup for the aligning bug in strip 2.8+ // fixup for the aligning bug in strip 2.8+
text = ((coff_header_t*) (unsigned char *) obuf)->sh;
data = text + 1;
text->scnptr &= 0x1ff; text->scnptr &= 0x1ff;
data->scnptr = text->scnptr + text->size; data->scnptr = text->scnptr + text->size;
// write decompressed file // write decompressed file
if (fo) if (fo)
{ fo->write(obuf, ph.u_len);
fo->write(obuf,ph.u_len);
handle_allegropak(fi,fo);
} }
else
{
// write the header
// some padding might be required between the end
// of the header and the start of the .text section
const unsigned padding = text->scnptr - hdrsize;
ibuf.clear(0, padding);
if (fo)
{
fo->write(obuf, hdrsize);
fo->write(ibuf, padding);
fo->write(obuf + hdrsize, ph.u_len - hdrsize);
}
}
if (fo)
handle_allegropak(fi, fo);
} }
+3 -3
View File
@@ -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-2002 Markus Franz Xaver Johannes Oberhumer Copyright (C) 1996-2004 Markus Franz Xaver Johannes Oberhumer
Copyright (C) 1996-2002 Laszlo Molnar Copyright (C) 1996-2004 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
@@ -40,7 +40,7 @@ class PackDjgpp2 : public Packer
public: public:
PackDjgpp2(InputFile *f); PackDjgpp2(InputFile *f);
virtual int getVersion() const { return 13; } virtual int getVersion() const { return 14; }
virtual int getFormat() const { return UPX_F_DJGPP2_COFF; } virtual int getFormat() const { return UPX_F_DJGPP2_COFF; }
virtual const char *getName() const { return "djgpp2/coff"; } virtual const char *getName() const { return "djgpp2/coff"; }
virtual const int *getCompressionMethods(int method, int level) const; virtual const int *getCompressionMethods(int method, int level) const;
+313 -46
View File
@@ -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-2002 Markus Franz Xaver Johannes Oberhumer Copyright (C) 1996-2004 Markus Franz Xaver Johannes Oberhumer
Copyright (C) 1996-2002 Laszlo Molnar Copyright (C) 1996-2004 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
@@ -34,68 +34,335 @@
// Some ELF type definitinons // Some ELF type definitinons
**************************************************************************/ **************************************************************************/
namespace TT_Elf {
// The ELF file header. This appears at the start of every ELF file. // The ELF file header. This appears at the start of every ELF file.
struct Elf_LE32_Ehdr template <class Word, class Addr, class Off, class Half>
struct Ehdr
{ {
unsigned char e_ident[16]; /* Magic number and other info */ unsigned char e_ident[16]; /* Magic number and other info */
LE16 e_type; /* Object file type */ Half e_type; /* Object file type */
LE16 e_machine; /* Architecture */ Half e_machine; /* Architecture */
LE32 e_version; /* Object file version */ Word e_version; /* Object file version */
LE32 e_entry; /* Entry point virtual address */ Addr e_entry; /* Entry point virtual address */
LE32 e_phoff; /* Program header table file offset */ Off e_phoff; /* Program header table file offset */
LE32 e_shoff; /* Section header table file offset */ Off e_shoff; /* Section header table file offset */
LE32 e_flags; /* Processor-specific flags */ Word e_flags; /* Processor-specific flags */
LE16 e_ehsize; /* ELF header size in bytes */ Half e_ehsize; /* ELF header size in bytes */
LE16 e_phentsize; /* Program header table entry size */ Half e_phentsize; /* Program header table entry size */
LE16 e_phnum; /* Program header table entry count */ Half e_phnum; /* Program header table entry count */
LE16 e_shentsize; /* Section header table entry size */ Half e_shentsize; /* Section header table entry size */
LE16 e_shnum; /* Section header table entry count */ Half e_shnum; /* Section header table entry count */
LE16 e_shstrndx; /* Section header string table index */ Half e_shstrndx; /* Section header string table index */
}
__attribute_packed;
enum { // e_ident[]
// Program segment header. EI_CLASS = 4,
struct Elf_LE32_Phdr EI_DATA = 5, /* Data encoding */
{ EI_VERSION = 6,
LE32 p_type; /* Segment type */ EI_OSABI = 7,
LE32 p_offset; /* Segment file offset */ EI_ABIVERSION = 8,
LE32 p_vaddr; /* Segment virtual address */ };
LE32 p_paddr; /* Segment physical address */ enum { // e_ident[EI_CLASS]
LE32 p_filesz; /* Segment size in file */ ELFCLASS32 = 1, /* 32-bit objects */
LE32 p_memsz; /* Segment size in memory */ ELFCLASS64 = 2, /* 64-bit objects */
LE32 p_flags; /* Segment flags */ };
LE32 p_align; /* Segment alignment */ enum { // e_ident[EI_DATA]
ELFDATA2LSB = 1, /* 2's complement, little endian */
// Values for p_type ELFDATA2MSB = 2 /* 2's complement, big endian */
enum { };
PT_LOAD = 1, /* Loadable program segment */ enum { // e_ident[EI_OSABI]
PT_DYNAMIC = 2, /* Dynamic linking information */ ELFOSABI_LINUX = 3
PT_PHDR = 6 /* Entry for header table itself */ };
enum { // e_type
ET_NONE = 0, /* No file type */
ET_REL = 1, /* Relocatable file */
ET_EXEC = 2, /* Executable file */
ET_DYN = 3, /* Shared object file */
ET_CORE = 4, /* Core file */
};
enum { // e_machine
EM_386 = 3,
EM_PPC = 20,
EM_PPC64 = 21,
EM_ARM = 40,
EM_X86_64 = 62,
};
enum { // e_version
EV_CURRENT = 1,
}; };
// Values for p_flags
enum { PF_X = (1 << 0) }; /* Segment is executable */
enum { PF_W = (1 << 1) }; /* Segment is writable */
enum { PF_R = (1 << 2) }; /* Segment is readable */
} }
__attribute_packed; __attribute_packed;
struct Elf_LE32_Dyn template <class Word, class Addr>
struct Dyn
{ {
LE32 d_tag; Word d_tag;
LE32 d_val; Addr d_val;
enum { // tags enum { // d_tag
DT_NULL = 0, /* End flag */ DT_NULL = 0, /* End flag */
DT_NEEDED = 1, /* Name of needed library */ DT_NEEDED = 1, /* Name of needed library */
DT_HASH = 4, /* Hash table of symbol names */
DT_STRTAB = 5, /* String table */ DT_STRTAB = 5, /* String table */
DT_STRSZ = 10 /* Sizeof string table */ DT_SYMTAB = 6, /* Symbol table */
DT_STRSZ = 10, /* Sizeof string table */
}; };
} }
__attribute_packed; __attribute_packed;
} // namespace TT_Elf
namespace TT_Elf32 {
// Program segment header.
template <class Word, class Addr, class Off>
struct Phdr
{
Word p_type; /* Segment type */
Off p_offset; /* Segment file offset */
Addr p_vaddr; /* Segment virtual address */
Addr p_paddr; /* Segment physical address */
Word p_filesz; /* Segment size in file */
Word p_memsz; /* Segment size in memory */
Word p_flags; /* Segment flags */
Word p_align; /* Segment alignment */
enum { // p_type
PT_LOAD = 1, /* Loadable program segment */
PT_DYNAMIC = 2, /* Dynamic linking information */
PT_INTERP = 3, /* Name of program interpreter */
PT_PHDR = 6, /* Entry for header table itself */
};
enum { // p_flags
PF_X = 1, /* Segment is executable */
PF_W = 2, /* Segment is writable */
PF_R = 4, /* Segment is readable */
};
}
__attribute_packed;
template <class Word, class Addr, class Off>
struct Shdr
{
Word sh_name; /* Section name (string tbl index) */
Word sh_type; /* Section type */
Word sh_flags; /* Section flags */
Addr sh_addr; /* Section virtual addr at execution */
Off sh_offset; /* Section file offset */
Word sh_size; /* Section size in bytes */
Word sh_link; /* Link to another section */
Word sh_info; /* Additional section information */
Word sh_addralign; /* Section alignment */
Word sh_entsize; /* Entry size if section holds table */
enum { // sh_type
SHT_NULL = 0, /* Section header table entry unused */
SHT_PROGBITS = 1, /* Program data */
SHT_SYMTAB = 2, /* Symbol table */
SHT_STRTAB = 3, /* String table */
SHT_RELA = 4, /* Relocation entries with addends */
SHT_HASH = 5, /* Symbol hash table */
SHT_DYNAMIC = 6, /* Dynamic linking information */
SHT_NOTE = 7, /* Notes */
SHT_NOBITS = 8, /* Program space with no data (bss) */
SHT_REL = 9, /* Relocation entries, no addends */
SHT_SHLIB = 10, /* Reserved */
SHT_DYNSYM = 11, /* Dynamic linker symbol table */
/* 12, 13 hole */
SHT_INIT_ARRAY = 14, /* Array of constructors */
SHT_FINI_ARRAY = 15, /* Array of destructors */
SHT_PREINIT_ARRAY = 16, /* Array of pre-constructors */
SHT_GROUP = 17, /* Section group */
SHT_SYMTAB_SHNDX = 18, /* Extended section indeces */
SHT_GNU_LIBLIST = 0x6ffffff7, /* Prelink library list */
};
enum { // sh_flags
SHF_WRITE = (1 << 0), /* Writable */
SHF_ALLOC = (1 << 1), /* Occupies memory during execution */
SHF_EXECINSTR = (1 << 2), /* Executable */
SHF_MERGE = (1 << 4), /* Might be merged */
SHF_STRINGS = (1 << 5), /* Contains nul-terminated strings */
SHF_INFO_LINK = (1 << 6), /* `sh_info' contains SHT index */
SHF_LINK_ORDER = (1 << 7), /* Preserve order after combining */
};
}
__attribute_packed;
template <class TT16, class TT32, class TT64>
struct Sym
{
TT32 st_name; /* symbol name (index into string table) */
TT32 st_value; /* symbol value */
TT32 st_size; /* symbol size */
unsigned char st_info; /* symbol type and binding */
unsigned char st_other; /* symbol visibility */
TT16 st_shndx; /* section index */
unsigned int st_bind(unsigned int x) const { return 0xf & (x>>4); }
unsigned int st_type(unsigned int x) const { return 0xf & x ; }
unsigned char St_info(unsigned bind, unsigned type) const { return (bind<<4) + (0xf & type); }
enum { // st_bind (high 4 bits of st_info)
STB_LOCAL = 0, /* Local symbol */
STB_GLOBAL = 1, /* Global symbol */
STB_WEAK = 2, /* Weak symbol */
};
enum { // st_type (low 4 bits of st_info)
STT_NOTYPE = 0, /* Symbol type is unspecified */
STT_OBJECT = 1, /* Symbol is a data object */
STT_FUNC = 2, /* Symbol is a code object */
STT_SECTION = 3, /* Symbol associated with a section */
STT_FILE = 4, /* Symbol's name is file name */
STT_COMMON = 5, /* Symbol is a common data object */
STT_TLS = 6, /* Symbol is thread-local data object*/
};
enum { // st_other (visibility)
STV_DEFAULT = 0, /* Default symbol visibility rules */
STV_INTERNAL = 1, /* Processor specific hidden class */
STV_HIDDEN = 2, /* Sym unavailable in other modules */
STV_PROTECTED= 3, /* Not preemptible, not exported */
};
enum { // st_shndx
SHN_UNDEF = 0, /* Undefined section */
SHN_ABS = 0xfff1, /* Associated symbol is absolute */
SHN_COMMON = 0xfff2, /* Associated symbol is common */
};
}
__attribute_packed;
} // namespace TT_Elf32
namespace TT_Elf64 {
// Program segment header.
template <class Word, class Xword, class Addr, class Off>
struct Phdr
{
Word p_type; /* Segment type */
Word p_flags; /* Segment flags */
Off p_offset; /* Segment file offset */
Addr p_vaddr; /* Segment virtual address */
Addr p_paddr; /* Segment physical address */
Xword p_filesz; /* Segment size in file */
Xword p_memsz; /* Segment size in memory */
Xword p_align; /* Segment alignment */
enum { // p_type
PT_LOAD = 1, /* Loadable program segment */
PT_DYNAMIC = 2, /* Dynamic linking information */
PT_INTERP = 3, /* Name of program interpreter */
PT_PHDR = 6, /* Entry for header table itself */
};
enum { // p_flags
PF_X = 1, /* Segment is executable */
PF_W = 2, /* Segment is writable */
PF_R = 4, /* Segment is readable */
};
}
__attribute_packed;
template <class Word, class Xword, class Addr, class Off>
struct Shdr
{
Word sh_name; /* Section name (string tbl index) */
Word sh_type; /* Section type */
Xword sh_flags; /* Section flags */
Addr sh_addr; /* Section virtual addr at execution */
Off sh_offset; /* Section file offset */
Xword sh_size; /* Section size in bytes */
Word sh_link; /* Link to another section */
Word sh_info; /* Additional section information */
Xword sh_addralign; /* Section alignment */
Xword sh_entsize; /* Entry size if section holds table */
enum { // sh_type
SHT_NULL = 0, /* Section header table entry unused */
SHT_PROGBITS = 1, /* Program data */
SHT_SYMTAB = 2, /* Symbol table */
SHT_STRTAB = 3, /* String table */
SHT_RELA = 4, /* Relocation entries with addends */
SHT_HASH = 5, /* Symbol hash table */
SHT_DYNAMIC = 6, /* Dynamic linking information */
SHT_NOTE = 7, /* Notes */
SHT_NOBITS = 8, /* Program space with no data (bss) */
SHT_REL = 9, /* Relocation entries, no addends */
SHT_SHLIB = 10, /* Reserved */
SHT_DYNSYM = 11, /* Dynamic linker symbol table */
/* 12, 13 hole */
SHT_INIT_ARRAY = 14, /* Array of constructors */
SHT_FINI_ARRAY = 15, /* Array of destructors */
SHT_PREINIT_ARRAY = 16, /* Array of pre-constructors */
SHT_GROUP = 17, /* Section group */
SHT_SYMTAB_SHNDX = 18, /* Extended section indeces */
SHT_GNU_LIBLIST = 0x6ffffff7, /* Prelink library list */
};
}
__attribute_packed;
} // namespace TT_Elf64
/*************************************************************************
// now for the actual types
**************************************************************************/
typedef TT_Elf ::Ehdr<LE32,LE32,LE32,LE16> Elf_LE32_Ehdr;
typedef TT_Elf32::Phdr<LE32,LE32,LE32> Elf_LE32_Phdr;
typedef TT_Elf32::Shdr<LE32,LE32,LE32> Elf_LE32_Shdr;
typedef TT_Elf ::Dyn <LE32,LE32> Elf_LE32_Dyn;
typedef TT_Elf32::Sym <LE16,LE32,void> Elf_LE32_Sym;
typedef TT_Elf ::Ehdr<unsigned int,unsigned int,unsigned int,unsigned short> Elf32_Ehdr;
typedef TT_Elf32::Phdr<unsigned int,unsigned int,unsigned int> Elf32_Phdr;
typedef TT_Elf32::Shdr<unsigned int,unsigned int,unsigned int> Elf32_Shdr;
typedef TT_Elf ::Dyn <unsigned int,unsigned int> Elf32_Dyn;
typedef TT_Elf32::Sym <unsigned short,unsigned int,void> Elf32_Sym;
ACC_COMPILE_TIME_ASSERT_HEADER(sizeof(Elf_LE32_Ehdr) == 52)
ACC_COMPILE_TIME_ASSERT_HEADER(sizeof(Elf_LE32_Phdr) == 32)
ACC_COMPILE_TIME_ASSERT_HEADER(sizeof(Elf_LE32_Shdr) == 40)
ACC_COMPILE_TIME_ASSERT_HEADER(sizeof(Elf_LE32_Dyn) == 8)
ACC_COMPILE_TIME_ASSERT_HEADER(sizeof(Elf_LE32_Sym) == 16)
ACC_COMPILE_TIME_ASSERT_HEADER(sizeof(Elf32_Ehdr) == 52)
ACC_COMPILE_TIME_ASSERT_HEADER(sizeof(Elf32_Phdr) == 32)
ACC_COMPILE_TIME_ASSERT_HEADER(sizeof(Elf32_Shdr) == 40)
ACC_COMPILE_TIME_ASSERT_HEADER(sizeof(Elf32_Dyn) == 8)
ACC_COMPILE_TIME_ASSERT_HEADER(sizeof(Elf32_Sym) == 16)
typedef TT_Elf ::Ehdr<LE32,LE64,LE64,LE16> Elf_LE64_Ehdr;
typedef TT_Elf64::Phdr<LE32,LE64,LE64,LE64> Elf_LE64_Phdr;
typedef TT_Elf64::Shdr<LE32,LE64,LE64,LE64> Elf_LE64_Shdr;
typedef TT_Elf ::Dyn <LE64,LE64> Elf_LE64_Dyn;
typedef TT_Elf ::Ehdr<unsigned int,unsigned long long,
unsigned long long,unsigned short> Elf64_Ehdr;
typedef TT_Elf64::Phdr<unsigned int,unsigned long long,
unsigned long long,unsigned long long> Elf64_Phdr;
typedef TT_Elf64::Shdr<unsigned int,unsigned long long,
unsigned long long,unsigned long long> Elf64_Shdr;
typedef TT_Elf ::Dyn <unsigned long long,unsigned long long> Elf64_Dyn;
ACC_COMPILE_TIME_ASSERT_HEADER(sizeof(Elf_LE64_Ehdr) == 64)
ACC_COMPILE_TIME_ASSERT_HEADER(sizeof(Elf_LE64_Phdr) == 56)
ACC_COMPILE_TIME_ASSERT_HEADER(sizeof(Elf_LE64_Shdr) == 64)
ACC_COMPILE_TIME_ASSERT_HEADER(sizeof(Elf_LE64_Dyn) == 16)
ACC_COMPILE_TIME_ASSERT_HEADER(sizeof(Elf64_Ehdr) == 64)
ACC_COMPILE_TIME_ASSERT_HEADER(sizeof(Elf64_Phdr) == 56)
ACC_COMPILE_TIME_ASSERT_HEADER(sizeof(Elf64_Shdr) == 64)
ACC_COMPILE_TIME_ASSERT_HEADER(sizeof(Elf64_Dyn) == 16)
#endif /* already included */ #endif /* already included */
+2 -2
View File
@@ -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-2002 Markus Franz Xaver Johannes Oberhumer Copyright (C) 1996-2004 Markus Franz Xaver Johannes Oberhumer
Copyright (C) 1996-2002 Laszlo Molnar Copyright (C) 1996-2004 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
+28 -27
View File
@@ -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-2002 Markus Franz Xaver Johannes Oberhumer Copyright (C) 1996-2004 Markus Franz Xaver Johannes Oberhumer
Copyright (C) 1996-2002 Laszlo Molnar Copyright (C) 1996-2004 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 markus@oberhumer.com ml1050@users.sourceforge.net
*/ */
@@ -72,7 +72,7 @@ int PackExe::fillExeHeader(struct exe_header_t *eh) const
#define oh (*eh) #define oh (*eh)
// fill new exe header // fill new exe header
int flag = 0; int flag = 0;
if (!opt->dos.no_reloc) if (!opt->dos_exe.no_reloc)
flag |= USEJUMP; flag |= USEJUMP;
if (ih.relocs == 0) if (ih.relocs == 0)
flag |= NORELOC; flag |= NORELOC;
@@ -82,7 +82,7 @@ int PackExe::fillExeHeader(struct exe_header_t *eh) const
oh.headsize16 = 2; oh.headsize16 = 2;
oh.ip = 0; oh.ip = 0;
oh.sp = ih.sp > 0x200 ? ih.sp : 0x200; oh.sp = ih.sp > 0x200 ? (unsigned) ih.sp : 0x200;
unsigned destpara = (ph.u_len + ph.overlap_overhead - ph.c_len + 31) / 16; unsigned destpara = (ph.u_len + ph.overlap_overhead - ph.c_len + 31) / 16;
oh.ss = ph.c_len/16 + destpara; oh.ss = ph.c_len/16 + destpara;
@@ -110,7 +110,7 @@ int PackExe::buildLoader(const Filter *)
initLoader(nrv_loader,sizeof(nrv_loader)); initLoader(nrv_loader,sizeof(nrv_loader));
addLoader("EXEENTRY", addLoader("EXEENTRY",
relocsize ? "EXERELPU" : "", relocsize ? "EXERELPU" : "",
"EXEMAIN4""+G5DXXXX""UPX1HEAD""EXECUTPO", "EXEMAIN4,+G5DXXXX,UPX1HEAD,EXECUTPO",
NULL NULL
); );
if (ph.method == M_NRV2B_8) if (ph.method == M_NRV2B_8)
@@ -122,7 +122,7 @@ int PackExe::buildLoader(const Filter *)
opt->cpu == opt->CPU_8086 ? "N2BX8602" : "N2B28602", opt->cpu == opt->CPU_8086 ? "N2BX8602" : "N2B28602",
"NRV2BEX3", "NRV2BEX3",
ph.c_len > 0xffff ? "N2B64K02" : "", ph.c_len > 0xffff ? "N2B64K02" : "",
"NRV2BEX9""NRV2B16E", "NRV2BEX9,NRV2B16E",
NULL NULL
); );
else if (ph.method == M_NRV2D_8) else if (ph.method == M_NRV2D_8)
@@ -134,7 +134,7 @@ int PackExe::buildLoader(const Filter *)
opt->cpu == opt->CPU_8086 ? "N2DX8602" : "N2D28602", opt->cpu == opt->CPU_8086 ? "N2DX8602" : "N2D28602",
"NRV2DEX3", "NRV2DEX3",
ph.c_len > 0xffff ? "N2D64K02" : "", ph.c_len > 0xffff ? "N2D64K02" : "",
"NRV2DEX9""NRV2D16E", "NRV2DEX9,NRV2D16E",
NULL NULL
); );
else if (ph.method == M_NRV2E_8) else if (ph.method == M_NRV2E_8)
@@ -146,7 +146,7 @@ int PackExe::buildLoader(const Filter *)
opt->cpu == opt->CPU_8086 ? "N2EX8602" : "N2E28602", opt->cpu == opt->CPU_8086 ? "N2EX8602" : "N2E28602",
"NRV2EEX3", "NRV2EEX3",
ph.c_len > 0xffff ? "N2E64K02" : "", ph.c_len > 0xffff ? "N2E64K02" : "",
"NRV2EEX9""NRV2E16E", "NRV2EEX9,NRV2E16E",
NULL NULL
); );
else else
@@ -213,7 +213,7 @@ bool PackExe::canPack()
fi->readx(&offs,sizeof (offs)); fi->readx(&offs,sizeof (offs));
if (ih.relocoffs >= 0x40 && offs) if (ih.relocoffs >= 0x40 && offs)
{ {
if (opt->dos.force_stub) if (opt->dos_exe.force_stub)
opt->overlay = opt->COPY_OVERLAY; opt->overlay = opt->COPY_OVERLAY;
else else
throwCantPack("can't pack new-exe"); throwCantPack("can't pack new-exe");
@@ -293,7 +293,9 @@ unsigned optimize_relocs(upx_byte *b, const unsigned size,
{ {
addr = get_le32(relocs+4*i); addr = get_le32(relocs+4*i);
//printf ("%x\n",es*16+di); //printf ("%x\n",es*16+di);
if (addr - es*16 > 0xfffe) if ((addr - es*16 > 0xfffe)
|| (i == nrelocs - 1 && addr - es * 16 > 0xff00)
)
{ {
// segment change // segment change
t = 1+(0xffff-di)/254; t = 1+(0xffff-di)/254;
@@ -338,7 +340,7 @@ unsigned optimize_relocs(upx_byte *b, const unsigned size,
set_le16 (crel_save+2,seg_high); set_le16 (crel_save+2,seg_high);
//OutputFile::dump("x.rel", crel_save, crel - crel_save); //OutputFile::dump("x.rel", crel_save, crel - crel_save);
return crel - crel_save; return (unsigned) (crel - crel_save);
} }
@@ -409,7 +411,7 @@ void PackExe::pack(OutputFile *fo)
throwCantPack("decompressor limit exceeded, send a bugreport"); throwCantPack("decompressor limit exceeded, send a bugreport");
#ifdef TESTING #ifdef TESTING
if (opt->debug) if (opt->debug.debug_level)
{ {
printf("image+relocs %d -> %d\n",ih_imagesize+relocsize,ph.c_len); printf("image+relocs %d -> %d\n",ih_imagesize+relocsize,ph.c_len);
printf("offsets: %d - %d\nmatches: %d - %d\nruns: %d - %d\n", printf("offsets: %d - %d\nmatches: %d - %d\nruns: %d - %d\n",
@@ -437,8 +439,8 @@ void PackExe::pack(OutputFile *fo)
// set oh.min & oh.max // set oh.min & oh.max
ic = ih.min*16 + ih_imagesize; ic = ih.min*16 + ih_imagesize;
if (ic < oh.ss*16 + oh.sp) if (ic < oh.ss*16u + oh.sp)
ic = oh.ss*16 + oh.sp; ic = oh.ss*16u + oh.sp;
oh.min = (ic - (packedsize + lsize)) / 16; oh.min = (ic - (packedsize + lsize)) / 16;
ic = oh.min + (ih.max - ih.min); ic = oh.min + (ih.max - ih.min);
oh.max = ic < 0xffff && ih.max != 0xffff ? ic : 0xffff; oh.max = ic < 0xffff && ih.max != 0xffff ? ic : 0xffff;
@@ -525,7 +527,7 @@ void PackExe::pack(OutputFile *fo)
// write header + write loader + compressed file // write header + write loader + compressed file
#ifdef TESTING #ifdef TESTING
if (opt->debug) if (opt->debug.debug_level)
printf("\n%d %d %d %d\n",(int)sizeof(oh),e_len,packedsize,d_len); printf("\n%d %d %d %d\n",(int)sizeof(oh),e_len,packedsize,d_len);
#endif #endif
fo->write(&oh,sizeof(oh)); fo->write(&oh,sizeof(oh));
@@ -605,12 +607,11 @@ void PackExe::unpack(OutputFile *fo)
{ {
relocs -= get_le16(obuf+ph.u_len-2); relocs -= get_le16(obuf+ph.u_len-2);
ph.u_len -= 2; ph.u_len -= 2;
upx_byte *p;
wrkmem.alloc(4*MAXRELOCS); wrkmem.alloc(4*MAXRELOCS);
unsigned es = 0,ones = get_le16(relocs); unsigned es = 0, ones = get_le16(relocs);
unsigned seghi = get_le16(relocs+2); const unsigned seghi = get_le16(relocs+2);
p = relocs + 4; const upx_byte *p = relocs + 4;
while (ones) while (ones)
{ {
@@ -628,10 +629,10 @@ void PackExe::unpack(OutputFile *fo)
dorel = true; dorel = true;
if (*p == 0) if (*p == 0)
{ {
upx_byte *q; const upx_byte *q;
for (q = obuf+es*16+di; !(*q == 0x9a && get_le16(q+3) <= seghi); q++) for (q = obuf+es*16+di; !(*q == 0x9a && get_le16(q+3) <= seghi); q++)
; ;
di = q - (obuf+es*16) + 3; di = ptr_diff(q, obuf+es*16) + 3;
} }
else if (*p == 1) else if (*p == 1)
{ {
@@ -668,15 +669,15 @@ void PackExe::unpack(OutputFile *fo)
oh.ss = ih.ss; oh.ss = ih.ss;
if (flag & MAXMEM) if (flag & MAXMEM)
imagesize -= 2, oh.max = get_le16(ibuf+imagesize); { imagesize -= 2; oh.max = get_le16(ibuf+imagesize); }
if (flag & MINMEM) if (flag & MINMEM)
imagesize -= 2, oh.min = get_le16(ibuf+imagesize); { imagesize -= 2; oh.min = get_le16(ibuf+imagesize); }
if (flag & SP) if (flag & SP)
imagesize -= 2, oh.sp = get_le16(ibuf+imagesize); { imagesize -= 2; oh.sp = get_le16(ibuf+imagesize); }
if (flag & SS) if (flag & SS)
imagesize -= 2, oh.ss = get_le16(ibuf+imagesize); { imagesize -= 2; oh.ss = get_le16(ibuf+imagesize); }
unsigned ip = (flag & USEJUMP) ? get_le32(ibuf+imagesize-4) : ih.firstreloc; unsigned ip = (flag & USEJUMP) ? get_le32(ibuf+imagesize-4) : (unsigned) ih.firstreloc;
oh.ip = ip & 0xffff; oh.ip = ip & 0xffff;
oh.cs = ip >> 16; oh.cs = ip >> 16;
+2 -2
View File
@@ -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-2002 Markus Franz Xaver Johannes Oberhumer Copyright (C) 1996-2004 Markus Franz Xaver Johannes Oberhumer
Copyright (C) 1996-2002 Laszlo Molnar Copyright (C) 1996-2004 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
+1482 -219
View File
File diff suppressed because it is too large Load Diff
+269 -17
View File
@@ -2,9 +2,9 @@
This file is part of the UPX executable compressor. This file is part of the UPX executable compressor.
Copyright (C) 1996-2002 Markus Franz Xaver Johannes Oberhumer Copyright (C) 1996-2004 Markus Franz Xaver Johannes Oberhumer
Copyright (C) 1996-2002 Laszlo Molnar Copyright (C) 1996-2004 Laszlo Molnar
Copyright (C) 2000-2002 John F. Reiser Copyright (C) 2000-2004 John F. Reiser
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
@@ -31,6 +31,256 @@
#define __UPX_P_LX_ELF_H #define __UPX_P_LX_ELF_H
class PackLinuxElf : public PackUnix
{
typedef PackUnix super;
public:
PackLinuxElf(InputFile *f);
virtual ~PackLinuxElf();
/*virtual int buildLoader(const Filter *);*/
virtual bool canUnpackVersion(int version) const { return (version >= 11); }
protected:
virtual const int *getCompressionMethods(int method, int level) const;
// All other virtual functions in this class must be pure virtual
// because they depend on Elf32 or Elf64 data structures, which differ.
virtual void pack1(OutputFile *, Filter &) = 0; // generate executable header
virtual void pack2(OutputFile *, Filter &) = 0; // append compressed data
//virtual void pack3(OutputFile *, Filter &) = 0; // append loader
virtual void pack4(OutputFile *, Filter &) = 0; // append pack header
virtual void generateElfHdr(
OutputFile *,
void const *proto,
unsigned const brka
) = 0;
virtual int buildLinuxLoader(
upx_byte const *const proto, // assembly-only sections
unsigned const szproto,
upx_byte const *const fold, // linked assembly + C section
unsigned const szfold,
Filter const *ft
) = 0;
virtual void unpack(OutputFile *fo) = 0;
protected:
unsigned sz_phdrs; // sizeof Phdr[]
unsigned sz_elf_hdrs; // all Elf headers
};
class PackLinuxElf32 : public PackLinuxElf
{
typedef PackLinuxElf super;
public:
PackLinuxElf32(InputFile *f);
virtual ~PackLinuxElf32();
protected:
virtual int checkEhdr(
Elf32_Ehdr const *ehdr,
unsigned char e_machine,
unsigned char ei_class,
unsigned char ei_data) const;
virtual void pack1(OutputFile *, Filter &); // generate executable header
virtual void pack2(OutputFile *, Filter &); // append compressed data
//virtual void pack3(OutputFile *, Filter &); // append loader
virtual void pack4(OutputFile *, Filter &); // append pack header
virtual void unpack(OutputFile *fo);
virtual void generateElfHdr(
OutputFile *,
void const *proto,
unsigned const brka
);
virtual off_t getbrk(const Elf32_Phdr *phdr, int e_phnum) const;
virtual void patchLoader();
virtual void updateLoader(OutputFile *fo);
virtual unsigned find_LOAD_gap(Elf32_Phdr const *const phdri, unsigned const k,
unsigned const e_phnum);
protected:
Elf32_Ehdr ehdri; // from input file
Elf32_Phdr *phdri; // for input file
struct cprElfHdr1 {
Elf32_Ehdr ehdr;
Elf32_Phdr phdr[1];
l_info linfo;
}
__attribute_packed;
struct cprElfHdr2 {
Elf32_Ehdr ehdr;
Elf32_Phdr phdr[2];
l_info linfo;
}
__attribute_packed;
struct cprElfHdr3 {
Elf32_Ehdr ehdr;
Elf32_Phdr phdr[3];
l_info linfo;
}
__attribute_packed;
cprElfHdr3 elfout;
};
class PackLinuxElf64 : public PackLinuxElf
{
typedef PackLinuxElf super;
public:
PackLinuxElf64(InputFile *f);
virtual ~PackLinuxElf64();
/*virtual int buildLoader(const Filter *);*/
protected:
virtual int checkEhdr(
Elf64_Ehdr const *ehdr,
unsigned char e_machine,
unsigned char ei_class,
unsigned char ei_data) const;
virtual void pack1(OutputFile *, Filter &); // generate executable header
virtual void pack2(OutputFile *, Filter &); // append compressed data
//virtual void pack3(OutputFile *, Filter &); // append loader
virtual void pack4(OutputFile *, Filter &); // append pack header
virtual void unpack(OutputFile *fo);
virtual void generateElfHdr(
OutputFile *,
void const *proto,
unsigned const brka
);
virtual off_t getbrk(const Elf64_Phdr *phdr, int e_phnum) const;
virtual void patchLoader();
virtual void updateLoader(OutputFile *fo);
virtual unsigned find_LOAD_gap(Elf64_Phdr const *const phdri, unsigned const k,
unsigned const e_phnum);
protected:
Elf64_Ehdr ehdri; // from input file
Elf64_Phdr *phdri; // for input file
struct cprElfHdr1 {
Elf64_Ehdr ehdr;
Elf64_Phdr phdr[1];
l_info linfo;
}
__attribute_packed;
struct cprElfHdr2 {
Elf64_Ehdr ehdr;
Elf64_Phdr phdr[2];
l_info linfo;
}
__attribute_packed;
struct cprElfHdr3 {
Elf64_Ehdr ehdr;
Elf64_Phdr phdr[3];
l_info linfo;
}
__attribute_packed;
cprElfHdr3 elfout;
};
class PackLinuxElf32Be : public PackLinuxElf32
{
typedef PackLinuxElf32 super;
protected:
PackLinuxElf32Be(InputFile *f) : super(f) { }
virtual acc_uint64l_t get_native64(const void *b) const { return get_be64(b); }
virtual unsigned get_native32(const void *b) const { return get_be32(b); }
virtual unsigned get_native16(const void *b) const { return get_be16(b); }
virtual void set_native64(void *b, acc_uint64l_t v) const { set_be64(b, v); }
virtual void set_native32(void *b, unsigned v) const { set_be32(b, v); }
virtual void set_native16(void *b, unsigned v) const { set_be16(b, v); }
};
class PackLinuxElf64Le : public PackLinuxElf64
{
typedef PackLinuxElf64 super;
protected:
PackLinuxElf64Le(InputFile *f) : super(f) { }
virtual acc_uint64l_t get_native64(const void *b) const { return get_le64(b); }
virtual unsigned get_native32(const void *b) const { return get_le32(b); }
virtual unsigned get_native16(const void *b) const { return get_le16(b); }
virtual void set_native64(void *b, acc_uint64l_t v) const { set_le64(b, v); }
virtual void set_native32(void *b, unsigned v) const { set_le32(b, v); }
virtual void set_native16(void *b, unsigned v) const { set_le16(b, v); }
};
/*************************************************************************
// linux/elf64amd
**************************************************************************/
class PackLinuxElf64amd : public PackLinuxElf64Le
{
typedef PackLinuxElf64Le super;
public:
PackLinuxElf64amd(InputFile *f);
virtual ~PackLinuxElf64amd();
virtual int getFormat() const { return UPX_F_LINUX_ELF64_AMD; }
virtual const char *getName() const { return "linux/ElfAMD"; }
virtual const int *getFilters() const;
virtual bool canPack();
protected:
virtual void pack3(OutputFile *, Filter &); // append loader
virtual const int *getCompressionMethods(int method, int level) const;
virtual int buildLinuxLoader(
upx_byte const *const proto, // assembly-only sections
unsigned const szproto,
upx_byte const *const fold, // linked assembly + C section
unsigned const szfold,
Filter const *ft
);
virtual int buildLoader(const Filter *);
virtual void generateElfHdr(
OutputFile *,
void const *proto,
unsigned const brka
);
};
/*************************************************************************
// linux/elf32ppc
**************************************************************************/
class PackLinuxElf32ppc : public PackLinuxElf32Be
{
typedef PackLinuxElf32Be super;
public:
PackLinuxElf32ppc(InputFile *f);
virtual ~PackLinuxElf32ppc();
virtual int getFormat() const { return UPX_F_LINUX_ELFPPC32; }
virtual const char *getName() const { return "linux/ElfPPC"; }
virtual const int *getFilters() const;
virtual bool canPack();
protected:
virtual void pack3(OutputFile *, Filter &); // append loader
virtual const int *getCompressionMethods(int method, int level) const;
virtual int buildLinuxLoader(
upx_byte const *const proto, // assembly-only sections
unsigned const szproto,
upx_byte const *const fold, // linked assembly + C section
unsigned const szfold,
Filter const *ft
);
virtual int buildLoader(const Filter *);
virtual void generateElfHdr(
OutputFile *,
void const *proto,
unsigned const brka
);
};
/************************************************************************* /*************************************************************************
// linux/elf386 // linux/elf386
**************************************************************************/ **************************************************************************/
@@ -53,28 +303,30 @@ public:
virtual bool canUnpackVersion(int version) const virtual bool canUnpackVersion(int version) const
{ return (version >= 11); } { return (version >= 11); }
protected:
struct Extent {
off_t offset;
off_t size;
};
virtual void packExtent(Extent const &x,
unsigned &total_in, unsigned &total_out, Filter *, OutputFile *);
virtual void unpackExtent(unsigned wanted, OutputFile *fo,
unsigned &total_in, unsigned &total_out,
unsigned &c_adler, unsigned &u_adler,
bool first_PF_X, unsigned szb_info );
protected: protected:
virtual void pack1(OutputFile *, Filter &); // generate executable header virtual void pack1(OutputFile *, Filter &); // generate executable header
virtual void pack2(OutputFile *, Filter &); // append compressed data virtual void pack2(OutputFile *, Filter &); // append compressed data
virtual void pack3(OutputFile *, Filter &); // append loader
virtual void pack4(OutputFile *, Filter &); // append pack header
virtual void patchLoader(); virtual void patchLoader();
Elf_LE32_Ehdr ehdri; // from input file Elf32_Ehdr ehdri; // from input file
Elf_LE32_Phdr *phdri; // for input file Elf32_Phdr *phdri; // for input file
unsigned sz_phdrs; // sizeof Phdr[] unsigned sz_phdrs; // sizeof Phdr[]
char *file_image; // if ET_DYN investigation
Elf32_Dyn const *dynseg; // from PT_DYNAMIC
unsigned int const *hashtab; // from DT_HASH
char const *dynstr; // from DT_STRTAB
Elf32_Sym const *dynsym; // from DT_SYMTAB
static unsigned elf_hash(char const *) /*const*/;
virtual void const *elf_find_dynamic(unsigned) const;
virtual Elf32_Sym const *elf_lookup(char const *) const;
virtual unsigned elf_get_offset_from_address(unsigned) const;
virtual unsigned find_LOAD_gap(Elf32_Phdr const *const phdri, unsigned const k,
unsigned const e_phnum);
}; };
+180 -67
View File
@@ -2,9 +2,9 @@
This file is part of the UPX executable compressor. This file is part of the UPX executable compressor.
Copyright (C) 1996-2002 Markus Franz Xaver Johannes Oberhumer Copyright (C) 1996-2006 Markus Franz Xaver Johannes Oberhumer
Copyright (C) 1996-2002 Laszlo Molnar Copyright (C) 1996-2006 Laszlo Molnar
Copyright (C) 2001-2002 John F. Reiser Copyright (C) 2001-2006 John F. Reiser
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
@@ -37,12 +37,14 @@
#include "p_unix.h" #include "p_unix.h"
#include "p_lx_exc.h" #include "p_lx_exc.h"
#define PT_LOAD Elf_LE32_Phdr::PT_LOAD #define PT_LOAD Elf32_Phdr::PT_LOAD
#define PT_DYNAMIC Elf_LE32_Phdr::PT_DYNAMIC #define PT_DYNAMIC Elf32_Phdr::PT_DYNAMIC
#define DT_NULL Elf_LE32_Dyn::DT_NULL #if 0 // UNUSED
#define DT_NEEDED Elf_LE32_Dyn::DT_NEEDED #define DT_NULL Elf32_Dyn::DT_NULL
#define DT_STRTAB Elf_LE32_Dyn::DT_STRTAB #define DT_NEEDED Elf32_Dyn::DT_NEEDED
#define DT_STRSZ Elf_LE32_Dyn::DT_STRSZ #define DT_STRTAB Elf32_Dyn::DT_STRTAB
#define DT_STRSZ Elf32_Dyn::DT_STRSZ
#endif
/************************************************************************* /*************************************************************************
@@ -63,10 +65,15 @@ const int *PackLinuxI386::getCompressionMethods(int method, int level) const
const int *PackLinuxI386::getFilters() const const int *PackLinuxI386::getFilters() const
{ {
static const int filters[] = { static const int filters[] = {
#if 1
0x26, 0x24, 0x11, 0x14, 0x13, 0x16, 0x25, 0x15, 0x12,
#else
0x49, 0x46, 0x49, 0x46,
// FIXME 2002-11-11: We use stub/fold_exec86.asm, which calls the
// decompressor multiple times, and unfilter is independent of decompress.
// Currently only filters 0x49, 0x46, 0x80..0x87 can handle this;
// and 0x80..0x87 are regarded as "untested".
#if 0
0x26, 0x24, 0x11, 0x14, 0x13, 0x16, 0x25, 0x15, 0x12,
#endif
#if 0
0x83, 0x86, 0x80, 0x84, 0x87, 0x81, 0x82, 0x85, 0x83, 0x86, 0x80, 0x84, 0x87, 0x81, 0x82, 0x85,
0x24, 0x16, 0x13, 0x14, 0x11, 0x25, 0x15, 0x12, 0x24, 0x16, 0x13, 0x14, 0x11, 0x25, 0x15, 0x12,
#endif #endif
@@ -76,19 +83,20 @@ const int *PackLinuxI386::getFilters() const
void void
PackLinuxI386::generateElfHdr( PackLinuxI386::generateElfHdr(
OutputFile *const fo, OutputFile *fo,
void const *const proto, void const *proto,
unsigned const brka unsigned const brka
) )
{ {
cprElfHdr1 *const h1 = (cprElfHdr1 *)&elfout; cprElfHdr1 *const h1 = (cprElfHdr1 *)&elfout;
cprElfHdr2 *const h2 = (cprElfHdr2 *)&elfout; cprElfHdr2 *const h2 = (cprElfHdr2 *)&elfout;
memcpy(h2, proto, sizeof(*h2)); cprElfHdr3 *const h3 = (cprElfHdr3 *)&elfout;
memcpy(h3, proto, sizeof(*h3)); // reads beyond, but OK
assert(h2->ehdr.e_phoff == sizeof(Elf_LE32_Ehdr)); assert(h2->ehdr.e_phoff == sizeof(Elf32_Ehdr));
assert(h2->ehdr.e_shoff == 0); assert(h2->ehdr.e_shoff == 0);
assert(h2->ehdr.e_ehsize == sizeof(Elf_LE32_Ehdr)); assert(h2->ehdr.e_ehsize == sizeof(Elf32_Ehdr));
assert(h2->ehdr.e_phentsize == sizeof(Elf_LE32_Phdr)); assert(h2->ehdr.e_phentsize == sizeof(Elf32_Phdr));
assert(h2->ehdr.e_shnum == 0); assert(h2->ehdr.e_shnum == 0);
#if 0 //{ #if 0 //{
@@ -100,12 +108,22 @@ PackLinuxI386::generateElfHdr(
// Info for OS kernel to set the brk() // Info for OS kernel to set the brk()
if (brka) { if (brka) {
#define PAGE_MASK (~0ul<<12)
// linux-2.6.14 binfmt_elf.c: SIGKILL if (0==.p_memsz) on a page boundary
unsigned const brkb = brka | ((0==(~PAGE_MASK & brka)) ? 0x20 : 0);
h2->phdr[1].p_type = PT_LOAD; // be sure h2->phdr[1].p_type = PT_LOAD; // be sure
h2->phdr[1].p_offset = 0xfff&brka; h2->phdr[1].p_offset = ~PAGE_MASK & brkb;
h2->phdr[1].p_vaddr = brka; h2->phdr[1].p_vaddr = brkb;
h2->phdr[1].p_paddr = brka; h2->phdr[1].p_paddr = brkb;
h2->phdr[1].p_filesz = 0; h2->phdr[1].p_filesz = 0;
h2->phdr[1].p_memsz = 0; h2->phdr[1].p_memsz = 0;
if (0==h2->phdr[1].p_flags) {
h2->phdr[1].p_flags = Elf32_Phdr::PF_R|Elf32_Phdr::PF_W;
}
if (0==h2->phdr[1].p_align) {
h2->phdr[1].p_align = 0x1000;
}
#undef PAGE_MASK
} }
if (ph.format==UPX_F_LINUX_i386 ) { if (ph.format==UPX_F_LINUX_i386 ) {
@@ -120,10 +138,15 @@ PackLinuxI386::generateElfHdr(
} }
else if (ph.format==UPX_F_LINUX_SH_i386) { else if (ph.format==UPX_F_LINUX_SH_i386) {
assert(h2->ehdr.e_phnum==1); assert(h2->ehdr.e_phnum==1);
h2->ehdr.e_phnum = 2; h2->ehdr.e_phnum = 1;
memset(&h2->linfo, 0, sizeof(h2->linfo)); memset(&h2->linfo, 0, sizeof(h2->linfo));
fo->write(h2, sizeof(*h2)); fo->write(h2, sizeof(*h2));
} }
else if (ph.format==UPX_F_LINUX_ELFI_i386) {
assert(h3->ehdr.e_phnum==3);
memset(&h3->linfo, 0, sizeof(h3->linfo));
fo->write(h3, sizeof(*h3));
}
else { else {
assert(false); // unknown ph.format, PackUnix::generateElfHdr assert(false); // unknown ph.format, PackUnix::generateElfHdr
} }
@@ -144,21 +167,73 @@ PackLinuxI386::pack4(OutputFile *fo, Filter &ft)
overlay_offset = sizeof(elfout.ehdr) + overlay_offset = sizeof(elfout.ehdr) +
(elfout.ehdr.e_phentsize * elfout.ehdr.e_phnum) + (elfout.ehdr.e_phentsize * elfout.ehdr.e_phnum) +
sizeof(l_info) + sizeof(l_info) +
((elfout.ehdr.e_phnum==3) ? elfout.phdr[2].p_memsz : 0) ; ((elfout.ehdr.e_phnum==3) ? (unsigned) elfout.phdr[2].p_memsz : 0) ;
unsigned len = fo->getBytesWritten();
set_native32(&elfout.phdr[0].p_filesz, len);
super::pack4(fo, ft); // write PackHeader and overlay_offset super::pack4(fo, ft); // write PackHeader and overlay_offset
elfout.phdr[0].p_filesz = fo->getBytesWritten();
#define PAGE_MASK (~0<<12) #if 0 // {
// /usr/bin/strip from RedHat 8.0 (binutils-2.13.90.0.2-2)
// generates a 92-byte [only] output, because the "linking view"
// is empty. This code supplies a "linking view".
// However, 'strip' then generates _plausible_ junk that gets
// "Illegal instruction" because 'strip' changes p_hdr[1].p_align,
// .p_offset, and .p_vaddr incorrectly. So the "cure" is worse than
// the disease. It is obvious that a 92-byte file is bad,
// but it is not obvious that the changed .p_align is bad.
// Also, having a totally empty "linking view" is easier for 'strip'
// to fix: just detect that, and do nothing.
// So, we don't use this code for now [2003-01-11].
// Supply a "linking view" that covers everything,
// so that 'strip' does not omit everything.
Elf32_Shdr shdr;
// The section header string table.
char const shstrtab[] = "\0.\0.shstrtab";
unsigned eod = elfout.phdr[0].p_filesz;
set_native32(&elfout.ehdr.e_shoff, eod);
set_native16(&elfout.ehdr.e_shentsize, sizeof(shdr));
set_native16(&elfout.ehdr.e_shnum, 3);
set_native16(&elfout.ehdr.e_shstrndx, 2);
// An empty Elf32_Shdr for space as a null index.
memset(&shdr, 0, sizeof(shdr));
set_native32(&shdr.sh_type, Elf32_Shdr::SHT_NULL);
fo->write(&shdr, sizeof(shdr));
// Cover all the bits we need at runtime.
memset(&shdr, 0, sizeof(shdr));
set_native32(&shdr.sh_name, 1);
set_native32(&shdr.sh_type, Elf32_Shdr::SHT_PROGBITS);
set_native32(&shdr.sh_flags, Elf32_Shdr::SHF_ALLOC);
set_native32(&shdr.sh_addr, elfout.phdr[0].p_vaddr);
set_native32(&shdr.sh_offset, overlay_offset);
set_native32(&shdr.sh_size, eod - overlay_offset);
set_native32(&shdr.sh_addralign, 4096);
fo->write(&shdr, sizeof(shdr));
// A section header for the section header string table.
memset(&shdr, 0, sizeof(shdr));
set_native32(&shdr.sh_name, 3);
set_native32(&shdr.sh_type, Elf32_Shdr::SHT_STRTAB);
set_native32(&shdr.sh_offset, 3*sizeof(shdr) + eod);
set_native32(&shdr.sh_size, sizeof(shstrtab));
fo->write(&shdr, sizeof(shdr));
fo->write(shstrtab, sizeof(shstrtab));
#endif // }
#undef PAGE_MASK
#define PAGE_MASK (~0u<<12)
// pre-calculate for benefit of runtime disappearing act via munmap() // pre-calculate for benefit of runtime disappearing act via munmap()
elfout.phdr[0].p_memsz = PAGE_MASK & (~PAGE_MASK + elfout.phdr[0].p_filesz); elfout.phdr[0].p_memsz = PAGE_MASK & (~PAGE_MASK + elfout.phdr[0].p_filesz);
#undef PAGE_MASK #undef PAGE_MASK
// rewrite Elf header // rewrite Elf header
fo->seek(0, SEEK_SET); fo->seek(0, SEEK_SET);
fo->rewrite(&elfout, sizeof(elfout.ehdr) + fo->rewrite(&elfout, overlay_offset);
elfout.ehdr.e_phnum * sizeof(elfout.phdr[0]) +
sizeof(l_info) );
} }
static unsigned static unsigned
@@ -181,26 +256,37 @@ PackLinuxI386::buildLinuxLoader(
{ {
initLoader(proto, szproto); initLoader(proto, szproto);
cprElfHdr1 const *const hf = (cprElfHdr1 const *)fold;
unsigned const fold_hdrlen = umax(0x80, sizeof(hf->ehdr) +
hf->ehdr.e_phentsize * hf->ehdr.e_phnum + sizeof(l_info) );
struct b_info h; memset(&h, 0, sizeof(h)); struct b_info h; memset(&h, 0, sizeof(h));
h.sz_unc = szfold - fold_hdrlen; unsigned fold_hdrlen = 0;
if (0 < szfold) {
cprElfHdr1 const *const hf = (cprElfHdr1 const *)fold;
fold_hdrlen = sizeof(hf->ehdr) + hf->ehdr.e_phentsize * hf->ehdr.e_phnum +
sizeof(l_info);
if (0 == get_le32(fold_hdrlen + fold)) {
// inconsistent SIZEOF_HEADERS in *.lds (ld, binutils)
fold_hdrlen = umax(0x80, fold_hdrlen);
}
h.sz_unc = (szfold < fold_hdrlen) ? 0 : (szfold - fold_hdrlen);
h.b_method = (unsigned char) ph.method; h.b_method = (unsigned char) ph.method;
h.b_ftid = (unsigned char) ph.filter; h.b_ftid = (unsigned char) ph.filter;
h.b_cto8 = (unsigned char) ph.filter_cto; h.b_cto8 = (unsigned char) ph.filter_cto;
}
unsigned char const *const uncLoader = fold_hdrlen + fold; unsigned char const *const uncLoader = fold_hdrlen + fold;
unsigned char *const cprLoader = new unsigned char[sizeof(h) + h.sz_unc]; unsigned char *const cprLoader = new unsigned char[sizeof(h) + h.sz_unc];
int r = upx_compress(uncLoader, h.sz_unc, sizeof(h) + cprLoader, &h.sz_cpr, if (0 < szfold) {
unsigned sz_cpr;
int r = upx_compress(uncLoader, h.sz_unc, sizeof(h) + cprLoader, &sz_cpr,
NULL, ph.method, 10, NULL, NULL ); NULL, ph.method, 10, NULL, NULL );
h.sz_cpr = sz_cpr;
if (r != UPX_E_OK || h.sz_cpr >= h.sz_unc) if (r != UPX_E_OK || h.sz_cpr >= h.sz_unc)
throwInternalError("loader compression failed"); throwInternalError("loader compression failed");
}
memcpy(cprLoader, &h, sizeof(h)); memcpy(cprLoader, &h, sizeof(h));
// This adds the definition to the "library", to be used later. // This adds the definition to the "library", to be used later.
linker->addSection("FOLDEXEC", cprLoader, sizeof(h) + h.sz_cpr); linker->addSection("FOLDEXEC", cprLoader, sizeof(h) + h.sz_cpr);
delete cprLoader; delete [] cprLoader;
n_mru = ft->n_mru; n_mru = ft->n_mru;
@@ -213,77 +299,80 @@ PackLinuxI386::buildLinuxLoader(
// checksum UPX! lsize version format // checksum UPX! lsize version format
sizeof(l_info) + sizeof(l_info) +
// PT_DYNAMIC with DT_NEEDED "forwarded" from original file // PT_DYNAMIC with DT_NEEDED "forwarded" from original file
((elfout.ehdr.e_phnum==3) ? elfout.phdr[2].p_memsz : 0) + ((elfout.ehdr.e_phnum==3) ? (unsigned) elfout.phdr[2].p_memsz : 0) +
// p_progid, p_filesize, p_blocksize // p_progid, p_filesize, p_blocksize
sizeof(p_info) + sizeof(p_info) +
// compressed data // compressed data
b_len + ph.c_len ); b_len + ph.c_len );
// entry to stub // entry to stub
addLoader("LEXEC000", 0); addLoader("LEXEC000", NULL);
if (ft->id) { if (ft->id) {
if (ph.format==UPX_F_LINUX_ELF_i386) { // decompr, unfilter are separate if (ph.format==UPX_F_LINUX_ELF_i386) { // decompr, unfilter are separate
addLoader("LXUNF000", 0); addLoader("LXUNF000", NULL);
addLoader("LXUNF002", 0); addLoader("LXUNF002", NULL);
if (0x80==(ft->id & 0xF0)) { if (0x80==(ft->id & 0xF0)) {
if (256==n_mru) { if (256==n_mru) {
addLoader("MRUBYTE0", 0); addLoader("MRUBYTE0", NULL);
} }
else if (n_mru) { else if (n_mru) {
addLoader("LXMRU005", 0); addLoader("LXMRU005", NULL);
} }
if (n_mru) { if (n_mru) {
addLoader("LXMRU006", 0); addLoader("LXMRU006", NULL);
} }
else { else {
addLoader("LXMRU007", 0); addLoader("LXMRU007", NULL);
} }
} }
else if (0x40==(ft->id & 0xF0)) { else if (0x40==(ft->id & 0xF0)) {
addLoader("LXUNF008", 0); addLoader("LXUNF008", NULL);
} }
addLoader("LXUNF010", 0); addLoader("LXUNF010", NULL);
} }
if (n_mru) { if (n_mru) {
addLoader("LEXEC009", 0); addLoader("LEXEC009", NULL);
} }
} }
addLoader("LEXEC010", 0); addLoader("LEXEC010", NULL);
addLoader(getDecompressor(), 0); addLoader(getDecompressor(), NULL);
addLoader("LEXEC015", 0); addLoader("LEXEC015", NULL);
if (ft->id) { if (ft->id) {
if (ph.format==UPX_F_LINUX_ELF_i386) { // decompr, unfilter are separate if (ph.format==UPX_F_LINUX_ELF_i386) { // decompr, unfilter are separate
if (0x80!=(ft->id & 0xF0)) { if (0x80!=(ft->id & 0xF0)) {
addLoader("LXUNF042", 0); addLoader("LXUNF042", NULL);
} }
} }
else { // decompr, unfilter not separate else { // decompr, unfilter not separate
if (0x80==(ft->id & 0xF0)) { if (0x80==(ft->id & 0xF0)) {
addLoader("LEXEC110", 0); addLoader("LEXEC110", NULL);
if (n_mru) { if (n_mru) {
addLoader("LEXEC100", 0); addLoader("LEXEC100", NULL);
} }
// bug in APP: jmp and label must be in same .asx/.asy // bug in APP: jmp and label must be in same .asx/.asy
addLoader("LEXEC016", 0); addLoader("LEXEC016", NULL);
} }
} }
addFilter32(ft->id); addFilter32(ft->id);
if (ph.format==UPX_F_LINUX_ELF_i386) { // decompr, unfilter are separate if (ph.format==UPX_F_LINUX_ELF_i386) { // decompr, unfilter are separate
if (0x80==(ft->id & 0xF0)) { if (0x80==(ft->id & 0xF0)) {
if (0==n_mru) { if (0==n_mru) {
addLoader("LXMRU058", 0); addLoader("LXMRU058", NULL);
} }
} }
addLoader("LXUNF035", 0); addLoader("LXUNF035", NULL);
} }
else { // decompr always unfilters else { // decompr always unfilters
addLoader("LEXEC017", 0); addLoader("LEXEC017", NULL);
} }
} }
else {
addLoader("LEXEC017", NULL);
}
addLoader("IDENTSTR", 0); addLoader("IDENTSTR", NULL);
addLoader("LEXEC020", 0); addLoader("LEXEC020", NULL);
addLoader("FOLDEXEC", 0); addLoader("FOLDEXEC", NULL);
char *ptr_cto = (char *)const_cast<unsigned char *>(getLoader()); char *ptr_cto = (char *)const_cast<unsigned char *>(getLoader());
int sz_cto = getLoaderSize(); int sz_cto = getLoaderSize();
@@ -320,7 +409,14 @@ PackLinuxI386::buildLoader(Filter const *ft)
// filter // filter
optimizeFilter(&fold_ft, buf, sz_fold); optimizeFilter(&fold_ft, buf, sz_fold);
bool success = fold_ft.filter(buf + sizeof(cprElfHdr2), sz_fold - sizeof(cprElfHdr2));
unsigned fold_hdrlen = sizeof(l_info) + sizeof(Elf32_Ehdr) +
sizeof(Elf32_Phdr) * get_native32(&((Elf32_Ehdr const *)(void *)buf)->e_phnum);
if (0 == get_le32(fold_hdrlen + buf)) {
// inconsistent SIZEOF_HEADERS in *.lds (ld, binutils)
fold_hdrlen = umax(0x80, fold_hdrlen);
}
bool success = fold_ft.filter(buf + fold_hdrlen, sz_fold - fold_hdrlen);
(void)success; (void)success;
return buildLinuxLoader( return buildLinuxLoader(
@@ -328,6 +424,7 @@ PackLinuxI386::buildLoader(Filter const *ft)
buf, sz_fold, ft ); buf, sz_fold, ft );
} }
// FIXME: getLoaderPrefixSize is unused?
int PackLinuxI386::getLoaderPrefixSize() const int PackLinuxI386::getLoaderPrefixSize() const
{ {
return 116; return 116;
@@ -339,7 +436,7 @@ int PackLinuxI386::getLoaderPrefixSize() const
**************************************************************************/ **************************************************************************/
// basic check of an Linux ELF Ehdr // basic check of an Linux ELF Ehdr
int PackLinuxI386::checkEhdr(const Elf_LE32_Ehdr *ehdr) const int PackLinuxI386::checkEhdr(const Elf32_Ehdr *ehdr) const
{ {
const unsigned char * const buf = ehdr->e_ident; const unsigned char * const buf = ehdr->e_ident;
@@ -349,15 +446,16 @@ int PackLinuxI386::checkEhdr(const Elf_LE32_Ehdr *ehdr) const
// now check the ELF header // now check the ELF header
if (!memcmp(buf+8, "FreeBSD", 7)) // branded if (!memcmp(buf+8, "FreeBSD", 7)) // branded
return 1; return 1;
if (ehdr->e_type != 2) // executable if (ehdr->e_type != Elf32_Ehdr::ET_EXEC
&& ehdr->e_type != Elf32_Ehdr::ET_DYN ) // executable
return 2; return 2;
if (ehdr->e_machine != 3) // Intel 80386 if (ehdr->e_machine != Elf32_Ehdr::EM_386) // Intel 80386
return 3; return 3;
if (ehdr->e_version != 1) // version if (ehdr->e_version != Elf32_Ehdr::EV_CURRENT) // version
return 4; return 4;
if (ehdr->e_phnum < 1) if (ehdr->e_phnum < 1)
return 5; return 5;
if (ehdr->e_phentsize != sizeof(Elf_LE32_Phdr)) if (ehdr->e_phentsize != sizeof(Elf32_Phdr))
return 6; return 6;
// check for Linux kernels // check for Linux kernels
@@ -378,7 +476,7 @@ int PackLinuxI386::checkEhdr(const Elf_LE32_Ehdr *ehdr) const
} }
off_t PackLinuxI386::getbrk(const Elf_LE32_Phdr *phdr, int e_phnum) const off_t PackLinuxI386::getbrk(const Elf32_Phdr *phdr, int e_phnum) const
{ {
off_t brka = 0; off_t brka = 0;
for (int j = 0; j < e_phnum; ++phdr, ++j) { for (int j = 0; j < e_phnum; ++phdr, ++j) {
@@ -391,6 +489,21 @@ off_t PackLinuxI386::getbrk(const Elf_LE32_Phdr *phdr, int e_phnum) const
return brka; return brka;
} }
off_t PackLinuxI386::getbase(const Elf32_Phdr *phdr, int e_phnum) const
{
off_t base = ~0u;
for (int j = 0; j < e_phnum; ++phdr, ++j) {
if (phdr->PT_LOAD == phdr->p_type) {
if (phdr->p_vaddr < (unsigned) base)
base = phdr->p_vaddr;
}
}
if (0!=base) {
return base;
}
return 0x12000;
}
/************************************************************************* /*************************************************************************
// //
@@ -401,7 +514,7 @@ bool PackLinuxI386::canPack()
if (exetype != 0) if (exetype != 0)
return super::canPack(); return super::canPack();
Elf_LE32_Ehdr ehdr; Elf32_Ehdr ehdr;
unsigned char *buf = ehdr.e_ident; unsigned char *buf = ehdr.e_ident;
fi->readx(&ehdr, sizeof(ehdr)); fi->readx(&ehdr, sizeof(ehdr));
@@ -415,7 +528,7 @@ bool PackLinuxI386::canPack()
{ {
// NOTE: ELF executables are now handled by p_lx_elf.cpp, // NOTE: ELF executables are now handled by p_lx_elf.cpp,
// so we only handle them here if force_execve // so we only handle them here if force_execve
if (elf == 0 && opt->unix.force_execve) if (elf == 0 && opt->o_unix.force_execve)
exetype = 1; exetype = 1;
} }
else if (l == 0x00640107 || l == 0x00640108 || l == 0x0064010b || l == 0x006400cc) else if (l == 0x00640107 || l == 0x00640108 || l == 0x0064010b || l == 0x006400cc)
+15 -14
View File
@@ -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-2002 Markus Franz Xaver Johannes Oberhumer Copyright (C) 1996-2004 Markus Franz Xaver Johannes Oberhumer
Copyright (C) 1996-2002 Laszlo Molnar Copyright (C) 1996-2004 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
@@ -42,7 +42,7 @@ public:
virtual void generateElfHdr( virtual void generateElfHdr(
OutputFile *, OutputFile *,
void const *proto, void const *proto,
unsigned brka unsigned const brka
); );
virtual int getFormat() const { return UPX_F_LINUX_i386; } virtual int getFormat() const { return UPX_F_LINUX_i386; }
virtual const char *getName() const { return "linux/386"; } virtual const char *getName() const { return "linux/386"; }
@@ -74,8 +74,9 @@ protected:
virtual void updateLoader(OutputFile *); virtual void updateLoader(OutputFile *);
// ELF util // ELF util
virtual int checkEhdr(const Elf_LE32_Ehdr *ehdr) const; virtual int checkEhdr(const Elf32_Ehdr *ehdr) const;
virtual off_t getbrk(const Elf_LE32_Phdr *phdr, int e_phnum) const; virtual off_t getbrk(const Elf32_Phdr *phdr, int e_phnum) const;
virtual off_t getbase(const Elf32_Phdr *phdr, int e_phnum) const;
enum { enum {
UPX_ELF_MAGIC = 0x5850557f // "\x7fUPX" UPX_ELF_MAGIC = 0x5850557f // "\x7fUPX"
@@ -84,23 +85,23 @@ protected:
unsigned n_mru; unsigned n_mru;
struct cprElfHdr1 { struct cprElfHdr1 {
struct Elf_LE32_Ehdr ehdr; Elf32_Ehdr ehdr;
struct Elf_LE32_Phdr phdr[1]; Elf32_Phdr phdr[1];
struct PackUnix::l_info linfo; l_info linfo;
} }
__attribute_packed; __attribute_packed;
struct cprElfHdr2 { struct cprElfHdr2 {
struct Elf_LE32_Ehdr ehdr; Elf32_Ehdr ehdr;
struct Elf_LE32_Phdr phdr[2]; Elf32_Phdr phdr[2];
struct PackUnix::l_info linfo; l_info linfo;
} }
__attribute_packed; __attribute_packed;
struct cprElfHdr3 { struct cprElfHdr3 {
struct Elf_LE32_Ehdr ehdr; Elf32_Ehdr ehdr;
struct Elf_LE32_Phdr phdr[3]; Elf32_Phdr phdr[3];
struct PackUnix::l_info linfo; l_info linfo;
} }
__attribute_packed; __attribute_packed;
+307
View File
@@ -0,0 +1,307 @@
/* p_lx_interp.cpp --
This file is part of the UPX executable compressor.
Copyright (C) 1996-2006 Markus Franz Xaver Johannes Oberhumer
Copyright (C) 1996-2006 Laszlo Molnar
Copyright (C) 2000-2006 John F. Reiser
All Rights Reserved.
UPX and the UCL library are free software; you can redistribute them
and/or modify them under the terms of the GNU General Public License as
published by the Free Software Foundation; either version 2 of
the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; see the file COPYING.
If not, write to the Free Software Foundation, Inc.,
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
Markus F.X.J. Oberhumer Laszlo Molnar John F. Reiser
markus@oberhumer.com ml1050@cdata.tvnet.hu jreiser@BitWagon.com
*/
#include "conf.h"
#include "file.h"
#include "filter.h"
#include "linker.h"
#include "packer.h"
#include "p_elf.h"
#include "p_unix.h"
#include "p_lx_exc.h"
#include "p_lx_elf.h"
#include "p_lx_interp.h"
#define PT_LOAD Elf32_Phdr::PT_LOAD
#define PT_INTERP Elf32_Phdr::PT_INTERP
/*************************************************************************
//
**************************************************************************/
static const
#include "stub/l_lx_pti86.h"
static const
#include "stub/fold_pti86.h"
PackLinuxI386interp::PackLinuxI386interp(InputFile *f) :
super(f)
{
}
PackLinuxI386interp::~PackLinuxI386interp()
{
}
bool PackLinuxI386interp::canPack()
{
if (opt->o_unix.make_ptinterp) {
return true;
}
if (!opt->o_unix.use_ptinterp) {
return false;
}
return super::canPack();
}
void PackLinuxI386interp::pack1(OutputFile *fo, Filter &)
{
fi->seek(0, SEEK_SET);
fi->readx(&ehdri, sizeof(ehdri));
assert(ehdri.e_phoff == sizeof(Elf32_Ehdr)); // checked by canPack()
sz_phdrs = ehdri.e_phnum * ehdri.e_phentsize;
phdri = new Elf32_Phdr[(unsigned)ehdri.e_phnum];
fi->seek(ehdri.e_phoff, SEEK_SET);
fi->readx(phdri, sz_phdrs);
#define E Elf32_Ehdr
cprElfHdr3 h3;
memset(&h3, 0, sizeof(h3));
memcpy(h3.ehdr.e_ident, "\177ELF", 4);
h3.ehdr.e_ident[E::EI_CLASS] = E::ELFCLASS32;
h3.ehdr.e_ident[E::EI_DATA] = E::ELFDATA2LSB;
h3.ehdr.e_ident[E::EI_VERSION] = E::EV_CURRENT;
h3.ehdr.e_ident[E::EI_OSABI] = E::ELFOSABI_LINUX;
h3.ehdr.e_ident[E::EI_ABIVERSION] = E::EV_CURRENT;
h3.ehdr.e_type = E::ET_EXEC;
h3.ehdr.e_machine = E::EM_386;
h3.ehdr.e_version = 1;
h3.ehdr.e_phoff = sizeof(Elf32_Ehdr);
h3.ehdr.e_ehsize = sizeof(Elf32_Ehdr);
h3.ehdr.e_phentsize = sizeof(Elf32_Phdr);
h3.ehdr.e_phnum = 3;
h3.phdr[0].p_type = PT_LOAD;
h3.phdr[0].p_flags = Elf32_Phdr::PF_X | Elf32_Phdr::PF_R;
h3.phdr[0].p_align = 0x1000;
h3.phdr[1].p_type = PT_LOAD;
h3.phdr[1].p_flags = Elf32_Phdr::PF_W | Elf32_Phdr::PF_R;
h3.phdr[1].p_align = 1;
h3.phdr[2].p_type = PT_INTERP;
h3.phdr[2].p_offset = (char *)&h3.phdr[2].p_vaddr - (char *)&h3;
memcpy(&h3.phdr[2].p_vaddr, "/upxrun", h3.phdr[2].p_filesz = 8);
h3.phdr[2].p_align = 1;
if (opt->o_unix.make_ptinterp) { // unusual "once per release"
elfout = h3;
elfout.ehdr.e_phnum = 1;
fo->write(&elfout, elfout.ehdr.e_ehsize + elfout.ehdr.e_phentsize);
}
else { // usual case
generateElfHdr(fo, &h3, getbrk(phdri, ehdri.e_phnum));
}
#undef E
}
void PackLinuxI386interp::pack2(OutputFile *fo, Filter &ft)
{
if (opt->o_unix.make_ptinterp) {
return; // ignore current input file!
}
super::pack2(fo, ft);
}
#undef PAGE_MASK
#define PAGE_MASK (~0u<<12)
void PackLinuxI386interp::pack3(OutputFile *fo, Filter &/*ft*/)
{
unsigned base = getbase(phdri, ehdri.e_phnum);
unsigned sz = PAGE_MASK & (~PAGE_MASK + elfout.phdr[0].p_filesz);
if (base < (0x11000 + sz)) {
base = 0x11000 + sz;
}
if (opt->o_unix.make_ptinterp) {
base = 0x10000;
}
elfout.phdr[0].p_paddr = elfout.phdr[0].p_vaddr = base - sz;
if (opt->o_unix.make_ptinterp) {
initLoader(linux_i386pti_loader, sizeof(linux_i386pti_loader));
linker->addSection("FOLDEXEC", linux_i386pti_fold, sizeof(linux_i386pti_fold));
addLoader("LXPTI000", NULL);
addLoader("LXPTI040", NULL);
ph.method = M_NRV2B_LE32; addLoader(getDecompressor(), NULL);
addLoader("LXPTI090", NULL);
addLoader("LXPTI041", NULL);
ph.method = M_NRV2D_LE32; addLoader(getDecompressor(), NULL);
addLoader("LXPTI090", NULL);
addLoader("LXPTI042", NULL);
ph.method = M_NRV2E_LE32; addLoader(getDecompressor(), NULL);
addLoader("LXPTI090", NULL);
addLoader("LXPTI043", NULL);
ph.method = M_CL1B_LE32; addLoader(getDecompressor(), NULL);
addLoader("LXPTI090", NULL);
addLoader("LXPTI091", NULL);
addLoader("LXPTI140", NULL);
addLoader("LXUNF002,LXUNF008,LXUNF010", NULL);
addFilter32(0x46);
addLoader("LXUNF042,LXUNF035", NULL);
addLoader("LXUNF002,LXUNF008,LXUNF010", NULL);
addFilter32(0x49);
addLoader("LXUNF042,LXUNF035", NULL);
addLoader("LXPTI200", NULL);
addLoader("FOLDEXEC", NULL);
upx_byte const *p = getLoader();
lsize = getLoaderSize();
updateLoader(fo);
fo->write(p, lsize);
elfout.phdr[0].p_filesz = fo->getBytesWritten();
}
else {
updateLoader(fo);
}
}
void PackLinuxI386interp::unpack(OutputFile *fo)
{
#define MAX_INTERP_HDR 512
char bufehdr[MAX_INTERP_HDR];
Elf32_Ehdr *const ehdr = (Elf32_Ehdr *)bufehdr;
Elf32_Phdr const *phdr = (Elf32_Phdr *)(1+ehdr);
unsigned szb_info = sizeof(b_info);
{
fi->seek(0, SEEK_SET);
fi->readx(bufehdr, MAX_INTERP_HDR);
unsigned const e_entry = get_native32(&ehdr->e_entry);
if (e_entry < 0x401180) { /* old style, 8-byte b_info */
szb_info = 2*sizeof(unsigned);
}
}
fi->seek(overlay_offset, SEEK_SET);
p_info hbuf;
fi->readx(&hbuf, sizeof(hbuf));
unsigned orig_file_size = get_native32(&hbuf.p_filesize);
blocksize = get_native32(&hbuf.p_blocksize);
if (file_size > (off_t)orig_file_size || blocksize > orig_file_size)
throwCantUnpack("file header corrupted");
ibuf.alloc(blocksize + OVERHEAD);
b_info bhdr; memset(&bhdr, 0, sizeof(bhdr));
fi->readx(&bhdr, szb_info);
ph.u_len = get_native32(&bhdr.sz_unc);
ph.c_len = get_native32(&bhdr.sz_cpr);
ph.filter_cto = bhdr.b_cto8;
// Uncompress Ehdr and Phdrs.
fi->readx(ibuf, ph.c_len);
decompress(ibuf, (upx_byte *)ehdr, false);
unsigned total_in = 0;
unsigned total_out = 0;
unsigned c_adler = upx_adler32(NULL, 0);
unsigned u_adler = upx_adler32(NULL, 0);
off_t ptload0hi=0, ptload1lo=0, ptload1sz=0;
// decompress PT_LOAD
bool first_PF_X = true;
fi->seek(- (off_t) (szb_info + ph.c_len), SEEK_CUR);
for (unsigned j=0; j < ehdr->e_phnum; ++phdr, ++j) {
if (PT_LOAD==phdr->p_type) {
if (0==ptload0hi) {
ptload0hi = phdr->p_filesz + phdr->p_offset;
}
else if (0==ptload1lo) {
ptload1lo = phdr->p_offset;
ptload1sz = phdr->p_filesz;
}
if (fo)
fo->seek(phdr->p_offset, SEEK_SET);
if (Elf32_Phdr::PF_X & phdr->p_flags) {
unpackExtent(phdr->p_filesz, fo, total_in, total_out,
c_adler, u_adler, first_PF_X, szb_info);
first_PF_X = false;
}
else {
unpackExtent(phdr->p_filesz, fo, total_in, total_out,
c_adler, u_adler, false, szb_info);
}
}
}
if (0!=ptload1sz && ptload0hi < ptload1lo) { // alignment hole?
if (fo)
fo->seek(ptload0hi, SEEK_SET);
unpackExtent(ptload1lo - ptload0hi, fo, total_in, total_out,
c_adler, u_adler, false, szb_info);
}
if (total_out != orig_file_size) { // non-PT_LOAD stuff
if (fo)
fo->seek(0, SEEK_END);
unpackExtent(orig_file_size - total_out, fo, total_in, total_out,
c_adler, u_adler, false, szb_info);
}
// check for end-of-file
fi->readx(&bhdr, szb_info);
unsigned const sz_unc = ph.u_len = get_native32(&bhdr.sz_unc);
if (sz_unc == 0) { // uncompressed size 0 -> EOF
// note: magic is always stored le32
unsigned const sz_cpr = get_le32(&bhdr.sz_cpr);
if (sz_cpr != UPX_MAGIC_LE32) // sz_cpr must be h->magic
throwCompressedDataViolation();
}
else { // extra bytes after end?
throwCompressedDataViolation();
}
// update header with totals
ph.c_len = total_in;
ph.u_len = total_out;
// all bytes must be written
if (total_out != orig_file_size)
throwEOFException();
// finally test the checksums
if (ph.c_adler != c_adler || ph.u_adler != u_adler)
throwChecksumError();
#undef MAX_INTERP_HDR
}
/*
vi:ts=4:et
*/
+64
View File
@@ -0,0 +1,64 @@
/* p_lx_interp.h --
This file is part of the UPX executable compressor.
Copyright (C) 1996-2004 Markus Franz Xaver Johannes Oberhumer
Copyright (C) 1996-2004 Laszlo Molnar
Copyright (C) 2000-2004 John F. Reiser
All Rights Reserved.
UPX and the UCL library are free software; you can redistribute them
and/or modify them under the terms of the GNU General Public License as
published by the Free Software Foundation; either version 2 of
the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; see the file COPYING.
If not, write to the Free Software Foundation, Inc.,
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
Markus F.X.J. Oberhumer Laszlo Molnar John F. Reiser
markus@oberhumer.com ml1050@cdata.tvnet.hu jreiser@BitWagon.com
*/
#ifndef __UPX_P_LX_INTERP_H //{
#define __UPX_P_LX_INTERP_H
/*************************************************************************
// linux/interp386
**************************************************************************/
class PackLinuxI386interp : public PackLinuxI386elf
{
typedef PackLinuxI386elf super;
public:
PackLinuxI386interp(InputFile *f);
virtual ~PackLinuxI386interp();
virtual int getVersion() const { return 13; }
virtual int getFormat() const { return UPX_F_LINUX_ELFI_i386; }
virtual const char *getName() const { return "linux/elfi386"; }
virtual bool canPack();
virtual void unpack(OutputFile *fo);
protected:
virtual void pack1(OutputFile *, Filter &); // generate executable header
virtual void pack2(OutputFile *, Filter &); // append compressed data
virtual void pack3(OutputFile *, Filter &); // build loader
};
#endif /*} already included */
/*
vi:ts=4:et
*/
+6 -6
View File
@@ -2,9 +2,9 @@
This file is part of the UPX executable compressor. This file is part of the UPX executable compressor.
Copyright (C) 1996-2002 Markus Franz Xaver Johannes Oberhumer Copyright (C) 1996-2006 Markus Franz Xaver Johannes Oberhumer
Copyright (C) 1996-2002 Laszlo Molnar Copyright (C) 1996-2006 Laszlo Molnar
Copyright (C) 2000-2002 John F. Reiser Copyright (C) 2000-2006 John F. Reiser
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
@@ -42,7 +42,7 @@
// //
**************************************************************************/ **************************************************************************/
//#define SCRIPT_SIZE (opt->unix.SCRIPT_MAX + sizeof(l_info)) //#define SCRIPT_SIZE (opt->o_unix.SCRIPT_MAX + sizeof(l_info))
#define SCRIPT_SIZE (32 + sizeof(l_info)) #define SCRIPT_SIZE (32 + sizeof(l_info))
const upx_byte *PackLinuxI386sep::getLoader() const const upx_byte *PackLinuxI386sep::getLoader() const
@@ -50,7 +50,7 @@ const upx_byte *PackLinuxI386sep::getLoader() const
static char script[SCRIPT_SIZE]; static char script[SCRIPT_SIZE];
memset(script, 0, sizeof(script)); memset(script, 0, sizeof(script));
char const *name = opt->unix.script_name; char const *name = opt->o_unix.script_name;
if (0==name) { if (0==name) {
name = "/usr/local/lib/upxX"; name = "/usr/local/lib/upxX";
} }
@@ -77,7 +77,7 @@ int PackLinuxI386sep::getLoaderSize() const
int PackLinuxI386sep::getLoaderPrefixSize() const int PackLinuxI386sep::getLoaderPrefixSize() const
{ {
return opt->unix.SCRIPT_MAX; return opt->o_unix.SCRIPT_MAX;
} }
void PackLinuxI386sep::patchLoader() void PackLinuxI386sep::patchLoader()
+3 -3
View File
@@ -2,9 +2,9 @@
This file is part of the UPX executable compressor. This file is part of the UPX executable compressor.
Copyright (C) 1996-2002 Markus Franz Xaver Johannes Oberhumer Copyright (C) 1996-2004 Markus Franz Xaver Johannes Oberhumer
Copyright (C) 1996-2002 Laszlo Molnar Copyright (C) 1996-2004 Laszlo Molnar
Copyright (C) 2000-2002 John F. Reiser Copyright (C) 2000-2004 John F. Reiser
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
+33 -7
View File
@@ -2,9 +2,9 @@
This file is part of the UPX executable compressor. This file is part of the UPX executable compressor.
Copyright (C) 1996-2002 Markus Franz Xaver Johannes Oberhumer Copyright (C) 1996-2006 Markus Franz Xaver Johannes Oberhumer
Copyright (C) 1996-2002 Laszlo Molnar Copyright (C) 1996-2006 Laszlo Molnar
Copyright (C) 2000-2002 John F. Reiser Copyright (C) 2000-2006 John F. Reiser
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
@@ -59,6 +59,15 @@ PackLinuxI386sh::~PackLinuxI386sh()
{ {
} }
static unsigned
umax(unsigned a, unsigned b)
{
if (a <= b) {
return b;
}
return a;
}
int int
PackLinuxI386sh::buildLoader(Filter const *ft) PackLinuxI386sh::buildLoader(Filter const *ft)
{ {
@@ -78,7 +87,13 @@ PackLinuxI386sh::buildLoader(Filter const *ft)
// filter // filter
optimizeFilter(&fold_ft, buf, sz_fold); optimizeFilter(&fold_ft, buf, sz_fold);
bool success = fold_ft.filter(buf + sizeof(cprElfHdr2), sz_fold - sizeof(cprElfHdr2)); unsigned fold_hdrlen = sizeof(l_info) + sizeof(Elf32_Ehdr) +
sizeof(Elf32_Phdr) * get_native32(&((Elf32_Ehdr const *)(void *)buf)->e_phnum);
if (0 == get_le32(fold_hdrlen + buf)) {
// inconsistent SIZEOF_HEADERS in *.lds (ld, binutils)
fold_hdrlen = umax(0x80, fold_hdrlen);
}
bool success = fold_ft.filter(buf + fold_hdrlen, sz_fold - fold_hdrlen);
UNUSED(success); UNUSED(success);
return buildLinuxLoader( return buildLinuxLoader(
@@ -92,11 +107,11 @@ void PackLinuxI386sh::patchLoader() { }
bool PackLinuxI386sh::getShellName(char *buf) bool PackLinuxI386sh::getShellName(char *buf)
{ {
exetype = -1; exetype = -1;
l_shname = strcspn(buf, " \t\n\v\f\r"); l_shname = (int) strcspn(buf, " \t\n\v\f\r");
buf[l_shname] = 0; buf[l_shname] = 0;
static char const *const shname[] = { // known shells that accept "-c" arg static char const *const shname[] = { // known shells that accept "-c" arg
"ash", "bash", "bsh", "csh", "ksh", "pdksh", "sh", "tcsh", "zsh", "ash", "bash", "bsh", "csh", "ksh", "pdksh", "sh", "tcsh", "zsh",
//"python", // FIXME: does python work ??? "python",
NULL NULL
}; };
const char *bname = strrchr(buf, '/'); const char *bname = strrchr(buf, '/');
@@ -104,7 +119,11 @@ bool PackLinuxI386sh::getShellName(char *buf)
return false; return false;
for (int j = 0; NULL != shname[j]; ++j) { for (int j = 0; NULL != shname[j]; ++j) {
if (0 == strcmp(shname[j], bname + 1)) { if (0 == strcmp(shname[j], bname + 1)) {
return super::canPack(); bool const s = super::canPack();
if (s) {
opt->o_unix.blocksize = blocksize = file_size;
}
return s;
} }
} }
return false; return false;
@@ -139,6 +158,13 @@ PackLinuxI386sh::pack1(OutputFile *fo, Filter &)
generateElfHdr(fo, linux_i386sh_fold, 0x08048000); generateElfHdr(fo, linux_i386sh_fold, 0x08048000);
} }
void
PackLinuxI386sh::pack3(OutputFile *fo, Filter &ft)
{
super::pack3(fo,ft);
elfout.phdr[0].p_filesz = fo->getBytesWritten();
}
/* /*
vi:ts=4:et vi:ts=4:et
*/ */
+4 -3
View File
@@ -2,9 +2,9 @@
This file is part of the UPX executable compressor. This file is part of the UPX executable compressor.
Copyright (C) 1996-2002 Markus Franz Xaver Johannes Oberhumer Copyright (C) 1996-2004 Markus Franz Xaver Johannes Oberhumer
Copyright (C) 1996-2002 Laszlo Molnar Copyright (C) 1996-2004 Laszlo Molnar
Copyright (C) 2000-2002 John F. Reiser Copyright (C) 2000-2004 John F. Reiser
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
@@ -48,6 +48,7 @@ public:
virtual int buildLoader(const Filter *); virtual int buildLoader(const Filter *);
virtual void pack1(OutputFile *fo, Filter &ft); virtual void pack1(OutputFile *fo, Filter &ft);
virtual void pack3(OutputFile *fo, Filter &ft);
virtual bool canPack(); virtual bool canPack();
// virtual void unpack(OutputFile *fo) { super::unpack(fo); } // virtual void unpack(OutputFile *fo) { super::unpack(fo); }
+443
View File
@@ -0,0 +1,443 @@
/* p_mach.cpp -- pack Mach Object executable
This file is part of the UPX executable compressor.
Copyright (C) 2004 John Reiser
All Rights Reserved.
UPX and the UCL library are free software; you can redistribute them
and/or modify them under the terms of the GNU General Public License as
published by the Free Software Foundation; either version 2 of
the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; see the file COPYING.
If not, write to the Free Software Foundation, Inc.,
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
John Reiser
jreiser@users.sourceforge.net
*/
#include "conf.h"
#include "file.h"
#include "filter.h"
#include "linker.h"
#include "packer.h"
#include "p_mach.h"
static const
#include "stub/l_mac_ppc32.h"
static const
#include "stub/fold_machppc32.h"
PackMachPPC32::PackMachPPC32(InputFile *f) :
super(f), n_segment(0), rawmseg(0), msegcmd(0)
{
}
PackMachPPC32::~PackMachPPC32()
{
delete [] msegcmd;
delete [] rawmseg;
}
const int *PackMachPPC32::getCompressionMethods(int /*method*/, int /*level*/) const
{
// There really is no LE bias in M_NRV2E_LE32.
static const int m_nrv2e[] = { M_NRV2E_LE32, -1 };
return m_nrv2e;
}
const int *PackMachPPC32::getFilters() const
{
static const int filters[] = { 0xd0, -1 };
return filters;
}
int
PackMachPPC32::buildMachLoader(
upx_byte const *const proto,
unsigned const szproto,
upx_byte const *const fold,
unsigned const szfold,
Filter const */*ft*/
)
{
int eof_empty = -1;
initLoader(&eof_empty, 4096, 0, 0);
struct b_info h; memset(&h, 0, sizeof(h));
unsigned fold_hdrlen = 0;
if (0 < szfold) {
h.sz_unc = (szfold < fold_hdrlen) ? 0 : (szfold - fold_hdrlen);
h.b_method = (unsigned char) ph.method;
h.b_ftid = (unsigned char) ph.filter;
h.b_cto8 = (unsigned char) ph.filter_cto;
}
unsigned char const *const uncLoader = fold_hdrlen + fold;
unsigned char *const cprLoader = new unsigned char[sizeof(h) + h.sz_unc];
if (0 < szfold) {
unsigned sz_cpr;
int r = upx_compress(uncLoader, h.sz_unc, sizeof(h) + cprLoader, &sz_cpr,
NULL, ph.method, 10, NULL, NULL );
h.sz_cpr = sz_cpr;
if (r != UPX_E_OK || h.sz_cpr >= h.sz_unc)
throwInternalError("loader compression failed");
}
memcpy(cprLoader, &h, sizeof(h));
// This adds the definition to the "library", to be used later.
linker->addSection("FOLDEXEC", cprLoader, sizeof(h) + h.sz_cpr);
delete [] cprLoader;
int const GAP = 128; // must match stub/l_mac_ppc.S
segcmdo.vmsize += h.sz_unc - h.sz_cpr + GAP + 64;
linker->addSection("MACOS000", proto, szproto);
addLoader("MACOS000", NULL);
addLoader("FOLDEXEC", NULL);
return getLoaderSize();
}
int
PackMachPPC32::buildLoader(const Filter *ft)
{
return buildMachLoader(
l_mac_ppc32_loader, sizeof(l_mac_ppc32_loader),
fold_machppc32, sizeof(fold_machppc32), ft );
}
void PackMachPPC32::patchLoader() { }
void PackMachPPC32::updateLoader(OutputFile *) {}
void
PackMachPPC32::patchLoaderChecksum()
{
unsigned char *const ptr = const_cast<unsigned char *>(getLoader());
l_info *const lp = &linfo;
// checksum for loader; also some PackHeader info
lp->l_checksum = 0;
lp->l_magic = UPX_MAGIC_LE32; // LE32 always
lp->l_lsize = (unsigned short) lsize;
lp->l_version = (unsigned char) ph.version;
lp->l_format = (unsigned char) ph.format;
// INFO: lp->l_checksum is currently unused
lp->l_checksum = upx_adler32(ptr, lsize);
}
static int __acc_cdecl_qsort
compare_segment_command(void const *const aa, void const *const bb)
{
Mach_segment_command const *const a = (Mach_segment_command const *)aa;
Mach_segment_command const *const b = (Mach_segment_command const *)bb;
unsigned const xa = a->cmd - Mach_segment_command::LC_SEGMENT;
unsigned const xb = b->cmd - Mach_segment_command::LC_SEGMENT;
if (xa < xb) return -1; // LC_SEGMENT first
if (xa > xb) return 1;
if (a->vmaddr < b->vmaddr) return -1; // ascending by .vmaddr
if (a->vmaddr > b->vmaddr) return 1;
return 0;
}
void
PackMachPPC32::pack4(OutputFile *fo, Filter &ft) // append PackHeader
{
// offset of p_info in compressed file
overlay_offset = sizeof(mhdro) + sizeof(segcmdo) + sizeof(threado) + sizeof(linfo);
super::pack4(fo, ft);
segcmdo.filesize = fo->getBytesWritten();
segcmdo.vmsize += segcmdo.filesize;
fo->seek(sizeof(mhdro), SEEK_SET);
fo->write(&segcmdo, sizeof(segcmdo));
fo->write(&threado, sizeof(threado));
fo->write(&linfo, sizeof(linfo));
}
void
PackMachPPC32::pack3(OutputFile *fo, Filter &ft) // append loader
{
BE32 disp;
unsigned const zero = 0;
unsigned len = fo->getBytesWritten();
fo->write(&zero, 3& -len);
len += (3& -len) + sizeof(disp);
set_be32(&disp, 4+ len - sz_mach_headers); // 4: sizeof(instruction)
fo->write(&disp, sizeof(disp));
threado.state.srr0 = len + segcmdo.vmaddr; /* entry address */
super::pack3(fo, ft);
}
// Determine length of gap between PT_LOAD phdri[k] and closest PT_LOAD
// which follows in the file (or end-of-file). Optimize for common case
// where the PT_LOAD are adjacent ascending by .p_offset. Assume no overlap.
unsigned PackMachPPC32::find_SEGMENT_gap(
unsigned const k
)
{
if (Mach_segment_command::LC_SEGMENT!=msegcmd[k].cmd
|| 0==msegcmd[k].filesize ) {
return 0;
}
unsigned const hi = get_native32(&msegcmd[k].fileoff) +
get_native32(&msegcmd[k].filesize);
unsigned lo = ph.u_file_size;
unsigned j = k;
for (;;) { // circular search, optimize for adjacent ascending
++j;
if (n_segment==j) {
j = 0;
}
if (k==j) {
break;
}
if (Mach_segment_command::LC_SEGMENT==msegcmd[j].cmd
&& 0!=msegcmd[j].filesize ) {
unsigned const t = get_native32(&msegcmd[j].fileoff);
if ((t - hi) < (lo - hi)) {
lo = t;
if (hi==lo) {
break;
}
}
}
}
return lo - hi;
}
void
PackMachPPC32::pack2(OutputFile *fo, Filter &ft) // append compressed body
{
Extent x;
unsigned k;
// count passes, set ptload vars
ui_total_passes = 0;
for (k = 0; k < n_segment; ++k) {
if (Mach_segment_command::LC_SEGMENT==msegcmd[k].cmd
&& 0!=msegcmd[k].filesize ) {
ui_total_passes++;
if (find_SEGMENT_gap(k)) {
ui_total_passes++;
}
}
}
// compress extents
unsigned total_in = 0;
unsigned total_out = 0;
unsigned hdr_ulen = mhdri.sizeofcmds;
ui_pass = 0;
ft.addvalue = 0;
int nx = 0;
for (k = 0; k < n_segment; ++k)
if (Mach_segment_command::LC_SEGMENT==msegcmd[k].cmd
&& 0!=msegcmd[k].filesize ) {
x.offset = msegcmd[k].fileoff;
x.size = msegcmd[k].filesize;
if (0 == nx) { // 1st LC_SEGMENT must cover Mach_header at 0==fileoffset
unsigned const delta = mhdri.sizeofcmds;
x.offset += delta;
x.size -= delta;
}
packExtent(x, total_in, total_out,
((Mach_segment_command::VM_PROT_EXECUTE & msegcmd[k].initprot)
? &ft : 0 ), fo, hdr_ulen );
hdr_ulen = 0;
++nx;
}
for (k = 0; k < n_segment; ++k) {
x.size = find_SEGMENT_gap(k);
if (x.size) {
x.offset = get_native32(&msegcmd[k].fileoff) +
get_native32(&msegcmd[k].filesize);
packExtent(x, total_in, total_out, 0, fo);
}
}
if ((off_t)total_in != file_size)
throwEOFException();
segcmdo.filesize = fo->getBytesWritten();
}
#undef PAGE_MASK
#undef PAGE_SIZE
#define PAGE_MASK (~0u<<12)
#define PAGE_SIZE -PAGE_MASK
void
PackMachPPC32::pack1(OutputFile *fo, Filter &/*ft*/) // generate executable header
{
mhdro = mhdri;
mhdro.ncmds = 2;
mhdro.sizeofcmds = sizeof(segcmdo) + sizeof(threado);
mhdro.flags = Mach_header::MH_NOUNDEFS;
fo->write(&mhdro, sizeof(mhdro));
segcmdo.cmd = Mach_segment_command::LC_SEGMENT;
segcmdo.cmdsize = sizeof(segcmdo);
strncpy((char *)&segcmdo.segname, "__TEXT", sizeof(segcmdo.segname));
segcmdo.vmaddr = PAGE_MASK & (~PAGE_MASK +
msegcmd[n_segment -1].vmsize + msegcmd[n_segment -1].vmaddr );
segcmdo.vmsize = 0; // adjust later
segcmdo.fileoff = 0;
segcmdo.filesize = 0; // adjust later
segcmdo.initprot = segcmdo.maxprot =
Mach_segment_command::VM_PROT_READ |
Mach_segment_command::VM_PROT_WRITE |
Mach_segment_command::VM_PROT_EXECUTE;
segcmdo.nsects = 0;
segcmdo.flags = 0;
fo->write(&segcmdo, sizeof(segcmdo));
threado.cmd = Mach_segment_command::LC_UNIXTHREAD;
threado.cmdsize = sizeof(threado);
threado.flavor = Mach_thread_command::PPC_THREAD_STATE;
threado.count = Mach_thread_command::PPC_THREAD_STATE_COUNT;
memset(&threado.state, 0, sizeof(threado.state));
fo->write(&threado, sizeof(threado));
sz_mach_headers = fo->getBytesWritten();
memset((char *)&linfo, 0, sizeof(linfo));
fo->write(&linfo, sizeof(linfo));
return;
}
void
PackMachPPC32::unpack(OutputFile *fo)
{
fi->seek(overlay_offset, SEEK_SET);
p_info hbuf;
fi->readx(&hbuf, sizeof(hbuf));
unsigned orig_file_size = get_native32(&hbuf.p_filesize);
blocksize = get_native32(&hbuf.p_blocksize);
if (file_size > (off_t)orig_file_size || blocksize > orig_file_size)
throwCantUnpack("file header corrupted");
ibuf.alloc(blocksize + OVERHEAD);
b_info bhdr; memset(&bhdr, 0, sizeof(bhdr));
fi->readx(&bhdr, sizeof(bhdr));
ph.u_len = get_native32(&bhdr.sz_unc);
ph.c_len = get_native32(&bhdr.sz_cpr);
ph.filter_cto = bhdr.b_cto8;
// Uncompress Macho headers
fi->readx(ibuf, ph.c_len);
Mach_header *const mhdr = (Mach_header *)new upx_byte[ph.u_len];
decompress(ibuf, (upx_byte *)mhdr, false);
unsigned const ncmds = mhdr->ncmds;
msegcmd = new Mach_segment_command[ncmds];
unsigned char *ptr = (unsigned char *)(1+mhdr);
for (unsigned j= 0; j < ncmds; ++j) {
msegcmd[j] = *(Mach_segment_command *)ptr;
ptr += (unsigned) ((Mach_segment_command *)ptr)->cmdsize;
}
// Put LC_SEGMENT together at the beginning, ascending by .vmaddr.
qsort(msegcmd, ncmds, sizeof(*msegcmd), compare_segment_command);
n_segment = 0;
for (unsigned j= 0; j < ncmds; ++j) {
n_segment += (Mach_segment_command::LC_SEGMENT==msegcmd[j].cmd);
}
unsigned total_in = 0;
unsigned total_out = 0;
unsigned c_adler = upx_adler32(NULL, 0);
unsigned u_adler = upx_adler32(NULL, 0);
Mach_segment_command const *sc = (Mach_segment_command const *)(1+ mhdr);
unsigned k;
fi->seek(- (off_t)(sizeof(bhdr) + ph.c_len), SEEK_CUR);
for (
k = 0;
k < ncmds;
(++k), (sc = (Mach_segment_command const *)(sc->cmdsize + (char const *)sc))
) {
if (Mach_segment_command::LC_SEGMENT==sc->cmd
&& 0!=sc->filesize ) {
unsigned filesize = get_be32(&sc->filesize);
unpackExtent(filesize, fo, total_in, total_out, c_adler, u_adler, false, sizeof(bhdr));
}
}
for (unsigned j = 0; j < ncmds; ++j) {
unsigned const size = find_SEGMENT_gap(j);
if (size) {
unsigned const where = get_native32(&msegcmd[k].fileoff) +
get_native32(&msegcmd[k].filesize);
if (fo)
fo->seek(where, SEEK_SET);
unpackExtent(size, fo, total_in, total_out,
c_adler, u_adler, false, sizeof(bhdr));
}
}
}
bool
PackMachPPC32::canPack()
{
fi->seek(0, SEEK_SET);
fi->readx(&mhdri, sizeof(mhdri));
if (Mach_header::MH_MAGIC !=mhdri.magic
|| Mach_header::CPU_TYPE_POWERPC !=mhdri.cputype
|| Mach_header::MH_EXECUTE !=mhdri.filetype
)
return false;
rawmseg = (Mach_segment_command *)new char[mhdri.sizeofcmds];
fi->readx(rawmseg, mhdri.sizeofcmds);
msegcmd = new Mach_segment_command[mhdri.ncmds];
unsigned char *ptr = (unsigned char *)rawmseg;
for (unsigned j= 0; j < mhdri.ncmds; ++j) {
msegcmd[j] = *(Mach_segment_command *)ptr;
ptr += (unsigned) ((Mach_segment_command *)ptr)->cmdsize;
}
// Put LC_SEGMENT together at the beginning, ascending by .vmaddr.
qsort(msegcmd, mhdri.ncmds, sizeof(*msegcmd), compare_segment_command);
// Check that LC_SEGMENTs form one contiguous chunk of the file.
for (unsigned j= 0; j < mhdri.ncmds; ++j) {
if (Mach_segment_command::LC_SEGMENT==msegcmd[j].cmd) {
if (0xfff & (msegcmd[j].fileoff | msegcmd[j].vmaddr)) {
return false;
}
if (0 < j) {
unsigned const sz = ~0xfff
& (0xfff + msegcmd[j-1].filesize);
if ((sz + msegcmd[j-1].fileoff)!=msegcmd[j].fileoff) {
return false;
}
}
++n_segment;
sz_segment = msegcmd[j].filesize + msegcmd[j].fileoff - msegcmd[0].fileoff;
}
}
// set options
opt->o_unix.blocksize = file_size;
return 0 < n_segment;
}
/*
vi:ts=4:et
*/
+214
View File
@@ -0,0 +1,214 @@
/* p_mach.h --
This file is part of the UPX executable compressor.
Copyright (C) 1996-2004 Markus Franz Xaver Johannes Oberhumer
Copyright (C) 1996-2004 Laszlo Molnar
All Rights Reserved.
UPX and the UCL library are free software; you can redistribute them
and/or modify them under the terms of the GNU General Public License as
published by the Free Software Foundation; either version 2 of
the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; see the file COPYING.
If not, write to the Free Software Foundation, Inc.,
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
Markus F.X.J. Oberhumer Laszlo Molnar
markus@oberhumer.com ml1050@cdata.tvnet.hu
*/
#ifndef __UPX_P_MACHO_H
#define __UPX_P_MACHO_H
/*************************************************************************
// Mach Mach Object executable
**************************************************************************/
struct Mach_header {
BE32 magic;
enum {
MH_MAGIC = 0xfeedface
};
BE32 cputype;
enum {
CPU_TYPE_POWERPC = 18
};
BE32 cpysubtype;
BE32 filetype;
enum {
MH_EXECUTE = 2
};
BE32 ncmds;
BE32 sizeofcmds;
BE32 flags;
enum {
MH_NOUNDEFS = 1
};
}
__attribute_packed;
struct Mach_segment_command {
BE32 cmd;
enum {
LC_SEGMENT = 0x1,
LC_THREAD = 0x4,
LC_UNIXTHREAD = 0x5,
LC_LOAD_DYLINKER = 0xe
};
BE32 cmdsize;
char segname[16];
BE32 vmaddr;
BE32 vmsize;
BE32 fileoff;
BE32 filesize;
BE32 maxprot;
enum {
VM_PROT_READ = 1,
VM_PROT_WRITE = 2,
VM_PROT_EXECUTE = 4
};
BE32 initprot;
BE32 nsects;
BE32 flags;
}
__attribute_packed;
struct Mach_section {
char sectname[16];
char segname[16];
BE32 addr; /* memory address */
BE32 size; /* size in bytes */
BE32 offset; /* file offset */
BE32 align; /* power of 2 */
BE32 reloff; /* file offset of relocation entries */
BE32 nreloc; /* number of relocation entries */
BE32 flags; /* section type and attributes */
enum {
S_REGULAR = 0,
S_ZEROFILL,
S_CSTRING_LITERALS,
S_4BYTE_LITERALS,
S_8BYTE_LITERALS,
S_LITERAL_POINTERS,
S_NON_LAZY_SYMBOL_POINTERS,
S_LAZY_SYMBOL_POINTERS,
S_SYMBOL_STUBS,
S_MOD_INIT_FUNC_POINTERS,
S_MOD_TERM_FNC_POINTERS,
S_COALESCED
};
enum {
S_ATTR_PURE_INSTRUCTIONS = 0x80000000,
S_ATTR_NO_TOC = 0x40000000,
S_ATTR_STRIP_STATIC_SYMS = 0x20000000,
S_ATTR_SOME_INSTRUCTIONS = 0x00000400,
S_ATTR_EXT_RELOC = 0x00000200,
S_ATTR_LOC_RELOC = 0x00000100
};
BE32 reserved1;
BE32 reserved2;
}
__attribute_packed;
struct Mach_ppc_thread_state {
BE32 srr0; /* Instruction address register (PC; entry addr) */
BE32 srr1; /* Machine state register (supervisor) */
BE32 r0, r1, r2, r3, r4, r5, r6, r7;
BE32 r8, r9,r10,r11,r12,r13,r14,r15;
BE32 r16,r17,r18,r19,r20,r21,r22,r23;
BE32 r24,r25,r26,r27,r28,r29,r30,r31;
BE32 cr; /* Condition register */
BE32 xer; /* User's integer exception register */
BE32 lr; /* Link register */
BE32 ctr; /* Count register */
BE32 mq; /* MQ register (601 only) */
BE32 vrsave; /* Vector Save Register */
};
struct Mach_thread_command {
BE32 cmd; /* LC_THREAD or LC_UNIXTHREAD */
BE32 cmdsize; /* total size of this command */
BE32 flavor;
enum {
PPC_THREAD_STATE = 1
};
BE32 count; /* sizeof(following_thread_state)/4 */
enum {
PPC_THREAD_STATE_COUNT = sizeof(struct Mach_ppc_thread_state)/4
};
struct Mach_ppc_thread_state state;
}
__attribute_packed;
#include "p_unix.h"
class PackMachPPC32 : public PackUnixBe32
{
typedef PackUnixBe32 super;
public:
PackMachPPC32(InputFile *f);
virtual ~PackMachPPC32();
virtual int getVersion() const { return 13; }
virtual int getFormat() const { return UPX_F_MACH_PPC32; }
virtual const char *getName() const { return "Mach/ppc32"; }
virtual const int *getCompressionMethods(int method, int level) const;
virtual const int *getFilters() const;
// called by the generic pack()
virtual void pack1(OutputFile *, Filter &); // generate executable header
virtual void pack2(OutputFile *, Filter &); // append compressed data
virtual void pack3(OutputFile *, Filter &); // append loader
virtual void pack4(OutputFile *, Filter &); // append PackHeader
virtual void unpack(OutputFile *fo);
virtual bool canPack();
virtual unsigned find_SEGMENT_gap(unsigned const k);
protected:
virtual int buildLoader(const Filter *ft);
virtual void patchLoader();
virtual void patchLoaderChecksum();
virtual void updateLoader(OutputFile *);
virtual int buildMachLoader(
upx_byte const *const proto,
unsigned const szproto,
upx_byte const *const fold,
unsigned const szfold,
Filter const *ft );
unsigned n_segment;
unsigned sz_segment;
unsigned sz_mach_headers;
Mach_segment_command *rawmseg; // as input, with sections
Mach_segment_command *msegcmd; // LC_SEGMENT first, without sections
Mach_header mhdri;
Mach_header mhdro;
Mach_segment_command segcmdo;
Mach_thread_command threado;
struct l_info linfo;
};
#endif /* already included */
/*
vi:ts=4:et
*/
+299 -164
View File
@@ -2,9 +2,10 @@
This file is part of the UPX executable compressor. This file is part of the UPX executable compressor.
Copyright (C) 1996-2002 Markus Franz Xaver Johannes Oberhumer Copyright (C) 1996-2006 Markus Franz Xaver Johannes Oberhumer
Copyright (C) 1996-2002 Laszlo Molnar Copyright (C) 1996-2006 Laszlo Molnar
Copyright (C) 2002 Jens Medoch Copyright (C) 2002-2006 Jens Medoch
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
and/or modify them under the terms of the GNU General Public License as and/or modify them under the terms of the GNU General Public License as
@@ -36,74 +37,158 @@
#include "p_ps1.h" #include "p_ps1.h"
static const static const
#include "stub/l_ps1.h" #include "stub/l_ps1b.h"
static const
#include "stub/l_ps1c.h"
#define MIPS_HI(a) (((a) >> 16) /* + (((a)&0x8000)>>15) */ ) #define MIPS_HI(a) ((a) >> 16)
#define MIPS_LO(a) ((a) & 0xffff) #define MIPS_LO(a) ((a) & 0xffff)
#define MIPS_JP(a) ((0x08 << 24) | (((a) & 0x0fffffff) >> 2)) #define MIPS_JP(a) ((0x08 << 24) | (((a) & 0x0fffffff) >> 2))
#define CHK_ALIGNED(a,b) ((b) - ((a) % (b))) #define TIL_ALIGNED(a,b) (((b) - ((a) & ((b) - 1))) & (b) - 1)
#define NOCACHE(a) ((a) & 0x1FFFFFFF)
#define PS_HDR_SIZE 2048 // one CD sector in bytes #define CD_SEC 2048
#define PS_HDR_SIZE CD_SEC
#define PS_RAM_SIZE 0x200000
#define PS_MIN_SIZE (PS_HDR_SIZE*3)
#define PS_MAX_SIZE 0x1e8000 #define PS_MAX_SIZE 0x1e8000
#define IH_BKUP (10 * sizeof(LE32)) #define SZ_IH_BKUP (10 * sizeof(LE32))
#define EIGHTBIT #define HD_CODE_OFS (sizeof(ps1_exe_t))
#define K0_BS (0x80000000)
#define K1_BS (0xa0000000)
#define FIX_PSVR (K1_BS - (ih.epc & K0_BS)) + (PS_HDR_SIZE - HD_CODE_OFS)
/************************************************************************* /*************************************************************************
// ps1 exe looks like this:
// 1. <header> 2048 bytes
// 2. <body> plain binary
// //
// header: contains the ps1_exe_t structure 188 bytes at offset zero
// rest is filled with zeros to reach the required
// cd mode 2 data sector size of 2048 bytes
// body: contains the binary data / code of the executable
// reqiures: executable code must be aligned to 4
// must be aligned to 2048 to run from a CD
// optional: not aligned to 2048 (for console run only)
**************************************************************************/ **************************************************************************/
PackPs1::PackPs1(InputFile *f) : PackPs1::PackPs1(InputFile *f) :
super(f) super(f),
isCon(!opt->ps1_exe.boot_only), is32Bit(!opt->ps1_exe.do_8bit),
overlap(0), sa_cnt(0)
{ {
COMPILE_TIME_ASSERT(sizeof(ps1_exe_t) == 188); COMPILE_TIME_ASSERT(sizeof(ps1_exe_t) == 188);
COMPILE_TIME_ASSERT(IH_BKUP == 40); COMPILE_TIME_ASSERT(PS_HDR_SIZE > sizeof(ps1_exe_t));
COMPILE_TIME_ASSERT(SZ_IH_BKUP == 40);
overlap = 0; #if 1 || defined(WITH_NRV)
sa_cnt = 0; COMPILE_TIME_ASSERT(sizeof(nrv_boot_loader) == 3935);
fdata_size = cfile_size = 0; COMPILE_TIME_ASSERT(NRV_BOOT_LOADER_CRC32 == 0x0ac25782);
COMPILE_TIME_ASSERT(sizeof(nrv_con_loader) == 2829);
COMPILE_TIME_ASSERT(NRV_CON_LOADER_CRC32 == 0x923b55c4);
#endif
fdata_size = file_size - PS_HDR_SIZE;
} }
const int *PackPs1::getCompressionMethods(int method, int level) const const int *PackPs1::getCompressionMethods(int method, int level) const
{ {
#ifdef EIGHTBIT if (is32Bit)
return Packer::getDefaultCompressionMethods_8(method, level);
#else
return Packer::getDefaultCompressionMethods_le32(method, level); return Packer::getDefaultCompressionMethods_le32(method, level);
#endif else
return Packer::getDefaultCompressionMethods_8(method, level);
} }
const int *PackPs1::getFilters() const const int *PackPs1::getFilters() const
{ {
return NULL; return NULL;
} }
// functions for marker handling /*************************************************************************
int PackPs1::patch_mips_le16(void *b, int blen, const void *old, unsigned new_) // util
// readFileHeader() reads ih and checks for illegal values
// checkFileHeader() checks ih for legal but unsupported values
**************************************************************************/
int PackPs1::readFileHeader()
{ {
fi->seek(0, SEEK_SET);
fi->readx(&ih, sizeof(ih));
if (memcmp(&ih.id,"PS-X EXE",8) != 0 &&
memcmp(&ih.id,"EXE X-SP",8) != 0)
return 0;
if (ih.text != 0 || ih.data != 0)
return 0;
return UPX_F_PS1_EXE;
}
bool PackPs1::checkFileHeader()
{
if (fdata_size != ih.tx_len || (ih.tx_len & 3))
{
if (!opt->force)
throwCantPack("file size entry damaged (try --force)");
else
{
opt->info_mode += !opt->info_mode ? 1 : 0;
infoWarning("fixing damaged header, keeping backup file");
opt->backup = 1;
ih.tx_len = fdata_size;
}
}
if (!opt->force &&
(ih.da_ptr != 0 || ih.da_len != 0 ||
ih.bs_ptr != 0 || ih.bs_len != 0))
{
infoWarning("unsupported header field entry");
return false;
}
if (!opt->force && ih.is_ptr == 0)
{
infoWarning("stack pointer field empty");
return false;
}
return true;
}
/*************************************************************************
// patch util
**************************************************************************/
void PackPs1::patch_mips_le(void *b, int blen, const void *old, unsigned new_)
{
size_t patch_len = strlen((const char*)old);
if (patch_len == 2)
{
unsigned char w[2]; unsigned char w[2];
set_le16(w, get_be16(old)); set_le16(w, get_be16(old));
return patch_le16(b, blen, w, new_); patch_le16(b, blen, w, MIPS_LO(new_));
} }
else if (patch_len == 4)
int PackPs1::patch_mips_le32(void *b, int blen, const void *old, unsigned new_) {
{
unsigned char w[4]; unsigned char w[4];
set_le32(w, get_be32(old)); set_le32(w, get_be32(old));
return patch_le32(b, blen, w, new_); int boff = find(b, blen, w, 4);
}
int PackPs1::patch_hi_lo(void *b, int blen, const void *old_hi, const void *old_lo, unsigned new_) if (boff == -1)
{ {
patch_mips_le16(b, blen, old_lo, MIPS_LO(new_)); patch_le16(b, blen, &w[0], MIPS_LO(new_));
patch_mips_le16(b, blen, old_hi, MIPS_HI(new_)); patch_le16(b, blen, &w[2], MIPS_HI(new_));
return 1; }
else
patch_le32((unsigned char *)b + boff, (blen-boff), &w, new_);
}
else
throwInternalError("bad marker length");
} }
@@ -113,25 +198,30 @@ int PackPs1::patch_hi_lo(void *b, int blen, const void *old_hi, const void *old_
bool PackPs1::canPack() bool PackPs1::canPack()
{ {
unsigned char buf[256]; unsigned char buf[PS_HDR_SIZE-HD_CODE_OFS];
fdata_size = file_size-PS_HDR_SIZE;
fi->seek(0, SEEK_SET); if (!readFileHeader())
fi->readx(&ih, sizeof(ih));
if ((memcmp(&ih.id,"PS-X EXE",8) != 0) && (memcmp(&ih.id,"EXE X-SP",8) != 0))
return false; return false;
fi->readx(buf, sizeof(buf)); fi->readx(buf, sizeof(buf));
checkAlreadyPacked(buf, sizeof(buf)); checkAlreadyPacked(buf, sizeof(buf));
if (fdata_size != ih.tx_len || (ih.tx_len & 3))
{ for (unsigned i = 0; i < sizeof(buf); i++)
if (buf[i] != 0)
if (!opt->force) if (!opt->force)
throwCantPack("check header for file size (try --force)"); throwCantPack("unknown data in header (try --force)");
cfile_size = fdata_size; else
{
opt->info_mode += !opt->info_mode ? 1 : 0;
infoWarning("clearing header, keeping backup file");
opt->backup = 1;
break;
} }
if (file_size <= (PS_HDR_SIZE*3) && !opt->force) if (!checkFileHeader())
throwCantPack("unsupported header flags (try --force)");
if (!opt->force && file_size < PS_MIN_SIZE)
throwCantPack("file is too small (try --force)"); throwCantPack("file is too small (try --force)");
if (file_size > PS_MAX_SIZE && !opt->force) if (!opt->force && file_size > PS_MAX_SIZE)
throwCantPack("file is too big (try --force)"); throwCantPack("file is too big (try --force)");
return true; return true;
} }
@@ -143,33 +233,41 @@ bool PackPs1::canPack()
int PackPs1::buildLoader(const Filter *) int PackPs1::buildLoader(const Filter *)
{ {
initLoader(nrv_loader,sizeof(nrv_loader)); if (isCon)
addLoader("PSXPREP0","PSXSTSZ0","PSXMAIN0", initLoader(nrv_con_loader,sizeof(nrv_con_loader));
ih.tx_ptr & 0xffff ? "PSXJSTA0" : "PSXJSTH0", else
"PSXDECO0", initLoader(nrv_boot_loader,sizeof(nrv_boot_loader));
addLoader("PS1START",
isCon ? ph.c_len & 3 ? "PS1PADCD" : "" : "PS1ENTRY",
ih.tx_ptr & 0xffff ? "PS1CONHL" : "PS1CONHI",
isCon ? "PS1ENTRY" : "",
NULL); NULL);
#ifdef EIGHTBIT
if (ph.method == M_NRV2B_8) if (ph.method == M_NRV2B_8)
addLoader("PSXN2BD0", NULL); addLoader("PS1N2B08", NULL);
else if (ph.method == M_NRV2D_8) else if (ph.method == M_NRV2D_8)
addLoader("PSXN2DD0", NULL); addLoader("PS1N2D08", NULL);
else if (ph.method == M_NRV2E_8) else if (ph.method == M_NRV2E_8)
addLoader("PSXN2ED0", NULL); addLoader("PS1N2E08", NULL);
#else else if (ph.method == M_NRV2B_LE32)
if (ph.method == M_NRV2B_LE32) addLoader("PS1N2B32", NULL);
addLoader("PSXN2BD0", NULL);
else if (ph.method == M_NRV2D_LE32) else if (ph.method == M_NRV2D_LE32)
addLoader("PSXN2DD0", NULL); addLoader("PS1N2D32", NULL);
else if (ph.method == M_NRV2E_LE32) else if (ph.method == M_NRV2E_LE32)
addLoader("PSXN2ED0", NULL); addLoader("PS1N2E32", NULL);
#endif
else else
throwInternalError("unknown compression method"); throwInternalError("unknown compression method");
if (sa_cnt) if (sa_cnt)
addLoader((sa_cnt > 0xfffc) ? "MSETBIG0" : "MSETSML0", // set small/big memset addLoader(sa_cnt > (0x10000 << 2) ? "PS1MSETB" : "PS1MSETS",
(ih.tx_len & 3) ? "MSETUAL0" : "MSETALG0", // un/aligned memset ih.tx_len & 3 ? "PS1MSETU" : "PS1MSETA",
NULL); NULL);
addLoader("PSXEXIT0", "IDENTSTR", "PSXPHDR0", NULL);
addLoader("PS1EXITC", "IDENTSTR", "PS1PAHDR",
isCon ? "PS1SREGS" : "",
NULL);
return getLoaderSize(); return getLoaderSize();
} }
@@ -182,130 +280,163 @@ void PackPs1::pack(OutputFile *fo)
{ {
ibuf.alloc(fdata_size); ibuf.alloc(fdata_size);
obuf.allocForCompression(fdata_size); obuf.allocForCompression(fdata_size);
const upx_byte *p_scan = ibuf+(fdata_size-1); const upx_byte *p_scan = ibuf+fdata_size;
// read file // read file
fi->seek(PS_HDR_SIZE,SEEK_SET); fi->seek(PS_HDR_SIZE,SEEK_SET);
fi->readx(ibuf,fdata_size); fi->readx(ibuf,fdata_size);
// this scans the end of file for 2048 bytes sector alignment // scan EOF for 2048 bytes sector alignment
// this should be padded with zeros // the removed space will secure in-place decompression
while (!(*p_scan--)) { if ((sa_cnt += 1) > (0xfffc<<3)) break; } while (!(*--p_scan)) { if (sa_cnt++ > (0x10000<<5) || sa_cnt >= fdata_size-1024) break; }
if (sa_cnt > 0xfffc)
sa_cnt = ALIGN_DOWN(sa_cnt,8); if (sa_cnt > (0x10000<<2))
sa_cnt = ALIGN_DOWN(sa_cnt,32);
else else
sa_cnt = ALIGN_DOWN(sa_cnt,4); sa_cnt = ALIGN_DOWN(sa_cnt,4);
// prepare packheader // prepare packheader
ph.u_len = (fdata_size - sa_cnt); ph.u_len = (fdata_size - sa_cnt);
ph.filter = 0; ph.filter = 0;
Filter ft(ph.level); Filter ft(ph.level);
// compress (max_match = 65535) // compress (max_match = 65535)
compressWithFilters(&ft, 512, 0, NULL, 0, 65535); compressWithFilters(&ft, 512, 0, NULL, 0, 65535);
if (ph.overlap_overhead <= sa_cnt) if (ph.overlap_overhead > sa_cnt)
overlap = 0;
else
{ {
if (!opt->force) if (!opt->force)
{
infoWarning("not in-place decompressible");
throwCantPack("packed data overlap (try --force)"); throwCantPack("packed data overlap (try --force)");
}
else else
{ {
overlap = ALIGN_UP((ph.overlap_overhead-sa_cnt),4); overlap = ALIGN_UP((ph.overlap_overhead-sa_cnt),4);
opt->info_mode += !opt->info_mode ? 1 : 0; opt->info_mode += !opt->info_mode ? 1 : 0;
infoWarning("%s will load to a %d bytes higher offset",fi->getName(),overlap); infoWarning("%s: memory overlap %d bytes",fi->getName(),overlap);
} }
} }
memcpy(&oh, &ih, sizeof(ih)); memcpy(&oh, &ih, sizeof(ih));
memcpy(&oh.ih_bkup, &ih.epc, IH_BKUP); memcpy(&oh.ih_bkup, &ih.epc, SZ_IH_BKUP);
oh.ih_csum = upx_adler32(&ih.epc, IH_BKUP); oh.ih_csum = upx_adler32(&ih.epc, SZ_IH_BKUP);
if (ih.is_ptr == 0)
oh.is_ptr = PS_RAM_SIZE-0x10;
if (ih.da_ptr != 0 || ih.da_len != 0 ||
ih.bs_ptr != 0 || ih.bs_len != 0)
oh.da_ptr = oh.da_len =
oh.bs_ptr = oh.bs_len = 0;
const int lsize = getLoaderSize(); const int lsize = getLoaderSize();
const int h_len = lsize-getLoaderSectionStart("IDENTSTR");
const int e_len = lsize-h_len;
const int d_len = e_len-getLoaderSectionStart("PSXDECO0");
int s_len;
getLoaderSection("PSXSTSZ0",&s_len); // get size of pushed/poped regs
MemBuffer loader(lsize); MemBuffer loader(lsize);
memcpy(loader,getLoader(),lsize); memcpy(loader, getLoader(), lsize);
unsigned pad, pad_code;
pad = ALIGN_UP((cfile_size ? cfile_size : ih.tx_len), 4);
pad_code = CHK_ALIGNED(ph.c_len, 4);
const unsigned decomp_data_start = NOCACHE(ih.tx_ptr);
// set the offset for compressed stuff at the very end of file
const unsigned comp_data_start = NOCACHE(((decomp_data_start+pad+overlap)-ph.c_len));
if (!opt->ps1.no_align)
// align the packed file to mode 2 data sector size (2048)
pad = CHK_ALIGNED(ph.c_len+pad_code+e_len+overlap, 2048);
else
// no align
pad = 0;
const unsigned entry = NOCACHE(comp_data_start - e_len - pad_code);
patchPackHeader(loader,lsize); patchPackHeader(loader,lsize);
patch_mips_le32(loader,e_len,"JPEP",MIPS_JP(ih.epc));
if (sa_cnt) unsigned pad = 0;
patch_mips_le16(loader,e_len,"SC", unsigned filelen = ALIGN_UP(ih.tx_len, 4);
MIPS_LO(sa_cnt > 0xfffc ? sa_cnt >> 3 : sa_cnt)); unsigned pad_code = TIL_ALIGNED(ph.c_len, 4);
if (ih.tx_ptr & 0xffff)
//we have to set the high/low value of the offset const unsigned decomp_data_start = ih.tx_ptr;
patch_hi_lo(loader,e_len,"OH","OL",decomp_data_start); const unsigned comp_data_start = ((decomp_data_start + filelen + overlap) - ph.c_len);
const int h_len = lsize - getLoaderSectionStart("IDENTSTR");
const int c_len = lsize - h_len;
int d_len = 0;
int e_len = 0;
if (isCon)
{
e_len = lsize - h_len;
d_len = e_len - getLoaderSectionStart("PS1ENTRY");
}
else else
//only high has to be set, this will save 4 bytes {
patch_mips_le16(loader,e_len,"OH",decomp_data_start>>16); d_len = (lsize - h_len) - getLoaderSectionStart("PS1ENTRY");
patch_hi_lo(loader,e_len,"CH","CL",comp_data_start); e_len = (lsize - d_len) - h_len;
patch_hi_lo(loader,e_len,"DH","DL",entry+(e_len-d_len)); }
patch_mips_le16(loader,e_len,"LS",d_len+s_len);
// set the file load address patch_mips_le(loader,c_len,"JPEP",MIPS_JP(ih.epc));
oh.tx_ptr = entry - pad; if (sa_cnt)
// set the correct file len in header patch_mips_le(loader,c_len,"SC",
oh.tx_len = ph.c_len + e_len + pad + pad_code; MIPS_LO(sa_cnt > (0x10000 << 2) ? sa_cnt >> 5 : sa_cnt >> 2));
// set the code entry if (ih.tx_ptr & 0xffff)
oh.epc = entry; patch_mips_le(loader,c_len,"DECO",decomp_data_start);
else
patch_mips_le(loader,c_len,"DE",MIPS_HI(decomp_data_start));
// write loader + compressed file const unsigned entry = comp_data_start - e_len - pad_code;
oh.tx_ptr = entry;
oh.tx_len = ph.c_len + e_len + pad_code;
oh.epc = comp_data_start - e_len - pad_code;
if (!opt->ps1_exe.no_align)
{
pad = oh.tx_len;
oh.tx_len = ALIGN_UP(oh.tx_len, CD_SEC);
pad = oh.tx_len - pad;
oh.tx_ptr -= pad;
}
ibuf.clear(0,fdata_size);
upx_bytep paddata = ibuf; upx_bytep paddata = ibuf;
memset(paddata,0,fdata_size);
fo->write(&oh,sizeof(oh)); if (isCon)
{
// id & upx header
fo->write(loader+e_len,h_len);
// align the ps exe header (mode 2 sector data size)
fo->write(paddata,PS_HDR_SIZE-fo->getBytesWritten());
if (pad)
// align the file
fo->write(paddata,pad);
// entry
fo->write(loader,e_len);
if (pad_code) if (pad_code)
// align the mips runtime code patch_mips_le(loader, c_len, "PC", pad_code);
fo->write(paddata,pad_code); patch_mips_le(loader, c_len, "DCRT", entry + (e_len - d_len));
fo->write(obuf,ph.c_len); patch_mips_le(loader, c_len, "LS",
d_len + get_le32(&loader[getLoaderSectionStart("PS1SREGS")]));
// ps1_exe_t structure 188 bytes
fo->write(&oh,sizeof(oh));
// id & upx header
fo->write(loader + e_len,h_len);
}
else
{
patch_mips_le(loader, c_len, "CPDO", comp_data_start);
patch_mips_le(loader, e_len, "PSVR", FIX_PSVR);
// ps1_exe_t structure 188 bytes
fo->write(&oh,sizeof(oh));
// decompressor
fo->write(loader + e_len, d_len);
// id & upx header
fo->write(loader + e_len + d_len, h_len);
}
// header size is 2048 bytes
fo->write(paddata, PS_HDR_SIZE - fo->getBytesWritten());
// sector alignment
if (pad)
fo->write(paddata, pad);
// entry
fo->write(loader, e_len);
// code must be aligned to 4!
if (pad_code)
fo->write(paddata, pad_code);
// compressed binary / data
fo->write(obuf, ph.c_len);
// verify
verifyOverlappingDecompression(); verifyOverlappingDecompression();
// finally check the compression ratio
if (!checkFinalCompressionRatio(fo)) if (!checkFinalCompressionRatio(fo))
throwNotCompressible(); throwNotCompressible();
#if 0 #if 0
printf("%-13s: uncompressed : %8ld bytes\n", getName(), (long) ph.u_len);
printf("%-13s: compressed : %8ld bytes\n", getName(), (long) ph.c_len); printf("%-13s: compressed : %8ld bytes\n", getName(), (long) ph.c_len);
printf("%-13s: decompressor : %8ld bytes\n", getName(), (long) e_len); printf("%-13s: decompressor : %8ld bytes\n", getName(), (long) lsize - h_len);
printf("%-13s: code entry : %08X bytes\n", getName(), (unsigned int) oh.epc); printf("%-13s: code entry : %08X bytes\n", getName(), (unsigned int) oh.epc);
printf("%-13s: load address : %08X bytes\n", getName(), (unsigned int) oh.tx_ptr); printf("%-13s: load address : %08X bytes\n", getName(), (unsigned int) oh.tx_ptr);
printf("%-13s: section size : %8ld bytes\n", getName(), (long) oh.tx_len);
printf("%-13s: eof in mem IF: %08X bytes\n", getName(), (unsigned int) ih.tx_ptr+ih.tx_len); printf("%-13s: eof in mem IF: %08X bytes\n", getName(), (unsigned int) ih.tx_ptr+ih.tx_len);
printf("%-13s: eof in mem OF: %08X bytes\n", getName(), (unsigned int) oh.tx_ptr+oh.tx_len); printf("%-13s: eof in mem OF: %08X bytes\n", getName(), (unsigned int) oh.tx_ptr+oh.tx_len);
char method_name[32+1]; set_method_name(method_name, sizeof(method_name), ph.method, ph.level);
printf("%-13s: compressor : %s\n", getName(), method_name);
#endif #endif
} }
@@ -316,10 +447,17 @@ void PackPs1::pack(OutputFile *fo)
int PackPs1::canUnpack() int PackPs1::canUnpack()
{ {
if (!readPackHeader(0x400)) if (!readFileHeader())
return false; return false;
if (file_size <= (off_t) ph.c_len) if (!readPackHeader(1024))
return false; return false;
// check header as set by packer
if (ih.ih_csum != upx_adler32(&ih.ih_bkup, SZ_IH_BKUP) &&
(ph.c_len >= fdata_size))
throwCantUnpack("header damaged");
// generic check
if (!checkFileHeader())
throwCantUnpack("unsupported header flags");
return true; return true;
} }
@@ -330,40 +468,37 @@ int PackPs1::canUnpack()
void PackPs1::unpack(OutputFile *fo) void PackPs1::unpack(OutputFile *fo)
{ {
fdata_size = file_size-PS_HDR_SIZE; // restore orig exec hdr
ibuf.alloc(file_size);
fi->seek(0x0,SEEK_SET);
fi->readx(&ih,sizeof(ih));
fi->seek(PS_HDR_SIZE,SEEK_SET);
fi->readx(ibuf,fdata_size);
// test & restore orig exec hdr
if (ih.ih_csum != upx_adler32(&ih.ih_bkup,IH_BKUP))
throwCantUnpack("file is possibly modified/hacked/protected; take care!");
memcpy(&oh, &ih, sizeof(ih)); memcpy(&oh, &ih, sizeof(ih));
memcpy(&oh.epc, &ih.ih_bkup, IH_BKUP); memcpy(&oh.epc, &ih.ih_bkup, SZ_IH_BKUP);
// clear backup and checksum of header
memset(&oh.ih_bkup,0,IH_BKUP+4);
// check for removed sector alignment // check for removed sector alignment
assert(oh.tx_len >= ph.u_len);
const unsigned pad = oh.tx_len - ph.u_len; const unsigned pad = oh.tx_len - ph.u_len;
obuf.allocForUncompression(ph.u_len+pad); ibuf.alloc(fdata_size > PS_HDR_SIZE ? fdata_size : PS_HDR_SIZE);
memset(obuf,0,obuf.getSize()); obuf.allocForUncompression(ph.u_len, pad);
fi->seek(PS_HDR_SIZE, SEEK_SET);
fi->readx(ibuf, fdata_size);
// clear backup and checksum of header
memset(&oh.ih_bkup, 0, SZ_IH_BKUP+4);
// decompress // decompress
decompress(ibuf+(fdata_size-ph.c_len),obuf); decompress(ibuf + (fdata_size - ph.c_len), obuf);
// write decompressed file // write decompressed file
if (fo) if (fo)
{ {
fo->write(&oh,sizeof(oh)); // write header
memset(ibuf,0,fdata_size); fo->write(&oh, sizeof(oh));
fo->write(ibuf,PS_HDR_SIZE-fo->getBytesWritten()); // align the ps exe header (mode 2 sector data size)
fo->write(obuf,ph.u_len+pad); ibuf.clear();
// write uncompressed data + pad
fo->write(ibuf, PS_HDR_SIZE - sizeof(oh));
obuf.clear(ph.u_len, pad);
fo->write(obuf, ph.u_len + pad);
} }
} }
+30 -25
View File
@@ -2,9 +2,10 @@
This file is part of the UPX executable compressor. This file is part of the UPX executable compressor.
Copyright (C) 1996-2002 Markus Franz Xaver Johannes Oberhumer Copyright (C) 1996-2004 Markus Franz Xaver Johannes Oberhumer
Copyright (C) 1996-2002 Laszlo Molnar Copyright (C) 1996-2004 Laszlo Molnar
Copyright (C) 2002 Jens Medoch Copyright (C) 2002-2004 Jens Medoch
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
and/or modify them under the terms of the GNU General Public License as and/or modify them under the terms of the GNU General Public License as
@@ -55,50 +56,54 @@ public:
virtual int canUnpack(); virtual int canUnpack();
protected: protected:
virtual void patch_mips_le(void *b, int blen, const void *old, unsigned new_);
virtual int buildLoader(const Filter *ft); virtual int buildLoader(const Filter *ft);
virtual int patch_mips_le16(void *b, int blen, const void *old, unsigned new_);
virtual int patch_mips_le32(void *b, int blen, const void *old, unsigned new_); virtual int readFileHeader();
virtual int patch_hi_lo(void *b, int blen, const void *old_hi, const void *old_lo, unsigned new_); virtual bool checkFileHeader();
struct ps1_exe_t struct ps1_exe_t
{ {
// ident string
char id[8]; char id[8];
// is NULL
LE32 text; LE32 text;
// is NULL
LE32 data; LE32 data;
// initial program counter
LE32 epc; LE32 epc;
// initial gp register value
LE32 gp; LE32 gp;
LE32 tx_ptr; // load offset of binary data
LE32 tx_len; LE32 tx_ptr, tx_len;
LE32 da_ptr; LE32 da_ptr, da_len;
LE32 da_len; LE32 bs_ptr, bs_len;
LE32 bs_ptr; // initial stack params
LE32 bs_len; LE32 is_ptr, is_len;
LE32 sd_ptr; // saved regs on execution
LE32 sd_len; LE32 sp, fp, gp0, ra, k0;
LE32 sp,fp,gp0,ra,k0; // origin Jap/USA/Europe
char origin[60]; char origin[60];
// some safety space after that // some safety space after that
char pad[8]; char pad[8];
// i'll place the backup of the original // backup of the original header (epc - is_len)
// execution file structure here (epc - sd_len)
LE32 ih_bkup[10]; LE32 ih_bkup[10];
// plus checksum for the backup // plus checksum for the backup
LE32 ih_csum; LE32 ih_csum;
// here will find the id & the upx header it's place. // id & the upx header.
// btw only the 'epc - sd_len' entries init the executable.
// so stuff placed here will not load and waste memory.
} }
__attribute_packed; __attribute_packed;
ps1_exe_t ih, oh; ps1_exe_t ih, oh;
upx_uint overlap; bool isCon;
upx_uint sa_cnt; bool is32Bit;
unsigned overlap;
unsigned sa_cnt;
// filesize-PS_HDR_SIZE // filesize-PS_HDR_SIZE
upx_uint fdata_size; unsigned fdata_size;
// calculated filesize
upx_uint cfile_size;
}; };
+6 -6
View File
@@ -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-2002 Markus Franz Xaver Johannes Oberhumer Copyright (C) 1996-2004 Markus Franz Xaver Johannes Oberhumer
Copyright (C) 1996-2002 Laszlo Molnar Copyright (C) 1996-2004 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 markus@oberhumer.com ml1050@users.sourceforge.net
*/ */
@@ -107,12 +107,12 @@ int PackSys::buildLoader(const Filter *ft)
initLoader(nrv2b_loader,sizeof(nrv2b_loader)); initLoader(nrv2b_loader,sizeof(nrv2b_loader));
addLoader("SYSMAIN1", addLoader("SYSMAIN1",
opt->cpu == opt->CPU_8086 ? "SYSI0861" : "SYSI2861", opt->cpu == opt->CPU_8086 ? "SYSI0861" : "SYSI2861",
"SYSMAIN2""SYSSUBSI", "SYSMAIN2,SYSSUBSI",
ph.first_offset_found == 1 ? "SYSSBBBP" : "", ph.first_offset_found == 1 ? "SYSSBBBP" : "",
ft->id ? "SYSCALLT" : "", ft->id ? "SYSCALLT" : "",
"SYSMAIN3""UPX1HEAD""SYSCUTPO""NRV2B160""NRVDDONE""NRVDECO1", "SYSMAIN3,UPX1HEAD,SYSCUTPO,NRV2B160,NRVDDONE,NRVDECO1",
ph.max_offset_found <= 0xd00 ? "NRVLED00" : "NRVGTD00", ph.max_offset_found <= 0xd00 ? "NRVLED00" : "NRVGTD00",
"NRVDECO2""NRV2B169", "NRVDECO2,NRV2B169",
NULL NULL
); );
if (ft->id) if (ft->id)
+3 -3
View File
@@ -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-2002 Markus Franz Xaver Johannes Oberhumer Copyright (C) 1996-2004 Markus Franz Xaver Johannes Oberhumer
Copyright (C) 1996-2002 Laszlo Molnar Copyright (C) 1996-2004 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
@@ -46,7 +46,7 @@ public:
virtual bool canPack(); virtual bool canPack();
protected: protected:
virtual const unsigned getCallTrickOffset() const { return 0; } virtual unsigned getCallTrickOffset() const { return 0; }
protected: protected:
virtual int buildLoader(const Filter *ft); virtual int buildLoader(const Filter *ft);
+7 -7
View File
@@ -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-2002 Markus Franz Xaver Johannes Oberhumer Copyright (C) 1996-2004 Markus Franz Xaver Johannes Oberhumer
Copyright (C) 1996-2002 Laszlo Molnar Copyright (C) 1996-2004 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 markus@oberhumer.com ml1050@users.sourceforge.net
*/ */
@@ -78,9 +78,9 @@ int PackTmt::buildLoader(const Filter *ft)
{ {
// prepare loader // prepare loader
initLoader(nrv_loader,sizeof(nrv_loader)); initLoader(nrv_loader,sizeof(nrv_loader));
addLoader("IDENTSTR""TMTMAIN1", addLoader("IDENTSTR,TMTMAIN1",
ft->id ? "TMTCALT1" : "", ft->id ? "TMTCALT1" : "",
"TMTMAIN2""UPX1HEAD""TMTCUTPO""+0XXXXXX", "TMTMAIN2,UPX1HEAD,TMTCUTPO,+0XXXXXX",
getDecompressor(), getDecompressor(),
"TMTMAIN5", "TMTMAIN5",
NULL NULL
@@ -91,9 +91,9 @@ int PackTmt::buildLoader(const Filter *ft)
addLoader("TMTCALT2",NULL); addLoader("TMTCALT2",NULL);
addFilter32(ft->id); addFilter32(ft->id);
} }
addLoader("TMTRELOC""RELOC320", addLoader("TMTRELOC,RELOC320",
big_relocs ? "REL32BIG" : "", big_relocs ? "REL32BIG" : "",
"RELOC32J""TMTJUMP1", "RELOC32J,TMTJUMP1",
NULL NULL
); );
return getLoaderSize(); return getLoaderSize();
+2 -2
View File
@@ -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-2002 Markus Franz Xaver Johannes Oberhumer Copyright (C) 1996-2004 Markus Franz Xaver Johannes Oberhumer
Copyright (C) 1996-2002 Laszlo Molnar Copyright (C) 1996-2004 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
+29 -20
View File
@@ -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-2002 Markus Franz Xaver Johannes Oberhumer Copyright (C) 1996-2004 Markus Franz Xaver Johannes Oberhumer
Copyright (C) 1996-2002 Laszlo Molnar Copyright (C) 1996-2004 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
@@ -136,6 +136,8 @@ int PackTos::getLoaderSize() const
/************************************************************************* /*************************************************************************
// util // util
// readFileHeader() reads ih and checks for illegal values
// checkFileHeader() checks ih for legal but unsupported values
**************************************************************************/ **************************************************************************/
int PackTos::readFileHeader() int PackTos::readFileHeader()
@@ -221,6 +223,7 @@ static unsigned OP_MOVEQ(int value, int d_reg)
static unsigned OP_SUBQ_L(int value, int d_reg) static unsigned OP_SUBQ_L(int value, int d_reg)
{ {
// subq.l #X,d0
assert(value >= 1 && value <= 8); assert(value >= 1 && value <= 8);
assert(d_reg >= REG_D0 && d_reg <= REG_D7); assert(d_reg >= REG_D0 && d_reg <= REG_D7);
return 0x5180 | ((value & 7) << 9) | (d_reg & 7); return 0x5180 | ((value & 7) << 9) | (d_reg & 7);
@@ -228,6 +231,7 @@ static unsigned OP_SUBQ_L(int value, int d_reg)
static unsigned OP_SUBQ_W(int value, int d_reg) static unsigned OP_SUBQ_W(int value, int d_reg)
{ {
// subq.w #X,d0
assert(value >= 1 && value <= 8); assert(value >= 1 && value <= 8);
assert(d_reg >= REG_D0 && d_reg <= REG_D7); assert(d_reg >= REG_D0 && d_reg <= REG_D7);
return 0x5140 | ((value & 7) << 9) | (d_reg & 7); return 0x5140 | ((value & 7) << 9) | (d_reg & 7);
@@ -365,14 +369,15 @@ bool PackTos::canPack()
if (!readFileHeader()) if (!readFileHeader())
return false; return false;
unsigned char buf[512]; unsigned char buf[768];
fi->readx(buf, sizeof(buf)); fi->readx(buf, sizeof(buf));
checkAlreadyPacked(buf, sizeof(buf)); checkAlreadyPacked(buf, sizeof(buf));
if (!checkFileHeader()) if (!checkFileHeader())
throwCantPack("unsupported header flags"); throwCantPack("unsupported header flags");
if (file_size < 256) if (file_size < 1024)
throwCantPack("program too small"); throwCantPack("program is too small");
return true; return true;
} }
@@ -399,13 +404,6 @@ void PackTos::pack(OutputFile *fo)
unsigned relocsize = 0; unsigned relocsize = 0;
unsigned overlay = 0; unsigned overlay = 0;
const unsigned lsize = getLoaderSize();
const unsigned e_len = get_be16(getLoader()+lsize-6);
const unsigned d_len = get_be16(getLoader()+lsize-4);
const unsigned decomp_offset = get_be16(getLoader()+lsize-2);
assert(e_len + d_len == lsize - 6);
assert((e_len & 3) == 0 && (d_len & 1) == 0);
const unsigned i_text = ih.fh_text; const unsigned i_text = ih.fh_text;
const unsigned i_data = ih.fh_data; const unsigned i_data = ih.fh_data;
const unsigned i_sym = ih.fh_sym; const unsigned i_sym = ih.fh_sym;
@@ -474,8 +472,8 @@ void PackTos::pack(OutputFile *fo)
// After compression this will become the first part of the // After compression this will become the first part of the
// data segement. The second part will be the decompressor. // data segement. The second part will be the decompressor.
// alloc buffer // alloc buffer (2048 is for decompressor and the various alignments)
obuf.allocForCompression(t + d_len + 512); obuf.allocForCompression(t, 2048);
// prepare packheader // prepare packheader
ph.u_len = t; ph.u_len = t;
@@ -484,6 +482,14 @@ void PackTos::pack(OutputFile *fo)
// compress (max_match = 65535) // compress (max_match = 65535)
compressWithFilters(&ft, 512, 0, NULL, 0, 65535); compressWithFilters(&ft, 512, 0, NULL, 0, 65535);
// get loader
const unsigned lsize = getLoaderSize();
const unsigned e_len = get_be16(getLoader()+lsize-6);
const unsigned d_len = get_be16(getLoader()+lsize-4);
const unsigned decomp_offset = get_be16(getLoader()+lsize-2);
assert(e_len + d_len == lsize - 6);
assert((e_len & 3) == 0 && (d_len & 1) == 0);
// The decompressed data will now get placed at this offset: // The decompressed data will now get placed at this offset:
unsigned offset = (ph.u_len + ph.overlap_overhead) - ph.c_len; unsigned offset = (ph.u_len + ph.overlap_overhead) - ph.c_len;
@@ -536,12 +542,14 @@ void PackTos::pack(OutputFile *fo)
// prepare loader // prepare loader
MemBuffer loader(o_text); MemBuffer loader(o_text);
memcpy(loader,getLoader(),o_text); memcpy(loader, getLoader(), o_text);
// patch loader // patch loader
patchPackHeader(loader,o_text); int tmp = patchPackHeader(loader, o_text);
assert(tmp + 32 == (int)o_text); UNUSED(tmp);
patchVersionYear(loader, o_text);
if (!opt->small) if (!opt->small)
patchVersion(loader,o_text); patchVersion(loader, o_text);
// patch "subq.l #1,d6" or "subq.w #1,d6" - see "up41" below // patch "subq.l #1,d6" or "subq.w #1,d6" - see "up41" below
const unsigned dirty_bss_d6 = const unsigned dirty_bss_d6 =
patch_d_subq(loader, o_text, REG_D6, dirty_bss / dirty_bss_align, "u4"); patch_d_subq(loader, o_text, REG_D6, dirty_bss / dirty_bss_align, "u4");
@@ -575,7 +583,7 @@ void PackTos::pack(OutputFile *fo)
// set new file_hdr // set new file_hdr
memcpy(&oh, &ih, FH_SIZE); memcpy(&oh, &ih, FH_SIZE);
if (opt->tos.split_segments) if (opt->atari_tos.split_segments)
{ {
oh.fh_text = o_text; oh.fh_text = o_text;
oh.fh_data = o_data; oh.fh_data = o_data;
@@ -635,6 +643,7 @@ int PackTos::canUnpack()
if ((ih.fh_text & 3) != 0 || (ih.fh_data & 3) != 0 || (ih.fh_bss & 3) != 0 if ((ih.fh_text & 3) != 0 || (ih.fh_data & 3) != 0 || (ih.fh_bss & 3) != 0
|| ih.fh_sym != 0 || ih.fh_reserved != 0 || ih.fh_reloc > 1) || ih.fh_sym != 0 || ih.fh_reserved != 0 || ih.fh_reloc > 1)
throwCantUnpack("program header damaged"); throwCantUnpack("program header damaged");
// generic check
if (!checkFileHeader()) if (!checkFileHeader())
throwCantUnpack("unsupported header flags"); throwCantUnpack("unsupported header flags");
return true; return true;
@@ -650,8 +659,8 @@ void PackTos::unpack(OutputFile *fo)
ibuf.alloc(ph.c_len); ibuf.alloc(ph.c_len);
obuf.allocForUncompression(ph.u_len); obuf.allocForUncompression(ph.u_len);
fi->seek(ph.buf_offset + ph.getPackHeaderSize(),SEEK_SET); fi->seek(FH_SIZE + ph.buf_offset + ph.getPackHeaderSize(), SEEK_SET);
fi->readx(ibuf,ph.c_len); fi->readx(ibuf, ph.c_len);
// decompress // decompress
decompress(ibuf,obuf); decompress(ibuf,obuf);

Some files were not shown because too many files have changed in this diff Show More