📄 upx.html
字号:
available compression methods. This may improve the compression ratio in some cases, but usually the default method gives the best results anyway.</pre><p></p><h2><a name="notes_for_bvmlinuz_i386">NOTES FOR BVMLINUZ/I386</a></h2><p>Same as vmlinuz/i386.</p><p></p><h2><a name="notes_for_dos_com">NOTES FOR DOS/COM</a></h2><p>Obviously <strong>UPX</strong> won't work with executables that want to read data fromthemselves (like some commandline utilities that ship with Win95/98/ME).</p><p>Compressed programs only work on a 286+.</p><p>Packed programs will be byte-identical to the original after uncompression.</p><p>Maximum uncompressed size: ~65100 bytes.</p><p>Extra options available for this executable format:</p><pre> --8086 Create an executable that works on any 8086 CPU.</pre><pre> --all-methods Compress the program several times, using all available compression methods. This may improve the compression ratio in some cases, but usually the default method gives the best results anyway.</pre><pre> --all-filters Compress the program several times, using all available preprocessing filters. This may improve the compression ratio in some cases, but usually the default filter gives the best results anyway.</pre><p></p><h2><a name="notes_for_dos_exe">NOTES FOR DOS/EXE</a></h2><p>dos/exe stands for all ``normal'' 16-bit DOS executables.</p><p>Obviously <strong>UPX</strong> won't work with executables that want to read data fromthemselves (like some command line utilities that ship with Win95/98/ME).</p><p>Compressed programs only work on a 286+.</p><p>Extra options available for this executable format:</p><pre> --8086 Create an executable that works on any 8086 CPU.</pre><pre> --no-reloc Use no relocation records in the exe header.</pre><pre> --all-methods Compress the program several times, using all available compression methods. This may improve the compression ratio in some cases, but usually the default method gives the best results anyway.</pre><p></p><h2><a name="notes_for_dos_sys">NOTES FOR DOS/SYS</a></h2><p>You can only compress plain sys files, sys/exe (two in one)combos are not supported.</p><p>Compressed programs only work on a 286+.</p><p>Packed programs will be byte-identical to the original after uncompression.</p><p>Maximum uncompressed size: ~65350 bytes.</p><p>Extra options available for this executable format:</p><pre> --8086 Create an executable that works on any 8086 CPU.</pre><pre> --all-methods Compress the program several times, using all available compression methods. This may improve the compression ratio in some cases, but usually the default method gives the best results anyway.</pre><pre> --all-filters Compress the program several times, using all available preprocessing filters. This may improve the compression ratio in some cases, but usually the default filter gives the best results anyway.</pre><p></p><h2><a name="notes_for_djgpp2_coff">NOTES FOR DJGPP2/COFF</a></h2><p>First of all, it is recommended to use <strong>UPX</strong> *instead* of <strong>strip</strong>. strip hasthe very bad habit of replacing your stub with its own (outdated) version.Additionally <strong>UPX</strong> corrects a bug/feature in strip v2.8.x: itwill fix the 4 KByte aligment of the stub.</p><p><strong>UPX</strong> includes the full functionality of stubify. This means it willautomatically stubify your COFF files. Use the option <strong>--coff</strong> todisable this functionality (see below).</p><p><strong>UPX</strong> automatically handles Allegro packfiles.</p><p>The DLM format (a rather exotic shared library extension) is not supported.</p><p>Packed programs will be byte-identical to the original after uncompression.All debug information and trailing garbage will be stripped, though.</p><p>Extra options available for this executable format:</p><pre> --coff Produce COFF output instead of EXE. By default UPX keeps your current stub.</pre><pre> --all-methods Compress the program several times, using all available compression methods. This may improve the compression ratio in some cases, but usually the default method gives the best results anyway.</pre><pre> --all-filters Compress the program several times, using all available preprocessing filters. This may improve the compression ratio in some cases, but usually the default filter gives the best results anyway.</pre><p></p><h2><a name="notes_for_linux__general_">NOTES FOR LINUX [general]</a></h2><p>Introduction</p><pre> Linux/386 support in UPX consists of 3 different executable formats, one optimized for ELF excutables ("linux/elf386"), one optimized for shell scripts ("linux/sh386"), and one generic format ("linux/386").</pre><pre> We will start with a general discussion first, but please also read the relevant docs for each of the individual formats.</pre><pre> Also, there is special support for bootable kernels - see the description of the vmlinuz/386 format.</pre><p>General user's overview</p><pre> Running a compressed executable program trades less space on a ``permanent'' storage medium (such as a hard disk, floppy disk, CD-ROM, flash memory, EPROM, etc.) for more space in one or more ``temporary'' storage media (such as RAM, swap space, /tmp, etc.). Running a compressed executable also requires some additional CPU cycles to generate the compressed executable in the first place, and to decompress it at each invocation.</pre><pre> How much space is traded? It depends on the executable, but many programs save 30% to 50% of permanent disk space. How much CPU overhead is there? Again, it depends on the executable, but decompression speed generally is at least many megabytes per second, and frequently is limited by the speed of the underlying disk or network I/O.</pre><pre> Depending on the statistics of usage and access, and the relative speeds of CPU, RAM, swap space, /tmp, and filesystem storage, then invoking and running a compressed executable can be faster than directly running the corresponding uncompressed program. The operating system might perfrom fewer expensive I/O operations to invoke the compressed program. Paging to or from swap space or /tmp might be faster than paging from the general filesystem. ``Medium-sized'' programs which access about 1/3 to 1/2 of their stored program bytes can do particulary well with compression. Small programs tend not to benefit as much because the absolute savings is less. Big programs tend not to benefit proportionally because each invocation may use only a small fraction of the program, yet UPX decompresses the entire program before invoking it. But in environments where disk or flash memory storage is limited, then compression may win anyway.</pre><pre> Currently, executables compressed by UPX do not share RAM at runtime in the way that executables mapped from a filesystem do. As a result, if the same program is run simultaneously by more than one process, then using the compressed version will require more RAM and/or swap space. So, shell programs (bash, csh, etc.) and ``make'' might not be good candidates for compression.</pre><pre> UPX recognizes three executable formats for Linux: Linux/elf386, Linux/sh386, and Linux/386. Linux/386 is the most generic format; it accommodates any file that can be executed. At runtime, the UPX decompression stub re-creates in /tmp a copy of the original file, and then the copy is (re-)executed with the same arguments. ELF binary executables prefer the Linux/elf386 format by default, because UPX decompresses them directly into RAM, uses only one exec, does not use space in /tmp, and does not use /proc. Shell scripts where the underlying shell accepts a ``-c'' argument can use the Linux/sh386 format. UPX decompresses the shell script into low memory, then maps the shell and passes the entire text of the script as an argument with a leading ``-c''.</pre><p>General benefits:</p><pre> - UPX can compress all executables, be it AOUT, ELF, libc4, libc5, libc6, Shell/Perl/Python/... scripts, standalone Java .class binaries, or whatever... All scripts and programs will work just as before.</pre><pre> - Compressed programs are completely self-contained. No need for any external program.</pre><pre> - UPX keeps your original program untouched. This means that after decompression you will have a byte-identical version, and you can use UPX as a file compressor just like gzip. [ Note that UPX maintains a checksum of the file internally, so it is indeed a reliable alternative. ]</pre><pre> - As the stub only uses syscalls and isn't linked against libc it should run under any Linux configuration that can run ELF binaries.</pre><pre> - For the same reason compressed executables should run under FreeBSD and other systems which can run Linux binaries. [ Please send feedback on this topic ]</pre><p>General drawbacks:</p><pre> - It is not advisable to compress programs which usually have many instances running (like `sh' or `make') because the common segments of compressed programs won't be shared any longer between different processes.</pre><pre> - `ldd' and `size' won't show anything useful because all they see is the statically linked stub. Since version 0.82 the section headers are stripped from the UPX stub and `size' doesn't even recognize the file format. The file patches/patch-elfcode.h has a patch to fix this bug in `size' and other programs which use GNU BFD.</pre><p>General notes:</p><pre> - As UPX leaves your original program untouched it is advantageous to strip it before compression.</pre><pre> - If you compress a script you will lose platform independence - this could be a problem if you are using NFS mounted disks.</pre><pre> - Compression of suid, guid and sticky-bit programs is rejected because of possible security implications.</pre><pre> - For the same reason there is no sense in making any compressed program suid.</pre><pre> - Obviously UPX won't work with executables that want to read data from themselves. E.g., this might be a problem for Perl scripts which access their __DATA__ lines.</pre><pre> - In case of internal errors the stub will abort with exitcode 127. Typical reasons for this to happen are that the program has somehow been modified after compression. Running `strace -o strace.log compressed_file' will tell you more.</pre><p></p><h2><a name="notes_for_linux_elf386">NOTES FOR LINUX/ELF386</a></h2><p>Please read the general Linux description first.</p><p>The linux/elf386 format decompresses directly into RAM,uses only one exec, does not use space in /tmp,and does not use /proc.</p><p>Linux/elf386 is automatically selected for Linux ELF exectuables.</p><p>Packed programs will be byte-identical to the original after uncompression.</p><p>How it works:</p><pre> For ELF executables, UPX decompresses directly to memory, simulating the mapping that the operating system kernel uses during exec(), including the PT_INTERP program interpreter (if any). The brk() is set by a special PT_LOAD segment in the compressed executable itself. UPX then wipes the stack clean except for arguments, environment variables, and Elf_auxv entries (this is required by bugs in the startup code of /lib/ld-linux.so as of May 2000), and transfers control to the program interpreter or the e_entry address of the original executable.</pre><pre> The UPX stub is about 1700 bytes long, partly written in assembler and only uses kernel syscalls. It is not linked against any libc.</pre><p>Specific drawbacks:</p><pre> - For linux/elf386 and linux/sh386 formats, you will be relying on RAM and swap space to hold all of the decompressed program during the lifetime of the process. If you already use most of your swap space, then you may run out. A system that is "out of memory" can become fragile. Many programs do not react gracefully when malloc() returns 0. With newer Linux kernels, the kernel may decide to kill some processes to regain memory, and you may not like the kernel's choice of which to kill. Running /usr/bin/top is one way to check on the usage of swap space.</pre><p>Extra options available for this executable format:</p><pre> (none)</pre><p></p><h2><a name="notes_for_linux_sh386">NOTES FOR LINUX/SH386</a></h2><p>Please read the general Linux description first.</p><p>Shell scripts where the underling shell accepts a ``-c'' argumentcan use the Linux/sh386 format. <strong>UPX</strong> decompresses the shell scriptinto low memory, then maps the shell and passes the entire text of thescript as an argument with a leading ``-c''.It does not use space in /tmp, and does not use /proc.</p><p>Linux/sh386 is automatically selected for shell scripts thatuse a known shell.</p><p>Packed programs will be byte-identical to the original after uncompression.</p><p>How it works:</p><pre> For shell script executables (files beginning with "#!/" or "#! /") where the shell is known to accept "-c <command>", UPX decompresses the file into low memory, then maps the shell (and its PT_INTERP), and passes control to the shell with the entire decompressed file as the argument after "-c". Known shells are sh, ash, bash, bsh, csh, ksh, tcsh, pdksh. Restriction: UPX cannot use this method for shell scripts which use the one optional string argument after the shell name in the script (example: "#! /bin/sh option3\n".)</pre><pre> The UPX stub is about 1700 bytes long, partly written in assembler and only uses kernel syscalls. It is not linked against any libc.</pre><p>Specific drawbacks:</p><pre> - For linux/elf386 and linux/sh386 formats, you will be relying on RAM and swap space to hold all of the decompressed program during the lifetime of the process. If you already use most of your swap space, then you may run out. A system that is "out of memory" can become fragile. Many programs do not react gracefully when malloc() returns 0. With newer Linux kernels, the kernel may decide to kill some processes to regain memory, and you
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -