Compare commits

..

130 Commits

Author SHA1 Message Date
Markus F.X.J. Oberhumer d767332943 CI updates
CI / Rebuild stubs (push) Has been cancelled
CI / ${{ format('{0}', matrix.os) }}-0 (ubuntu-22.04) (push) Has been cancelled
CI / ${{ format('{0}', matrix.os) }}-0 (ubuntu-22.04-arm) (push) Has been cancelled
CI / ${{ format('{0}', matrix.os) }}-0 (ubuntu-24.04) (push) Has been cancelled
CI / ${{ format('{0}', matrix.os) }}-0 (ubuntu-24.04-arm) (push) Has been cancelled
CI / ${{ format('{0}', matrix.os) }} (ubuntu-22.04, true) (push) Has been cancelled
CI / ${{ format('{0}', matrix.os) }} (ubuntu-24.04, true, true) (push) Has been cancelled
CI / ${{ format('{0} {1}{2}', matrix.os, matrix.xcode_version && 'xcode-' || '', matrix.xcode_version) }} (gcc-13, g++-13, macos-14, true) (push) Has been cancelled
CI / ${{ format('{0} {1}{2}', matrix.os, matrix.xcode_version && 'xcode-' || '', matrix.xcode_version) }} (gcc-14, g++-14, macos-15, true) (push) Has been cancelled
CI / ${{ format('{0} {1}{2}', matrix.os, matrix.xcode_version && 'xcode-' || '', matrix.xcode_version) }} (gcc-15, g++-15, macos-26, true) (push) Has been cancelled
CI / ${{ format('{0}', matrix.name) }} (windows-11-arm64, windows-11-arm, arm64, 2022) (push) Has been cancelled
CI / ${{ format('{0}', matrix.name) }} (windows-11-arm64ec, windows-11-arm, true, arm64, 2022) (push) Has been cancelled
CI / ${{ format('{0}', matrix.name) }} (windows-2022-amd64, windows-2022, amd64, 2022) (push) Has been cancelled
CI / ${{ format('{0}', matrix.name) }} (windows-2022-i386, windows-2022, amd64_x86, 2022) (push) Has been cancelled
CI / ${{ format('{0}', matrix.name) }} (windows-2025-amd64, windows-2025, amd64, 2022) (push) Has been cancelled
CI / ${{ format('{0}', matrix.name) }} (windows-2025-i386, windows-2025, amd64_x86, 2022) (push) Has been cancelled
CI / ${{ format('windows-bh {0}', matrix.name) }} (-arm64EC, /machine:arm64ec, arm64ec-win64-vs2025, windows-2025, amd64_arm64, 2022) (push) Has been cancelled
CI / ${{ format('windows-bh {0}', matrix.name) }} (amd64-win64-vs2025, windows-2025, amd64, 2022) (push) Has been cancelled
CI / ${{ format('windows-bh {0}', matrix.name) }} (arm64-win64-vs2025, windows-2025, amd64_arm64, 2022) (push) Has been cancelled
CI / ${{ format('zigcc {0} {1}', matrix.zig_target, matrix.zig_pic) }} (-march=i586, i386-linux-gnu.2.17) (push) Has been cancelled
CI / ${{ format('zigcc {0} {1}', matrix.zig_target, matrix.zig_pic) }} (-march=i586, i386-linux-gnu.2.3.4) (push) Has been cancelled
CI / ${{ format('zigcc {0} {1}', matrix.zig_target, matrix.zig_pic) }} (aarch64-macos-none) (push) Has been cancelled
CI / ${{ format('zigcc {0} {1}', matrix.zig_target, matrix.zig_pic) }} (aarch64-windows-gnu) (push) Has been cancelled
CI / ${{ format('zigcc {0} {1}', matrix.zig_target, matrix.zig_pic) }} (alpine:3.18, qemu-x86_64, -fPIE, x86_64-linux-musl) (push) Has been cancelled
CI / ${{ format('zigcc {0} {1}', matrix.zig_target, matrix.zig_pic) }} (i386-windows-gnu) (push) Has been cancelled
CI / ${{ format('zigcc {0} {1}', matrix.zig_target, matrix.zig_pic) }} (qemu-aarch64, aarch64-linux-musl) (push) Has been cancelled
CI / ${{ format('zigcc {0} {1}', matrix.zig_target, matrix.zig_pic) }} (qemu-arm, arm-linux-musleabihf) (push) Has been cancelled
CI / ${{ format('zigcc {0} {1}', matrix.zig_target, matrix.zig_pic) }} (qemu-armeb, armeb-linux-musleabihf) (push) Has been cancelled
CI / ${{ format('zigcc {0} {1}', matrix.zig_target, matrix.zig_pic) }} (qemu-i386, -march=i586, -fPIE, i386-linux-musl) (push) Has been cancelled
CI / ${{ format('zigcc {0} {1}', matrix.zig_target, matrix.zig_pic) }} (qemu-i386, -march=i586, i386-linux-musl) (push) Has been cancelled
CI / ${{ format('zigcc {0} {1}', matrix.zig_target, matrix.zig_pic) }} (qemu-mips, mips-linux-musleabi) (push) Has been cancelled
CI / ${{ format('zigcc {0} {1}', matrix.zig_target, matrix.zig_pic) }} (qemu-mips, mips-linux-musleabihf) (push) Has been cancelled
CI / ${{ format('zigcc {0} {1}', matrix.zig_target, matrix.zig_pic) }} (qemu-mipsel, mipsel-linux-musleabi) (push) Has been cancelled
CI / ${{ format('zigcc {0} {1}', matrix.zig_target, matrix.zig_pic) }} (qemu-mipsel, mipsel-linux-musleabihf) (push) Has been cancelled
CI / ${{ format('zigcc {0} {1}', matrix.zig_target, matrix.zig_pic) }} (qemu-ppc, powerpc-linux-musleabihf) (push) Has been cancelled
CI / ${{ format('zigcc {0} {1}', matrix.zig_target, matrix.zig_pic) }} (qemu-ppc64, -fPIE, powerpc64-linux-musl) (push) Has been cancelled
CI / ${{ format('zigcc {0} {1}', matrix.zig_target, matrix.zig_pic) }} (qemu-ppc64, powerpc64-linux-musl) (push) Has been cancelled
CI / ${{ format('zigcc {0} {1}', matrix.zig_target, matrix.zig_pic) }} (qemu-ppc64le, -fPIE, powerpc64le-linux-musl) (push) Has been cancelled
CI / ${{ format('zigcc {0} {1}', matrix.zig_target, matrix.zig_pic) }} (qemu-ppc64le, powerpc64le-linux-musl) (push) Has been cancelled
CI / ${{ format('zigcc {0} {1}', matrix.zig_target, matrix.zig_pic) }} (qemu-riscv64, UPX-UNSUPPORTED, -fPIE, riscv64-linux-musl) (push) Has been cancelled
CI / ${{ format('zigcc {0} {1}', matrix.zig_target, matrix.zig_pic) }} (qemu-riscv64, UPX-UNSUPPORTED, riscv64-linux-musl) (push) Has been cancelled
CI / ${{ format('zigcc {0} {1}', matrix.zig_target, matrix.zig_pic) }} (qemu-x86_64, x86_64-linux-gnu.2.3.4) (push) Has been cancelled
CI / ${{ format('zigcc {0} {1}', matrix.zig_target, matrix.zig_pic) }} (qemu-x86_64, x86_64-linux-musl) (push) Has been cancelled
CI / ${{ format('zigcc {0} {1}', matrix.zig_target, matrix.zig_pic) }} (x86_64-macos-none) (push) Has been cancelled
CI / ${{ format('zigcc {0} {1}', matrix.zig_target, matrix.zig_pic) }} (x86_64-windows-gnu) (push) Has been cancelled
CI / ${{ format('{0} {1}{2}', matrix.os, matrix.xcode_version && 'xcode-' || '', matrix.xcode_version) }} (gcc-14, g++-14, macos-15-intel, true) (push) Has been cancelled
CI / ${{ format('windows-bh {0}', matrix.name) }} (i386-win32-vs2025, windows-2025, amd64_x86, 2022) (push) Has been cancelled
CI / ${{ format('zigcc {0} {1}', matrix.zig_target, matrix.zig_pic) }} (alpine:3.18, qemu-aarch64, -fPIE, aarch64-linux-musl) (push) Has been cancelled
CI / ${{ format('zigcc {0} {1}', matrix.zig_target, matrix.zig_pic) }} (qemu-x86_64, x86_64-linux-gnu.2.17) (push) Has been cancelled
2025-12-12 11:44:17 +01:00
John Reiser f3d4503e93 clang-format inconsistency
modified:   p_elf_enum.h
2025-12-10 10:33:46 -08:00
John Reiser 70cb4aadda Fix "bad slide" on 32-bit ARM shared library
https://github.com/upx/upx/issues/944
	modified:   src/p_elf_enum.h
	modified:   src/p_lx_elf.cpp
2025-12-10 10:24:53 -08:00
John Reiser 75325bf9ef bb1
modified:   src/p_lx_elf.cpp
2025-12-10 10:24:53 -08:00
Markus F.X.J. Oberhumer 669bf2251f CI updates 2025-12-10 12:30:09 +01:00
Markus F.X.J. Oberhumer 190fd76583 CI updates 2025-12-10 10:15:51 +01:00
Markus F.X.J. Oberhumer 8622e22be0 CI updates 2025-12-02 13:54:23 +01:00
Markus F.X.J. Oberhumer 139a0324b6 CI updates 2025-11-29 18:10:15 +01:00
Markus F.X.J. Oberhumer e39f2b2b2f CI updates 2025-11-29 15:12:15 +01:00
John Reiser 7a46365296 Fix unpack of PackLinuxI386 for upx version 11
Old b_info without .b_method
https://github.com/upx/upx/issues/942
        modified:   p_unix.cpp
2025-11-25 04:29:52 -08:00
Markus F.X.J. Oberhumer f83b7690e5 CI updates 2025-11-25 09:15:40 +01:00
Markus F.X.J. Oberhumer 98c00d0fcb CI updates 2025-11-08 09:05:25 +01:00
Markus F.X.J. Oberhumer b04d566b83 CI updates 2025-11-03 15:41:08 +01:00
Markus F.X.J. Oberhumer b3c765ac7c CI updates 2025-11-02 23:52:34 +01:00
Markus F.X.J. Oberhumer f7146b5af9 CI updates 2025-11-02 18:41:09 +01:00
John Reiser 5dbf94e49b Update README.SRC to enable success by newbies.
Need i386 version of zlib, updated libmfpr.so, g++ (not clang++).
https://github.com/upx/upx/issues/938
	modified:   README.SRC
2025-10-29 11:14:58 -07:00
Markus F.X.J. Oberhumer 2e39c924d5 CI updates 2025-10-29 10:03:11 +01:00
John Reiser 3068d19492 WinPE with TLS: fix relocation bugs
--strip-relocs not needed after bugfixes, but keep safety check.
Thanks to @ml1050.
https://github.com/upx/upx/issues/880
	modified:   pefile.cpp
2025-10-26 13:36:43 -07:00
Markus F.X.J. Oberhumer 09d7d08e55 all: version bump 2025-10-24 22:02:13 +02:00
Markus F.X.J. Oberhumer 31ff38049f CI updates 2025-10-24 21:53:23 +02:00
John Reiser a5f5e7fc73 WinPE: Require --strip-relocs if relocating compressed data
Thanks to @bitraid for investigating and suggestions.
https://github.com/upx/upx/issues/880
	modified:   pefile.cpp
2025-10-24 08:35:20 -07:00
Markus F.X.J. Oberhumer 3533ebe804 CI updates 2025-10-13 01:44:37 +02:00
Markus F.X.J. Oberhumer c4ed5cc159 CI updates 2025-10-11 02:59:23 +02:00
John Reiser 303ac34539 ord() not needed
modified:   scripts/bin2h.py
2025-10-10 13:34:15 -07:00
John Reiser e8947a6812 Cleanup deubg
modified:   scripts/brandelf.py
2025-10-10 13:10:14 -07:00
John Reiser 533e642945 Merge branch 'jreiser-python3a' into jreiser-python3 2025-10-10 11:50:22 -07:00
John Reiser 8ab47ba8a4 More python3
modified:   scripts/brandelf.py
	modified:   scripts/gpp_inc.py
	modified:   src/arch/i086/cleanasm.py
2025-10-10 11:43:39 -07:00
John Reiser e4c638aa73 Mixing python3 strings with bytes requires .encode and .decode
modified:   stub/scripts/bin2h.py
	modified:   stub/scripts/brandelf.py
	modified:   stub/scripts/gpp_inc.py
	modified:   stub/scripts/xstrip.py
2025-10-10 08:56:37 -07:00
John Reiser 4ec866594b Mixing python3 strings with bytes requires .encode and .decode
modified:   stub/scripts/bin2h.py
	modified:   stub/scripts/brandelf.py
	modified:   stub/scripts/gpp_inc.py
	modified:   stub/scripts/xstrip.py
2025-10-10 08:38:59 -07:00
John Reiser a3d5a0a7b8 Replace 'has_key' with 'in'
modified:   src/stub/scripts/bin2h.py
	modified:   src/stub/scripts/xstrip.py
	modified:   src/stub/src/arch/i086/cleanasm.py
2025-10-08 14:35:13 -07:00
John Reiser 59d5d25a77 python-is-python3
modified:   ci.yml
2025-10-08 14:24:32 -07:00
John Reiser e60ebd4027 install python
modified:   ci.yml
2025-10-08 14:22:12 -07:00
John Reiser 3a61782f12 no more PYTHON2
modified:   src/stub/Makefile
2025-10-08 14:18:52 -07:00
John Reiser 11041f44e6 need ../deps/packages
modified:   ci.yml
2025-10-08 14:05:01 -07:00
John Reiser 649063c8c6 ci.yml syntax
modified:   ci.yml
2025-10-08 08:40:23 -07:00
John Reiser 36271c3244 python (python3) replaces python2
https://github.com/upx/upx/issues/868
Thanks to 'tansy' for the patches to *.py .

	modified:   .github/workflows/ci.yml
	modified:   src/stub/scripts/bin2h.py
	modified:   src/stub/scripts/brandelf.py
	modified:   src/stub/scripts/gpp_inc.py
	modified:   src/stub/scripts/xstrip.py
	modified:   src/stub/src/arch/i086/cleanasm.py
	modified:   src/stub/src/arch/i086/wdis2gas.py
2025-10-08 08:32:24 -07:00
Markus F.X.J. Oberhumer 3c3caaa567 CI updates 2025-10-07 22:00:31 +02:00
Markus F.X.J. Oberhumer d3504d8af2 CI updates 2025-10-05 13:17:03 +02:00
Markus F.X.J. Oberhumer 12d1c6bbda CI updates 2025-09-30 20:38:33 +02:00
Markus F.X.J. Oberhumer 466ceb4a1f CI updates 2025-09-18 12:03:48 +02:00
John Reiser 3b71139426 WIP Propagate CETCOMPAT flag for PeFile.
https://github.com/upx/upx/issues/909
	modified:   pefile.cpp
	modified:   pefile.h
2025-09-13 15:50:01 -07:00
Markus F.X.J. Oberhumer b11f043d64 CI updates 2025-09-10 11:11:51 +02:00
John Reiser aef93548f9 Fix memfd_create in shared libraries on amd64 Linux < kernel 6.3
https://github.com/upx/upx/issues/929
	modified:   stub/src/amd64-linux.elf-so_fold.S
           plus generated .h .dump
2025-09-09 14:58:00 -07:00
John Reiser 26ca21f6cb arm.v4a: cancel_sigsegv
modified:   misc/testsuite/upx_testsuite_1-expected_sha256sums.sh
	modified:   src/stub/src/arm.v4a-linux.elf-entry.S
	modified:   src/stub/src/arm.v4a-linux.elf-fold.S
           plus generated .h .dump .map
2025-08-21 06:19:21 -07:00
Markus F.X.J. Oberhumer 404fb48668 CI updates 2025-08-21 00:21:15 +02:00
John Reiser e85e8bec5d New option --catch-sigsegv on amd64, arm64, arm.v4a
Catch SIGSEGV during de-compression, and print state info
("auto debug") using /proc/self/maps and gdb.
This was motivated by suspicion of unreliable hardware
which triggered "Heisenbugs": a crash which cannot be reproduced.
If SIGSGV occurs without the "auto debug" info, then that
implies an error user code after de-compression, often when
user code accesses /proc/self/exe, which is not the un-compressed file.
	modified:   misc/testsuite/upx_testsuite_1-expected_sha256sums.sh
	modified:   src/help.cpp
	modified:   src/main.cpp
	modified:   src/options.h
	modified:   src/p_lx_elf.cpp
	modified:   src/stub/Makefile
	modified:   src/stub/src/amd64-linux.elf-entry.S
	modified:   src/stub/src/amd64-linux.elf-fold.S
	modified:   src/stub/src/arm.v4a-linux.elf-entry.S
	modified:   src/stub/src/arm.v4a-linux.elf-fold.S
	modified:   src/stub/src/arm64-linux.elf-entry.S
	modified:   src/stub/src/arm64-linux.elf-fold.S
           plus generated .h .dump .map
2025-08-19 12:25:33 -07:00
John Reiser 4530e5c264 Fix upxfd_create for stubs on PowerPC64
https://github.com/upx/upx/issues/925
	modified:   misc/testsuite/upx_testsuite_1-expected_sha256sums.sh
	modified:   src/stub/src/powerpc64-linux.elf-fold.S
           plus generated .h
2025-08-16 16:00:11 -07:00
Markus F.X.J. Oberhumer 1188d2933b SIGSEGV: handle and pretty-print on arm64-linux 2025-08-10 09:55:12 +02:00
Markus F.X.J. Oberhumer 4e88556c94 SIGSEGV: handle and pretty-print on amd64-linux 2025-08-10 09:39:29 +02:00
Markus F.X.J. Oberhumer 1f0036a460 CI updates 2025-08-10 09:05:14 +02:00
Markus F.X.J. Oberhumer 5d30472ee2 CI updates 2025-08-04 16:05:44 +02:00
Markus F.X.J. Oberhumer 9866b9bca9 SIGSEGV: handle and pretty-print on amd64-linux 2025-08-01 00:49:27 +02:00
Markus F.X.J. Oberhumer bbf52cee67 CI updates 2025-07-30 23:09:28 +02:00
Markus F.X.J. Oberhumer b9b77965b7 CI updates 2025-07-30 01:40:30 +02:00
Markus F.X.J. Oberhumer 852666010e CI updates 2025-07-29 19:50:17 +02:00
John Reiser bbb886ae4d gcc 14.2.1-3 lax on signed-vs-unsigned compare
modified:   p_lx_elf.cpp
2025-07-25 07:14:33 -07:00
John Reiser b52d3e0772 Detect DT_HASH chain out-of-bounds
https://issues.oss-fuzz.com/u/1/issues/430110068
	modified:   p_lx_elf.cpp
2025-07-24 11:09:58 -07:00
Markus F.X.J. Oberhumer 27f8f4f62e CI updates 2025-07-25 18:20:14 +02:00
Markus F.X.J. Oberhumer 21ec7e7410 CI updates 2025-07-25 10:03:28 +02:00
Markus F.X.J. Oberhumer ae6d5303ba CI updates 2025-07-25 03:07:51 +02:00
Markus F.X.J. Oberhumer fbbc2bc874 CI updates 2025-07-23 14:33:29 +02:00
Markus F.X.J. Oberhumer 62f22d61e6 CI updates 2025-07-23 11:00:41 +02:00
Markus F.X.J. Oberhumer 3f1f76f8a3 CI updates 2025-07-21 15:57:03 +02:00
Markus F.X.J. Oberhumer 518712c613 CI updates 2025-07-21 12:26:30 +02:00
Markus F.X.J. Oberhumer c0c08c9f43 all: post-release version bump 2025-07-20 15:59:04 +02:00
Markus F.X.J. Oberhumer c4113b6bd6 all: prepare for release 2025-07-20 14:41:25 +02:00
Markus F.X.J. Oberhumer 4988868e61 CI updates 2025-07-20 13:58:38 +02:00
Markus F.X.J. Oberhumer 5a513ab16f CI updates 2025-07-20 12:21:56 +02:00
Markus F.X.J. Oberhumer f1a9d1bec9 CI updates 2025-07-20 00:38:43 +02:00
Markus F.X.J. Oberhumer 70a3acfded CI updates 2025-07-18 20:17:11 +02:00
Markus F.X.J. Oberhumer 3ec6a3cce0 CI updates 2025-07-18 12:42:37 +02:00
Markus F.X.J. Oberhumer dd0a8856cc CI updates 2025-07-18 11:44:36 +02:00
Markus F.X.J. Oberhumer c51a1130b8 CI updates 2025-07-17 20:47:19 +02:00
Markus F.X.J. Oberhumer 9851fba246 CI updates 2025-07-17 15:46:12 +02:00
Markus F.X.J. Oberhumer 8054543671 CI updates 2025-07-15 10:55:39 +02:00
Markus F.X.J. Oberhumer 17d0e897ba CI updates 2025-07-15 09:56:46 +02:00
Markus F.X.J. Oberhumer a7940fd19b CI updates 2025-07-07 18:01:00 +02:00
John Reiser 1fbd34035e shell trap on ERR to help locate failing commands
modified:   misc/testsuite/mimic_ctest.sh
2025-07-06 19:21:26 -07:00
John Reiser 945d9157fa PowerPC64 editing error affecting -fPIE
https://github.com/upx/upx/issues/918
	modified:   ../misc/testsuite/upx_testsuite_1-expected_sha256sums.sh
	modified:   stub/src/powerpc64-linux.elf-fold.S
          plus generated powerpc64*-linux.elf-fold.h
2025-07-05 18:10:46 -07:00
Markus F.X.J. Oberhumer 915bfbd82e CI updates 2025-07-05 22:23:13 +02:00
Markus F.X.J. Oberhumer ef01a73e8f CI updates 2025-06-26 11:54:26 +02:00
Markus F.X.J. Oberhumer 7e4e6a3cb1 CI updates 2025-06-26 11:30:46 +02:00
Markus F.X.J. Oberhumer ca97430db2 CI updates 2025-06-06 12:25:13 +02:00
Markus F.X.J. Oberhumer 7530643d1d CI updates 2025-06-01 14:55:43 +02:00
Markus F.X.J. Oberhumer 073cdb0d58 CI updates 2025-06-01 14:11:05 +02:00
Markus F.X.J. Oberhumer 9a93b5d1c1 CI updates 2025-05-31 15:44:22 +02:00
Markus F.X.J. Oberhumer 44ce469b84 CI updates 2025-05-31 13:54:04 +02:00
Markus F.X.J. Oberhumer 4d8d330f21 CI updates 2025-05-30 18:31:56 +02:00
Markus F.X.J. Oberhumer 793e1622ea CI updates 2025-05-29 12:04:43 +02:00
Markus F.X.J. Oberhumer 92a33fa0cc CI updates 2025-05-25 10:12:35 +02:00
John Reiser e8c49a2c35 Prevent SIGSEGV on de-compress of modified PE file
https://github.com/upx/upx/issues/863
	modified:   pefile.cpp
2025-05-13 10:51:59 -07:00
Markus F.X.J. Oberhumer d2e9db7112 CI updates 2025-05-10 13:55:49 +02:00
John Reiser b728b0e021 buildLinuxLoader needs more space
for shlib + lzma + Android
https://github.com/upx/upx/issues/913
	modified:   p_lx_elf.cpp
2025-05-07 13:52:58 -07:00
John Reiser a1ef410509 ELF DT_DYNSYM: fix checking of symbol table
Particularly JNI_OnLoad
https://github.com/upx/upx/issues/914
	modified:   p_lx_elf.cpp
2025-05-07 17:02:56 -07:00
Markus F.X.J. Oberhumer 24b4ec42e7 CI updates 2025-05-07 19:11:57 +02:00
Markus F.X.J. Oberhumer 52dde5789e all: post-release version bump 2025-05-06 14:01:35 +02:00
Markus F.X.J. Oberhumer 730c6ce6c5 all: prepare for release 2025-05-06 12:19:16 +02:00
Markus F.X.J. Oberhumer 5ed1d5b2b3 src/stub: fix ET_DYN with non-zero PT_LOAD[0].p_vaddr 2025-05-01 20:42:39 +02:00
Markus F.X.J. Oberhumer 23c70ec447 src/stub: fix ET_DYN with non-zero PT_LOAD[0].p_vaddr 2025-05-01 20:37:36 +02:00
Markus F.X.J. Oberhumer e29e73a4e4 src/help.cpp: mention --fileinfo 2025-05-01 20:33:34 +02:00
Markus F.X.J. Oberhumer 27289a7589 src/stub: flush datacache before msync 2025-04-29 17:53:33 +02:00
Markus F.X.J. Oberhumer e509bb87e9 src/stub: flush datacache before msync 2025-04-29 17:44:47 +02:00
Markus F.X.J. Oberhumer 5cec09966e submodules: update for new versions 2025-04-22 15:44:29 +02:00
Markus F.X.J. Oberhumer b5789fb321 src: minor cleanups 2025-04-21 14:04:27 +02:00
Markus F.X.J. Oberhumer a1b0fd987f CI updates 2025-04-20 15:46:19 +02:00
Markus F.X.J. Oberhumer a468b92e3a PowerPC Psync flush datacache before msync 2025-04-20 15:06:58 +02:00
John Reiser ddf0b50c6d PowerPC Psync flush datacache before msync
https://github.com/upx/upx/issues/907
	modified:   stub/src/powerpc-linux.elf-fold.S
	modified:   stub/src/powerpc64-linux.elf-fold.S
2025-04-20 14:55:06 +02:00
Markus F.X.J. Oberhumer 3af2b21869 CI updates 2025-04-11 09:41:08 +02:00
Markus F.X.J. Oberhumer c4bfebeceb CI updates 2025-04-10 20:04:34 +02:00
Markus F.X.J. Oberhumer d23484b9db CI updates 2025-04-09 11:32:13 +02:00
John Reiser 071579b5b6 Cleanup after broken tools
zig/powerpc64le/musl newly undefined openat64; adjacent literal strings
in C source were not concatenated; comment introduced by double slash
did not ignore backslash in rest of line
	modified:   ../misc/testsuite/upx_testsuite_1-expected_sha256sums.sh
	modified:   stub/src/mipsel.r3000-linux.elf-fold.S
	modified:   stub/src/powerpc-linux.elf-entry.S
	modified:   stub/src/powerpc-linux.elf-fold.S
	modified:   stub/src/powerpc64-linux.elf-entry.S
	modified:   stub/src/powerpc64-linux.elf-fold.S
	modified:   stub/src/upxfd_linux.c
2025-03-21 13:25:02 -07:00
John Reiser ff9d577e46 O_DIRECTORY is architecture-dependent
https://github.com/upx/upx/issues/902
	modified:   ../misc/testsuite/upx_testsuite_1-expected_sha256sums.sh
	modified:   stub/src/arm64-linux.elf-entry.S
	modified:   stub/src/arm64-linux.elf-fold.S
	modified:   stub/src/powerpc64-linux.elf-fold.S
	modified:   stub/src/upxfd_android.c
	modified:   stub/src/upxfd_linux.c
           plus generated .h .map .dump
2025-03-21 10:54:27 -07:00
John Reiser a25c20ee0b M_LZMA with hi parameter bytes confused --ultra-brute
https://github.com/upx/upx/issues/900
	modified:   packhead.cpp
	modified:   p_lx_elf.cpp
2025-03-20 09:48:00 -07:00
John Reiser ff75a462a4 Fighting over .e_shentsize
modified:   ../misc/testsuite/upx_testsuite_1-expected_sha256sums.sh
	modified:   p_lx_elf.cpp
2025-03-18 13:48:19 -07:00
John Reiser e0b6ff1924 More checking in unpack()
https://github.com/upx/upx/issues/898
	modified:   p_lx_elf.cpp
2025-03-18 08:40:08 -07:00
John Reiser 1c5fae74e0 Fix recovery of readlink() when /proc/self/exe is missing
https://github.com/upx/upx/issues/897
	modified:   ../misc/testsuite/upx_testsuite_1-expected_sha256sums.sh
	modified:   stub/src/arm.v4a-linux.elf-fold.S
           plus generated .h
2025-03-16 12:37:57 -07:00
John Reiser 6f650ca16f mips memfd_create() and syscall error handling
https://github.com/upx/upx/issues/895
	modified:   ../misc/testsuite/upx_testsuite_1-expected_sha256sums.sh
	modified:   stub/src/mipsel.r3000-linux.elf-entry.S
	modified:   stub/src/mipsel.r3000-linux.elf-fold.S
           plus generated .h .dump .map
2025-03-13 08:07:26 -07:00
Markus F.X.J. Oberhumer c2da21ba4e CI updates 2025-03-05 12:13:21 +01:00
John Reiser 903ca50391 Workaround valgrind-3.24.0 botch of 'notrack' on i386
https://github.com/upx/upx/issues/890
	modified:   stub/src/i386-linux.elf-fold.S
	modified:   ../misc/testsuite/upx_testsuite_1-expected_sha256sums.sh
           plus generated .h .map
2025-03-02 14:30:50 -08:00
John Reiser 70f1ab8cb7 Nice message for ancient Linux lacking memfd_create
... or O_TMPFILE for recovery using /dev/shm
https://github.com/upx/upx/issues/889
	modified:   stub/src/upxfd_linux.c
	modified:   ../misc/testsuite/upx_testsuite_1-expected_sha256sums.sh
           plus generated  .h  .map  .dump
2025-03-02 11:46:17 -08:00
John Reiser 6998449715 Remove inline syscalls from MIPS stubs
They were a maintenance headache, especially for error handling.
	modified:   stub/src/i386-linux.elf-entry.S
	modified:   stub/src/i386-linux.elf-main2.c
	modified:   stub/src/include/linux.h
	modified:   stub/src/mips.r3000-expand.S
	modified:   stub/src/mipsel.r3000-linux.elf-entry.S
	modified:   stub/src/mipsel.r3000-linux.elf-fold.S
	modified:   stub/src/upxfd_android.c
2025-03-02 11:32:49 -08:00
John Reiser fb0f6c6a00 Escape hatch needs 'notrack' to enter
modified:   stub/src/amd64-linux.elf-fold.S
	modified:   stub/src/i386-linux.elf-fold.S
2025-03-02 11:22:05 -08:00
John Reiser dbde75028c Avoid corrupted P_hdr
https://issues.oss-fuzz.com/u/1/issues/398127991
	modified:   p_lx_elf.cpp
2025-03-02 11:12:08 -08:00
John Reiser 90d86ea59e Prevent leak even if corrupted input
https://issues.oss-fuzz.com/u/1/issues/42531955
	modified:   pefile.cpp
2025-02-27 17:10:52 -08:00
John Reiser 64891286ba Unpack: better checking of bounds for DT_HASH
https://issues.oss-fuzz.com/u/1/issues/398075916
	modified:   p_lx_elf.cpp
2025-02-22 07:55:14 -08:00
John Reiser e52a3ceb48 Unpack: Entire ElfXX_Ehdr must be present in de-compressed Ehdr+Phdrs
https://issues.oss-fuzz.com/u/1/issues/397728078
(previous commit: https://issues.oss-fuzz.com/u/1/issues/397500915)
	modified:   p_lx_elf.cpp
2025-02-22 07:55:14 -08:00
John Reiser 8cce9cf641 Detect bad b_info.method
https://issues.oss-fuzz.com/u/1/issues?q=upx
	modified:   p_lx_elf.cpp
	modified:   p_unix.cpp
	modified:   packhead.cpp
	modified:   packhead.h
2025-02-22 07:55:14 -08:00
Markus F.X.J. Oberhumer 896dff9619 src/check: some toolchains are buggy 2025-02-22 06:43:28 +01:00
Markus F.X.J. Oberhumer 84a0347df1 testsuite: update checksums caused by version bump 2025-02-21 00:12:41 +01:00
Markus F.X.J. Oberhumer fc5e44f391 all: post-release version bump 2025-02-20 23:56:24 +01:00
151 changed files with 34919 additions and 32104 deletions
+1
View File
@@ -20,6 +20,7 @@ Checks: >
-bugprone-suspicious-memory-comparison, -bugprone-suspicious-memory-comparison,
-bugprone-suspicious-string-compare, -bugprone-suspicious-string-compare,
-bugprone-switch-missing-default-case, -bugprone-switch-missing-default-case,
-bugprone-unintended-char-ostream-output,
clang-analyzer-*, clang-analyzer-*,
-clang-analyzer-optin.performance.Padding, -clang-analyzer-optin.performance.Padding,
-clang-analyzer-security.insecureAPI.DeprecatedOrUnsafeBufferHandling, -clang-analyzer-security.insecureAPI.DeprecatedOrUnsafeBufferHandling,
+247 -95
View File
@@ -8,19 +8,22 @@ name: CI
on: [push, workflow_dispatch] on: [push, workflow_dispatch]
defaults: { run: { shell: bash } }
env: env:
CMAKE_REQUIRED_QUIET: 'OFF' CMAKE_REQUIRED_QUIET: 'OFF'
CMAKE_VERBOSE_MAKEFILE: 'ON' CMAKE_VERBOSE_MAKEFILE: 'ON'
CTEST_OUTPUT_ON_FAILURE: 'ON' CTEST_OUTPUT_ON_FAILURE: 'ON'
DEBIAN_FRONTEND: noninteractive DEBIAN_FRONTEND: noninteractive
NO_COLOR: 1
UPX_CMAKE_BUILD_FLAGS: --verbose UPX_CMAKE_BUILD_FLAGS: --verbose
UPX_CMAKE_CONFIG_FLAGS: -Wdev --warn-uninitialized UPX_CMAKE_CONFIG_FLAGS: -Wdev --warn-uninitialized
UPX_CONFIG_HAVE_WORKING_BUILD_RPATH: 'ON' UPX_CONFIG_HAVE_WORKING_BUILD_RPATH: 'ON'
UPX_DEBUG_TEST_FLOAT_DIVISION_BY_ZERO: 1 UPX_DEBUG_TEST_FLOAT_DIVISION_BY_ZERO: 1
UPX_DEBUG_TEST_LIBC_QSORT: 1 UPX_DEBUG_TEST_LIBC_QSORT: 1
ZSTD_CLEVEL: 9 ZSTD_CLEVEL: 17
# 2025-02-18 # 2025-10-11
ZIG_DIST_VERSION: 0.14.0-dev.3258+d2e70ef84 ZIG_DIST_VERSION: 0.15.2
jobs: jobs:
job-rebuild-and-verify-stubs: job-rebuild-and-verify-stubs:
@@ -30,19 +33,20 @@ jobs:
#container: debian:12-slim # also works; provides glibc-2.36 #container: debian:12-slim # also works; provides glibc-2.36
#container: debian:testing-slim # also works; currently provides glibc-2.38 #container: debian:testing-slim # also works; currently provides glibc-2.38
steps: steps:
- run: uname -a; pwd; id; umask
- name: Install packages - name: Install packages
run: | run: |
uname -a; pwd; id; umask
dpkg --add-architecture i386 dpkg --add-architecture i386
apt-get update && apt-get upgrade -y apt-get update && apt-get upgrade -y
# install system packages # install system packages
apt-get install -y --no-install-recommends bash ca-certificates curl git libmpc3 make perl-base tar time xz-utils libc6:i386 zlib1g:i386 apt-get install -y --no-install-recommends bash ca-certificates curl git libmpc3 make perl-base python3-minimal tar time xz-utils libc6:i386 zlib1g:i386
# install python2-minimal packages from Debian-11 apt-get install -y gcc-riscv64-linux-gnu
mkdir ../deps; cd ../deps; mkdir packages mkdir ../deps; cd ../deps; mkdir packages
curl -sS -L -O https://ftp.debian.org/debian/pool/main/p/python2.7/libpython2.7-minimal_2.7.18-8+deb11u1_amd64.deb ### install python2-minimal packages from Debian-11
curl -sS -L -O https://ftp.debian.org/debian/pool/main/p/python2.7/python2.7-minimal_2.7.18-8+deb11u1_amd64.deb ## curl -sS -L -O https://ftp.debian.org/debian/pool/main/p/python2.7/libpython2.7-minimal_2.7.18-8+deb11u1_amd64.deb
dpkg -i ./*python2*.deb && rm ./*python2*.deb && ldconfig ## curl -sS -L -O https://ftp.debian.org/debian/pool/main/p/python2.7/python2.7-minimal_2.7.18-8+deb11u1_amd64.deb
ln -s -v python2.7 /usr/bin/python2 ## dpkg -i ./*python2*.deb && rm ./*python2*.deb && ldconfig
## ln -s -v python2.7 /usr/bin/python2
# manually unpack and install compat libs from Ubuntu-16.04 # manually unpack and install compat libs from Ubuntu-16.04
curl -sS -L -O https://archive.kernel.org/ubuntu-archive/ubuntu/pool/main/m/mpfr4/libmpfr4_3.1.6-1_amd64.deb curl -sS -L -O https://archive.kernel.org/ubuntu-archive/ubuntu/pool/main/m/mpfr4/libmpfr4_3.1.6-1_amd64.deb
for f in ./*.deb; do dpkg -x $f ./packages; done for f in ./*.deb; do dpkg -x $f ./packages; done
@@ -50,6 +54,7 @@ jobs:
rm -rf ./*.deb ./packages && ldconfig rm -rf ./*.deb ./packages && ldconfig
# install upx-stubtools # install upx-stubtools
curl -sS -L https://github.com/upx/upx-stubtools/releases/download/v20221212/bin-upx-20221212.tar.xz | tar -xJ curl -sS -L https://github.com/upx/upx-stubtools/releases/download/v20221212/bin-upx-20221212.tar.xz | tar -xJ
- run: dpkg -l
- name: Check out code - name: Check out code
run: | run: |
git config --global --add safe.directory '*' # needed when running in a container git config --global --add safe.directory '*' # needed when running in a container
@@ -60,7 +65,7 @@ jobs:
run: | run: |
export PATH="$(readlink -en ../deps/bin-upx-20221212):$PATH" export PATH="$(readlink -en ../deps/bin-upx-20221212):$PATH"
make -C src/stub maintainer-clean extra-clean make -C src/stub maintainer-clean extra-clean
git status || true git status || true # make sure the stub files got deleted
make -C src/stub extra-all all make -C src/stub extra-all all
if ! git diff --quiet; then git diff; exit 1; fi if ! git diff --quiet; then git diff; exit 1; fi
- run: bash ./misc/scripts/check_whitespace_git.sh - run: bash ./misc/scripts/check_whitespace_git.sh
@@ -73,6 +78,78 @@ jobs:
run: | run: |
make -C doc clean all make -C doc clean all
if ! git diff --quiet; then git diff || true; fi # ignore diff error if ! git diff --quiet; then git diff || true; fi # ignore diff error
- name: Clean up
run: |
git ls-files -z --others --ignored --exclude-standard ./src/stub | xargs -0r rm -v --
find ./src/stub/src -type d -name tmp -print0 | xargs -0r rmdir -v --
- run: git status --ignored || true
job-linux-cmake-0: # uses cmake + make
if: true
needs: [ job-rebuild-and-verify-stubs ]
strategy:
fail-fast: false
matrix:
include:
- { os: ubuntu-22.04 }
- { os: ubuntu-24.04 }
- { os: ubuntu-22.04-arm }
- { os: ubuntu-24.04-arm }
name: ${{ format('{0}', matrix.os) }}-0
runs-on: ${{ matrix.os }}
steps:
- run: uname -a; pwd; id; umask
- run: sudo apt-get update
- run: sudo apt-get install -y dmidecode gdb parallel valgrind
- run: (sudo dmidecode | sed -n -e '/System Information/,/^$/p') || true
- run: sudo dmidecode -q || true
- run: sudo dmidecode || true
- uses: actions/checkout@v6
with: { submodules: true }
- run: make build/extra/gcc/all
- run: make build/extra/clang/all
- run: ls -l build/*/*/*/upx* || true
- run: file build/*/*/*/upx* || true
- name: Make artifact
run: |
N=$(echo "upx-${GITHUB_REF_NAME}-${GITHUB_SHA:0:7}-${{ matrix.os }}-0" | sed 's/[^0-9a-zA-Z_.-]/-/g')
mkdir -p "tmp/artifact/$N"
(cd build && shopt -s nullglob && cp -ai --parents */upx{,.exe} */*/*/upx{,.exe} "../tmp/artifact/$N")
if command -v hardlink >/dev/null; then (cd "tmp/artifact/$N" && hardlink .) fi
(cd tmp/artifact && tar --sort=name --zstd -cf "$N.tar.zst" "$N" && rm -rf "./$N" && ls -la && zstd -tq "$N.tar.zst")
echo "artifact_name=$N" >> $GITHUB_ENV
- name: ${{ format('Upload artifact {0}', env.artifact_name) }}
uses: actions/upload-artifact@v5
with: { name: '${{ env.artifact_name }}', path: tmp/artifact }
- name: Run install tests
run: |
jobs="gcc/debug gcc/release clang/debug clang/release"
echo "===== parallel jobs: $jobs"
DESTDIR="Install with make 2" parallel -kv --lb 'make build/extra/{}+install' ::: $jobs
- name: Mimic ctest tests SIGSEGV
run: |
jobs="gcc/debug gcc/release clang/debug clang/release"
echo "===== parallel jobs: $jobs"
parallel -kv --lb 'cd build/extra/{} && bash ../../../../misc/testsuite/mimic_ctest_sigsegv.sh' ::: $jobs
ls -ld ./build/*/*/*/upx-* || true
rm -rf ./build/*/*/*/upx-*
- name: Run ctest tests
run: |
jobs="gcc/debug gcc/release clang/debug clang/release"
echo "===== parallel jobs: $jobs"
CTEST_JOBS=2 parallel -kv --lb 'make build/extra/{}+test' ::: $jobs
ls -ld ./build/*/*/*/XTesting/*/* || true
rm -rf ./build/*/*/*/XTesting/*/*
- name: Mimic ctest tests with Valgrind
run: |
export UPX_CONFIG_DISABLE_EXHAUSTIVE_TESTS=ON # valgrind is SLOW
export upx_exe_runner="valgrind --leak-check=no --error-exitcode=1 --quiet --gen-suppressions=all"
# clang/debug does not work before valgrind-3.20, see https://bugs.kde.org/show_bug.cgi?id=452758
jobs="gcc/debug gcc/release clang/release"
echo "===== parallel jobs: $jobs"
parallel -kv --lb 'cd build/extra/{} && bash ../../../../misc/testsuite/mimic_ctest.sh' ::: $jobs
ls -ld ./build/*/*/*/upx-* || true
rm -rf ./build/*/*/*/upx-*
job-linux-cmake: # uses cmake + make job-linux-cmake: # uses cmake + make
if: true if: true
@@ -81,17 +158,18 @@ jobs:
fail-fast: false fail-fast: false
matrix: matrix:
include: include:
- { os: ubuntu-20.04, use_extra: true } - { os: ubuntu-22.04, use_extra: true }
- { os: ubuntu-22.04, use_extra: true, use_wine: true }
- { os: ubuntu-24.04, use_extra: true, use_wine: true } - { os: ubuntu-24.04, use_extra: true, use_wine: true }
name: ${{ format('{0}', matrix.os) }} name: ${{ format('{0}', matrix.os) }}
runs-on: ${{ matrix.os }} runs-on: ${{ matrix.os }}
steps: steps:
- run: uname -a; pwd; id; umask
- name: Install extra 32-bit and MinGW packages - name: Install extra 32-bit and MinGW packages
if: ${{ matrix.use_extra }} if: ${{ matrix.use_extra }}
run: | run: |
sudo dpkg --add-architecture i386 sudo dpkg --add-architecture i386
sudo apt-get update && sudo apt-get upgrade -y sudo apt-get update && sudo apt-get upgrade -y
sudo apt-get install -y dmidecode gdb libc6-dbg:i386 parallel valgrind
sudo apt-get install -y g++-multilib g++-mingw-w64-i686 g++-mingw-w64-x86-64 sudo apt-get install -y g++-multilib g++-mingw-w64-i686 g++-mingw-w64-x86-64
# make sure that we use posix-threads (pthread/winpthreads) and NOT win32-threads # make sure that we use posix-threads (pthread/winpthreads) and NOT win32-threads
for f in i686-w64-mingw32-g++ i686-w64-mingw32-gcc x86_64-w64-mingw32-g++ x86_64-w64-mingw32-gcc; do for f in i686-w64-mingw32-g++ i686-w64-mingw32-gcc x86_64-w64-mingw32-g++ x86_64-w64-mingw32-gcc; do
@@ -99,14 +177,19 @@ jobs:
ls -l /usr/bin/${f}* ls -l /usr/bin/${f}*
done done
ls -l /etc/alternatives/*mingw* || true ls -l /etc/alternatives/*mingw* || true
sudo apt-get install -y libc6-dbg:i386 valgrind - run: (sudo dmidecode | sed -n -e '/System Information/,/^$/p') || true
if: ${{ matrix.use_extra }}
- run: sudo dmidecode -q || true
if: ${{ matrix.use_extra }}
- run: sudo dmidecode || true
if: ${{ matrix.use_extra }}
- name: Install Wine - name: Install Wine
if: ${{ matrix.use_extra && matrix.use_wine }} if: ${{ matrix.use_extra && matrix.use_wine }}
run: | run: |
sudo apt-get install -y wine wine32:i386 wine64 sudo apt-get install -y wine wine32:i386 wine64
ls -l /usr/bin/wine* ls -l /usr/bin/wine*
mkdir -p -v ~/.wine && wineboot --init mkdir -p -v ~/.wine && wineboot --init
- uses: actions/checkout@v4 - uses: actions/checkout@v6
with: { submodules: true } with: { submodules: true }
- name: Check out test suite - name: Check out test suite
run: git clone --depth=1 https://github.com/upx/upx-testsuite ../deps/upx-testsuite run: git clone --depth=1 https://github.com/upx/upx-testsuite ../deps/upx-testsuite
@@ -126,6 +209,8 @@ jobs:
if: ${{ matrix.use_extra }} if: ${{ matrix.use_extra }}
- run: make build/extra/cross-windows-mingw64/all - run: make build/extra/cross-windows-mingw64/all
if: ${{ matrix.use_extra }} if: ${{ matrix.use_extra }}
- run: ls -l build/*/*/*/upx* || true
- run: file build/*/*/*/upx* || true
- name: Make artifact - name: Make artifact
run: | run: |
N=$(echo "upx-${GITHUB_REF_NAME}-${GITHUB_SHA:0:7}-${{ matrix.os }}" | sed 's/[^0-9a-zA-Z_.-]/-/g') N=$(echo "upx-${GITHUB_REF_NAME}-${GITHUB_SHA:0:7}-${{ matrix.os }}" | sed 's/[^0-9a-zA-Z_.-]/-/g')
@@ -145,12 +230,24 @@ jobs:
(cd tmp/artifact && tar --sort=name --zstd -cf "$N.tar.zst" "$N" && rm -rf "./$N" && ls -la && zstd -tq "$N.tar.zst") (cd tmp/artifact && tar --sort=name --zstd -cf "$N.tar.zst" "$N" && rm -rf "./$N" && ls -la && zstd -tq "$N.tar.zst")
echo "artifact_name=$N" >> $GITHUB_ENV echo "artifact_name=$N" >> $GITHUB_ENV
- name: ${{ format('Upload artifact {0}', env.artifact_name) }} - name: ${{ format('Upload artifact {0}', env.artifact_name) }}
uses: actions/upload-artifact@v4 uses: actions/upload-artifact@v5
with: { name: '${{ env.artifact_name }}', path: tmp/artifact } with: { name: '${{ env.artifact_name }}', path: tmp/artifact }
- name: Run install tests - name: Run install tests
run: | run: |
(cd build/extra/gcc/release && DESTDIR="$PWD/Install with cmake" cmake --install .) (cd build/extra/gcc/release && DESTDIR="$PWD/Install with cmake" cmake --install .)
(cd build/extra/gcc/release && DESTDIR="$PWD/Install with make" make install) (cd build/extra/gcc/release && DESTDIR="$PWD/Install with make" make install)
jobs="gcc/debug gcc/release clang/debug clang/release"
test "${{ matrix.use_extra }}" = "true" && jobs="$jobs gcc-m32/debug gcc-m32/release"
echo "===== parallel jobs: $jobs"
DESTDIR="Install with make 2" parallel -kv --lb 'make build/extra/{}+install' ::: $jobs
- name: Mimic ctest tests SIGSEGV
run: |
jobs="gcc/debug gcc/release clang/debug clang/release"
test "${{ matrix.use_extra }}" = "true" && jobs="$jobs gcc-m32/debug gcc-m32/release"
echo "===== parallel jobs: $jobs"
parallel -kv --lb 'cd build/extra/{} && bash ../../../../misc/testsuite/mimic_ctest_sigsegv.sh' ::: $jobs
ls -ld ./build/*/*/*/upx-* || true
rm -rf ./build/*/*/*/upx-*
- name: Run ctest tests - name: Run ctest tests
run: | run: |
jobs="gcc/debug gcc/release clang/debug clang/release" jobs="gcc/debug gcc/release clang/debug clang/release"
@@ -159,12 +256,8 @@ jobs:
command -v wine >/dev/null && jobs="$jobs cross-windows-mingw64/debug cross-windows-mingw64/release" command -v wine >/dev/null && jobs="$jobs cross-windows-mingw64/debug cross-windows-mingw64/release"
echo "===== parallel jobs: $jobs" echo "===== parallel jobs: $jobs"
CTEST_JOBS=2 parallel -kv --lb 'make build/extra/{}+test' ::: $jobs CTEST_JOBS=2 parallel -kv --lb 'make build/extra/{}+test' ::: $jobs
- name: Mimic ctest tests ls -ld ./build/*/*/*/XTesting/*/* || true
run: | rm -rf ./build/*/*/*/XTesting/*/*
jobs="gcc/debug gcc/release clang/debug clang/release"
test "${{ matrix.use_extra }}" = "true" && jobs="$jobs gcc-m32/debug gcc-m32/release"
echo "===== parallel jobs: $jobs"
parallel -kv --lb 'cd build/extra/{} && bash ../../../../misc/testsuite/mimic_ctest.sh' ::: $jobs
- name: Mimic ctest tests with Valgrind - name: Mimic ctest tests with Valgrind
if: true # note: valgrind is SLOW if: true # note: valgrind is SLOW
run: | run: |
@@ -176,6 +269,8 @@ jobs:
test "${{ matrix.use_extra }}" = "true" && jobs="$jobs gcc-m32/debug gcc-m32/release" test "${{ matrix.use_extra }}" = "true" && jobs="$jobs gcc-m32/debug gcc-m32/release"
echo "===== parallel jobs: $jobs" echo "===== parallel jobs: $jobs"
parallel -kv --lb 'cd build/extra/{} && bash ../../../../misc/testsuite/mimic_ctest.sh' ::: $jobs parallel -kv --lb 'cd build/extra/{} && bash ../../../../misc/testsuite/mimic_ctest.sh' ::: $jobs
ls -ld ./build/*/*/*/upx-* || true
rm -rf ./build/*/*/*/upx-*
fi fi
- name: Run file system tests - name: Run file system tests
run: | run: |
@@ -201,6 +296,8 @@ jobs:
test "${{ matrix.use_extra }}" = "true" && jobs="$jobs gcc-m32/debug gcc-m32/release" test "${{ matrix.use_extra }}" = "true" && jobs="$jobs gcc-m32/debug gcc-m32/release"
echo "===== parallel jobs: $jobs" echo "===== parallel jobs: $jobs"
parallel -kv --lb 'cd build/extra/{} && bash ../../../../misc/testsuite/upx_testsuite_1.sh' ::: $jobs parallel -kv --lb 'cd build/extra/{} && bash ../../../../misc/testsuite/upx_testsuite_1.sh' ::: $jobs
ls -ld ./build/*/*/*/tmp-upx-testsuite* || true
rm -rf ./build/*/*/*/tmp-upx-testsuite*
job-macos-cmake: # uses cmake + make job-macos-cmake: # uses cmake + make
if: true if: true
@@ -211,12 +308,14 @@ jobs:
include: include:
# NOTE: Xcode updates regularly tend to break Homebrew clang/gcc; often some ld64 issue; use "xcode_version" as needed; or try "-Wl,-ld_classic" # NOTE: Xcode updates regularly tend to break Homebrew clang/gcc; often some ld64 issue; use "xcode_version" as needed; or try "-Wl,-ld_classic"
# NOTE: macos does not have "env -C"; only with brew coreutils # NOTE: macos does not have "env -C"; only with brew coreutils
- { os: macos-13, gcc: gcc-12, gxx: g++-12, testsuite: true }
- { os: macos-14, gcc: gcc-13, gxx: g++-13, testsuite: true } - { os: macos-14, gcc: gcc-13, gxx: g++-13, testsuite: true }
- { os: macos-15, gcc: gcc-14, gxx: g++-14, testsuite: true } - { os: macos-15, gcc: gcc-14, gxx: g++-14, testsuite: true }
- { os: macos-26, gcc: gcc-15, gxx: g++-15, testsuite: true }
- { os: macos-15-intel, gcc: gcc-14, gxx: g++-14, testsuite: true }
name: ${{ format('{0} {1}{2}', matrix.os, matrix.xcode_version && 'xcode-' || '', matrix.xcode_version) }} name: ${{ format('{0} {1}{2}', matrix.os, matrix.xcode_version && 'xcode-' || '', matrix.xcode_version) }}
runs-on: ${{ matrix.os }} runs-on: ${{ matrix.os }}
steps: steps:
- run: uname -a; pwd; id; umask
- uses: maxim-lobanov/setup-xcode@v1 - uses: maxim-lobanov/setup-xcode@v1
if: ${{ matrix.xcode_version }} if: ${{ matrix.xcode_version }}
with: { xcode-version: '${{ matrix.xcode_version }}' } with: { xcode-version: '${{ matrix.xcode_version }}' }
@@ -226,7 +325,7 @@ jobs:
test -z "$HOMEBREW_PREFIX" && HOMEBREW_PREFIX="$(brew --prefix)" test -z "$HOMEBREW_PREFIX" && HOMEBREW_PREFIX="$(brew --prefix)"
echo "HOMEBREW_PREFIX=$HOMEBREW_PREFIX" >> $GITHUB_ENV echo "HOMEBREW_PREFIX=$HOMEBREW_PREFIX" >> $GITHUB_ENV
# testsuite needs working "readlink -en" and "sha256sum -b" # testsuite needs working "readlink -en" and "sha256sum -b"
packages="ninja parallel util-linux" packages="parallel util-linux"
test -e "$HOMEBREW_PREFIX/opt/coreutils/libexec/gnubin/readlink" || packages="$packages coreutils" test -e "$HOMEBREW_PREFIX/opt/coreutils/libexec/gnubin/readlink" || packages="$packages coreutils"
if test -n "$packages"; then if test -n "$packages"; then
echo "===== brew leaves:"; brew leaves; echo "===== brew list:"; brew list --versions echo "===== brew leaves:"; brew leaves; echo "===== brew list:"; brew list --versions
@@ -237,9 +336,9 @@ jobs:
echo "UPX_DEBUG_FORCE_PACK_MACOS=1" >> $GITHUB_ENV echo "UPX_DEBUG_FORCE_PACK_MACOS=1" >> $GITHUB_ENV
case "${{ matrix.os }}" in case "${{ matrix.os }}" in
# TODO FIXME: UPX on macos-13+ is broken => disable run-packed for now # TODO FIXME: UPX on macos-13+ is broken => disable run-packed for now
macos-13 | macos-14 | macos-15) echo "UPX_CONFIG_DISABLE_RUN_PACKED_TEST=ON" >> $GITHUB_ENV ;; macos-[12][3456]*) echo "UPX_CONFIG_DISABLE_RUN_PACKED_TEST=ON" >> $GITHUB_ENV ;;
esac esac
- uses: actions/checkout@v4 - uses: actions/checkout@v6
with: { submodules: true } with: { submodules: true }
- name: Check out test suite - name: Check out test suite
if: ${{ matrix.testsuite }} if: ${{ matrix.testsuite }}
@@ -262,6 +361,8 @@ jobs:
run: | run: |
make UPX_XTARGET=xtarget/cross-darwin-arm64 xtarget/all \ make UPX_XTARGET=xtarget/cross-darwin-arm64 xtarget/all \
CC="clang -target arm64-apple-darwin" CXX="clang++ -target arm64-apple-darwin" CC="clang -target arm64-apple-darwin" CXX="clang++ -target arm64-apple-darwin"
- run: ls -l build/*/*/*/upx* || true
- run: file build/*/*/*/upx* || true
- name: Make artifact - name: Make artifact
run: | run: |
X="${{ matrix.xcode_version }}"; test -n "$X" && X="-xcode-$X" X="${{ matrix.xcode_version }}"; test -n "$X" && X="-xcode-$X"
@@ -279,13 +380,14 @@ jobs:
(cd tmp/artifact && gtar --sort=name --zstd -cf "$N.tar.zst" "$N" && rm -rf "./$N" && ls -la && zstd -tq "$N.tar.zst") (cd tmp/artifact && gtar --sort=name --zstd -cf "$N.tar.zst" "$N" && rm -rf "./$N" && ls -la && zstd -tq "$N.tar.zst")
echo "artifact_name=$N" >> $GITHUB_ENV echo "artifact_name=$N" >> $GITHUB_ENV
- name: ${{ format('Upload artifact {0}', env.artifact_name) }} - name: ${{ format('Upload artifact {0}', env.artifact_name) }}
uses: actions/upload-artifact@v4 uses: actions/upload-artifact@v5
with: { name: '${{ env.artifact_name }}', path: tmp/artifact } with: { name: '${{ env.artifact_name }}', path: tmp/artifact }
- name: Run install tests - name: Run install tests
run: | run: |
(cd build/extra/clang/release && DESTDIR="$PWD/Install with cmake" cmake --install .) (cd build/extra/clang/release && DESTDIR="$PWD/Install with cmake" cmake --install .)
(cd build/extra/clang/release && DESTDIR="$PWD/Install with make" make install) (cd build/extra/clang/release && DESTDIR="$PWD/Install with make" make install)
- name: Run ctest tests - name: Run ctest tests
if: ${{ matrix.testsuite }}
run: | run: |
for f in ./build/extra/*/*/upx; do file $f; done for f in ./build/extra/*/*/upx; do file $f; done
jobs="clang/debug clang/release" jobs="clang/debug clang/release"
@@ -293,6 +395,7 @@ jobs:
echo "===== parallel jobs: $jobs" echo "===== parallel jobs: $jobs"
CTEST_JOBS=2 parallel -kv --lb 'make build/extra/{}+test' ::: $jobs CTEST_JOBS=2 parallel -kv --lb 'make build/extra/{}+test' ::: $jobs
- name: Mimic ctest tests - name: Mimic ctest tests
if: ${{ matrix.testsuite }}
run: | run: |
export PATH="$HOMEBREW_PREFIX/opt/coreutils/libexec/gnubin:$PATH" export PATH="$HOMEBREW_PREFIX/opt/coreutils/libexec/gnubin:$PATH"
jobs="clang/debug clang/release" jobs="clang/debug clang/release"
@@ -300,7 +403,7 @@ jobs:
echo "===== parallel jobs: $jobs" echo "===== parallel jobs: $jobs"
parallel -kv --lb 'cd build/extra/{} && bash ../../../../misc/testsuite/mimic_ctest.sh' ::: $jobs parallel -kv --lb 'cd build/extra/{} && bash ../../../../misc/testsuite/mimic_ctest.sh' ::: $jobs
- name: Run file system tests - name: Run file system tests
if: ${{ matrix.testsuite }} # for coreutils readlink if: ${{ matrix.testsuite }}
run: | run: |
export PATH="$HOMEBREW_PREFIX/opt/coreutils/libexec/gnubin:$PATH" export PATH="$HOMEBREW_PREFIX/opt/coreutils/libexec/gnubin:$PATH"
export upx_test_file="$PWD"/build/extra/clang/release/upx export upx_test_file="$PWD"/build/extra/clang/release/upx
@@ -325,24 +428,48 @@ jobs:
fail-fast: false fail-fast: false
matrix: matrix:
include: include:
- { name: windows-2019-amd64, os: windows-2019, vsversion: 2019, vsarch: amd64 } - { name: windows-11-arm64, os: windows-11-arm, vsversion: 2022, vsarch: arm64 }
- { name: windows-2022-amd64, os: windows-2022, vsversion: 2022, vsarch: amd64 } - { name: windows-11-arm64ec, os: windows-11-arm, vsversion: 2022, vsarch: arm64, use_arm64ec: true }
# { name: windows-11-arm64x, os: windows-11-arm, vsversion: 2022, vsarch: arm64, use_arm64x: true }
- { name: windows-2022-amd64, os: windows-2022, vsversion: 2022, vsarch: amd64 }
- { name: windows-2022-i386, os: windows-2022, vsversion: 2022, vsarch: amd64_x86 }
- { name: windows-2025-amd64, os: windows-2025, vsversion: 2022, vsarch: amd64 }
- { name: windows-2025-i386, os: windows-2025, vsversion: 2022, vsarch: amd64_x86 }
name: ${{ format('{0}', matrix.name) }} name: ${{ format('{0}', matrix.name) }}
runs-on: ${{ matrix.os }} runs-on: ${{ matrix.os }}
steps: steps:
- run: git config --global core.autocrlf false - run: git config --global core.autocrlf false
- uses: actions/checkout@v4 - uses: actions/checkout@v6
with: { submodules: true } with: { submodules: true }
- name: Check out test suite - name: Check out test suite
run: git clone --depth=1 https://github.com/upx/upx-testsuite ../deps/upx-testsuite run: git clone --depth=1 https://github.com/upx/upx-testsuite ../deps/upx-testsuite
- uses: ilammy/msvc-dev-cmd@v1 - uses: ilammy/msvc-dev-cmd@v1
with: { vsversion: '${{ matrix.vsversion }}', arch: '${{ matrix.vsarch }}' } with: { vsversion: '${{ matrix.vsversion }}', arch: '${{ matrix.vsarch }}' }
- name: Set platform
run: |
if [[ "${{ matrix.use_arm64ec }}" == "true" ]]; then true;
echo "UPX_CMAKE_CONFIG_FLAGS_PLATFORM=-A ARM64EC" >> $GITHUB_ENV
echo "UPX_CONFIG_DISABLE_SELF_PACK_TEST=ON" >> $GITHUB_ENV
elif [[ "${{ matrix.use_arm64x }}" == "true" ]]; then true;
echo "UPX_CMAKE_CONFIG_FLAGS_PLATFORM=-A ARM64X" >> $GITHUB_ENV
echo "UPX_CONFIG_DISABLE_SELF_PACK_TEST=ON" >> $GITHUB_ENV
elif [[ "${{ matrix.vsarch }}" == *amd64 ]]; then true;
echo "UPX_CMAKE_CONFIG_FLAGS_PLATFORM=-A x64" >> $GITHUB_ENV
elif [[ "${{ matrix.vsarch }}" == *arm64 ]]; then true;
echo "UPX_CMAKE_CONFIG_FLAGS_PLATFORM=-A ARM64" >> $GITHUB_ENV
echo "UPX_CONFIG_DISABLE_SELF_PACK_TEST=ON" >> $GITHUB_ENV
elif [[ "${{ matrix.vsarch }}" == *x86 ]]; then true;
echo "UPX_CMAKE_CONFIG_FLAGS_PLATFORM=-A Win32" >> $GITHUB_ENV
else
exit 1
fi
- run: make build/debug - run: make build/debug
- run: make build/release - run: make build/release
- run: shopt -s globstar; ls -ld build/**/upx* || true
- run: shopt -s globstar; file build/**/upx* || true
- name: Make artifact - name: Make artifact
shell: bash
run: | run: |
N=$(echo "upx-${GITHUB_REF_NAME}-${GITHUB_SHA:0:7}-${{ matrix.os }}" | sed 's/[^0-9a-zA-Z_.-]/-/g') N=$(echo "upx-${GITHUB_REF_NAME}-${GITHUB_SHA:0:7}-${{ matrix.name }}" | sed 's/[^0-9a-zA-Z_.-]/-/g')
mkdir -p "tmp/artifact/$N" mkdir -p "tmp/artifact/$N"
DESTDIR="$PWD/tmp/artifact/$N/InstallWithCMake/InstallWithDestdir/debug" cmake --install build/debug --config Debug DESTDIR="$PWD/tmp/artifact/$N/InstallWithCMake/InstallWithDestdir/debug" cmake --install build/debug --config Debug
DESTDIR="$PWD/tmp/artifact/$N/InstallWithCMake/InstallWithDestdir/release" cmake --install build/release --config Release DESTDIR="$PWD/tmp/artifact/$N/InstallWithCMake/InstallWithDestdir/release" cmake --install build/release --config Release
@@ -353,49 +480,47 @@ jobs:
cmake --install build/debug --config Debug --prefix "$PWD/tmp/artifact/$N/InstallWithCMake/InstallWithPrefixAndStrip/debug" --strip cmake --install build/debug --config Debug --prefix "$PWD/tmp/artifact/$N/InstallWithCMake/InstallWithPrefixAndStrip/debug" --strip
cmake --install build/release --config Release --prefix "$PWD/tmp/artifact/$N/InstallWithCMake/InstallWithPrefixAndStrip/release" --strip cmake --install build/release --config Release --prefix "$PWD/tmp/artifact/$N/InstallWithCMake/InstallWithPrefixAndStrip/release" --strip
(cd build && cp -ai --parents */*/upx.exe "../tmp/artifact/$N") (cd build && cp -ai --parents */*/upx.exe "../tmp/artifact/$N")
(cd tmp/artifact && tar --sort=name --zstd -cf "$N.tar.zst" "$N" && rm -rf "./$N" && ls -la && zstd -tq "$N.tar.zst") #(cd tmp/artifact && tar --sort=name --zstd -cf "$N.tar.zst" "$N" && rm -rf "./$N" && ls -la && zstd -tq "$N.tar.zst")
(cd tmp/artifact && tar --sort=name --gzip -cf "$N.tar.gz" "$N" && rm -rf "./$N" && ls -la && gzip -tq "$N.tar.gz")
echo "artifact_name=$N" >> $GITHUB_ENV echo "artifact_name=$N" >> $GITHUB_ENV
- name: ${{ format('Upload artifact {0}', env.artifact_name) }} - name: ${{ format('Upload artifact {0}', env.artifact_name) }}
uses: actions/upload-artifact@v4 uses: actions/upload-artifact@v5
with: { name: '${{ env.artifact_name }}', path: tmp/artifact } with: { name: '${{ env.artifact_name }}', path: tmp/artifact }
- name: Run ctest tests - name: Run ctest tests
if: ${{ matrix.vsarch != 'amd64_arm64' }}
run: | run: |
ctest --test-dir build/debug --parallel 8 -C Debug ctest --test-dir build/debug --parallel 8 -C Debug
ctest --test-dir build/release --parallel 8 -C Release ctest --test-dir build/release --parallel 8 -C Release
- name: Mimic ctest tests
run: |
env -C build/debug/Debug upx_exe=./upx.exe bash "$PWD"/misc/testsuite/mimic_ctest.sh
env -C build/release/Release upx_exe=./upx.exe bash "$PWD"/misc/testsuite/mimic_ctest.sh
- name: Run test suite build/release - name: Run test suite build/release
if: ${{ matrix.vsarch != 'amd64_arm64' }}
shell: bash
run: | run: |
export upx_testsuite_SRCDIR="$(readlink -en ../deps/upx-testsuite)" export upx_testsuite_SRCDIR="$(readlink -en ../deps/upx-testsuite)"
env -C build/release/Release bash "$PWD"/misc/testsuite/upx_testsuite_1.sh env -C build/release/Release upx_exe=./upx.exe bash "$PWD"/misc/testsuite/upx_testsuite_1.sh
job-windows-toolchains: # build "by hand" using cmd.exe job-windows-bh-toolchains: # build "by hand" using cmd.exe
if: github.repository_owner == 'upx' if: github.repository_owner == 'upx'
needs: [ job-rebuild-and-verify-stubs ] needs: [ job-rebuild-and-verify-stubs ]
strategy: strategy:
fail-fast: false fail-fast: false
matrix: matrix:
include: include:
- { name: amd64-win64-vs2019, os: windows-2019, vsversion: 2019, vsarch: amd64 } - { name: amd64-win64-vs2025, os: windows-2025, vsversion: 2022, vsarch: amd64 }
- { name: amd64-win64-vs2022, os: windows-2022, vsversion: 2022, vsarch: amd64 } - { name: arm64-win64-vs2025, os: windows-2025, vsversion: 2022, vsarch: amd64_arm64 }
- { name: arm64-win64-vs2019, os: windows-2019, vsversion: 2019, vsarch: amd64_arm64 } - { name: arm64ec-win64-vs2025, os: windows-2025, vsversion: 2022, vsarch: amd64_arm64, cl_machine_flags: -arm64EC, link_machine_flags: '/machine:arm64ec' }
- { name: arm64-win64-vs2022, os: windows-2022, vsversion: 2022, vsarch: amd64_arm64 } # { name: arm64x-win64-vs2025, os: windows-2025, vsversion: 2022, vsarch: amd64_arm64, cl_machine_flags: -arm64EC, link_machine_flags: '/machine:arm64x' }
- { name: arm64ec-win64-vs2022, os: windows-2022, vsversion: 2022, vsarch: amd64_arm64, cl_machine_flags: -arm64EC, link_machine_flags: '/machine:arm64ec' } - { name: i386-win32-vs2025, os: windows-2025, vsversion: 2022, vsarch: amd64_x86 }
# { name: arm64x-win64-vs2022, os: windows-2022, vsversion: 2022, vsarch: amd64_arm64, cl_machine_flags: -arm64EC, link_machine_flags: '/machine:arm64x' } name: ${{ format('windows-bh {0}', matrix.name) }}
- { name: i386-win32-vs2019, os: windows-2019, vsversion: 2019, vsarch: amd64_x86 }
- { name: i386-win32-vs2022, os: windows-2022, vsversion: 2022, vsarch: amd64_x86 }
name: ${{ format('windows {0}', matrix.name) }}
runs-on: ${{ matrix.os }} runs-on: ${{ matrix.os }}
env: env:
C: ${{ matrix.name }} C: ${{ matrix.name }}
B: release B: release
steps: steps:
- run: git config --global core.autocrlf false - run: git config --global core.autocrlf false
- uses: actions/checkout@v4 - uses: actions/checkout@v6
with: { submodules: true } with: { submodules: true }
- name: Prepare sources and Check out test suite - name: Prepare sources and Check out test suite
shell: bash
run: | run: |
git clone --depth=1 https://github.com/upx/upx-testsuite ../deps/upx-testsuite git clone --depth=1 https://github.com/upx/upx-testsuite ../deps/upx-testsuite
mkdir -p -v build/$C/$B/{bzip2,ucl,upx,zlib,zstd} mkdir -p -v build/$C/$B/{bzip2,ucl,upx,zlib,zstd}
@@ -443,34 +568,25 @@ jobs:
@rem set UPX_LIBS=%BDIR%\bzip2\bzip2.lib %BDIR%\ucl\ucl.lib %BDIR%\zlib\zlib.lib %BDIR%\zstd\zstd.lib @rem set UPX_LIBS=%BDIR%\bzip2\bzip2.lib %BDIR%\ucl\ucl.lib %BDIR%\zlib\zlib.lib %BDIR%\zstd\zstd.lib
set sources=%s%\*.cpp %s%\check\*.cpp %s%\compress\*.cpp %s%\console\*.cpp %s%\filter\*.cpp %s%\util\*.cpp set sources=%s%\*.cpp %s%\check\*.cpp %s%\compress\*.cpp %s%\console\*.cpp %s%\filter\*.cpp %s%\util\*.cpp
%RUN_CL% -J -O2 -W4 -WX -std:c++17 -Zc:__cplusplus -EHsc -DUPX_VERSION_GITREV="""%GITREV%""" %DEFS% %UPX_DEFS% -I%H%\vendor -Feupx.exe %sources% %UPX_LIBS% /link ${{ matrix.link_machine_flags }} setargv.obj %RUN_CL% -J -O2 -W4 -WX -std:c++17 -Zc:__cplusplus -EHsc -DUPX_VERSION_GITREV="""%GITREV%""" %DEFS% %UPX_DEFS% -I%H%\vendor -Feupx.exe %sources% %UPX_LIBS% /link ${{ matrix.link_machine_flags }} setargv.obj
- run: shopt -s globstar; ls -ld build/**/upx* || true
- run: shopt -s globstar; file build/**/upx* || true
- name: Make artifact - name: Make artifact
shell: bash
run: | run: |
N=$(echo "upx-${GITHUB_REF_NAME}-${GITHUB_SHA:0:7}-windows-${{ matrix.name }}" | sed 's/[^0-9a-zA-Z_.-]/-/g') N=$(echo "upx-${GITHUB_REF_NAME}-${GITHUB_SHA:0:7}-windows-bh-${{ matrix.name }}" | sed 's/[^0-9a-zA-Z_.-]/-/g')
mkdir -p "tmp/artifact/$N/$B" mkdir -p "tmp/artifact/$N/$B"
cp -ai build/$C/$B/upx/upx*.exe "tmp/artifact/$N/$B" cp -ai build/$C/$B/upx/upx*.exe "tmp/artifact/$N/$B"
(cd tmp/artifact && tar --sort=name --zstd -cf "$N.tar.zst" "$N" && rm -rf "./$N" && ls -la && zstd -tq "$N.tar.zst") #(cd tmp/artifact && tar --sort=name --zstd -cf "$N.tar.zst" "$N" && rm -rf "./$N" && ls -la && zstd -tq "$N.tar.zst")
(cd tmp/artifact && tar --sort=name --gzip -cf "$N.tar.gz" "$N" && rm -rf "./$N" && ls -la && gzip -tq "$N.tar.gz")
echo "artifact_name=$N" >> $GITHUB_ENV echo "artifact_name=$N" >> $GITHUB_ENV
- name: ${{ format('Upload artifact {0}', env.artifact_name) }} - name: ${{ format('Upload artifact {0}', env.artifact_name) }}
uses: actions/upload-artifact@v4 uses: actions/upload-artifact@v5
with: { name: '${{ env.artifact_name }}', path: tmp/artifact } with: { name: '${{ env.artifact_name }}', path: tmp/artifact }
- name: Run basic tests - name: Mimic ctest tests
if: ${{ matrix.vsarch != 'amd64_arm64' }} if: ${{ matrix.vsarch != 'amd64_arm64' }}
run: | run: |
$ErrorActionPreference = 'stop' env -C build/$C/$B/upx upx_exe=./upx.exe bash "$PWD"/misc/testsuite/mimic_ctest.sh
$ErrorView = 'NormalView'
cd $Env:H\build\$Env:C\$Env:B\upx
$Env:UPX = "--no-color --no-progress"
.\upx.exe --version
.\upx.exe --sysinfo -v
.\upx.exe upx.exe -o upx_packed.exe
dir *.exe
.\upx.exe -l upx_packed.exe
.\upx.exe -t upx_packed.exe
.\upx_packed.exe --version
- name: Run test suite - name: Run test suite
if: ${{ matrix.vsarch != 'amd64_arm64' }} if: ${{ matrix.vsarch != 'amd64_arm64' }}
shell: bash
run: | run: |
export upx_testsuite_SRCDIR="$(readlink -en ../deps/upx-testsuite)" export upx_testsuite_SRCDIR="$(readlink -en ../deps/upx-testsuite)"
env -C build/$C/$B/upx upx_exe=./upx.exe bash "$PWD"/misc/testsuite/upx_testsuite_1.sh env -C build/$C/$B/upx upx_exe=./upx.exe bash "$PWD"/misc/testsuite/upx_testsuite_1.sh
@@ -484,28 +600,42 @@ jobs:
include: include:
# only build a few selected targets => more targets are tested in the Weekly CI # only build a few selected targets => more targets are tested in the Weekly CI
- { zig_target: aarch64-linux-musl, qemu: qemu-aarch64 } - { zig_target: aarch64-linux-musl, qemu: qemu-aarch64 }
- { zig_target: aarch64-macos.11.0-none } - { zig_target: aarch64-linux-musl, qemu: qemu-aarch64, zig_pic: -fPIE, container: 'alpine:3.18' }
- { zig_target: aarch64-macos-none }
- { zig_target: aarch64-windows-gnu } - { zig_target: aarch64-windows-gnu }
- { zig_target: arm-linux-musleabihf, qemu: qemu-arm } - { zig_target: arm-linux-musleabihf, qemu: qemu-arm }
- { zig_target: armeb-linux-musleabihf, qemu: qemu-armeb } - { zig_target: armeb-linux-musleabihf, qemu: qemu-armeb }
- { zig_target: i386-linux-gnu.2.3.4, zig_flags: -march=i586 } - { zig_target: i386-linux-gnu.2.3.4, zig_flags: -march=i586 }
- { zig_target: i386-linux-gnu.2.17, zig_flags: -march=i586 }
- { zig_target: i386-linux-musl, zig_flags: -march=i586, qemu: qemu-i386 } - { zig_target: i386-linux-musl, zig_flags: -march=i586, qemu: qemu-i386 }
- { zig_target: i386-linux-musl, zig_flags: -march=i586, qemu: qemu-i386, zig_pic: -fPIE }
- { zig_target: i386-windows-gnu } - { zig_target: i386-windows-gnu }
- { zig_target: mips-linux-musleabi, zig_flags: -msoft-float, qemu: qemu-mips } - { zig_target: mips-linux-musleabi, qemu: qemu-mips }
- { zig_target: mips-linux-musleabihf, qemu: qemu-mips } - { zig_target: mips-linux-musleabihf, qemu: qemu-mips }
- { zig_target: mipsel-linux-musleabi, zig_flags: -msoft-float, qemu: qemu-mipsel } - { zig_target: mipsel-linux-musleabi, qemu: qemu-mipsel }
- { zig_target: mipsel-linux-musleabihf, qemu: qemu-mipsel } - { zig_target: mipsel-linux-musleabihf, qemu: qemu-mipsel }
# { zig_target: mips-linux-musleabi-mips32r2, zig_flags: -march=mips32r2, qemu: qemu-mips }
# { zig_target: mips-linux-musleabi-mips32r3, zig_flags: -march=mips32r3, qemu: qemu-mips }
# { zig_target: mips-linux-musleabi-mips32r5, zig_flags: -march=mips32r5, qemu: qemu-mips }
# { zig_target: mips-linux-musleabi-mips32r6, zig_flags: -march=mips32r6, qemu: qemu-mips }
- { zig_target: powerpc-linux-musleabihf, qemu: qemu-ppc } - { zig_target: powerpc-linux-musleabihf, qemu: qemu-ppc }
- { zig_target: powerpc64-linux-musl, qemu: qemu-ppc64 } - { zig_target: powerpc64-linux-musl, qemu: qemu-ppc64 }
- { zig_target: powerpc64-linux-musl, qemu: qemu-ppc64, zig_pic: -fPIE }
- { zig_target: powerpc64le-linux-musl, qemu: qemu-ppc64le } - { zig_target: powerpc64le-linux-musl, qemu: qemu-ppc64le }
- { zig_target: powerpc64le-linux-musl, qemu: qemu-ppc64le, zig_pic: -fPIE }
- { zig_target: riscv64-linux-musl, qemu: qemu-riscv64, tt: UPX-UNSUPPORTED }
- { zig_target: riscv64-linux-musl, qemu: qemu-riscv64, tt: UPX-UNSUPPORTED, zig_pic: -fPIE }
- { zig_target: x86_64-linux-gnu.2.3.4, qemu: qemu-x86_64 } # can use QEMU because of gcompat - { zig_target: x86_64-linux-gnu.2.3.4, qemu: qemu-x86_64 } # can use QEMU because of gcompat
- { zig_target: x86_64-linux-gnu.2.17, qemu: qemu-x86_64 } # can use QEMU because of gcompat
- { zig_target: x86_64-linux-musl, qemu: qemu-x86_64 } - { zig_target: x86_64-linux-musl, qemu: qemu-x86_64 }
- { zig_target: x86_64-macos.11.0-none } - { zig_target: x86_64-linux-musl, qemu: qemu-x86_64, zig_pic: -fPIE, container: 'alpine:3.18' }
- { zig_target: x86_64-macos-none }
- { zig_target: x86_64-windows-gnu } - { zig_target: x86_64-windows-gnu }
name: ${{ format('zigcc {0} {1}', matrix.zig_target, matrix.zig_pic) }} name: ${{ format('zigcc {0} {1}', matrix.zig_target, matrix.zig_pic) }}
runs-on: ubuntu-latest runs-on: ubuntu-latest
container: 'alpine:3.21' container: ${{ matrix.container || 'alpine:3.23' }}
env: env:
container: ${{ matrix.container || 'alpine:3.23' }}
UPX_CONFIG_HAVE_WORKING_BUILD_RPATH: '' UPX_CONFIG_HAVE_WORKING_BUILD_RPATH: ''
# for zig-cc wrapper scripts (see below): # for zig-cc wrapper scripts (see below):
ZIG_CPPFLAGS: -DUPX_DOCTEST_CONFIG_MULTITHREADING ZIG_CPPFLAGS: -DUPX_DOCTEST_CONFIG_MULTITHREADING
@@ -513,41 +643,51 @@ jobs:
ZIG_PIC: ${{ matrix.zig_pic }} ZIG_PIC: ${{ matrix.zig_pic }}
ZIG_TARGET: ${{ matrix.zig_target }} ZIG_TARGET: ${{ matrix.zig_target }}
steps: steps:
- name: Install Alpine Linux container packages - run: uname -a; pwd; id; umask
if: ${{ job.container }} shell: sh
- name: ${{ format('Install packages {0}', env.container) }}
shell: sh shell: sh
run: | run: |
apk update && apk upgrade && apk add bash cmake curl file git make parallel tar util-linux xz zstd apk update && apk upgrade && apk add bash cmake curl dmidecode file gdb git make parallel patch strace sudo tar util-linux xz zstd
# set PATH like in Ubuntu # set PATH like in Ubuntu
echo "PATH=$HOME/.local/bin:$PATH" >> $GITHUB_ENV echo "PATH=$HOME/.local/bin:$PATH" >> $GITHUB_ENV
git config --global --add safe.directory '*' # needed when running in a container git config --global --add safe.directory '*' # needed when running in a container
mkdir -p ~/.parallel && : > ~/.parallel/$(echo 6305-4721 | tr 0-7 leticlwi) mkdir -p ~/.parallel && : > ~/.parallel/$(echo 6305-4721 | tr 0-7 leticlwi)
- uses: actions/checkout@v4 - run: (sudo dmidecode | sed -n -e '/System Information/,/^$/p') || true
- uses: actions/checkout@v6
with: { submodules: true } with: { submodules: true }
- name: ${{ format('Install Zig {0}', env.ZIG_DIST_VERSION) }} - name: ${{ format('Install Zig {0}', env.ZIG_DIST_VERSION) }}
shell: bash
run: | run: |
rev=$(git rev-parse --short=7 HEAD) rev=$(git rev-parse --short=7 HEAD)
echo "UPX_GITREV_SHORT=$rev" >> $GITHUB_ENV echo "UPX_GITREV_SHORT=$rev" >> $GITHUB_ENV
if [[ "${{ matrix.zig_target }}" == i386-linux-gnu.2.3.4 ]]; then if [[ "${{ matrix.zig_target }}" == i386-linux-gnu.2.3.* ]]; then true;
echo "UPX_CONFIG_DISABLE_SHARED_LIBS=ON" >> $GITHUB_ENV # zig problem when linking in Debug mode echo "UPX_CONFIG_DISABLE_SHARED_LIBS=ON" >> $GITHUB_ENV # zig problem when linking in Debug mode
fi fi
if [[ "${{ matrix.zig_target }}" == x86_64-linux-gnu.2.3.4 ]]; then if [[ "${{ matrix.zig_target }}" == x86_64-linux-gnu.2* ]]; then true;
echo "NEED_GCOMPAT=1" >> $GITHUB_ENV echo "NEED_GCOMPAT=1" >> $GITHUB_ENV
# TODO FIXME: problem with self-packed upx and musl+gcompat: "Not a valid dynamic program" # TODO FIXME: problem with self-packed upx and musl+gcompat: "Not a valid dynamic program"
echo "UPX_CONFIG_DISABLE_RUN_PACKED_TEST=ON" >> $GITHUB_ENV echo "UPX_CONFIG_DISABLE_RUN_PACKED_TEST=ON" >> $GITHUB_ENV
fi fi
test -z "${{ matrix.tt }}" || echo "UPX_CONFIG_DISABLE_SELF_PACK_TEST=ON" >> $GITHUB_ENV
# install zig; note that ~/.local/bin is included in the default $PATH on Ubuntu # install zig; note that ~/.local/bin is included in the default $PATH on Ubuntu
mkdir -p -v ~/.local/bin mkdir -p -v ~/.local/bin
cd ~/.local/bin cd ~/.local/bin
ZIG_DIST_VERSION=${ZIG_DIST_VERSION/#zig-/}
ZIG_DIST_NAME=zig-linux-x86_64-${ZIG_DIST_VERSION} ZIG_DIST_NAME=zig-linux-x86_64-${ZIG_DIST_VERSION}
curl -sS -L -O https://ziglang.org/builds/${ZIG_DIST_NAME}.tar.xz ZIG_DIST_NAME=zig-x86_64-linux-${ZIG_DIST_VERSION}
#curl -sS -L -O https://ziglang.org/builds/${ZIG_DIST_NAME}.tar.xz
#curl -sS -L -O https://ziglang.org/download/0.14.1/${ZIG_DIST_NAME}.tar.xz
curl -sS -L -O https://ziglang.org/download/0.15.2/${ZIG_DIST_NAME}.tar.xz
ls -l ${ZIG_DIST_NAME}.tar.xz ls -l ${ZIG_DIST_NAME}.tar.xz
file ${ZIG_DIST_NAME}.tar.xz || true
tar -xoJf ${ZIG_DIST_NAME}.tar.xz tar -xoJf ${ZIG_DIST_NAME}.tar.xz
rm ${ZIG_DIST_NAME}.tar.xz rm ${ZIG_DIST_NAME}.tar.xz
ln -s -v ${ZIG_DIST_NAME}/zig zig ln -s -v ${ZIG_DIST_NAME}/zig zig
#echo "PATH=$PATH" && which zig #echo "PATH=$PATH" && which zig
echo -n 'zig version: '; zig version echo -n 'zig version: '; zig version
# patch zig
ls -la "$HOME" "$GITHUB_WORKSPACE" || true
(cd ${ZIG_DIST_NAME} && patch --verbose -p1 -i "$GITHUB_WORKSPACE"/misc/patches/zig/0001-x.patch)
# create wrapper scripts (needed for CMake) # create wrapper scripts (needed for CMake)
log= log=
log='set -x\n' log='set -x\n'
@@ -558,34 +698,45 @@ jobs:
chmod +x zig-ar zig-cc zig-cxx zig-ranlib chmod +x zig-ar zig-cc zig-cxx zig-ranlib
ls -la; head zig-ar zig-cc zig-cxx zig-ranlib ls -la; head zig-ar zig-cc zig-cxx zig-ranlib
# update ZIG_TARGET # update ZIG_TARGET
ZIG_TARGET=${ZIG_TARGET/i386-/x86-} # i386 => x86 [[ $ZIG_TARGET == mips-linux-musleabi-* ]] && ZIG_TARGET=mips-linux-musleabi
[[ $ZIG_TARGET == mips-linux-musleabihf-* ]] && ZIG_TARGET=mips-linux-musleabihf
[[ $ZIG_TARGET == mipsel-linux-musleabi-* ]] && ZIG_TARGET=mipsel-linux-musleabi
[[ $ZIG_TARGET == mipsel-linux-musleabihf-* ]] && ZIG_TARGET=mipsel-linux-musleabihf
ZIG_TARGET=${ZIG_TARGET/#i386-/x86-} # i386 => x86
echo "ZIG_TARGET=$ZIG_TARGET" >> $GITHUB_ENV echo "ZIG_TARGET=$ZIG_TARGET" >> $GITHUB_ENV
# update ZIG_FLAGS
# -fPIE is for compilation only => also use the correct linker flag "-pie" # -fPIE is for compilation only => also use the correct linker flag "-pie"
# INFO: it seems the zig driver does handle this automatically(??), so not really needed # INFO: it seems the zig driver does handle this automatically(??), so not really needed
if test "X$ZIG_PIC" = "X-fPIE"; then true; if test "X$ZIG_PIC" = "X-fPIE"; then true;
ZIG_FLAGS="$ZIG_FLAGS --start-no-unused-arguments -pie --end-no-unused-arguments" ZIG_FLAGS="$ZIG_FLAGS --start-no-unused-arguments -pie --end-no-unused-arguments"
echo "UPX_CONFIG_DISABLE_SHARED_LIBS=ON" >> $GITHUB_ENV # conflicts with ZIG_PIC/ZIG_FLAGS echo "UPX_CONFIG_DISABLE_SHARED_LIBS=ON" >> $GITHUB_ENV # conflicts with ZIG_PIC/ZIG_FLAGS
fi fi
# zig bug TODO later: need -Wno-unused-command-line-argument if [[ $ZIG_TARGET == *-linux-gnu.2.3.* ]]; then true;
case "$ZIG_TARGET" in # glibc-2.3.3: undefined symbols in Debug build: __snprintf_chk __vsnprintf_chk
powerpc*) ZIG_FLAGS="$ZIG_FLAGS -Wno-unused-command-line-argument" ;; # glibc-2.3.4: ld.lld: error: undefined symbol: openat64
esac ZIG_FLAGS="$ZIG_FLAGS -fno-sanitize=all"
echo "UPX_CONFIG_DISABLE_SANITIZE=ON" >> $GITHUB_ENV
fi
if [[ $ZIG_TARGET == *-linux-gnu.2.[456789] ]]; then true;
# glibc-2.x: ld.lld: error: undefined symbol: pwritev64
ZIG_FLAGS="$ZIG_FLAGS -fno-sanitize=all"
echo "UPX_CONFIG_DISABLE_SANITIZE=ON" >> $GITHUB_ENV
fi
echo "ZIG_FLAGS=$ZIG_FLAGS" >> $GITHUB_ENV echo "ZIG_FLAGS=$ZIG_FLAGS" >> $GITHUB_ENV
# run: set -x; zig version; zig-cc --version; zig-cxx --version - run: set -x; zig version; zig-cc --version || true; zig-cxx --version || true
- run: zig-cc -E -x c -dM /dev/null # list predefined macros for C - run: zig-cc -E -x c -dM /dev/null # list predefined macros for C
- run: zig-cxx -E -x c++ -dM /dev/null # list predefined macros for C++ - run: zig-cxx -E -x c++ -dM /dev/null # list predefined macros for C++
- name: ${{ format('Build Release with zig-cc -target {0} {1}', env.ZIG_TARGET, env.ZIG_PIC) }} - name: ${{ format('Build Release with zig-cc -target {0} {1}', env.ZIG_TARGET, env.ZIG_PIC) }}
run: | run: |
make UPX_XTARGET=zig/${ZIG_TARGET}${ZIG_PIC} xtarget/release \ make UPX_XTARGET=zig/${ZIG_TARGET}${ZIG_PIC} xtarget/release \
CC="zig-cc" CXX="zig-cxx" CMAKE_AR="$HOME/.local/bin/zig-ar" CMAKE_RANLIB="$HOME/.local/bin/zig-ranlib" CC="zig-cc" CXX="zig-cxx" CMAKE_AR="$HOME/.local/bin/zig-ar" CMAKE_RANLIB="$HOME/.local/bin/zig-ranlib"
file build/zig/${ZIG_TARGET}${ZIG_PIC}/release/upx*
- name: ${{ format('Build Debug with zig-cc -target {0} {1}', env.ZIG_TARGET, env.ZIG_PIC) }} - name: ${{ format('Build Debug with zig-cc -target {0} {1}', env.ZIG_TARGET, env.ZIG_PIC) }}
run: | run: |
make UPX_XTARGET=zig/${ZIG_TARGET}${ZIG_PIC} xtarget/debug \ make UPX_XTARGET=zig/${ZIG_TARGET}${ZIG_PIC} xtarget/debug \
CC="zig-cc" CXX="zig-cxx" CMAKE_AR="$HOME/.local/bin/zig-ar" CMAKE_RANLIB="$HOME/.local/bin/zig-ranlib" CC="zig-cc" CXX="zig-cxx" CMAKE_AR="$HOME/.local/bin/zig-ar" CMAKE_RANLIB="$HOME/.local/bin/zig-ranlib"
file build/zig/${ZIG_TARGET}${ZIG_PIC}/debug/upx* - run: ls -l build/*/*/*/upx* || true
- run: file build/*/*/*/upx* || true
- name: ${{ format('Make artifact from upx-{0}-{1}', github.ref_name, env.UPX_GITREV_SHORT) }} - name: ${{ format('Make artifact from upx-{0}-{1}', github.ref_name, env.UPX_GITREV_SHORT) }}
shell: bash
run: | run: |
N=$(echo "upx-${GITHUB_REF_NAME}-${GITHUB_SHA:0:7}-zigcc-${{ matrix.zig_target }}${ZIG_PIC}" | sed 's/[^0-9a-zA-Z_.-]/-/g') N=$(echo "upx-${GITHUB_REF_NAME}-${GITHUB_SHA:0:7}-zigcc-${{ matrix.zig_target }}${ZIG_PIC}" | sed 's/[^0-9a-zA-Z_.-]/-/g')
mkdir -p "tmp/artifact/$N" mkdir -p "tmp/artifact/$N"
@@ -601,7 +752,7 @@ jobs:
(cd tmp/artifact && tar --sort=name --zstd -cf "$N.tar.zst" "$N" && rm -rf "./$N" && ls -la && zstd -tq "$N.tar.zst") (cd tmp/artifact && tar --sort=name --zstd -cf "$N.tar.zst" "$N" && rm -rf "./$N" && ls -la && zstd -tq "$N.tar.zst")
echo "artifact_name=$N" >> $GITHUB_ENV echo "artifact_name=$N" >> $GITHUB_ENV
- name: ${{ format('Upload artifact {0}', env.artifact_name) }} - name: ${{ format('Upload artifact {0}', env.artifact_name) }}
uses: actions/upload-artifact@v4 uses: actions/upload-artifact@v5
with: { name: '${{ env.artifact_name }}', path: tmp/artifact } with: { name: '${{ env.artifact_name }}', path: tmp/artifact }
- name: Run install tests - name: Run install tests
if: ${{ contains(matrix.zig_target, '-linux') }} if: ${{ contains(matrix.zig_target, '-linux') }}
@@ -609,14 +760,14 @@ jobs:
(cd build/zig/${ZIG_TARGET}${ZIG_PIC}/release && DESTDIR="$PWD/Install with cmake" cmake --install .) (cd build/zig/${ZIG_TARGET}${ZIG_PIC}/release && DESTDIR="$PWD/Install with cmake" cmake --install .)
(cd build/zig/${ZIG_TARGET}${ZIG_PIC}/release && DESTDIR="$PWD/Install with make" make install) (cd build/zig/${ZIG_TARGET}${ZIG_PIC}/release && DESTDIR="$PWD/Install with make" make install)
- name: Run ctest tests - name: Run ctest tests
if: ${{ matrix.zig_target == 'i386-linux-musl' || matrix.zig_target == 'x86_64-linux-musl' || matrix.zig_target == 'x86_64-linux-gnu.2.3.4' }} if: ${{ matrix.zig_target == 'i386-linux-musl' || matrix.zig_target == 'x86_64-linux-musl' || contains(matrix.zig_target, 'x86_64-linux-gnu.2') }}
run: | run: |
test -n "$NEED_GCOMPAT" && apk add gcompat test -n "$NEED_GCOMPAT" && apk add gcompat
jobs="${ZIG_TARGET}${ZIG_PIC}/debug ${ZIG_TARGET}${ZIG_PIC}/release" jobs="${ZIG_TARGET}${ZIG_PIC}/debug ${ZIG_TARGET}${ZIG_PIC}/release"
echo "===== parallel jobs: $jobs" echo "===== parallel jobs: $jobs"
parallel -kv --lb 'make build/zig/{}+test' ::: $jobs parallel -kv --lb 'make build/zig/{}+test' ::: $jobs
- name: Mimic ctest tests - name: Mimic ctest tests
if: ${{ matrix.zig_target == 'i386-linux-musl' || matrix.zig_target == 'x86_64-linux-musl' || matrix.zig_target == 'x86_64-linux-gnu.2.3.4' }} if: ${{ matrix.zig_target == 'i386-linux-musl' || matrix.zig_target == 'x86_64-linux-musl' || contains(matrix.zig_target, 'x86_64-linux-gnu.2') }}
run: | run: |
test -n "$NEED_GCOMPAT" && apk add gcompat test -n "$NEED_GCOMPAT" && apk add gcompat
jobs="${ZIG_TARGET}${ZIG_PIC}/debug ${ZIG_TARGET}${ZIG_PIC}/release" jobs="${ZIG_TARGET}${ZIG_PIC}/debug ${ZIG_TARGET}${ZIG_PIC}/release"
@@ -633,7 +784,8 @@ jobs:
echo "===== parallel jobs: $jobs" echo "===== parallel jobs: $jobs"
parallel -kv --lb 'cd build/zig/{} && bash ../../../../misc/testsuite/mimic_ctest.sh' ::: $jobs parallel -kv --lb 'cd build/zig/{} && bash ../../../../misc/testsuite/mimic_ctest.sh' ::: $jobs
- name: Mimic ctest tests with Valgrind - name: Mimic ctest tests with Valgrind
if: ${{ matrix.zig_target == 'x86_64-linux-musl' || matrix.zig_target == 'x86_64-linux-gnu.2.3.4' }} #if: ${{ matrix.zig_target == 'x86_64-linux-musl' || contains(matrix.zig_target, 'x86_64-linux-gnu.2') }}
if: false
run: | run: |
export UPX_CONFIG_DISABLE_EXHAUSTIVE_TESTS=ON # valgrind is SLOW export UPX_CONFIG_DISABLE_EXHAUSTIVE_TESTS=ON # valgrind is SLOW
apk add coreutils valgrind apk add coreutils valgrind
@@ -644,7 +796,7 @@ jobs:
echo "===== parallel jobs: $jobs" echo "===== parallel jobs: $jobs"
parallel -kv --lb 'cd build/zig/{} && bash ../../../../misc/testsuite/mimic_ctest.sh' ::: $jobs parallel -kv --lb 'cd build/zig/{} && bash ../../../../misc/testsuite/mimic_ctest.sh' ::: $jobs
- name: Run file system tests - name: Run file system tests
if: ${{ matrix.zig_target == 'i386-linux-musl' || matrix.zig_target == 'x86_64-linux-musl' || matrix.zig_target == 'x86_64-linux-gnu.2.3.4' }} if: ${{ matrix.zig_target == 'i386-linux-musl' || matrix.zig_target == 'x86_64-linux-musl' || contains(matrix.zig_target, 'x86_64-linux-gnu.2') }}
run: | run: |
apk add coreutils sudo apk add coreutils sudo
test -n "$NEED_GCOMPAT" && apk add gcompat test -n "$NEED_GCOMPAT" && apk add gcompat
@@ -25,7 +25,7 @@ jobs:
issues: write issues: write
pull-requests: write pull-requests: write
steps: steps:
- uses: actions/stale@v9 - uses: actions/stale@v10
with: with:
operations-per-run: 300 operations-per-run: 300
exempt-all-milestones: true exempt-all-milestones: true
+2
View File
@@ -1,6 +1,8 @@
/.cache* /.cache*
/.idea/
/.hg* /.hg*
/.vscode* /.vscode*
/.zed/
/CMakeCache* /CMakeCache*
/CMakeFiles* /CMakeFiles*
/CTest* /CTest*
+10 -6
View File
@@ -30,6 +30,8 @@ endif()
# support functions and some utility # support functions and some utility
include("${CMAKE_CURRENT_SOURCE_DIR}/misc/cmake/functions.cmake") include("${CMAKE_CURRENT_SOURCE_DIR}/misc/cmake/functions.cmake")
upx_print_var(CMAKE_VERSION UPX_CONFIG_CMAKE_MINIMUM_REQUIRED_VERSION CMAKE_GENERATOR) upx_print_var(CMAKE_VERSION UPX_CONFIG_CMAKE_MINIMUM_REQUIRED_VERSION CMAKE_GENERATOR)
upx_print_var(CMAKE_GENERATOR_TOOLSET CMAKE_GENERATOR_PLATFORM)
upx_print_env_var(CC CXX CPPFLAGS CFLAGS CXXFLAGS)
#*********************************************************************** #***********************************************************************
# options # options
@@ -55,20 +57,22 @@ endif()
# test config options (see below) # test config options (see below)
# IMPORTANT NOTE: self-pack test can only work if the host executable format is supported by UPX! # IMPORTANT NOTE: self-pack test can only work if the host executable format is supported by UPX!
option(UPX_CONFIG_DISABLE_SELF_PACK_TEST "Do not test packing UPX with itself" OFF) option(UPX_CONFIG_DISABLE_SELF_PACK_TEST "Do not test packing UPX with itself." OFF)
option(UPX_CONFIG_DISABLE_EXHAUSTIVE_TESTS "Do not run exhaustive tests" OFF) option(UPX_CONFIG_DISABLE_EXHAUSTIVE_TESTS "Do not run exhaustive tests." OFF)
#*********************************************************************** #***********************************************************************
# init # init
#*********************************************************************** #***********************************************************************
set(UPX_VERSION_STRING "5.0.0") # this should match src/version.h set(UPX_VERSION_STRING "5.1.0") # this should match src/version.h
upx_cmake_include_hook(2_init) upx_cmake_include_hook(2_init)
# Disallow in-source build. Note that you will still have to manually # Disallow in-source build. Note that you will still have to manually
# clean up a few files if you accidentally try an in-source build. # clean up a few files if you accidentally try an in-source build.
upx_disallow_in_source_build() if(IS_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/.git")
upx_disallow_in_source_build()
endif()
# global settings # global settings
if(${CMAKE_VERSION} VERSION_GREATER "3.14.99" AND NOT DEFINED CMAKE_MSVC_RUNTIME_LIBRARY) if(${CMAKE_VERSION} VERSION_GREATER "3.14.99" AND NOT DEFINED CMAKE_MSVC_RUNTIME_LIBRARY)
@@ -89,7 +93,6 @@ upx_cache_bool_vars(OFF
UPX_CONFIG_DISABLE_SAVE_TEMPS UPX_CONFIG_DISABLE_SHARED_LIBS UPX_CONFIG_REQUIRE_THREADS UPX_CONFIG_DISABLE_SAVE_TEMPS UPX_CONFIG_DISABLE_SHARED_LIBS UPX_CONFIG_REQUIRE_THREADS
) )
upx_cache_bool_vars(ON UPX_CONFIG_EXPECT_THREADS) upx_cache_bool_vars(ON UPX_CONFIG_EXPECT_THREADS)
upx_print_env_var(CC CXX)
# determine Git revision # determine Git revision
set(GITREV_SHORT "") set(GITREV_SHORT "")
@@ -286,7 +289,7 @@ if(Threads_FOUND)
if(NOT result) if(NOT result)
# failed; under MinGW be sure to use the posix-threads and NOT the win32-threads version # failed; under MinGW be sure to use the posix-threads and NOT the win32-threads version
if(UPX_CONFIG_REQUIRE_THREADS OR (UPX_CONFIG_EXPECT_THREADS AND NOT UPX_CONFIG_DISABLE_THREADS)) if(UPX_CONFIG_REQUIRE_THREADS OR (UPX_CONFIG_EXPECT_THREADS AND NOT UPX_CONFIG_DISABLE_THREADS))
message(WARNING "Threads FAILED ${f}: ${output}") # output from try_compile message(WARNING "Threads FAILED ${f}: ${output}") # output from try_compile()
endif() endif()
set(Threads_FOUND OFF) set(Threads_FOUND OFF)
break() break()
@@ -466,6 +469,7 @@ if(NOT CMAKE_CROSSCOMPILING OR CMAKE_CROSSCOMPILING_EMULATOR)
# IMPORTANT NOTE: these tests can only work if the host executable format # IMPORTANT NOTE: these tests can only work if the host executable format
# is supported by UPX! # is supported by UPX!
include("${CMAKE_CURRENT_SOURCE_DIR}/misc/cmake/self_pack_test.cmake") include("${CMAKE_CURRENT_SOURCE_DIR}/misc/cmake/self_pack_test.cmake")
upx_self_pack_test()
endif() endif()
endif() endif()
+28 -9
View File
@@ -26,8 +26,13 @@ endif
.DEFAULT_GOAL = build/release .DEFAULT_GOAL = build/release
run_cmake_config = $(CMAKE) -S . -B $1 $(UPX_CMAKE_CONFIG_FLAGS) -DCMAKE_BUILD_TYPE=$2 .NOTPARALLEL: # because the actual builds use "cmake --parallel"
run_cmake_build = $(CMAKE) --build $1 $(UPX_CMAKE_BUILD_FLAGS) --config $2 .PHONY: PHONY
.SECONDEXPANSION:
.SUFFIXES:
run_cmake_config = $(CMAKE) -S . -B "$1" $(UPX_CMAKE_CONFIG_FLAGS) -DCMAKE_BUILD_TYPE="$2"
run_cmake_build = $(CMAKE) --build "$1" $(UPX_CMAKE_BUILD_FLAGS) --config "$2"
# avoid re-running run_cmake_config if .upx_cmake_config_done.txt already exists # avoid re-running run_cmake_config if .upx_cmake_config_done.txt already exists
run_config = $(if $(wildcard $1/CMakeFiles/.*_cmake_config_done.txt),,$(call run_cmake_config,$1,$2)) run_config = $(if $(wildcard $1/CMakeFiles/.*_cmake_config_done.txt),,$(call run_cmake_config,$1,$2))
run_build = $(call run_cmake_build,$1,$2) run_build = $(call run_cmake_build,$1,$2)
@@ -40,11 +45,6 @@ build/release: PHONY
$(call run_config,$@,Release) $(call run_config,$@,Release)
$(call run_build,$@,Release) $(call run_build,$@,Release)
.NOTPARALLEL: # because the actual builds use "cmake --parallel"
.PHONY: PHONY
.SECONDEXPANSION:
.SUFFIXES:
# shortcuts (all => debug + release) # shortcuts (all => debug + release)
debug: build/debug PHONY debug: build/debug PHONY
release: build/release PHONY release: build/release PHONY
@@ -72,9 +72,26 @@ all+test build/all+test: build/debug+test build/release+test PHONY
test: $$(patsubst %+test,%,$$(.DEFAULT_GOAL))+test PHONY test: $$(patsubst %+test,%,$$(.DEFAULT_GOAL))+test PHONY
# #***********************************************************************
# install
#***********************************************************************
build/debug+install: $$(dir $$@)debug PHONY; cd "$(dir $@)debug" && $(CMAKE) --install . --config Debug
build/%/debug+install: $$(dir $$@)debug PHONY; cd "$(dir $@)debug" && $(CMAKE) --install . --config Debug
build/release+install: $$(dir $$@)release PHONY; cd "$(dir $@)release" && $(CMAKE) --install . --config Release
build/%/release+install: $$(dir $$@)release PHONY; cd "$(dir $@)release" && $(CMAKE) --install . --config Release
build/%/all+install: $$(dir $$@)debug+install $$(dir $$@)release+install PHONY ;
# shortcuts
debug+install: build/debug+install PHONY
release+install: build/release+install PHONY
all+install build/all+install: build/debug+install build/release+install PHONY
install: $$(patsubst %+install,%,$$(.DEFAULT_GOAL))+install PHONY
#***********************************************************************
# END of Makefile # END of Makefile
# #***********************************************************************
# extra pre-defined build configurations and some utility; optional # extra pre-defined build configurations and some utility; optional
-include ./Makevars-local.mk -include ./Makevars-local.mk
@@ -87,3 +104,5 @@ check-whitespace clang-format run-testsuite run-testsuite-all run-testsuite-debu
$(MAKE) -C src $@ $(MAKE) -C src $@
endif endif
endif endif
# vim:set ts=8 sw=8 noet:
+9
View File
@@ -2,6 +2,15 @@
User visible changes for UPX User visible changes for UPX
================================================================== ==================================================================
Changes in 5.1.0 (XX XXX XXXX):
* bug fixes - see https://github.com/upx/upx/milestone/21
Changes in 5.0.2 (20 Jul 2025):
* bug fixes - see https://github.com/upx/upx/milestone/20
Changes in 5.0.1 (06 May 2025):
* bug fixes - see https://github.com/upx/upx/milestone/19
Changes in 5.0.0 (20 Feb 2025): Changes in 5.0.0 (20 Feb 2025):
* ELF: use of memfd_create supports Enforcing mode of SELinux * ELF: use of memfd_create supports Enforcing mode of SELinux
* ELF: two-step de-compression enables future per-PT_LOAD work * ELF: two-step de-compression enables future per-PT_LOAD work
+4 -3
View File
@@ -61,8 +61,9 @@ 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' or 'upx --brute program.exe'. results try 'upx --best program.exe' or 'upx --brute program.exe'.
Please see the file UPX.DOC for the full documentation. The files Please see the file doc/upx-doc.txt for the full documentation. The files
NEWS and BUGS also contain various tidbits of information. NEWS and doc/BUGS.txt also contain various tidbits of information, as
does the output of 'upx --help'.
THE FUTURE THE FUTURE
@@ -91,7 +92,7 @@ Copyright (C) 2000-2025 John F. Reiser
UPX is distributed with full source code under the terms of the UPX is distributed with full source code under the terms of the
GNU General Public License v2+; either under the pure GPLv2+ (see GNU General Public License v2+; either under the pure GPLv2+ (see
the file COPYING), or (at your option) under the GPLv+2 with special the file COPYING), or (at your option) under the GPLv2+ with special
exceptions and restrictions granting the free usage for all binaries exceptions and restrictions granting the free usage for all binaries
including commercial programs (see the file LICENSE). including commercial programs (see the file LICENSE).
+21 -1
View File
@@ -81,6 +81,15 @@ Developer quick start
4b) $ wget https://github.com/upx/upx-stubtools/releases/download/v20221212/bin-upx-20221212.tar.xz 4b) $ wget https://github.com/upx/upx-stubtools/releases/download/v20221212/bin-upx-20221212.tar.xz
# Extract to $HOME/bin/bin-upx or $HOME/local/bin/bin-upx. # Extract to $HOME/bin/bin-upx or $HOME/local/bin/bin-upx.
# See directions in: https://github.com/upx/upx-stubtools # See directions in: https://github.com/upx/upx-stubtools
# Some of the pre-built tools need i386 libz. On Ubuntu:
# # dpkg --add-architecture i386
# # apt-get update
# # apt-get install zlib1g-dev
# aarch64-linux-gnu/4.9.2/cc1 needs libmpfr.so.4. Make a symlink:
# # ln -s /usr/lib/x86_64-linux-gnu/libmpfr.so.6 /usr/lib/x86_64-linux-gnu/libmpfr.so.4
4c) $ make clean; make # verify that you can re-build stubs 4c) $ make clean; make # verify that you can re-build stubs
4d) $ popd # my-upx 4d) $ popd # my-upx
5) $ cd upx # my-upx/upx 5) $ cd upx # my-upx/upx
@@ -92,7 +101,18 @@ Developer quick start
# If stuck, then reset via "rm -rf vendor; git submodule update --init". # If stuck, then reset via "rm -rf vendor; git submodule update --init".
7) $ mkdir -p build/debug build/release 7) $ mkdir -p build/debug build/release
8) $ pushd build/debug # my-upx/upx/build/debug 8) $ pushd build/debug # my-upx/upx/build/debug
9) $ cmake ../.. # configure cmake
9a) Install GNU g++ so that it is used when invoking "c++" compiler.
On Ubuntu 24.04 with
cmake: cmake version 3.28.3
g++: Ubuntu clang version 18.1.3 (1ubuntu1)
/lib/llvm-18/lib/cmake/llvm/HandleLLVMOptions.cmake:
add_flag_if_supported("-fno-lifetime-dse" CMAKE_CXX_FLAGS)
then cmake invoking c++ uses -fno-lifetime-dse but gets
c++: error: unknown argument: '-fno-lifetime-dse'
Commenting out the "add_flag_if_supported' line still uses that unknown argument.
Installing g++ avoids the problem.
9b) $ cmake ../.. # configure cmake
10) $ cmake --build . --verbose # optional "--verbose" 10) $ cmake --build . --verbose # optional "--verbose"
# This relies on stub/*.h, which YOU must re-build if necessary. # This relies on stub/*.h, which YOU must re-build if necessary.
# When in doubt, then use "cd src/stub; make clean; make". # When in doubt, then use "cd src/stub; make clean; make".
Generated
+1 -1
View File
@@ -55,7 +55,7 @@
.\" ======================================================================== .\" ========================================================================
.\" .\"
.IX Title "UPX 1" .IX Title "UPX 1"
.TH UPX 1 2025-02-20 "upx 5.0.0" " " .TH UPX 1 2025-10-24 "upx 5.1.0" " "
.\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" For nroff, turn off justification. Always turn off hyphenation; it makes
.\" way too many mistakes in technical documents. .\" way too many mistakes in technical documents.
.if n .ad l .if n .ad l
+2 -2
View File
@@ -42,7 +42,7 @@ function(upx_print_info)
upx_print_var(CMAKE_${lang}_COMPILER_ID) upx_print_var(CMAKE_${lang}_COMPILER_ID)
upx_print_var(CMAKE_${lang}_SIMULATE_ID) upx_print_var(CMAKE_${lang}_SIMULATE_ID)
upx_print_var(CMAKE_${lang}_COMPILER_VERSION) upx_print_var(CMAKE_${lang}_COMPILER_VERSION)
upx_print_var(CMAKE_${lang}_COMPILER_FRONTEND_VARIANT ) upx_print_var(CMAKE_${lang}_COMPILER_FRONTEND_VARIANT)
upx_print_var(CMAKE_${lang}_COMPILER_ARCHITECTURE_ID) upx_print_var(CMAKE_${lang}_COMPILER_ARCHITECTURE_ID)
upx_print_var(CMAKE_${lang}_PLATFORM_ID) upx_print_var(CMAKE_${lang}_PLATFORM_ID)
upx_print_var(CMAKE_${lang}_COMPILER_ABI) upx_print_var(CMAKE_${lang}_COMPILER_ABI)
@@ -56,7 +56,7 @@ function(upx_print_info)
upx_print_var(UPX_CONFIG_SANITIZE_FLAGS_DEBUG UPX_CONFIG_SANITIZE_FLAGS_RELEASE) upx_print_var(UPX_CONFIG_SANITIZE_FLAGS_DEBUG UPX_CONFIG_SANITIZE_FLAGS_RELEASE)
# shortcuts # shortcuts
upx_print_var(APPLE CLANG CYGWIN GNU_FRONTEND GNUC MINGW MSVC MSVC_FRONTEND MSVC_IDE MSVC_SIMULATE MSVC_TOOLSET_VERSION MSVC_VERSION MSYS UNIX WIN32 WIN64) upx_print_var(AIX APPLE CLANG CYGWIN GNU_FRONTEND GNUC MINGW MSVC MSVC_FRONTEND MSVC_IDE MSVC_SIMULATE MSVC_TOOLSET_VERSION MSVC_VERSION MSYS UNIX WIN32 WIN64)
endfunction() endfunction()
# vim:set ft=cmake ts=4 sw=4 tw=0 et: # vim:set ft=cmake ts=4 sw=4 tw=0 et:
+35 -26
View File
@@ -10,6 +10,8 @@
# is supported by UPX! # is supported by UPX!
#*********************************************************************** #***********************************************************************
function(upx_self_pack_test)
set(emu "") set(emu "")
if(DEFINED CMAKE_CROSSCOMPILING_EMULATOR) if(DEFINED CMAKE_CROSSCOMPILING_EMULATOR)
set(emu "${CMAKE_CROSSCOMPILING_EMULATOR}") set(emu "${CMAKE_CROSSCOMPILING_EMULATOR}")
@@ -114,35 +116,42 @@ endif()
if(NOT UPX_CONFIG_DISABLE_EXHAUSTIVE_TESTS) if(NOT UPX_CONFIG_DISABLE_EXHAUSTIVE_TESTS)
foreach(method IN ITEMS nrv2b nrv2d nrv2e lzma) foreach(method IN ITEMS nrv2b nrv2d nrv2e lzma)
foreach(level IN ITEMS 1 2 3 4 5 6 7) foreach(level IN ITEMS 1 2 3 4 5 6 7)
set(s "${method}-${level}") foreach(small IN ITEMS normal small)
upx_add_test(upx-self-pack-${s} upx --${method} -${level} --all-filters --debug-use-random-filter "${upx_self_exe}" ${fo} -o upx-packed-${s}${exe}) set(s "${method}-${level}")
upx_add_test(upx-list-${s} upx -l upx-packed-${s}${exe}) set(ss "")
upx_add_test(upx-fileinfo-${s} upx --fileinfo upx-packed-${s}${exe}) if(small MATCHES "small")
upx_add_test(upx-test-${s} upx -t upx-packed-${s}${exe}) set(s "${method}-${level}-${small}")
upx_add_test(upx-unpack-${s} upx -d upx-packed-${s}${exe} ${fo} -o upx-unpacked-${s}${exe}) set(ss "--small")
upx_add_test(upx-compare-${s} "${CMAKE_COMMAND}" -E compare_files upx-unpacked${exe} upx-unpacked-${s}${exe}) endif()
upx_test_depends(upx-list-${s} upx-self-pack-${s}) upx_add_test(upx-self-pack-${s} upx --${method} -${level} ${ss} --all-filters --debug-use-random-filter "${upx_self_exe}" ${fo} -o upx-packed-${s}${exe})
upx_test_depends(upx-fileinfo-${s} upx-self-pack-${s}) upx_add_test(upx-list-${s} upx -l upx-packed-${s}${exe})
upx_test_depends(upx-test-${s} upx-self-pack-${s}) upx_add_test(upx-fileinfo-${s} upx --fileinfo upx-packed-${s}${exe})
upx_test_depends(upx-unpack-${s} upx-self-pack-${s}) upx_add_test(upx-test-${s} upx -t upx-packed-${s}${exe})
upx_test_depends(upx-compare-${s} "upx-unpack;upx-unpack-${s}") upx_add_test(upx-unpack-${s} upx -d upx-packed-${s}${exe} ${fo} -o upx-unpacked-${s}${exe})
if(method MATCHES "lzma") upx_add_test(upx-compare-${s} "${CMAKE_COMMAND}" -E compare_files upx-unpacked${exe} upx-unpacked-${s}${exe})
set_tests_properties(upx-self-pack-${s} PROPERTIES COST "3${level}") upx_test_depends(upx-list-${s} upx-self-pack-${s})
else() upx_test_depends(upx-fileinfo-${s} upx-self-pack-${s})
set_tests_properties(upx-self-pack-${s} PROPERTIES COST "2${level}") upx_test_depends(upx-test-${s} upx-self-pack-${s})
endif() upx_test_depends(upx-unpack-${s} upx-self-pack-${s})
if(NOT UPX_CONFIG_DISABLE_RUN_PACKED_TEST) upx_test_depends(upx-compare-${s} "upx-unpack;upx-unpack-${s}")
upx_add_test(upx-run-packed-${s} ${emu} ./upx-packed-${s}${exe} --version-short) if(method MATCHES "lzma")
upx_test_depends(upx-run-packed-${s} upx-self-pack-${s}) set_tests_properties(upx-self-pack-${s} PROPERTIES COST "3${level}")
endif() else()
set_tests_properties(upx-self-pack-${s} PROPERTIES COST "2${level}")
endif()
if(NOT UPX_CONFIG_DISABLE_RUN_PACKED_TEST)
set(i 0)
while(${i} LESS 20)
math(EXPR i "${i} + 1")
upx_add_test(upx-run-packed-${s}-${i} ${emu} ./upx-packed-${s}${exe} --version-short)
upx_test_depends(upx-run-packed-${s}-${i} upx-self-pack-${s})
endwhile()
endif()
endforeach()
endforeach() endforeach()
endforeach() endforeach()
endif() # UPX_CONFIG_DISABLE_EXHAUSTIVE_TESTS endif() # UPX_CONFIG_DISABLE_EXHAUSTIVE_TESTS
# clean up endfunction()
set(emu "")
set(exe "")
set(upx_self_exe "")
set(fo "")
# vim:set ft=cmake ts=4 sw=4 tw=0 et: # vim:set ft=cmake ts=4 sw=4 tw=0 et:
+11
View File
@@ -0,0 +1,11 @@
#
# UPX "CMake" build file; see https://cmake.org/
# Copyright (C) Markus Franz Xaver Johannes Oberhumer
#
if(NOT DEFINED USE_STRICT_DEFAULTS)
# use strict config defaults for Git developer builds
set(USE_STRICT_DEFAULTS TRUE CACHE INTERNAL "" FORCE)
endif()
# vim:set ft=cmake ts=4 sw=4 tw=0 et:
+29 -3
View File
@@ -65,6 +65,13 @@ build/extra/clang-lto-auto/release: PHONY; $(call run_config_and_build,$@,Releas
build/extra/clang-lto-auto/%: export CC = clang -flto=auto build/extra/clang-lto-auto/%: export CC = clang -flto=auto
build/extra/clang-lto-auto/%: export CXX = clang++ -flto=auto build/extra/clang-lto-auto/%: export CXX = clang++ -flto=auto
# force building with clang/clang++ -pie
build/extra/clang-pie/debug: PHONY; $(call run_config_and_build,$@,Debug)
build/extra/clang-pie/release: PHONY; $(call run_config_and_build,$@,Release)
build/extra/clang-pie/%: export CC = clang -pie -fPIE -Wno-unused-command-line-argument
build/extra/clang-pie/%: export CXX = clang++ -pie -fPIE -Wno-unused-command-line-argument
build/extra/clang-pie/%: export UPX_CONFIG_DISABLE_SHARED_LIBS = ON
# force building with clang/clang++ -static # force building with clang/clang++ -static
build/extra/clang-static/debug: PHONY; $(call run_config_and_build,$@,Debug) build/extra/clang-static/debug: PHONY; $(call run_config_and_build,$@,Debug)
build/extra/clang-static/release: PHONY; $(call run_config_and_build,$@,Release) build/extra/clang-static/release: PHONY; $(call run_config_and_build,$@,Release)
@@ -102,6 +109,14 @@ build/extra/clang-std-cxx23/%: export CXX = clang++ -std=gnu++2b
build/extra/clang-std-cxx23/%: export UPX_CONFIG_DISABLE_C_STANDARD = ON build/extra/clang-std-cxx23/%: export UPX_CONFIG_DISABLE_C_STANDARD = ON
build/extra/clang-std-cxx23/%: export UPX_CONFIG_DISABLE_CXX_STANDARD = ON build/extra/clang-std-cxx23/%: export UPX_CONFIG_DISABLE_CXX_STANDARD = ON
# force building with clang/clang++ C++26 (and C23)
build/extra/clang-std-cxx26/debug: PHONY; $(call run_config_and_build,$@,Debug)
build/extra/clang-std-cxx26/release: PHONY; $(call run_config_and_build,$@,Release)
build/extra/clang-std-cxx26/%: export CC = clang -std=gnu2x -Wno-constant-logical-operand
build/extra/clang-std-cxx26/%: export CXX = clang++ -std=gnu++2c
build/extra/clang-std-cxx26/%: export UPX_CONFIG_DISABLE_C_STANDARD = ON
build/extra/clang-std-cxx26/%: export UPX_CONFIG_DISABLE_CXX_STANDARD = ON
# force building with gcc/g++ # force building with gcc/g++
build/extra/gcc/debug: PHONY; $(call run_config_and_build,$@,Debug) build/extra/gcc/debug: PHONY; $(call run_config_and_build,$@,Debug)
build/extra/gcc/release: PHONY; $(call run_config_and_build,$@,Release) build/extra/gcc/release: PHONY; $(call run_config_and_build,$@,Release)
@@ -132,6 +147,13 @@ build/extra/gcc-lto-auto/release: PHONY; $(call run_config_and_build,$@,Release)
build/extra/gcc-lto-auto/%: export CC = gcc -flto=auto build/extra/gcc-lto-auto/%: export CC = gcc -flto=auto
build/extra/gcc-lto-auto/%: export CXX = g++ -flto=auto build/extra/gcc-lto-auto/%: export CXX = g++ -flto=auto
# force building with gcc/g++ -pie
build/extra/gcc-pie/debug: PHONY; $(call run_config_and_build,$@,Debug)
build/extra/gcc-pie/release: PHONY; $(call run_config_and_build,$@,Release)
build/extra/gcc-pie/%: export CC = gcc -pie -fPIE
build/extra/gcc-pie/%: export CXX = g++ -pie -fPIE
build/extra/gcc-pie/%: export UPX_CONFIG_DISABLE_SHARED_LIBS = ON
# force building with gcc/g++ -static # force building with gcc/g++ -static
build/extra/gcc-static/debug: PHONY; $(call run_config_and_build,$@,Debug) build/extra/gcc-static/debug: PHONY; $(call run_config_and_build,$@,Debug)
build/extra/gcc-static/release: PHONY; $(call run_config_and_build,$@,Release) build/extra/gcc-static/release: PHONY; $(call run_config_and_build,$@,Release)
@@ -169,7 +191,7 @@ build/extra/gcc-std-cxx23/%: export CXX = g++ -std=gnu++2b
build/extra/gcc-std-cxx23/%: export UPX_CONFIG_DISABLE_C_STANDARD = ON build/extra/gcc-std-cxx23/%: export UPX_CONFIG_DISABLE_C_STANDARD = ON
build/extra/gcc-std-cxx23/%: export UPX_CONFIG_DISABLE_CXX_STANDARD = ON build/extra/gcc-std-cxx23/%: export UPX_CONFIG_DISABLE_CXX_STANDARD = ON
# force building with gcc/g++ C++26 (EXPERIMENTAL; need gcc-14) # force building with gcc/g++ C++26 (and C23)
build/extra/gcc-std-cxx26/debug: PHONY; $(call run_config_and_build,$@,Debug) build/extra/gcc-std-cxx26/debug: PHONY; $(call run_config_and_build,$@,Debug)
build/extra/gcc-std-cxx26/release: PHONY; $(call run_config_and_build,$@,Release) build/extra/gcc-std-cxx26/release: PHONY; $(call run_config_and_build,$@,Release)
build/extra/gcc-std-cxx26/%: export CC = gcc -std=gnu23 build/extra/gcc-std-cxx26/%: export CC = gcc -std=gnu23
@@ -242,7 +264,7 @@ build/analyze/clang-analyzer/%: export CCC_CXX ?= clang++
# run clang-tidy: uses file compile_commands.json from an existing clang build; # run clang-tidy: uses file compile_commands.json from an existing clang build;
# does not create any actual files, so purely PHONY # does not create any actual files, so purely PHONY
CLANG_TIDY_BUILD_BASE = build/extra/clang CLANG_TIDY_BUILD_BASE = build/extra/clang
RUN_CLANG_TIDY = time python3 ./misc/analyze/clang-tidy/run-clang-tidy.py -p $< RUN_CLANG_TIDY = time python3 ./misc/analyze/clang-tidy/run-clang-tidy.py -p "$<"
RUN_CLANG_TIDY_WERROR = $(RUN_CLANG_TIDY) '-warnings-as-errors=*' RUN_CLANG_TIDY_WERROR = $(RUN_CLANG_TIDY) '-warnings-as-errors=*'
build/analyze/clang-tidy-upx/debug build/analyze/clang-tidy-upx/release: $$(CLANG_TIDY_BUILD_BASE)/$$(notdir $$@) PHONY build/analyze/clang-tidy-upx/debug build/analyze/clang-tidy-upx/release: $$(CLANG_TIDY_BUILD_BASE)/$$(notdir $$@) PHONY
$(RUN_CLANG_TIDY_WERROR) -config-file ./.clang-tidy '/src/.*\.cpp' $(RUN_CLANG_TIDY_WERROR) -config-file ./.clang-tidy '/src/.*\.cpp'
@@ -259,6 +281,7 @@ build/analyze/clang-tidy/debug build/analyze/clang-tidy/release: build/analyze/c
build/analyze/clang-tidy/debug build/analyze/clang-tidy/release: build/analyze/clang-tidy-ucl/$$(notdir $$@) build/analyze/clang-tidy/debug build/analyze/clang-tidy/release: build/analyze/clang-tidy-ucl/$$(notdir $$@)
build/analyze/clang-tidy/debug build/analyze/clang-tidy/release: build/analyze/clang-tidy-zlib/$$(notdir $$@) build/analyze/clang-tidy/debug build/analyze/clang-tidy/release: build/analyze/clang-tidy-zlib/$$(notdir $$@)
build/analyze/clang-tidy/debug build/analyze/clang-tidy/release: build/analyze/clang-tidy-zstd/$$(notdir $$@) build/analyze/clang-tidy/debug build/analyze/clang-tidy/release: build/analyze/clang-tidy-zstd/$$(notdir $$@)
build/analyze/clang-tidy/debug build/analyze/clang-tidy/release: PHONY
# OLD names [deprecated] # OLD names [deprecated]
build/extra/scan-build/debug: build/analyze/clang-analyzer/debug PHONY build/extra/scan-build/debug: build/analyze/clang-analyzer/debug PHONY
@@ -311,6 +334,7 @@ $(call check_undefined,__add_cmake_config)
__add_cmake_config = $(and $($1),-D$1="$($1)") __add_cmake_config = $(and $($1),-D$1="$($1)")
# pass common CMake settings # pass common CMake settings
UPX_CMAKE_CONFIG_FLAGS += $(call __add_cmake_config,CMAKE_INSTALL_PREFIX)
UPX_CMAKE_CONFIG_FLAGS += $(call __add_cmake_config,CMAKE_VERBOSE_MAKEFILE) UPX_CMAKE_CONFIG_FLAGS += $(call __add_cmake_config,CMAKE_VERBOSE_MAKEFILE)
# pass common CMake toolchain settings # pass common CMake toolchain settings
UPX_CMAKE_CONFIG_FLAGS += $(call __add_cmake_config,CMAKE_ADDR2LINE) UPX_CMAKE_CONFIG_FLAGS += $(call __add_cmake_config,CMAKE_ADDR2LINE)
@@ -354,6 +378,8 @@ UPX_CMAKE_CONFIG_FLAGS += $(call __add_cmake_config,UPX_CONFIG_EXTRA_COMPILE_OPT
SUBMODULES = doctest lzma-sdk ucl valgrind zlib SUBMODULES = doctest lzma-sdk ucl valgrind zlib
$(foreach 1,$(SUBMODULES),$(if $(wildcard vendor/$1/[CL]*),,\ $(foreach 1,$(SUBMODULES),$(if $(wildcard vendor/$1/[CL]*),,\
$(error ERROR: missing git submodule '$1'; run 'git submodule update --init'))) $(error ERROR: missing git submodule '$1'; run 'git submodule update --init')))
endif # UPX_MAKEFILE_EXTRA_MK_INCLUDED endif # UPX_MAKEFILE_EXTRA_MK_INCLUDED
# vim:set ts=8 sw=8 noet:
+30
View File
@@ -0,0 +1,30 @@
From 741b9d2f24b5796fc499a411f632820ab4f889e5 Mon Sep 17 00:00:00 2001
From: "Markus F.X.J. Oberhumer" <markus@oberhumer.com>
Date: Wed, 9 Apr 2025 20:00:24 +0200
Subject: [PATCH] x
---
lib/libcxx/include/__config | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/lib/libcxx/include/__config b/lib/libcxx/include/__config
index fec323f..a16d145 100644
--- a/lib/libcxx/include/__config
+++ b/lib/libcxx/include/__config
@@ -637,9 +637,12 @@ typedef __char32_t char32_t;
# define _DECLARE_C99_LDBL_MATH 1
# endif
+# if defined(_LIBCPP_HAS_NO_LIBRARY_ALIGNED_ALLOCATION)
+# define _LIBCPP_HAS_LIBRARY_ALIGNED_ALLOCATION 0
+# elif defined(_LIBCPP_HAS_LIBRARY_ALIGNED_ALLOCATION)
// If we are getting operator new from the MSVC CRT, then allocation overloads
// for align_val_t were added in 19.12, aka VS 2017 version 15.3.
-# if defined(_LIBCPP_MSVCRT) && defined(_MSC_VER) && _MSC_VER < 1912
+# elif defined(_LIBCPP_MSVCRT) && defined(_MSC_VER) && _MSC_VER < 1912
# define _LIBCPP_HAS_LIBRARY_ALIGNED_ALLOCATION 0
# elif defined(_LIBCPP_ABI_VCRUNTIME) && !defined(__cpp_aligned_new)
// We're deferring to Microsoft's STL to provide aligned new et al. We don't
--
2.49.0
+8 -6
View File
@@ -8,23 +8,25 @@ ENV LANG=C.UTF-8
RUN dpkg --add-architecture i386 \ RUN dpkg --add-architecture i386 \
&& apt-get update && apt-get upgrade -y \ && apt-get update && apt-get upgrade -y \
&& apt-get install -y --no-install-recommends \ && apt-get install -y --no-install-recommends \
aria2 bash bash-completion ca-certificates curl git less libmpc3 \ aria2 bash bash-completion ca-certificates coreutils curl diffutils findutils git grep gzip \
make ncurses-term perl-base tar time wget xz-utils \ less libmpc3 make ncurses-term perl-base python3 sed sudo tar time util-linux wget xz-utils \
libc6:i386 zlib1g:i386 \ libc6:i386 zlib1g:i386 \
# the following packages are not required for rebuilding the stubs, but # the following packages are not required for rebuilding the stubs, but
# they do make the image *much* more convenient and also allow building # they do make the image *much* more convenient and also allow building
# the full UPX binary inside the container via CMake: # the full UPX binary inside the container via CMake:
7zip bat bfs btop bubblewrap busybox bzip2 bzip3 cabextract ccache chrpath cmake cpio \ 7zip bat bfs btop bubblewrap busybox bzip2 bzip3 cabextract ccache chrpath cmake cpio \
dash diffstat direnv elfutils execstack eza fd-find file fish fzf \ dash diffstat direnv dmidecode elfutils execstack eza fd-find file fish fzf \
g++ gawk gdb gojq ht htop hyperfine jq ksh \ g++ gawk gdb gh gojq ht htop hyperfine jq just ksh \
lftp libzstd-dev lsb-release lsd lz4 lzip lzop minify mksh moreutils musl neovim ninja-build \ lftp libzstd-dev lsb-release lsd lz4 lzip lzop minify mksh moreutils musl neovim ninja-build \
p7zip parallel patch patchelf patchutils pax-utils proot \ p7zip parallel patch patchelf patchutils pax-utils proot \
python3 python3-pyasn1 python3-pycryptodome python3-pycurl python3-tomli python3-tomli-w \ python3-pyasn1 python3-pycryptodome python3-pycurl python3-tomli python3-tomli-w \
python3-yaml python3-zstd \ python3-yaml python3-zstd \
re2c ripgrep rsync screen socat strace universal-ctags unzip valgrind yash yq \ re2c ripgrep rsync screen socat strace universal-ctags unzip valgrind yash yq \
zip zlib1g-dev zoxide zsh zstd \ zip zlib1g-dev zoxide zsh zstd \
# extra packages for compiling with "gcc -m32" and "gcc -mx32": # extra packages for compiling with "gcc -m32" and "gcc -mx32":
g++-multilib gcc-multilib \ g++-multilib gcc-multilib \
&& apt-get install -y \
gcc-riscv64-linux-gnu \
&& true && true
# install python2-minimal packages from Debian-11; REQUIRED # install python2-minimal packages from Debian-11; REQUIRED
@@ -62,7 +64,7 @@ RUN cd /root \
# install official UPX release binaries into /usr/local/bin; not required but convenient for testing # install official UPX release binaries into /usr/local/bin; not required but convenient for testing
RUN cd /root \ RUN cd /root \
&& curl -sS -L -O https://github.com/upx/upx/releases/download/v3.91/upx-3.91-amd64_linux.tar.bz2 \ && curl -sS -L -O https://github.com/upx/upx/releases/download/v3.91/upx-3.91-amd64_linux.tar.bz2 \
&& xzversions="3.92 3.93 3.94 3.95 3.96 4.0.0 4.0.1 4.0.2 4.1.0 4.2.0 4.2.1 4.2.2 4.2.3 4.2.4" \ && xzversions="3.92 3.93 3.94 3.95 3.96 4.0.0 4.0.1 4.0.2 4.1.0 4.2.0 4.2.1 4.2.2 4.2.3 4.2.4 5.0.0 5.0.1 5.0.2" \
&& for v in $xzversions; do curl -sS -L -O https://github.com/upx/upx/releases/download/v${v}/upx-${v}-amd64_linux.tar.xz; done \ && for v in $xzversions; do curl -sS -L -O https://github.com/upx/upx/releases/download/v${v}/upx-${v}-amd64_linux.tar.xz; done \
&& for f in ./upx-*.tar.*; do tar -xoaf $f; done \ && for f in ./upx-*.tar.*; do tar -xoaf $f; done \
&& for v in 3.91 $xzversions; do d=upx-${v}-amd64_linux; ./$d/upx -qq -d $d/upx -o /usr/local/bin/upx-${v}; done \ && for v in 3.91 $xzversions; do d=upx-${v}-amd64_linux; ./$d/upx -qq -d $d/upx -o /usr/local/bin/upx-${v}; done \
+473 -412
View File
File diff suppressed because it is too large Load Diff
+4 -5
View File
@@ -25,13 +25,12 @@ LC_ALL=C sort -z | xargs -0r perl -n -e '
if (m,[\x00\x01\x02\x7f\xfe\xff],) { print "ERROR: binary file detected $ARGV: $_"; exit(1); } if (m,[\x00\x01\x02\x7f\xfe\xff],) { print "ERROR: binary file detected $ARGV: $_"; exit(1); }
if (m,[\r\x1a],) { print "ERROR: DOS EOL detected $ARGV: $_"; exit(1); } if (m,[\r\x1a],) { print "ERROR: DOS EOL detected $ARGV: $_"; exit(1); }
if (m,([ \t]+)$,) { if (m,([ \t]+)$,) {
# allow exactly two trailing spaces for GitHub flavoured Markdown in .md files if ($ARGV =~ m,\.patch$,) { }
if ($1 ne " " || $ARGV !~ m,\.md$,) { else { print "ERROR: trailing whitespace detected $ARGV: $_"; exit(1); }
print "ERROR: trailing whitespace detected $ARGV: $_"; exit(1);
}
} }
if (m,\t,) { if (m,\t,) {
if ($ARGV =~ m,(^|/)(gnu|m)?make(file|vars),i) { } if ($ARGV =~ m,\.patch$,) { }
elsif ($ARGV =~ m,(^|/)(gnu|m)?make(file|vars),i) { }
elsif ($ARGV =~ m,\.mk$,) { } elsif ($ARGV =~ m,\.mk$,) { }
elsif ($ARGV =~ m,/tmp/.*\.(disasm|dump)$,) { } elsif ($ARGV =~ m,/tmp/.*\.(disasm|dump)$,) { }
elsif ($ARGV =~ m,/src/stub/src/arch/.*/lzma\w+\.S$,) { } elsif ($ARGV =~ m,/src/stub/src/arch/.*/lzma\w+\.S$,) { }
+4 -5
View File
@@ -19,13 +19,12 @@ git ls-files --full-name -z | perl -0 -n -e '
if (m,[\x00\x01\x02\x7f\xfe\xff],) { print "ERROR: binary file detected $ARGV: $_"; exit(1); } if (m,[\x00\x01\x02\x7f\xfe\xff],) { print "ERROR: binary file detected $ARGV: $_"; exit(1); }
if (m,[\r\x1a],) { print "ERROR: DOS EOL detected $ARGV: $_"; exit(1); } if (m,[\r\x1a],) { print "ERROR: DOS EOL detected $ARGV: $_"; exit(1); }
if (m,([ \t]+)$,) { if (m,([ \t]+)$,) {
# allow exactly two trailing spaces for GitHub flavoured Markdown in .md files if ($ARGV =~ m,\.patch$,) { }
if ($1 ne " " || $ARGV !~ m,\.md$,) { else { print "ERROR: trailing whitespace detected $ARGV: $_"; exit(1); }
print "ERROR: trailing whitespace detected $ARGV: $_"; exit(1);
}
} }
if (m,\t,) { if (m,\t,) {
if ($ARGV =~ m,(^|/)(gnu|m)?make(file|vars),i) { } if ($ARGV =~ m,\.patch$,) { }
elsif ($ARGV =~ m,(^|/)(gnu|m)?make(file|vars),i) { }
elsif ($ARGV =~ m,\.mk$,) { } elsif ($ARGV =~ m,\.mk$,) { }
elsif ($ARGV =~ m,/tmp/.*\.(disasm|dump)$,) { } elsif ($ARGV =~ m,/tmp/.*\.(disasm|dump)$,) { }
elsif ($ARGV =~ m,/src/stub/src/arch/.*/lzma\w+\.S$,) { } elsif ($ARGV =~ m,/src/stub/src/arch/.*/lzma\w+\.S$,) { }
+1 -1
View File
@@ -14,7 +14,7 @@ __add_cmake_config() {
} }
# pass common CMake settings # pass common CMake settings
for v in CMAKE_VERBOSE_MAKEFILE; do for v in CMAKE_INSTALL_PREFIX CMAKE_VERBOSE_MAKEFILE; do
__add_cmake_config $v __add_cmake_config $v
done done
# pass common CMake toolchain settings # pass common CMake toolchain settings
+1 -1
View File
@@ -29,6 +29,6 @@ fi
# limit memory usage to 1 GiB (in case of clang-format problems with invalid files) # limit memory usage to 1 GiB (in case of clang-format problems with invalid files)
ulimit -v 1048576 || true ulimit -v 1048576 || true
#echo $UPX_CLANG_FORMAT #echo "$UPX_CLANG_FORMAT"
exec "$UPX_CLANG_FORMAT" -style=file "$@" exec "$UPX_CLANG_FORMAT" -style=file "$@"
exit 99 exit 99
+28 -11
View File
@@ -16,6 +16,12 @@ argv0=$0; argv0abs=$(readlink -fn "$argv0"); argv0dir=$(dirname "$argv0abs")
# $upx_exe_runner (e.g. "qemu-x86_64 -cpu Nehalem" or "valgrind") # $upx_exe_runner (e.g. "qemu-x86_64 -cpu Nehalem" or "valgrind")
# #
# Debugging aid for locating failing commands. Depends on 'bash' shell.
# (BASH_LINENO is relative to current FUNCTION only; non-function ==> 0)
# Notice single-quoting of entire first argument.
trap 'echo ERROR: pwd=\"$PWD\" file=\"$BASH_SOURCE\" line=${BASH_LINENO[0]} cmd=\"$BASH_COMMAND\"' ERR
# Example: "false a b c" ==> ERROR: pwd="path/misc/testsuite" file="./mimic_ctest.sh" line=0 cmd="false a b c"
#*********************************************************************** #***********************************************************************
# init & checks # init & checks
#*********************************************************************** #***********************************************************************
@@ -42,6 +48,7 @@ run_upx=( "${emu[@]}" "$upx_exe" )
echo "run_upx='${run_upx[*]}'" echo "run_upx='${run_upx[*]}'"
# run_upx sanity check # run_upx sanity check
"${run_upx[@]}" --version-short || true
if ! "${run_upx[@]}" --version-short >/dev/null; then echo "UPX-ERROR: FATAL: upx --version-short FAILED"; exit 1; fi if ! "${run_upx[@]}" --version-short >/dev/null; then echo "UPX-ERROR: FATAL: upx --version-short FAILED"; exit 1; fi
if ! "${run_upx[@]}" -L >/dev/null 2>&1; then echo "UPX-ERROR: FATAL: upx -L FAILED"; exit 1; fi if ! "${run_upx[@]}" -L >/dev/null 2>&1; then echo "UPX-ERROR: FATAL: upx -L FAILED"; exit 1; fi
if ! "${run_upx[@]}" --help >/dev/null; then echo "UPX-ERROR: FATAL: upx --help FAILED"; exit 1; fi if ! "${run_upx[@]}" --help >/dev/null; then echo "UPX-ERROR: FATAL: upx --help FAILED"; exit 1; fi
@@ -148,17 +155,27 @@ if [[ $UPX_CONFIG_DISABLE_EXHAUSTIVE_TESTS != ON ]]; then
set +x set +x
for method in nrv2b nrv2d nrv2e lzma; do for method in nrv2b nrv2d nrv2e lzma; do
for level in 1 2 3 4 5 6 7; do for level in 1 2 3 4 5 6 7; do
s="${method}-${level}" for small in normal small; do
echo "========== $s ==========" s="${method}-${level}"
"${run_upx[@]}" -qq --${method} -${level} --all-filters --debug-use-random-filter "${upx_self_exe}" ${fo} -o upx-packed-${s}${exe} ss=
"${run_upx[@]}" -qq -l upx-packed-${s}${exe} if [[ $small == "small" ]]; then
"${run_upx[@]}" -qq --fileinfo upx-packed-${s}${exe} s="${method}-${level}-${small}"
"${run_upx[@]}" -qq -t upx-packed-${s}${exe} ss="--small"
"${run_upx[@]}" -qq -d upx-packed-${s}${exe} ${fo} -o upx-unpacked-${s}${exe} fi
cmp -s upx-unpacked${exe} upx-unpacked-${s}${exe} echo "========== $s =========="
if [[ $UPX_CONFIG_DISABLE_RUN_PACKED_TEST != ON ]]; then "${run_upx[@]}" -qq --${method} -${level} ${ss} --all-filters --debug-use-random-filter "${upx_self_exe}" ${fo} -o upx-packed-${s}${exe}
"${emu[@]}" ./upx-packed-${s}${exe} --version-short "${run_upx[@]}" -qq -l upx-packed-${s}${exe}
fi "${run_upx[@]}" -qq --fileinfo upx-packed-${s}${exe}
"${run_upx[@]}" -qq -t upx-packed-${s}${exe}
"${run_upx[@]}" -qq -d upx-packed-${s}${exe} ${fo} -o upx-unpacked-${s}${exe}
cmp -s upx-unpacked${exe} upx-unpacked-${s}${exe}
if [[ $UPX_CONFIG_DISABLE_RUN_PACKED_TEST != ON ]]; then
: ${upx_run_packed_test_count:=20}
for ((i = 0; i < $upx_run_packed_test_count; i++)); do
"${emu[@]}" ./upx-packed-${s}${exe} --version-short
done
fi
done
done done
done done
fi fi
+46
View File
@@ -0,0 +1,46 @@
#! /usr/bin/env bash
## vim:set ts=4 sw=4 et:
set -e; set -o pipefail
argv0=$0; argv0abs=$(readlink -fn "$argv0"); argv0dir=$(dirname "$argv0abs")
#
# Copyright (C) Markus Franz Xaver Johannes Oberhumer
#
# mimic running "ctest", i.e. the "test" section of CMakeLists.txt
# - does not redirect stdout
# - allows freely setting $upx_exe_runner, while CMake is restricted to configure-time settings
#
# requires:
# $upx_exe (required, but with convenience fallback "./upx")
# optional settings:
# $upx_exe_runner (e.g. "qemu-x86_64 -cpu Nehalem" or "valgrind")
#
cat >catch-sigsegv.gdb <<'EOF'
catch signal SIGSEGV
commands
x/i $pc
info reg
x/32i $pc-0x20
quit 77
end
EOF
catcher=$(readlink -fn catch-sigsegv.gdb)
function emu_gdb() {
gdb -q -x "$catcher" <<EOF --args "$@"
run
EOF
}
if [[ -n $upx_exe_runner ]]; then
true
elif [[ -n $CMAKE_CROSSCOMPILING_EMULATOR ]]; then
true
else
upx_exe_runner=emu_gdb
: ${upx_run_packed_test_count:=20}
fi
source "$argv0dir/mimic_ctest.sh"
+147 -147
View File
@@ -46,164 +46,164 @@ b8c35fa2956da17ca505956e9f5017bb5f3a746322647e24ccb8ff28059cafa4 *powerpc-linux.
a0950546dc17fca9437219431d8ddb0249ce5b08e899e0c799a87ac982adee70 *powerpc64le-linux.elf/upx-3.95 a0950546dc17fca9437219431d8ddb0249ce5b08e899e0c799a87ac982adee70 *powerpc64le-linux.elf/upx-3.95
" "
expected_sha256sums__t110_compress_ucl_nrv2b_3_no_filter="\ expected_sha256sums__t110_compress_ucl_nrv2b_3_no_filter="\
f0c85faf008ad8e51e71f9c29122fe23cce8e584fdea2c7a56b1b49bf9bfe8bc *amd64-linux.elf/upx-3.91 836d9c5d9092421e49aeb573cde449ef740afbfea54d131ccbd88d8c7d87860d *amd64-linux.elf/upx-3.91
82c13304a9799c5afb1963bc666f888e0c05923cb088d8d2bcc62c4aa734ad8f *amd64-linux.elf/upx-3.95 9776a2d030719f9d74413d17c1bb732aaabb610b341031facd2c1a75348fc661 *amd64-linux.elf/upx-3.95
f3a107343e8bf9d079cf669c34139bc2c99695b87881e440e5441c0403548d1f *amd64-win64.pe/upx-3.95.exe 822718cc0f6ac5e57bb23eeb65be6f3f7e73df8b062853abddcc924ec8207596 *amd64-win64.pe/upx-3.95.exe
862dc98313017cda5c7f5bc859cd7c46c203ad8da95fbf3784dbc0229672af43 *arm-linux.elf/upx-3.95 40353c37020fd4bb713c5d54273b8dc07666e262b83a4f0652ccb8a236465f9c *arm-linux.elf/upx-3.95
e6636ae5cf7f54cbe65f3768f0858d5045b0b67e087b85ddcab029d76ca46e7d *arm-wince.pe/upx-3.91.exe 1440d6b44968954baf56fbc2a0739a51873455876114d4445ae4b67cb5e7893b *arm-wince.pe/upx-3.91.exe
3f3223911d8044d2e32eb3b185bbe5a148f8719fd19cdba7fc3f5e389019e994 *arm64-linux.elf/upx-3.95 35c08bf5086fe21ff19e3512359e54ac97c6d4513e6bb9ef4a59294bebf18f6a *arm64-linux.elf/upx-3.95
c91d57c236864a6237566ac9ee32e2b1aa89bcecf688a548d6b9e80339c7fcbc *armeb-linux.elf/upx-3.91 0ca2dcd9e8b5c3f16dcb31e30b42ec57a70b8fe90281d412081095a3d7812f01 *armeb-linux.elf/upx-3.91
5ffe5dadc9c0b18f427c6a13de0065946d4437ff43ef260c48702d5ba3a0d7e6 *armeb-linux.elf/upx-3.95 462a72efbb580a2e90564412737bb3c1db1d930cde5b4f2c94782df91c8e4f4b *armeb-linux.elf/upx-3.95
a5ba2584080983aada1956c12692189742f4e0bf878b60e19a9ec1bc4228f301 *i386-dos32.djgpp2.coff/upx-3.91.exe a7ee051c5f9dcf233e2ee248274121b99fb8f098eff95469bc0638a7423723f0 *i386-dos32.djgpp2.coff/upx-3.91.exe
1cd743f67f24c2588b99cfca15299bc4237fc1667f1d0615f8be995fac1696a3 *i386-dos32.djgpp2.coff/upx-3.95.exe 85cf31be166cb59587a99419cdd0fc5a79825d7508ab2c9a4bc0d700d603354d *i386-dos32.djgpp2.coff/upx-3.95.exe
6af6e47762c51b8789c11619bd95fef07cacb1b8f875ee8139e903fa1cc764d7 *i386-linux.elf/upx-3.91 fc7656d9a877967be7e339bfc98a0c63ea7b5abc30b96fa9e5931c75ecbe9827 *i386-linux.elf/upx-3.91
01442d33443d9b7328464597bbaf7d410b0b6f04d10d3edf6d9c1b3bad3b563b *i386-linux.elf/upx-3.95 d454a7639e96b986ad422b02045ecfefa3b9405901eaa32d92a2c489292b9600 *i386-linux.elf/upx-3.95
a12101d24d8a248163584774c742fa2e054f5c377665b25726f824d2dfdb2878 *i386-win32.pe/upx-3.91.exe 934dd17076c0298d35a738533ea668e1fcbf8fc85c6671fcdd3a12e7722502ce *i386-win32.pe/upx-3.91.exe
53f31cfa7f07d723620764df42abc47fbae679901760ca1b53a4c79a88ada2a0 *i386-win32.pe/upx-3.95.exe 519a9f6b3de56f5f080151074b9d5d81e31c1961cd6e395f73d2d522b7f7f8e0 *i386-win32.pe/upx-3.95.exe
65f8e36edecb0635eae313c66a81e1529a4f6b1693f72416dfbc285824846f88 *m68k-atari.tos/upx-3.91.ttp a7bd9f616231d883f6700b09e3c9a0af2880c6b5e5b0ce1cd8f06de43c48856c *m68k-atari.tos/upx-3.91.ttp
6a5d54b5a4805f96cc59a65a137002c1d25531d1429699139b09943ee9caf18f *mips-linux.elf/upx-3.95 7a0479691e51ea4a8a0246a1f0ffa9694ee2f0e0cf3aa43dc0f1324c4d427ba3 *mips-linux.elf/upx-3.95
421ac9190bd99715acd2f4a97becca55039c8f78c350ea6043f8a3b06978f0d8 *mipsel-linux.elf/upx-3.91 f60bab42fe3914109ab1b9f5d00a5be753cd0a2c1a79a3998d58800efedbfff7 *mipsel-linux.elf/upx-3.91
b17bc6b7673c33075bc3906e1bf7d7f109af7fba7bac3255b1c6fd13df89346d *mipsel-linux.elf/upx-3.95 b6d8cc9e2023a3fc415166afc378ccf2eb505487df84c8d959ec74b3fb4f8256 *mipsel-linux.elf/upx-3.95
dd82483277f03e4ed6042a4ac863f76500f9a0ba074c8225590c798d2153e278 *powerpc-linux.elf/upx-3.91 acd3dc5ed3e4c4eeaa42e7cca71a79d687dd844ce5f384666ed6e78327b5a8e3 *powerpc-linux.elf/upx-3.91
d65b9f3241982b4c4a0050cf3f3421f70d0019092560291e1e45cd88f146ee81 *powerpc-linux.elf/upx-3.95 03600584c97fa466ef58239452baf9ec6ff2f06b79d97d45c8490953080de6e3 *powerpc-linux.elf/upx-3.95
0a155990ebcc5af095b907a9a69cf072e5d0f531ec70358d8deee785009cc543 *powerpc64le-linux.elf/upx-3.95 3f02885d1e94e59062eb78c4c910cde042475a6cadb77a85a603de747a50f45c *powerpc64le-linux.elf/upx-3.95
" "
expected_sha256sums__t120_compress_ucl_nrv2d_3_no_filter="\ expected_sha256sums__t120_compress_ucl_nrv2d_3_no_filter="\
58c0b1d2ba1d1affb532efe1e55646629c53644dc55bf5dff585bbce1db5eb1a *amd64-linux.elf/upx-3.91 8431343adec632690cec669038c246438c799e7dc1b8bc85586e0d2bcd2eebad *amd64-linux.elf/upx-3.91
3f5942d5a43fa2473146bcad10ffd28d7e3aa13981adb3e73827cffbb3d7e1f6 *amd64-linux.elf/upx-3.95 1852bded40be6eb5ddb07a491476dcfcca69cadda45a5f128aa8f967d567fa0b *amd64-linux.elf/upx-3.95
e3e0c4a4c17c494d2228def4cfedf9def9f66d53eefe9208178565178882c442 *amd64-win64.pe/upx-3.95.exe 5ab022e2c3ecb09931e2181fb5f7699f35e2b453b54c823e42653c84b0df5f2c *amd64-win64.pe/upx-3.95.exe
82d1a89589d7beb1e16d13e9abb1636ddc21a182da9dec302303f05fa253f87b *arm-linux.elf/upx-3.95 6de0cf1903760710a95cb5330d0ffb406a93f081dbe6806935f51b0c75e23f03 *arm-linux.elf/upx-3.95
fed423b4a93090db5e94739f5662c183f10605bca3ebec0dc497936bf1357e00 *arm-wince.pe/upx-3.91.exe 53121baf42c85991900aa3947f3d817fe6e894bc6f325ab1d576de6fba5fbcbf *arm-wince.pe/upx-3.91.exe
d7d2e6dd5e314d1ca6987f24d28dfa4a7a733486744f7ead068428683924bf5e *arm64-linux.elf/upx-3.95 3c9e49445280de6a771e77f6a88b3c3957815baa193e92a893d5defe6699f50a *arm64-linux.elf/upx-3.95
be64f68e93443dea8b44d2a793c160efc4bc8a143018dbe227603dc832a8e93f *armeb-linux.elf/upx-3.91 627a3c77adfcd4ef8c32f1638a6b99e20e79bb914cbcebed6fb9ad5f96936530 *armeb-linux.elf/upx-3.91
5b3f6ecc52562f4b0bda58283cee0824015869199803112163ed0f9a2296da87 *armeb-linux.elf/upx-3.95 7faf9f0adf508cf29bf0ac2a62234df06d6c9153d6d59cf61019361db906daf8 *armeb-linux.elf/upx-3.95
65bfc96aadb43c6828e9e42e1992176b61d339ff17a4e70e5f0af7a898e81a9e *i386-dos32.djgpp2.coff/upx-3.91.exe 51e4faea51e12c7442b27bb50150f532ac51d8102f77a669cbce82f2675a2ef2 *i386-dos32.djgpp2.coff/upx-3.91.exe
78cf195faccd6b5b9ff1790cbb2008bfafc49a8e3eb3fa6c11b74d8c3128b315 *i386-dos32.djgpp2.coff/upx-3.95.exe 1196f578ab0b862bae8ac6b5166b770f072cf0ac521a2a23a6347c19ea82a0da *i386-dos32.djgpp2.coff/upx-3.95.exe
6dfc802b397c976078e81ea298031af215961f1ee6254a4100a1402b1f097648 *i386-linux.elf/upx-3.91 3015651261f28fb43ed43a8c1fa257bcfcdc788e6fd3f436f3de23733736c724 *i386-linux.elf/upx-3.91
14c1d4ef28374188b9e03714258507fd5f1fdc3e602d7a32343815a23456c941 *i386-linux.elf/upx-3.95 8cca96ea354af889f5e9d3074b2c7005f982463a3f22e1cca2bc01aed9232de1 *i386-linux.elf/upx-3.95
24c0712c8b1ad505762429c4f31ef68bbc030d29f6bde18a9cb9722a78e7ba2b *i386-win32.pe/upx-3.91.exe 3edf364443a3cd56efd04e95cc7d7c1846bf76addedd7263cfe8330771f19509 *i386-win32.pe/upx-3.91.exe
a4338529d1dfa339cb2ac25fbc0c56028d288e7393b2fda57e5d6588f388313a *i386-win32.pe/upx-3.95.exe 48141fd66443f85ea867d7fa0bb3a50debb10f15bdb26c71888026e17c88d3a8 *i386-win32.pe/upx-3.95.exe
4f1d68f6e66df8fecad727d0177cfad9a2b9a66fb298600a4fb4a5273b531a60 *m68k-atari.tos/upx-3.91.ttp 07e1c09a953a9c87afa33d1236f46244280161bf3802273a523d380318886177 *m68k-atari.tos/upx-3.91.ttp
595912450d678df1832d3f6e33f0f1d3787ff2fb9fb2ebf9712378d563c06835 *mips-linux.elf/upx-3.95 39b3a5c780d9354714d5e2ed69068511422f8faf9ab660706adc8ad5ecdf3598 *mips-linux.elf/upx-3.95
42c3485bdb4455bac91ac7279b061a26d203c46b8bb8284d00d93da9c50acf08 *mipsel-linux.elf/upx-3.91 123ce137e4cd555470fcf9fe67df75179b6f337fee66d075ddc06f9848817a37 *mipsel-linux.elf/upx-3.91
bd20dd1f41bf72d61fbd59be2cfa008e7a0a052272a5731e0d880c47cf6bfd5a *mipsel-linux.elf/upx-3.95 b78d8cd3a3402fed266c737cc34a32cc21b2b67b573e9e9071d4faf9fca89b89 *mipsel-linux.elf/upx-3.95
a3be663023c7cc534edb14477fb639da47d32ef88c25055ed94f22419bc34159 *powerpc-linux.elf/upx-3.91 ea9cae1d1701db3a0c53e9a651766db5bdc30032f48913a4a9e99f193a800acc *powerpc-linux.elf/upx-3.91
cc883bf36c11a4ceae5371c66e0f4b28dafa9ea4076df5eae533bcdc611c3be5 *powerpc-linux.elf/upx-3.95 aea86bf87870a1e48a454ac1ea9a80d90d8abe5113d418a71d8a9c4a74bb2d0a *powerpc-linux.elf/upx-3.95
ce5bf80740e5c13883f44fecc42f8f4eb61fe768b10eda796e7ab1fc66d76dbe *powerpc64le-linux.elf/upx-3.95 62038c87489dc5cd3772e8e4051cf1d416edecf267d37f390a649f4ae657e0f9 *powerpc64le-linux.elf/upx-3.95
" "
expected_sha256sums__t130_compress_ucl_nrv2e_3_no_filter="\ expected_sha256sums__t130_compress_ucl_nrv2e_3_no_filter="\
2207030b7262baa62b107c876399753ae080021eebd65bc26f2811ab9c584109 *amd64-linux.elf/upx-3.91 f817034e8b7765d8b422dac9cb6f24f78ce5bfd7169cd3b33e8224e00b131eca *amd64-linux.elf/upx-3.91
813c26d1c905ff526c60bde16c6f3fc00b05ec391c1265c8f08e73b10d97e229 *amd64-linux.elf/upx-3.95 d21441a05514c085c10e99b00d8cc4d45484297a8e4e8a246364ca4347d0ed56 *amd64-linux.elf/upx-3.95
0136fbd3b9706eedff270c2a59bbce60bc56f939ce8fe64cc03ae2524c80cdc0 *amd64-win64.pe/upx-3.95.exe 7bd7cd37093200fa94d21dd7fdfef4d7fb9c3049fbf5f408f1f242cb8d9c6a55 *amd64-win64.pe/upx-3.95.exe
7f34ca5efb80c4a54c5b7e1d2225ed0a594394b85d2d22741687511d4056779b *arm-linux.elf/upx-3.95 d328a89b333d0b36e96d0c61375bf686e8f3b73a188dd4d0df4d78e30af08632 *arm-linux.elf/upx-3.95
a52b38546e1273920936aef97d6880f768cf951aaacb1cefdb7349db581ea792 *arm-wince.pe/upx-3.91.exe ad0a7a18e87657d28260b7c527d284863becd3c5f92259c570125465f88d4042 *arm-wince.pe/upx-3.91.exe
9d52fb78b10e30b213926bb0e3749f7fb86303267d57616729e34aa180125ab8 *arm64-linux.elf/upx-3.95 0b700f0f7dde3118694155e876e6c2003ef701fe94856d6562936ec081278747 *arm64-linux.elf/upx-3.95
87fd843f80b2e8ce8321db6ec0b54742457d332f913ede8ed8507bdbb377dda0 *armeb-linux.elf/upx-3.91 53a1d04fa62e25e64e6f792b079e21b4c42676a73503ae6d9e67ae16c98e6d04 *armeb-linux.elf/upx-3.91
d3cf89367b1af3f444e3f47b527b59e77a8bd01849f78a1b40e0831edd789b74 *armeb-linux.elf/upx-3.95 33ed1e3b84836d2af52295ba0b90343ac0b8d524539ce3b8d0aa9f19a51d70dd *armeb-linux.elf/upx-3.95
10f60ea47cdce4b63c44d55709978cbe77e2cb507b3498320df98e9464dc1475 *i386-dos32.djgpp2.coff/upx-3.91.exe 6fcdc8e34ce8b3501db2260c8a921c6e963954fdeffedfefca353a27bcc02d56 *i386-dos32.djgpp2.coff/upx-3.91.exe
c80cec60ad9ed268b3a150299881d25035fa45638885df5a82287596d0708ef1 *i386-dos32.djgpp2.coff/upx-3.95.exe 6f4f901c1838252f9b3104060475a6f13a2ebec830096ff28d870148580e4287 *i386-dos32.djgpp2.coff/upx-3.95.exe
8f96a1d430eefa75f76207dc7cddf3f3b06cc3b6611a2cab4131e6694d54bf03 *i386-linux.elf/upx-3.91 8127f8380300508e8062e9391e321abd0429a6a31fec41e769cc7fe80af27e27 *i386-linux.elf/upx-3.91
76fb0e1394b7ac7c9e08522f5e7d4a7996515eceb6b804c8114ee819ffcee206 *i386-linux.elf/upx-3.95 b0a7e6b822f038b7940a54ea160b045d2241e3dfa15a5081a23fbc4d42fb6773 *i386-linux.elf/upx-3.95
03a74c66ce822c948abc20f1b41b7508a2d5a60975912f89569997795f92f957 *i386-win32.pe/upx-3.91.exe c78db15a8113b806e56812fd842fb467d2a9c9557fcdc0467dae3f4c33316630 *i386-win32.pe/upx-3.91.exe
c84de2b06d4a82a788c0c63ff1acd92a01344601b156c0cc878ccc24a07bc7d0 *i386-win32.pe/upx-3.95.exe 89314e8621c4a00e1a65e045686245d3c1e2ba0a858f1dcc8f3cc2d0eedccfb5 *i386-win32.pe/upx-3.95.exe
15dea9aa84e82d1be8d847eb7b774abd0080fb938896d37a06d9fbf07ee137d2 *m68k-atari.tos/upx-3.91.ttp 710ad88b63cc7e0fa0b413ebdbcebf41140678f551b5dd883ed6220507be3601 *m68k-atari.tos/upx-3.91.ttp
3c2e472ce7aea4d8bf8fcd27488764fef52fee7fa48807f3879c44dfabf3c131 *mips-linux.elf/upx-3.95 c7e3478872650b7f4f8ccb4a0649944e62f44f5a9249cb9425210333e1f2fdf4 *mips-linux.elf/upx-3.95
db72872a3e605bec878dbb7e841b950c8f8b9279b088fdb4b8142accbf85d78b *mipsel-linux.elf/upx-3.91 cd9b3d3780a79cb416b261d622e8e86f2369fa8bb9bc49b529c50cac2980d528 *mipsel-linux.elf/upx-3.91
407b5b6465d5af0ef43fbaf0e041115bba224a30f84f061249bfea4a7ed21b2e *mipsel-linux.elf/upx-3.95 5baf7db9e4335c0227106262efc9d18ad23b88c6d6bb636656aea67bb063b6ec *mipsel-linux.elf/upx-3.95
8d751e64f87be51d847dcc4bf0bf54f92213bed18b16919659c94dea5e5e77f8 *powerpc-linux.elf/upx-3.91 aba8bd826ee52d533f9e1c4270d4f4194fe8d8747ea10a1d3ce59b6443f1a9f2 *powerpc-linux.elf/upx-3.91
d56e4ca8274f11a26fb33518e155ca6aad6c88953bdbced23c4378c43ed7e531 *powerpc-linux.elf/upx-3.95 6f737ccbf8c830476bed9c4dd33dd7757ea25bf2f8fb03b44d03e9b77ada0f1b *powerpc-linux.elf/upx-3.95
c20cde25c44f9c4f1aa68b4307615be23a241d31acffcf612d9f5066e9703b43 *powerpc64le-linux.elf/upx-3.95 d313dd128a54189b9551a529b1ed21b222aa0394a30f9ba552cde96edcd4011e *powerpc64le-linux.elf/upx-3.95
" "
expected_sha256sums__t140_compress_lzma_2_no_filter="\ expected_sha256sums__t140_compress_lzma_2_no_filter="\
50532540dbd85b45c7a5968311144dcc28087453ed053d9b025e59a79d1085a9 *amd64-linux.elf/upx-3.91 fefac6fbd1e95479eb4066519f9bd801a30c29966685840b6a011e2911b984ca *amd64-linux.elf/upx-3.91
b750a28c3a4e15a5cde30b4bc98880dc2d9119cb1a0f8507a47ecebecc0b638c *amd64-linux.elf/upx-3.95 64487a0e0aade092a8ff7e6d8d9528ca550540cac8d432005ba610179782d042 *amd64-linux.elf/upx-3.95
1f8bb9320a0083fcd6a9debefc1ef7bd0a1fdc83a60d5f920f91c7b6fc6940b9 *amd64-win64.pe/upx-3.95.exe a55ec5a7f2911f6da8b9336daf4f1051e753cfb7a4458c7f7baa6b63340c6daf *amd64-win64.pe/upx-3.95.exe
aaa86b905cf1e0b75446a4d02212fe6dd7c07d473aabf59711fc2f9cc7f4c447 *arm-linux.elf/upx-3.95 9f405739b904bb85053b75187c9175e4ac7f66a07ac5e320eaa4e9771e1ec79e *arm-linux.elf/upx-3.95
518d80035753e184eff1a0b26c76f79df7725a28dfe6738355263a9b4eed9788 *arm-wince.pe/upx-3.91.exe 7a6c603eecf214e5d6742f1fce922223c97c8bd2527678a968640dd6c1bc0d71 *arm-wince.pe/upx-3.91.exe
148227eed271db8ef9367349211d91520c6e10fdd1cc31382fe3b83ca6dad30d *arm64-linux.elf/upx-3.95 c8435e2f82ba72a0b6abad4146539d40d495461c5e480af705b2bbd21d192128 *arm64-linux.elf/upx-3.95
487a46b214fd36db0cd814a98fe608ec6baad5fa3111c5fcf5b5902c554b9149 *armeb-linux.elf/upx-3.91 21fc48eaaedc73fe9239159fb864c6149f729ef1661a8407b88ad9c9a19f9a54 *armeb-linux.elf/upx-3.91
94a2289a1c17bf647681d52ac050677149bbcee8a6eb944051b7734d94e5c7d0 *armeb-linux.elf/upx-3.95 742db587dc53f616c7b276a930c3f586da2b7c3ce6ccd523c041e88a9671b99b *armeb-linux.elf/upx-3.95
d6dcbfb921ce4fb936f3c90929bab1c4922b557068a45a7f5e2d1e4af7462b6d *i386-dos32.djgpp2.coff/upx-3.91.exe 7a8eaa5139b95cc56591200fce62d3c9af163671467952cab6fcf487318107bb *i386-dos32.djgpp2.coff/upx-3.91.exe
efd3af572e9517128e49d0b013358abc0174966a8e596648af08bc3a3c822a05 *i386-dos32.djgpp2.coff/upx-3.95.exe 9b5fc0f54a5f811bda190c36fb2fa5c5b03c6c3de0c62693e4191230b5a419b8 *i386-dos32.djgpp2.coff/upx-3.95.exe
b98b1d2c9bea47155d26d078e152bd73a675cf91051db1419e872ba3b23d8b82 *i386-linux.elf/upx-3.91 68b4ce63cb0bd7dd5b287e1f9fa5d9bc234ac36359ce3ebff863984c503a698e *i386-linux.elf/upx-3.91
5182b9e69dd6440eacaae7213ebbe2a4bb7d4a0a2bbd650bb2b0cad0dbe8704f *i386-linux.elf/upx-3.95 aa75cf22f0b59cc796de678198432a3dc2d40ab871e4989dd97ff1a6c148f294 *i386-linux.elf/upx-3.95
770117cff05d8cf50a1ef7be873aae7d11649f2757d02b17dc8817104fa70f0d *i386-win32.pe/upx-3.91.exe 0e0780f5fccc52f6c78414f7279263b26e31de7c6ca1ec65a240e37cf0a4f5c9 *i386-win32.pe/upx-3.91.exe
460c437f090f68a8bc2c5f2557b8aa784b3a5cd7f8ef87fa6992305e1070125c *i386-win32.pe/upx-3.95.exe 3ddd6265d69e374f5f0f8c9f602e0e59c895da2f3fef611ef89f0ee4ae2c592b *i386-win32.pe/upx-3.95.exe
eaf53678fb35365dd6a20983b0379251b8aa28350a238b1636141ddc555a4520 *m68k-atari.tos/upx-3.91.ttp e268c98fdacfd04268d76644f2bb4746ae04b57801407aaa1867798840eeeea0 *m68k-atari.tos/upx-3.91.ttp
77dcc76fda69c13a8f58cbaf34376e734457909810ec351b291b63774752e1de *mips-linux.elf/upx-3.95 499e1d1486810cfa5b6662e30189183979e25f45d35654d8cd60fd793d0c07d8 *mips-linux.elf/upx-3.95
ad82bf571be17ecdd19520959e9e770205163693561cc6b3a6c206ca7ce8694d *mipsel-linux.elf/upx-3.91 4a30189ad7312eafb2d47e1b526ec22eaf614a895f8dce96f3e1c7385438f44c *mipsel-linux.elf/upx-3.91
7f3f5b2522761550f01d1c88b5f68d0f4a391c3470418b86a10f6ca5872f4357 *mipsel-linux.elf/upx-3.95 339d38602413d97d9bba113f39884815af10ebcdccf37e3f5e8d0879f262a048 *mipsel-linux.elf/upx-3.95
63a339a06d497120002ad45d549eef5db2f07e7419f1c68a8ede9f36c7ec4b96 *powerpc-linux.elf/upx-3.91 6d4f9d4383ebc9d8411d06a7c219dcf3e8513ea8c989f2d31ab382602f873ba5 *powerpc-linux.elf/upx-3.91
5ba0f8485b832d8da4d7210f01c09850fdad9a9d1f99d3726147494fed90b130 *powerpc-linux.elf/upx-3.95 5dd727d8d5a35cc0ab86d629285d8ff450f52b538118679edaa886ce9c1fed7d *powerpc-linux.elf/upx-3.95
0c89a155ff7acbaf5ca9618a7d632650ceb99c089d3dd8e56280b28d44302361 *powerpc64le-linux.elf/upx-3.95 efec1e5bbb9bcf11dbc7081adfc2020de18fae326ad86194551c44fba0d2148d *powerpc64le-linux.elf/upx-3.95
" "
expected_sha256sums__t150_compress_ucl_2_all_filters="\ expected_sha256sums__t150_compress_ucl_2_all_filters="\
af5fcd8a9b1c3869b082b2fe72c962a4dc651f1f2d8979eedbea4b2a82e6b955 *amd64-linux.elf/upx-3.91 05b29bde32af1e63e837e2be499567c4b10d7e692c88082f24e3417e0c7b9f40 *amd64-linux.elf/upx-3.91
4e0eb2be5592d19ee7ac0acfb68dec8d4393b996d4e3c112c34ffac0ba59b7b8 *amd64-linux.elf/upx-3.95 65c142ee01af09fa8741932c1f21d466be971aad059cc5afddbb7ecdf142c1bb *amd64-linux.elf/upx-3.95
0bc7af47ffb8a45b6877289c6bf8693d118a122190501438f7d77f318f8f7490 *amd64-win64.pe/upx-3.95.exe cbb5c90bd9195bd9e3acd931312a70deeccfab5540f398ceda8826f8d6b332bf *amd64-win64.pe/upx-3.95.exe
6b16659fa1fb13af0709273f41e18d3304996bb7c71ee679f589c7701b7480de *arm-linux.elf/upx-3.95 1ea1bb18c0ac85c07450f0a6704b84e58a1322556757e2943340ef381b2ce675 *arm-linux.elf/upx-3.95
2510e493e524dcb86b5cffc16cdeb116fe41e2a6ef765f066a88dad30b09e039 *arm-wince.pe/upx-3.91.exe 76a5f0518fc797bd3f132ce6eb61ca187b5d463f191417883a73d4584716c23a *arm-wince.pe/upx-3.91.exe
a19d8c1b68864540a0e6394fbd77f55293de372903821f9e11ad4782c5bc313c *arm64-linux.elf/upx-3.95 4df30002376a4f18029ea9dd8260d395bec3a3fa11fbc5aa19859c2f0efdc2e6 *arm64-linux.elf/upx-3.95
bd7c2bf7bcfd4d70fdfaba51a2dfb9820f586e61a6414fb6c888f9c5b1a64ed6 *armeb-linux.elf/upx-3.91 ba03fd4889210435c9673f2dcbd2269162037090eccc79cf7d2b896e64a57e2e *armeb-linux.elf/upx-3.91
1080b69f81b9fe7de4abee22e7ba88efbc6ea1a3e8d59f4e48268072a4cfc7f7 *armeb-linux.elf/upx-3.95 681f32d01c76ff31776b8d6f1556daa38eee297f675aa40ff1bb2e47e12adf15 *armeb-linux.elf/upx-3.95
8998ed7c785b2f242ebff1aa88225702c281eeb31bf02f6edd61851c22271fd0 *i386-dos32.djgpp2.coff/upx-3.91.exe aa05c3a2953f0f2d70842cba45786b707a79ffef22fd084f51e304762cc67765 *i386-dos32.djgpp2.coff/upx-3.91.exe
c955d35d9f829ba442db2bd26b2eb9d65c06ac15ffbbf96d77577365f489c2c9 *i386-dos32.djgpp2.coff/upx-3.95.exe c677241e9a8753ba1332ac3875ab6398fb2d792d2627edd9e58f2535b3131abe *i386-dos32.djgpp2.coff/upx-3.95.exe
cffe561026b58c3a16a78392ca835b212a6f82b7d995a6f0d607aea8b90e35a9 *i386-linux.elf/upx-3.91 7bcd42f58dcc8ddb6cb1a4e33d56b584fe6d49b002b01a0859571d1324dd593a *i386-linux.elf/upx-3.91
9fe71ad10328ddf551ed58ed377fe4b131a8deb2de9c0b3e56c1d5936075d540 *i386-linux.elf/upx-3.95 b6fe6220c0b3f4df131da3aaae566810f2aa1f13b63d23de3ead9174d08d82e1 *i386-linux.elf/upx-3.95
f4754aa1ab522cd208c93e9caf49ac0d4c357a2636fea1d94a24de3f54252c4a *i386-win32.pe/upx-3.91.exe 8ec02f816f4727b519e8775edc1afb1df32991319a6c6f050ece416011925379 *i386-win32.pe/upx-3.91.exe
54ebf5551a267e36c6afbebcde77e0f2ac1b52f66834545da082c4146f2ec03e *i386-win32.pe/upx-3.95.exe d5aeeedada49c0c2870ea450ed66b2cea31369bccfccf9407378ae0fb0736deb *i386-win32.pe/upx-3.95.exe
a085aa278eab7c2b82d9d7b931a889bb8cdff2af993b2a446dfc652603c9b8b1 *m68k-atari.tos/upx-3.91.ttp e414ad0aba43790d0498b26c23055fb051129b6cbe3e070a1406c91ac5b8032b *m68k-atari.tos/upx-3.91.ttp
9ab8d07b0e5aa4269d18bd0783f74c8cad6d681839774f091ea65b35231aa0be *mips-linux.elf/upx-3.95 c5107a84d32de820c81401259a7dd23435ea625588d56c6c75ad6fa14b0dbf8b *mips-linux.elf/upx-3.95
ab46fcc2f009fab7b5186c33e3d288df999e3ac96f3863fa82c314d4f8fa3d43 *mipsel-linux.elf/upx-3.91 78473f7d7ddf56812b8dee087ca62517ecdbd10fa14972ba6670338fc19061d1 *mipsel-linux.elf/upx-3.91
b23c4c341228a30a7f8a6e027279a2f016510e8011b2da4b460657bc633303fb *mipsel-linux.elf/upx-3.95 fd9ea397a29b41a2143f9e02217e181d0075d7ad7d87bdbadc7fc94bfb1b0d76 *mipsel-linux.elf/upx-3.95
ac26cabae4f900d5dbe06ec2128c66ff3d3934967d4e8f7fa8003d977827b554 *powerpc-linux.elf/upx-3.91 c47d1299f6ecf86e62528fc54979117b2b2ddbb6c80f553689402399fc7eab28 *powerpc-linux.elf/upx-3.91
f109345301a767465e966c59f9b97fcbc57dd123f0cfd6b3a1508d063afcb71a *powerpc-linux.elf/upx-3.95 77c3b4ba6909a4e20180bc13775e280086d67240519c323c2005f3fcee6e0b78 *powerpc-linux.elf/upx-3.95
14925049ea4d38ba1a7b1fa88397ea47c32b3e75aa73311acd5ce984dc9edff9 *powerpc64le-linux.elf/upx-3.95 e3ce51b863905a4831958c72541b04e9f893f0d9827f32e615822db7aebd56bc *powerpc64le-linux.elf/upx-3.95
" "
expected_sha256sums__t160_compress_all_methods_1_no_filter="\ expected_sha256sums__t160_compress_all_methods_1_no_filter="\
0b4129ac4d2660a61f65f89f5e4dfd337e757504ce7cdc865dfc40236a32fb98 *amd64-linux.elf/upx-3.91 94c91b97fcce7402a4494b22699b2450e8e4e2a9f4ddd66e1133c76ce198c167 *amd64-linux.elf/upx-3.91
56dbdb335ebaa58fb9a5b2cb1a0ca7ca9b0e6f02d4d06bc6cefc0433c166b5b2 *amd64-linux.elf/upx-3.95 5b3e85adb37919d051c6eaff205b8e1d77a2dfde0d8e7dcdee7c22f8fd5dc8c7 *amd64-linux.elf/upx-3.95
1b508481525d63d90d7b9125a7ce5f3f2adfedaa6b771f2a8f4f4502cd425dfb *amd64-win64.pe/upx-3.95.exe 5a0ecb45658904bcd0b823b77dba039c9814e2eff4ed429784c36b7074b9858c *amd64-win64.pe/upx-3.95.exe
0768ad7425df8a1397cacd6e611beaefec03e6b2be97109dfce5ee71773b3b9d *arm-linux.elf/upx-3.95 de93a219ca3c4ea84bd9c1b5fb37ff4aaa0a08ea6eac18da6d7a5865e4dad19c *arm-linux.elf/upx-3.95
24d9a9331ed1bf1f29286e58a3cf7f3c3d2cfc1e8763393088e8d967a0c404eb *arm-wince.pe/upx-3.91.exe fdbe0395ac401285edb9c2f9bfbb0fbd3c0eaad5052a88d8369b1a66b35a8a3e *arm-wince.pe/upx-3.91.exe
43f8f19d6928d072f6a8889c1045b39664d731b1164427c8f200d9aee00b8f15 *arm64-linux.elf/upx-3.95 acdb7ff90d7c6f403872ec333e2987ee74e99d6e1390863b321b528d312c1084 *arm64-linux.elf/upx-3.95
7520c0b23566e2acec6989d4d657dd004773e8da2b2f4c6440f41c5af3be0b23 *armeb-linux.elf/upx-3.91 54860e61da36414dc105aafcdbb86c79b745913a7d0da911fa58a6941f111e2d *armeb-linux.elf/upx-3.91
3adb141d33987869834da0fa971b1c5fde50cca227e2981856dba4be8e439909 *armeb-linux.elf/upx-3.95 7c36b75cc8a0712515e12a9e565df4ca43bff6cc0077afb282d367fcc2ee2acd *armeb-linux.elf/upx-3.95
73759310b8554f0011db0e5d443717e112a70f67376fa180bf1d08575f410998 *i386-dos32.djgpp2.coff/upx-3.91.exe 0a0099246096d20ff6035a4df6566954b9d8aff9ed8fdbd35aa5ee4995b02bfe *i386-dos32.djgpp2.coff/upx-3.91.exe
10a3d68b8a5364b4244f5273165530bc3b68f853a9096dd83d1f8536e7d679e0 *i386-dos32.djgpp2.coff/upx-3.95.exe 5df7aa9f0896df87eb8798119ad16a9b89c87a7568a67339e33b5baa99ec361f *i386-dos32.djgpp2.coff/upx-3.95.exe
69d47a715530e3d4e45a51be5c3c64ed59c1237d2b4c59d8cb8d11dcdd85266a *i386-linux.elf/upx-3.91 53e5aae9bc70f58e3dc2aef5a94f66df2517d547670e72ee2b3189b7da809f41 *i386-linux.elf/upx-3.91
f90e868783a5f216a59d230e4685d88abdc7d920de78139a841726bfc8a2395b *i386-linux.elf/upx-3.95 adaa1e2f46f7a235ab838b15aa7e820057e5ed7011d9d07c67dc770a88e3dd62 *i386-linux.elf/upx-3.95
6354a77c83a760b0621242982ace576a58941c687c8d0e2154d91263d45a7fd9 *i386-win32.pe/upx-3.91.exe f3d33c5c9809943a902133490bcf0cfbe39a5ef1635a0c29b3bdc4f35dfffa50 *i386-win32.pe/upx-3.91.exe
43d261ecf3dccf8bb1c3591b38dc20acedd846b1f5bba0a9fa290d29e6f5bd8f *i386-win32.pe/upx-3.95.exe 474e68a2390cf0376f59402eaef4c902daa49428b628e025b1c8506428a37937 *i386-win32.pe/upx-3.95.exe
586ad3f4d1a421cbfc86a38bc0b1f3d48dc5bf76ecd8281b001ff1e42cd5ed6c *m68k-atari.tos/upx-3.91.ttp 1561dd69f67e8705804dba41ebd876bce6a4ce8ed8b0bc0d0e7628697e7fee68 *m68k-atari.tos/upx-3.91.ttp
d88760fbaac2c4628c1cb6c8b3828c3ec717ac02e87c7c452d39fb2de9e32412 *mips-linux.elf/upx-3.95 74f7f69b4a8b2b7c428fa55e3970ee767c1947f19ed1b0644870ecb6b3cb713d *mips-linux.elf/upx-3.95
a3599c2acd0a449693468612a5ca897e48612cff448489df42f2d78775c36606 *mipsel-linux.elf/upx-3.91 12a42365234c001a52586b74a9597dc7d65184ddf1ee1d40734823a3443cd92a *mipsel-linux.elf/upx-3.91
bbe0cad71e7c0f93884f972ed1f0b464184a6f7bed57fc8c5120db758166e742 *mipsel-linux.elf/upx-3.95 68f674d081d87e86e54f0051eee9e2bc85b566051992774ab28ff3173cbcb75a *mipsel-linux.elf/upx-3.95
1247a34c56ae1eea834207a409f955a39362184ed730d0bdf797e20440fbad2a *powerpc-linux.elf/upx-3.91 f569d8f49d7110bb8b262a48055b39d889e9977c40c5f1b21e74f8cbf93b27ae *powerpc-linux.elf/upx-3.91
318e5c3db467a6d14d157828931932e4ae822b255970b8a6a8f4038e6c14ad03 *powerpc-linux.elf/upx-3.95 d8227a8a88c083760889acaf259e7da59eab75a23e341289bc8e3c60563ae344 *powerpc-linux.elf/upx-3.95
424837c52bce0853f0f97dc69273de4e2f0c3cf09fd992b08b1bfd79fbe04281 *powerpc64le-linux.elf/upx-3.95 e4b58ed65025b765953af02e80be9a171c49b6c707c835949b1c888fdbe8bba0 *powerpc64le-linux.elf/upx-3.95
" "
expected_sha256sums__t170_compress_all_methods_no_lzma_5_no_filter="\ expected_sha256sums__t170_compress_all_methods_no_lzma_5_no_filter="\
301f1ac99e989824b4171305c4bf21f848da49169a0ea35f9d954b6782946e3f *amd64-linux.elf/upx-3.91 52a39c30b60abb82c1ec2826297eb46abdc29b5dd55d7a7a41dd2fc1c573f60a *amd64-linux.elf/upx-3.91
bbd292d29f547d15d7ce1e5c16470282e91017a4bd317b24e71c9fc078e625e8 *amd64-linux.elf/upx-3.95 f0c728c42e8775767e0d963e1eef7ca78711f3f6dd180df980a1faef926d7cac *amd64-linux.elf/upx-3.95
dea208e13322f5545cd0f16ff06969dc9ded456191bc827803f5a871ec6e239f *amd64-win64.pe/upx-3.95.exe e07e9babdeb12fddeebbfa1b0293163cc5e63017d6f0933d02587c8da1e90a82 *amd64-win64.pe/upx-3.95.exe
93762a9cbeed31a7eee4762f410baee0c92ffaabc36c9dc92a7eb21e6f4fc526 *arm-linux.elf/upx-3.95 f0359efa2247e9ea756f54c85e7518d61f3b293e08f566c3812c64c7d5f0db0f *arm-linux.elf/upx-3.95
56349a327b7172010484f58e3ed13a9c5819241e1326d20843516458d85ec6c2 *arm-wince.pe/upx-3.91.exe 8d1706ab02013b536c3a4cec20d40a96591ffa45fdcb464ccd3f038567006d79 *arm-wince.pe/upx-3.91.exe
9c12ee31c2dbffb30ca41e799ea22f37a82be3b3af0cb3d93fb8159d57ad40b5 *arm64-linux.elf/upx-3.95 14932490ff17e27bb5bedde576b8683892c4720f4a0058f373aab9f8894fda09 *arm64-linux.elf/upx-3.95
6f4f80cb1bc8aedf2aade7b48e404c1edfd9e361818dc52d495b66951684107a *armeb-linux.elf/upx-3.91 64a73512e40c2fb49d8ae3a1d496b379c97b8724cf8ca4461a85825ff04366a0 *armeb-linux.elf/upx-3.91
b1d33445d3732860c6c20c9dc7b643886c8fd180a19abccdf489c7af297d1575 *armeb-linux.elf/upx-3.95 078e7cd073ba071f17ad4292e2211b7d635f57e974546e7f156cc87f9aa716e2 *armeb-linux.elf/upx-3.95
abdb6b7df1c5bcb30cf7534de2527df0e9edc961828a68e77c336a29a01810b8 *i386-dos32.djgpp2.coff/upx-3.91.exe dda2c348c43741a1bd65049a8e7b51be1ebf873d215370ec002185c85390c168 *i386-dos32.djgpp2.coff/upx-3.91.exe
3bda7b44bf9ca7a5a3272a2fb0202cba96017a34b1829cc371c9b7cbd7f43f2f *i386-dos32.djgpp2.coff/upx-3.95.exe 560392427ded22f2f3fea59ef10e55d65cf841001e67b1e4558ef13514baa602 *i386-dos32.djgpp2.coff/upx-3.95.exe
503edbca35752de11340e0364374432a08da5ab4b2719aadea9482f7018f3e68 *i386-linux.elf/upx-3.91 f3f8feceebe8536633554b204df68c2e94e1d1a313fe7a576b7f5d404c916083 *i386-linux.elf/upx-3.91
99c951666eeecab20e08a88b198943ca694d755570135ef218396968edec76e4 *i386-linux.elf/upx-3.95 e7f98419e346670f72d66ac25f3d6ad53201e768819980eecae24d801366be27 *i386-linux.elf/upx-3.95
c5960e4e4fb392a6b439a95d5b41a86be95e3f7898923268bf76534be4bfd6f2 *i386-win32.pe/upx-3.91.exe 3510bc5627237752bedd275e73c42bc02cd46145ff916e7bccbdec663f763ee4 *i386-win32.pe/upx-3.91.exe
d391d97db4a4593e8c3871968b3731817a8cac52953649619d0d63deb27fea74 *i386-win32.pe/upx-3.95.exe ad47c7522167f6f7e47d495e1fa119431386ca5ea9bc16b6a4b9cb38cf9cd29f *i386-win32.pe/upx-3.95.exe
6eec8f9d2eb1a0547f8f8c1c346227468422387dc8899782878a682d4d4e03a2 *m68k-atari.tos/upx-3.91.ttp 1c999e5c6cded8c99a7f6b4595879893ae63d2af1388dc61dd8b4e3106676480 *m68k-atari.tos/upx-3.91.ttp
a18383777c6c3ee7436447e7babb131e29608d235de47ea2583d1233b9b7103e *mips-linux.elf/upx-3.95 55a098c2cdce1917b76ce0845f434fc23b0bd30b34e884b19401c51c8c7f4756 *mips-linux.elf/upx-3.95
f4bf1e6fc9ebbdb798a6cd4875419bd9e7bfcf12d9439d926581ff60430dbd84 *mipsel-linux.elf/upx-3.91 4b6487d412f43acb8e41951a2135e56025139a9ad3e57102749df4d4bef934fa *mipsel-linux.elf/upx-3.91
7df55c1c945968d986ac6321f2503379a4a6b061f2ac59ab2dd68e2cb509839e *mipsel-linux.elf/upx-3.95 1dcd626fc4566c608e987fd6999b695793c5cae7f78872e3d1a9a23942fea188 *mipsel-linux.elf/upx-3.95
40b7830288602fb85b8068b7daebdb6c33fb64b79543ad87a412189dfdfc3583 *powerpc-linux.elf/upx-3.91 2047a4a880322bf41e8afbb4787f6103364de4a299b543808251a4144c4d990b *powerpc-linux.elf/upx-3.91
f012035e5268519485025fbc8a1286c4a380f2c80d979df182190bc32d7258e2 *powerpc-linux.elf/upx-3.95 63679bd238f30bfb14853246eb257536471fea10f942b2adfdd43cbef21dea30 *powerpc-linux.elf/upx-3.95
439cd93ccaa2b916bfb6d6c1c91cd09451121f9a8d8cad3386d628940b966870 *powerpc64le-linux.elf/upx-3.95 c75d1548db879ed589b55bc1319869b49d37595f4560a64b34016951dc02f997 *powerpc64le-linux.elf/upx-3.95
" "
########## end .sha256sums.recreate ########## end .sha256sums.recreate
+2 -1
View File
@@ -119,11 +119,12 @@ cd testsuite_1 || exit 1
#*********************************************************************** #***********************************************************************
run_upx() { run_upx() {
local flags="--disable-random-id --fake-stub-version=5.01 --fake-stub-year=2025"
local ec=0 local ec=0
if [[ $UPX_TESTSUITE_VERBOSE == 1 ]]; then if [[ $UPX_TESTSUITE_VERBOSE == 1 ]]; then
echo "LOG: '${run_upx[*]}' $*" echo "LOG: '${run_upx[*]}' $*"
fi fi
"${run_upx[@]}" "$@" || ec=$? "${run_upx[@]}" $flags "$@" || ec=$?
if [[ $ec != 0 ]]; then if [[ $ec != 0 ]]; then
echo "FATAL: '${run_upx[*]}' $*" echo "FATAL: '${run_upx[*]}' $*"
echo " (exit code was $ec)" echo " (exit code was $ec)"
+6
View File
@@ -9,6 +9,12 @@
Memcheck:Cond Memcheck:Cond
fun:enframe fun:enframe
} }
{
musl-malloc-get_nominal_size
Memcheck:Cond
fun:get_nominal_size
fun:__libc_free
}
# these are only needed for older musl versions # these are only needed for older musl versions
+9 -9
View File
@@ -25,11 +25,11 @@ endif
.SECONDEXPANSION: .SECONDEXPANSION:
.SUFFIXES: .SUFFIXES:
build/debug build/release build/all: PHONY; $(MAKE) -C $(top_srcdir) $@ build/debug build/release build/all: PHONY; $(MAKE) -C "$(top_srcdir)" $@
build/debug+test build/release+test build/all+test: PHONY; $(MAKE) -C $(top_srcdir) $@ build/debug+test build/release+test build/all+test: PHONY; $(MAKE) -C "$(top_srcdir)" $@
# shortcuts # shortcuts
debug release all: PHONY; $(MAKE) -C $(top_srcdir) $@ debug release all: PHONY; $(MAKE) -C "$(top_srcdir)" $@
debug+test release+test all+test: PHONY; $(MAKE) -C $(top_srcdir) $@ debug+test release+test all+test: PHONY; $(MAKE) -C "$(top_srcdir)" $@
test: $$(patsubst %+test,%,$$(.DEFAULT_GOAL))+test PHONY test: $$(patsubst %+test,%,$$(.DEFAULT_GOAL))+test PHONY
@@ -61,11 +61,11 @@ run-testsuite-%: export upx_testsuite_SRCDIR := $(upx_testsuite_SRCDIR)
run-testsuite-debug: export upx_testsuite_BUILDDIR := ./tmp-upx-testsuite-debug run-testsuite-debug: export upx_testsuite_BUILDDIR := ./tmp-upx-testsuite-debug
run-testsuite-debug: export upx_exe := $(top_srcdir)/build/debug/upx run-testsuite-debug: export upx_exe := $(top_srcdir)/build/debug/upx
run-testsuite-debug: build/debug PHONY run-testsuite-debug: build/debug PHONY
time -p bash $(top_srcdir)/misc/testsuite/upx_testsuite_1.sh time -p bash "$(top_srcdir)/misc/testsuite/upx_testsuite_1.sh"
run-testsuite-release: export upx_testsuite_BUILDDIR := ./tmp-upx-testsuite-release run-testsuite-release: export upx_testsuite_BUILDDIR := ./tmp-upx-testsuite-release
run-testsuite-release: export upx_exe := $(top_srcdir)/build/release/upx run-testsuite-release: export upx_exe := $(top_srcdir)/build/release/upx
run-testsuite-release: build/release PHONY run-testsuite-release: build/release PHONY
time -p bash $(top_srcdir)/misc/testsuite/upx_testsuite_1.sh time -p bash "$(top_srcdir)/misc/testsuite/upx_testsuite_1.sh"
endif endif
endif endif
@@ -75,9 +75,9 @@ endif
ifneq ($(wildcard /usr/bin/env),) # need Unix utils like bash, perl, sed, xargs, etc. ifneq ($(wildcard /usr/bin/env),) # need Unix utils like bash, perl, sed, xargs, etc.
CHECK_WHITESPACE = bash $(top_srcdir)/misc/scripts/check_whitespace.sh $(top_srcdir) CHECK_WHITESPACE = bash "$(top_srcdir)/misc/scripts/check_whitespace.sh" "$(top_srcdir)"
ifneq ($(wildcard $(top_srcdir)/.git/.),) ifneq ($(wildcard $(top_srcdir)/.git/.),)
CHECK_WHITESPACE = bash $(top_srcdir)/misc/scripts/check_whitespace_git.sh $(top_srcdir) CHECK_WHITESPACE = bash "$(top_srcdir)/misc/scripts/check_whitespace_git.sh" "$(top_srcdir)"
endif endif
check-whitespace: PHONY; $(CHECK_WHITESPACE) check-whitespace: PHONY; $(CHECK_WHITESPACE)
@@ -100,7 +100,7 @@ CLANG_FORMAT_FILES += $(sort $(wildcard ../misc/cmake/try_compile/*.[ch]*))
CLANG_FORMAT_FILES := $(sort $(filter-out $(CLANG_FORMAT_EXCLUDE_FILES),$(CLANG_FORMAT_FILES))) CLANG_FORMAT_FILES := $(sort $(filter-out $(CLANG_FORMAT_EXCLUDE_FILES),$(CLANG_FORMAT_FILES)))
clang-format: $(CLANG_FORMAT_FILES) PHONY clang-format: $(CLANG_FORMAT_FILES) PHONY
@echo "running upx-clang-format" @echo "running upx-clang-format"
@bash $(top_srcdir)/misc/scripts/upx-clang-format.sh -i $(CLANG_FORMAT_FILES) @bash "$(top_srcdir)/misc/scripts/upx-clang-format.sh" -i $(CLANG_FORMAT_FILES)
endif # Linux endif # Linux
endif # /usr/bin/env endif # /usr/bin/env
+31 -14
View File
@@ -32,8 +32,9 @@
// NE - Native Endianness (aka Host Endianness aka CPU Endianness) // NE - Native Endianness (aka Host Endianness aka CPU Endianness)
// TE - Target Endianness (not used here, see various packers) // TE - Target Endianness (not used here, see various packers)
static_assert(std::is_same_v<upx_uint32_t, unsigned>);
static_assert(std::is_same_v<byte, unsigned char>); static_assert(std::is_same_v<byte, unsigned char>);
static_assert(std::is_same_v<upx_int32_t, int>);
static_assert(std::is_same_v<upx_uint32_t, unsigned>);
#if defined(upx_is_constant_evaluated) #if defined(upx_is_constant_evaluated)
#define bele_constexpr constexpr #define bele_constexpr constexpr
@@ -294,13 +295,15 @@ forceinline constexpr upx_uint64_t no_bswap64(upx_uint64_t v) noexcept { return
#define ne16_to_le16(v) bswap16(v) #define ne16_to_le16(v) bswap16(v)
#define ne32_to_le32(v) bswap32(v) #define ne32_to_le32(v) bswap32(v)
#define ne64_to_le64(v) bswap64(v) #define ne64_to_le64(v) bswap64(v)
#else #elif (ACC_ABI_LITTLE_ENDIAN)
#define ne16_to_be16(v) bswap16(v) #define ne16_to_be16(v) bswap16(v)
#define ne32_to_be32(v) bswap32(v) #define ne32_to_be32(v) bswap32(v)
#define ne64_to_be64(v) bswap64(v) #define ne64_to_be64(v) bswap64(v)
#define ne16_to_le16(v) no_bswap16(v) #define ne16_to_le16(v) no_bswap16(v)
#define ne32_to_le32(v) no_bswap32(v) #define ne32_to_le32(v) no_bswap32(v)
#define ne64_to_le64(v) no_bswap64(v) #define ne64_to_le64(v) no_bswap64(v)
#else
#error "ACC_ABI_ENDIAN"
#endif #endif
/************************************************************************* /*************************************************************************
@@ -359,8 +362,12 @@ inline constexpr unsigned get_be24(const byte *p) noexcept {
inline constexpr unsigned get_le24(const byte *p) noexcept { inline constexpr unsigned get_le24(const byte *p) noexcept {
return upx::compile_time::get_le24(p); return upx::compile_time::get_le24(p);
} }
inline constexpr unsigned get_ne24(const byte *p) noexcept {
return upx::compile_time::get_ne24(p);
}
inline constexpr void set_be24(byte *p, unsigned v) noexcept { upx::compile_time::set_be24(p, v); } inline constexpr void set_be24(byte *p, unsigned v) noexcept { upx::compile_time::set_be24(p, v); }
inline constexpr void set_le24(byte *p, unsigned v) noexcept { upx::compile_time::set_le24(p, v); } inline constexpr void set_le24(byte *p, unsigned v) noexcept { upx::compile_time::set_le24(p, v); }
inline constexpr void set_ne24(byte *p, unsigned v) noexcept { upx::compile_time::set_ne24(p, v); }
REQUIRE_XE24 REQUIRE_XE24
forceinline bele_constexpr unsigned get_be24(const XE24 *p) noexcept { forceinline bele_constexpr unsigned get_be24(const XE24 *p) noexcept {
@@ -371,6 +378,10 @@ forceinline bele_constexpr unsigned get_le24(const XE24 *p) noexcept {
return get_le24(upx::ptr_static_cast<const byte *>(p)); return get_le24(upx::ptr_static_cast<const byte *>(p));
} }
REQUIRE_XE24 REQUIRE_XE24
forceinline bele_constexpr unsigned get_ne24(const XE24 *p) noexcept {
return get_ne24(upx::ptr_static_cast<const byte *>(p));
}
REQUIRE_XE24
forceinline bele_constexpr void set_be24(XE24 *p, unsigned v) noexcept { forceinline bele_constexpr void set_be24(XE24 *p, unsigned v) noexcept {
set_be24(upx::ptr_static_cast<byte *>(p), v); set_be24(upx::ptr_static_cast<byte *>(p), v);
} }
@@ -378,6 +389,10 @@ REQUIRE_XE24
forceinline bele_constexpr void set_le24(XE24 *p, unsigned v) noexcept { forceinline bele_constexpr void set_le24(XE24 *p, unsigned v) noexcept {
set_le24(upx::ptr_static_cast<byte *>(p), v); set_le24(upx::ptr_static_cast<byte *>(p), v);
} }
REQUIRE_XE24
forceinline bele_constexpr void set_ne24(XE24 *p, unsigned v) noexcept {
set_ne24(upx::ptr_static_cast<byte *>(p), v);
}
REQUIRE_XE32 REQUIRE_XE32
inline bele_constexpr unsigned get_le26(const XE32 *p) noexcept { return get_le32(p) & 0x03ffffff; } inline bele_constexpr unsigned get_le26(const XE32 *p) noexcept { return get_le32(p) & 0x03ffffff; }
@@ -411,7 +426,7 @@ inline bele_constexpr void set_le14_5(XE32 *p, unsigned v) noexcept {
// get signed values // get signed values
**************************************************************************/ **************************************************************************/
forceinline constexpr int sign_extend(unsigned v, unsigned bits) noexcept { forceinline constexpr int sign_extend32(unsigned v, unsigned bits) noexcept {
#if (ACC_ARCH_M68K) // no barrel shifter #if (ACC_ARCH_M68K) // no barrel shifter
const unsigned sign_bit = 1u << (bits - 1); const unsigned sign_bit = 1u << (bits - 1);
return ACC_ICAST(int, (v & (sign_bit - 1)) - (v & sign_bit)); return ACC_ICAST(int, (v & (sign_bit - 1)) - (v & sign_bit));
@@ -420,7 +435,7 @@ forceinline constexpr int sign_extend(unsigned v, unsigned bits) noexcept {
#endif #endif
} }
forceinline constexpr upx_int64_t sign_extend(upx_uint64_t v, unsigned bits) noexcept { forceinline constexpr upx_int64_t sign_extend64(upx_uint64_t v, unsigned bits) noexcept {
#if (ACC_ARCH_M68K) // no barrel shifter #if (ACC_ARCH_M68K) // no barrel shifter
const upx_uint64_t sign_bit = upx_uint64_t(1) << (bits - 1); const upx_uint64_t sign_bit = upx_uint64_t(1) << (bits - 1);
return ACC_ICAST(upx_int64_t, (v & (sign_bit - 1)) - (v & sign_bit)); return ACC_ICAST(upx_int64_t, (v & (sign_bit - 1)) - (v & sign_bit));
@@ -432,49 +447,49 @@ forceinline constexpr upx_int64_t sign_extend(upx_uint64_t v, unsigned bits) noe
REQUIRE_XE16 REQUIRE_XE16
inline bele_constexpr int get_be16_signed(const XE16 *p) noexcept { inline bele_constexpr int get_be16_signed(const XE16 *p) noexcept {
unsigned v = get_be16(p); unsigned v = get_be16(p);
return sign_extend(v, 16); return sign_extend32(v, 16);
} }
REQUIRE_XE24 REQUIRE_XE24
inline bele_constexpr int get_be24_signed(const XE24 *p) noexcept { inline bele_constexpr int get_be24_signed(const XE24 *p) noexcept {
unsigned v = get_be24(p); unsigned v = get_be24(p);
return sign_extend(v, 24); return sign_extend32(v, 24);
} }
REQUIRE_XE32 REQUIRE_XE32
inline bele_constexpr int get_be32_signed(const XE32 *p) noexcept { inline bele_constexpr int get_be32_signed(const XE32 *p) noexcept {
unsigned v = get_be32(p); unsigned v = get_be32(p);
return sign_extend(v, 32); return sign_extend32(v, 32);
} }
REQUIRE_XE64 REQUIRE_XE64
inline bele_constexpr upx_int64_t get_be64_signed(const XE64 *p) noexcept { inline bele_constexpr upx_int64_t get_be64_signed(const XE64 *p) noexcept {
upx_uint64_t v = get_be64(p); upx_uint64_t v = get_be64(p);
return sign_extend(v, 64); return sign_extend64(v, 64);
} }
REQUIRE_XE16 REQUIRE_XE16
inline bele_constexpr int get_le16_signed(const XE16 *p) noexcept { inline bele_constexpr int get_le16_signed(const XE16 *p) noexcept {
unsigned v = get_le16(p); unsigned v = get_le16(p);
return sign_extend(v, 16); return sign_extend32(v, 16);
} }
REQUIRE_XE24 REQUIRE_XE24
inline bele_constexpr int get_le24_signed(const XE24 *p) noexcept { inline bele_constexpr int get_le24_signed(const XE24 *p) noexcept {
unsigned v = get_le24(p); unsigned v = get_le24(p);
return sign_extend(v, 24); return sign_extend32(v, 24);
} }
REQUIRE_XE32 REQUIRE_XE32
inline bele_constexpr int get_le32_signed(const XE32 *p) noexcept { inline bele_constexpr int get_le32_signed(const XE32 *p) noexcept {
unsigned v = get_le32(p); unsigned v = get_le32(p);
return sign_extend(v, 32); return sign_extend32(v, 32);
} }
REQUIRE_XE64 REQUIRE_XE64
inline bele_constexpr upx_int64_t get_le64_signed(const XE64 *p) noexcept { inline bele_constexpr upx_int64_t get_le64_signed(const XE64 *p) noexcept {
upx_uint64_t v = get_le64(p); upx_uint64_t v = get_le64(p);
return sign_extend(v, 64); return sign_extend64(v, 64);
} }
/************************************************************************* /*************************************************************************
@@ -1084,7 +1099,7 @@ TT_UPX_IS_INTEGRAL(LE32);
TT_UPX_IS_INTEGRAL(LE64); TT_UPX_IS_INTEGRAL(LE64);
#undef TT_UPX_IS_INTEGRAL #undef TT_UPX_IS_INTEGRAL
// native types // NE - Native Endianness (aka Host Endianness aka CPU Endianness)
#if (ACC_ABI_BIG_ENDIAN) #if (ACC_ABI_BIG_ENDIAN)
typedef BE16 NE16; typedef BE16 NE16;
typedef BE32 NE32; typedef BE32 NE32;
@@ -1095,7 +1110,7 @@ typedef BE64 NE64;
#define ne16_compare_signed be16_compare_signed #define ne16_compare_signed be16_compare_signed
#define ne32_compare_signed be32_compare_signed #define ne32_compare_signed be32_compare_signed
#define ne64_compare_signed be64_compare_signed #define ne64_compare_signed be64_compare_signed
#else #elif (ACC_ABI_LITTLE_ENDIAN)
typedef LE16 NE16; typedef LE16 NE16;
typedef LE32 NE32; typedef LE32 NE32;
typedef LE64 NE64; typedef LE64 NE64;
@@ -1105,6 +1120,8 @@ typedef LE64 NE64;
#define ne16_compare_signed le16_compare_signed #define ne16_compare_signed le16_compare_signed
#define ne32_compare_signed le32_compare_signed #define ne32_compare_signed le32_compare_signed
#define ne64_compare_signed le64_compare_signed #define ne64_compare_signed le64_compare_signed
#else
#error "ACC_ABI_ENDIAN"
#endif #endif
/************************************************************************* /*************************************************************************
+3 -3
View File
@@ -135,7 +135,7 @@ struct BEPolicy final
S u32_compare_signed(const void *a, const void *b) C { return be32_compare_signed(a, b); } S u32_compare_signed(const void *a, const void *b) C { return be32_compare_signed(a, b); }
S u64_compare_signed(const void *a, const void *b) C { return be64_compare_signed(a, b); } S u64_compare_signed(const void *a, const void *b) C { return be64_compare_signed(a, b); }
static void compileTimeAssertions() { static void compileTimeAssertions() noexcept {
COMPILE_TIME_ASSERT(sizeof(U16) == 2) COMPILE_TIME_ASSERT(sizeof(U16) == 2)
COMPILE_TIME_ASSERT(sizeof(U32) == 4) COMPILE_TIME_ASSERT(sizeof(U32) == 4)
COMPILE_TIME_ASSERT(sizeof(U64) == 8) COMPILE_TIME_ASSERT(sizeof(U64) == 8)
@@ -194,7 +194,7 @@ struct LEPolicy final
S u32_compare_signed(const void *a, const void *b) C { return le32_compare_signed(a, b); } S u32_compare_signed(const void *a, const void *b) C { return le32_compare_signed(a, b); }
S u64_compare_signed(const void *a, const void *b) C { return le64_compare_signed(a, b); } S u64_compare_signed(const void *a, const void *b) C { return le64_compare_signed(a, b); }
static void compileTimeAssertions() { static void compileTimeAssertions() noexcept {
COMPILE_TIME_ASSERT(sizeof(U16) == 2) COMPILE_TIME_ASSERT(sizeof(U16) == 2)
COMPILE_TIME_ASSERT(sizeof(U32) == 4) COMPILE_TIME_ASSERT(sizeof(U32) == 4)
COMPILE_TIME_ASSERT(sizeof(U64) == 8) COMPILE_TIME_ASSERT(sizeof(U64) == 8)
@@ -210,7 +210,7 @@ private:
UPX_CXX_DISABLE_NEW_DELETE(LEPolicy) UPX_CXX_DISABLE_NEW_DELETE(LEPolicy)
}; };
// Native Endianness policy (aka host policy) // NE - Native Endianness policy (aka Host Policy)
#if (ACC_ABI_BIG_ENDIAN) #if (ACC_ABI_BIG_ENDIAN)
typedef BEPolicy NEPolicy; typedef BEPolicy NEPolicy;
typedef BEPolicy HostPolicy; typedef BEPolicy HostPolicy;
+51 -52
View File
@@ -158,8 +158,8 @@ static_assert(8 * sizeof(int) == __INT_WIDTH__, "");
#if defined(__LONG_WIDTH__) #if defined(__LONG_WIDTH__)
static_assert(8 * sizeof(long) == __LONG_WIDTH__, ""); static_assert(8 * sizeof(long) == __LONG_WIDTH__, "");
#endif #endif
#if defined(__LONG_LONG_WIDTH__) #if defined(__LLONG_WIDTH__)
static_assert(8 * sizeof(long long) == __LONG_LONG_WIDTH__, ""); static_assert(8 * sizeof(long long) == __LLONG_WIDTH__, "");
#endif #endif
#if defined(__INTMAX_WIDTH__) #if defined(__INTMAX_WIDTH__)
static_assert(8 * sizeof(intmax_t) == __INTMAX_WIDTH__, ""); static_assert(8 * sizeof(intmax_t) == __INTMAX_WIDTH__, "");
@@ -255,19 +255,6 @@ static_assert(std::is_unsigned<expected_ptraddr_t>::value, "");
ASSERT_SAME_TYPE(upx_ptraddr_t, expected_ptraddr_t); ASSERT_SAME_TYPE(upx_ptraddr_t, expected_ptraddr_t);
#endif #endif
#if defined(__INTPTR_TYPE__) && defined(__UINTPTR_TYPE__)
#if defined(__m68k__) && defined(__atarist__) && defined(__GNUC__)
// BUG: compiler/mintlib mismatch: int vs long
#elif (defined(__arm__) || defined(__mips__)) && defined(__linux__) && defined(__clang__) && \
(__SIZEOF_LONG__ == 4)
// BUG: compiler/libc mismatch: int vs long
// TODO later: check zig and clang for possible misconfiguration under 32-bit arm & mips
#else
ASSERT_SAME_TYPE(intptr_t, expected_intptr_t);
ASSERT_SAME_TYPE(uintptr_t, expected_uintptr_t);
#endif // BUG
#endif
// UPX types // UPX types
ASSERT_SAME_TYPE(signed char, upx_int8_t); ASSERT_SAME_TYPE(signed char, upx_int8_t);
ASSERT_SAME_TYPE(unsigned char, upx_uint8_t); ASSERT_SAME_TYPE(unsigned char, upx_uint8_t);
@@ -275,7 +262,7 @@ ASSERT_SAME_TYPE(short, upx_int16_t);
ASSERT_SAME_TYPE(unsigned short, upx_uint16_t); ASSERT_SAME_TYPE(unsigned short, upx_uint16_t);
ASSERT_SAME_TYPE(int, upx_int32_t); ASSERT_SAME_TYPE(int, upx_int32_t);
ASSERT_SAME_TYPE(unsigned, upx_uint32_t); ASSERT_SAME_TYPE(unsigned, upx_uint32_t);
#if (__SIZEOF_LONG_LONG__ + 0 < 128) #if (__SIZEOF_LONG_LONG__ + 0 < 16)
ASSERT_SAME_TYPE(long long, upx_int64_t); ASSERT_SAME_TYPE(long long, upx_int64_t);
ASSERT_SAME_TYPE(unsigned long long, upx_uint64_t); ASSERT_SAME_TYPE(unsigned long long, upx_uint64_t);
#endif #endif
@@ -296,18 +283,18 @@ static_assert(bswap32(bswap32(0xf4f3f2f1)) == no_bswap32(0xf4f3f2f1));
static_assert(bswap64(bswap64(0xf8f7f6f5f4f3f2f1ull)) == no_bswap64(0xf8f7f6f5f4f3f2f1ull)); static_assert(bswap64(bswap64(0xf8f7f6f5f4f3f2f1ull)) == no_bswap64(0xf8f7f6f5f4f3f2f1ull));
#endif #endif
static_assert(sign_extend(0u + 0, 8) == 0); static_assert(sign_extend32(0u + 0, 8) == 0);
static_assert(sign_extend(0u + 1, 8) == 1); static_assert(sign_extend32(0u + 1, 8) == 1);
static_assert(sign_extend(0u + 127, 8) == 127); static_assert(sign_extend32(0u + 127, 8) == 127);
static_assert(sign_extend(0u + 128, 8) == -128); static_assert(sign_extend32(0u + 128, 8) == -128);
static_assert(sign_extend(0u - 1, 8) == -1); static_assert(sign_extend32(0u - 1, 8) == -1);
static_assert(sign_extend(0u + 256, 8) == 0); static_assert(sign_extend32(0u + 256, 8) == 0);
static_assert(sign_extend(0u + 257, 8) == 1); static_assert(sign_extend32(0u + 257, 8) == 1);
static_assert(sign_extend(0u + 383, 8) == 127); static_assert(sign_extend32(0u + 383, 8) == 127);
static_assert(sign_extend(0u + 384, 8) == -128); static_assert(sign_extend32(0u + 384, 8) == -128);
static_assert(sign_extend(0u + 511, 8) == -1); static_assert(sign_extend32(0u + 511, 8) == -1);
static_assert(sign_extend(upx_uint64_t(0) + 0, 1) == 0); static_assert(sign_extend64(upx_uint64_t(0) + 0, 1) == 0);
static_assert(sign_extend(upx_uint64_t(0) + 1, 1) == -1); static_assert(sign_extend64(upx_uint64_t(0) + 1, 1) == -1);
static_assert(CHAR_BIT == 8); static_assert(CHAR_BIT == 8);
#if 0 // does not work with MSVC #if 0 // does not work with MSVC
@@ -727,6 +714,7 @@ template <class A, class B>
static forceinline bool testNoAliasing(A *a, B *b) noexcept { static forceinline bool testNoAliasing(A *a, B *b) noexcept {
return TestNoAliasingStruct<A, B>::test(a, b); return TestNoAliasingStruct<A, B>::test(a, b);
} }
template <class T> template <class T>
struct TestIntegerWrap { // check working -fno-strict-overflow struct TestIntegerWrap { // check working -fno-strict-overflow
static inline bool inc_gt(const T x) noexcept { return x + 1 > x; } static inline bool inc_gt(const T x) noexcept { return x + 1 > x; }
@@ -1113,14 +1101,14 @@ void upx_compiler_sanity_check(void) noexcept {
assert_noexcept(TestBELE<BE32>::test()); assert_noexcept(TestBELE<BE32>::test());
assert_noexcept(TestBELE<BE64>::test()); assert_noexcept(TestBELE<BE64>::test());
{ {
alignas(16) static constexpr byte dd[32] = { alignas(16) static constexpr const byte dd[32] = {
0, 0, 0, 0, 0, 0, 0, 0xff, 0xfe, 0xfd, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8, 0, 0, 0, 0, 0, 0, 0, 0, 0xff, 0xfe, 0xfd, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8, 0,
0, 0, 0, 0x7f, 0x7e, 0x7d, 0x7c, 0x7b, 0x7a, 0x79, 0x78, 0, 0, 0, 0, 0}; 0, 0, 0, 0x7f, 0x7e, 0x7d, 0x7c, 0x7b, 0x7a, 0x79, 0x78, 0, 0, 0, 0, 0};
constexpr const byte *d = dd + 7;
#if !defined(upx_fake_alignas_16) #if !defined(upx_fake_alignas_16)
assert_noexcept(ptr_is_aligned<16>(dd)); assert_noexcept(ptr_is_aligned<16>(dd));
assert_noexcept(ptr_is_aligned(dd, 16)); assert_noexcept(ptr_is_aligned(dd, 16));
#endif #endif
constexpr const byte *d = dd + 7;
static_assert(upx::compile_time::get_be16(d) == 0xfffe); static_assert(upx::compile_time::get_be16(d) == 0xfffe);
static_assert(upx::compile_time::get_be24(d) == 0xfffefd); static_assert(upx::compile_time::get_be24(d) == 0xfffefd);
static_assert(upx::compile_time::get_be32(d) == 0xfffefdfc); static_assert(upx::compile_time::get_be32(d) == 0xfffefdfc);
@@ -1129,10 +1117,10 @@ void upx_compiler_sanity_check(void) noexcept {
static_assert(upx::compile_time::get_le24(d) == 0xfdfeff); static_assert(upx::compile_time::get_le24(d) == 0xfdfeff);
static_assert(upx::compile_time::get_le32(d) == 0xfcfdfeff); static_assert(upx::compile_time::get_le32(d) == 0xfcfdfeff);
static_assert(upx::compile_time::get_le64(d) == 0xf8f9fafbfcfdfeffULL); static_assert(upx::compile_time::get_le64(d) == 0xf8f9fafbfcfdfeffULL);
const N_BELE_RTP::AbstractPolicy *bele;
assert_noexcept(upx_adler32(d, 4) == 0x09f003f7); assert_noexcept(upx_adler32(d, 4) == 0x09f003f7);
assert_noexcept(upx_adler32(d, 4, 0) == 0x09ec03f6); assert_noexcept(upx_adler32(d, 4, 0) == 0x09ec03f6);
assert_noexcept(upx_adler32(d, 4, 1) == 0x09f003f7); assert_noexcept(upx_adler32(d, 4, 1) == 0x09f003f7);
const N_BELE_RTP::AbstractPolicy *bele;
bele = &N_BELE_RTP::be_policy; bele = &N_BELE_RTP::be_policy;
assert_noexcept(get_be16(d) == 0xfffe); assert_noexcept(get_be16(d) == 0xfffe);
assert_noexcept(bele->get16(d) == 0xfffe); assert_noexcept(bele->get16(d) == 0xfffe);
@@ -1144,6 +1132,7 @@ void upx_compiler_sanity_check(void) noexcept {
assert_noexcept(bele->get32(d) == 0xfffefdfc); assert_noexcept(bele->get32(d) == 0xfffefdfc);
assert_noexcept(get_be32_signed(d) == -66052); assert_noexcept(get_be32_signed(d) == -66052);
assert_noexcept(get_be64(d) == 0xfffefdfcfbfaf9f8ULL); assert_noexcept(get_be64(d) == 0xfffefdfcfbfaf9f8ULL);
assert_noexcept(bele->get64(d) == 0xfffefdfcfbfaf9f8ULL);
assert_noexcept(get_be64_signed(d) == -283686952306184LL); assert_noexcept(get_be64_signed(d) == -283686952306184LL);
bele = &N_BELE_RTP::le_policy; bele = &N_BELE_RTP::le_policy;
assert_noexcept(get_le16(d) == 0xfeff); assert_noexcept(get_le16(d) == 0xfeff);
@@ -1156,6 +1145,7 @@ void upx_compiler_sanity_check(void) noexcept {
assert_noexcept(bele->get32(d) == 0xfcfdfeff); assert_noexcept(bele->get32(d) == 0xfcfdfeff);
assert_noexcept(get_le32_signed(d) == -50462977); assert_noexcept(get_le32_signed(d) == -50462977);
assert_noexcept(get_le64(d) == 0xf8f9fafbfcfdfeffULL); assert_noexcept(get_le64(d) == 0xf8f9fafbfcfdfeffULL);
assert_noexcept(bele->get64(d) == 0xf8f9fafbfcfdfeffULL);
assert_noexcept(get_le64_signed(d) == -506097522914230529LL); assert_noexcept(get_le64_signed(d) == -506097522914230529LL);
static_assert(get_be24(d) == 0xfffefd); static_assert(get_be24(d) == 0xfffefd);
static_assert(get_le24(d) == 0xfdfeff); static_assert(get_le24(d) == 0xfdfeff);
@@ -1222,29 +1212,33 @@ void upx_compiler_sanity_check(void) noexcept {
for (int i = 0; i < 256; i++) { for (int i = 0; i < 256; i++) {
{ {
const unsigned u = i; const unsigned u = i;
assert_noexcept(sign_extend(u, 1) == ((i & 1) ? -1 : 0)); assert_noexcept(sign_extend32(u, 1) == ((i & 1) ? -1 : 0));
assert_noexcept(sign_extend(u, 2) == ((i & 2) ? -2 + (i & 1) : (i & 1))); assert_noexcept(sign_extend32(u, 2) == ((i & 2) ? -2 + (i & 1) : (i & 1)));
assert_noexcept(sign_extend(u, 3) == ((i & 4) ? -4 + (i & 3) : (i & 3))); assert_noexcept(sign_extend32(u, 3) == ((i & 4) ? -4 + (i & 3) : (i & 3)));
assert_noexcept(sign_extend(u, 4) == ((i & 8) ? -8 + (i & 7) : (i & 7))); assert_noexcept(sign_extend32(u, 4) == ((i & 8) ? -8 + (i & 7) : (i & 7)));
assert_noexcept(sign_extend(u, 5) == ((i & 16) ? -16 + (i & 15) : (i & 15))); assert_noexcept(sign_extend32(u, 5) == ((i & 16) ? -16 + (i & 15) : (i & 15)));
assert_noexcept(sign_extend(u, 6) == ((i & 32) ? -32 + (i & 31) : (i & 31))); assert_noexcept(sign_extend32(u, 6) == ((i & 32) ? -32 + (i & 31) : (i & 31)));
assert_noexcept(sign_extend(u, 7) == ((i & 64) ? -64 + (i & 63) : (i & 63))); assert_noexcept(sign_extend32(u, 7) == ((i & 64) ? -64 + (i & 63) : (i & 63)));
assert_noexcept(sign_extend(u, 8) == ((i & 128) ? -128 + (i & 127) : (i & 127))); assert_noexcept(sign_extend32(u, 8) == ((i & 128) ? -128 + (i & 127) : (i & 127)));
assert_noexcept(sign_extend(u, 32) == i); assert_noexcept(sign_extend32(u, 9) == i);
assert_noexcept(sign_extend(0u - u, 32) == -i); assert_noexcept(sign_extend32(u, 32) == i);
assert_noexcept(sign_extend32(0u - u, 32) == -i);
} }
{ {
const upx_uint64_t u = i; const upx_uint64_t u = i;
assert_noexcept(sign_extend(u, 1) == ((i & 1) ? -1 : 0)); assert_noexcept(sign_extend64(u, 1) == ((i & 1) ? -1 : 0));
assert_noexcept(sign_extend(u, 2) == ((i & 2) ? -2 + (i & 1) : (i & 1))); assert_noexcept(sign_extend64(u, 2) == ((i & 2) ? -2 + (i & 1) : (i & 1)));
assert_noexcept(sign_extend(u, 3) == ((i & 4) ? -4 + (i & 3) : (i & 3))); assert_noexcept(sign_extend64(u, 3) == ((i & 4) ? -4 + (i & 3) : (i & 3)));
assert_noexcept(sign_extend(u, 4) == ((i & 8) ? -8 + (i & 7) : (i & 7))); assert_noexcept(sign_extend64(u, 4) == ((i & 8) ? -8 + (i & 7) : (i & 7)));
assert_noexcept(sign_extend(u, 5) == ((i & 16) ? -16 + (i & 15) : (i & 15))); assert_noexcept(sign_extend64(u, 5) == ((i & 16) ? -16 + (i & 15) : (i & 15)));
assert_noexcept(sign_extend(u, 6) == ((i & 32) ? -32 + (i & 31) : (i & 31))); assert_noexcept(sign_extend64(u, 6) == ((i & 32) ? -32 + (i & 31) : (i & 31)));
assert_noexcept(sign_extend(u, 7) == ((i & 64) ? -64 + (i & 63) : (i & 63))); assert_noexcept(sign_extend64(u, 7) == ((i & 64) ? -64 + (i & 63) : (i & 63)));
assert_noexcept(sign_extend(u, 8) == ((i & 128) ? -128 + (i & 127) : (i & 127))); assert_noexcept(sign_extend64(u, 8) == ((i & 128) ? -128 + (i & 127) : (i & 127)));
assert_noexcept(sign_extend(u, 64) == i); assert_noexcept(sign_extend64(u, 9) == i);
assert_noexcept(sign_extend(upx_uint64_t(0) - u, 64) == -i); assert_noexcept(sign_extend64(u, 32) == i);
assert_noexcept(sign_extend64(upx_uint64_t(0) - u, 32) == -i);
assert_noexcept(sign_extend64(u, 64) == i);
assert_noexcept(sign_extend64(upx_uint64_t(0) - u, 64) == -i);
} }
} }
} }
@@ -1298,6 +1292,9 @@ void upx_compiler_sanity_check(void) noexcept {
assert_noexcept(testNoAliasing(&u.v_int, &u.v_llong)); assert_noexcept(testNoAliasing(&u.v_int, &u.v_llong));
assert_noexcept(testNoAliasing(&u.v_long, &u.v_llong)); assert_noexcept(testNoAliasing(&u.v_long, &u.v_llong));
#if 1 && (ACC_CC_MSC) && (defined(_M_ARM64) || defined(_M_ARM64EC))
// @COMPILER_BUG @MSVC_BUG
#else
assert_noexcept(TestIntegerWrap<unsigned>::inc_gt(0)); assert_noexcept(TestIntegerWrap<unsigned>::inc_gt(0));
assert_noexcept(!TestIntegerWrap<unsigned>::inc_gt(UINT_MAX)); assert_noexcept(!TestIntegerWrap<unsigned>::inc_gt(UINT_MAX));
assert_noexcept(TestIntegerWrap<unsigned>::dec_lt(1)); assert_noexcept(TestIntegerWrap<unsigned>::dec_lt(1));
@@ -1314,6 +1311,7 @@ void upx_compiler_sanity_check(void) noexcept {
assert_noexcept(!TestIntegerWrap<int>::neg_eq(1)); assert_noexcept(!TestIntegerWrap<int>::neg_eq(1));
assert_noexcept(!TestIntegerWrap<int>::neg_eq(INT_MAX)); assert_noexcept(!TestIntegerWrap<int>::neg_eq(INT_MAX));
assert_noexcept(TestIntegerWrap<int>::neg_eq(INT_MIN)); // special case assert_noexcept(TestIntegerWrap<int>::neg_eq(INT_MIN)); // special case
#endif
} }
/************************************************************************* /*************************************************************************
@@ -1469,7 +1467,8 @@ TEST_CASE("libc qsort") {
return true; return true;
} }
}; };
constexpr size_t N = 4096;
constexpr size_t N = 256;
Elem e[N]; Elem e[N];
for (size_t n = 0; n <= N; n = 2 * n + 1) { for (size_t n = 0; n <= N; n = 2 * n + 1) {
// system sort functions // system sort functions
+7 -5
View File
@@ -558,7 +558,8 @@ TEST_CASE("upx::ObjectDeleter 1") {
LE32 *a = nullptr; // array LE32 *a = nullptr; // array
LE64 *m = nullptr; // malloc LE64 *m = nullptr; // malloc
{ {
auto o_deleter = upx::ObjectDeleter(&o, 1); // auto o_deleter = upx::ObjectDeleter(&o, 1);
upx::ObjectDeleter<LE16> o_deleter = upx::ObjectDeleter(&o, 1);
o = new LE16; o = new LE16;
assert(o != nullptr); assert(o != nullptr);
auto a_deleter = upx::ArrayDeleter(&a, 1); auto a_deleter = upx::ArrayDeleter(&a, 1);
@@ -594,7 +595,8 @@ TEST_CASE("upx::ObjectDeleter 2") {
BE32 *a[N]; // multiple arrays BE32 *a[N]; // multiple arrays
BE64 *m[N]; // multiple mallocs BE64 *m[N]; // multiple mallocs
{ {
auto o_deleter = upx::ObjectDeleter(o, 0); // auto o_deleter = upx::ObjectDeleter(o, 0);
upx::ObjectDeleter<BE16> o_deleter = upx::ObjectDeleter(o, 0);
auto a_deleter = upx::ArrayDeleter(a, 0); auto a_deleter = upx::ArrayDeleter(a, 0);
auto m_deleter = upx::MallocDeleter(m, 0); auto m_deleter = upx::MallocDeleter(m, 0);
for (size_t i = 0; i < N; i++) { for (size_t i = 0; i < N; i++) {
@@ -768,7 +770,7 @@ static_assert(sizeof(TestCT) == 8);
static_assert(alignof(TestCT) == 1); static_assert(alignof(TestCT) == 1);
} // namespace } // namespace
TEST_CASE("upx::compile_time") { TEST_CASE("upx::compile_time 1") {
constexpr upx_uint16_t v16 = 0x0201; constexpr upx_uint16_t v16 = 0x0201;
constexpr upx_uint32_t v24 = 0x030201; constexpr upx_uint32_t v24 = 0x030201;
constexpr upx_uint32_t v32 = 0x04030201; constexpr upx_uint32_t v32 = 0x04030201;
@@ -865,7 +867,7 @@ TEST_CASE("upx::compile_time") {
constexpr auto le64 = TestCT::makeLE64(v64); constexpr auto le64 = TestCT::makeLE64(v64);
static_assert(upx::compile_time::get_le64(le64.d) == v64); static_assert(upx::compile_time::get_le64(le64.d) == v64);
static_assert(mem_eq(le64.d, "\x01\x02\x03\x04\x05\x06\x07\x08", 8)); static_assert(mem_eq(le64.d, "\x01\x02\x03\x04\x05\x06\x07\x08", 8));
memset(buf, 0, 8); upx::compile_time::mem_clear(buf, 8);
TestCT::noinline_set_le64(buf, v64); TestCT::noinline_set_le64(buf, v64);
assert_noexcept(TestCT::noinline_get_le64(buf) == v64); assert_noexcept(TestCT::noinline_get_le64(buf) == v64);
assert_noexcept(upx::compile_time::get_le64(buf) == v64); assert_noexcept(upx::compile_time::get_le64(buf) == v64);
@@ -886,7 +888,7 @@ TEST_CASE("upx::compile_time") {
} }
} }
TEST_CASE("upx::compile_time") { TEST_CASE("upx::compile_time 2") {
constexpr upx_uint16_t v16 = 0xf2f1; constexpr upx_uint16_t v16 = 0xf2f1;
constexpr upx_uint32_t v24 = 0xf3f2f1; constexpr upx_uint32_t v24 = 0xf3f2f1;
constexpr upx_uint32_t v32 = 0xf4f3f2f1; constexpr upx_uint32_t v32 = 0xf4f3f2f1;
+2
View File
@@ -68,7 +68,9 @@
#endif #endif
#endif #endif
// NOLINTBEGIN(bugprone-unintended-char-ostream-output)
#include <doctest/doctest/parts/doctest.cpp> #include <doctest/doctest/parts/doctest.cpp>
// NOLINTEND(bugprone-unintended-char-ostream-output)
#endif // DOCTEST_CONFIG_DISABLE #endif // DOCTEST_CONFIG_DISABLE
+189 -6
View File
@@ -101,9 +101,6 @@ TEST_CASE("basic xspan usage") {
CHECK(b0.raw_size_in_bytes() == 0u); CHECK(b0.raw_size_in_bytes() == 0u);
CHECK(bp.raw_size_in_bytes() == 0u); CHECK(bp.raw_size_in_bytes() == 0u);
#endif #endif
CHECK(raw_bytes(b0, 999999) == buf);
CHECK(raw_bytes(bp, 999999) == buf);
CHECK(raw_bytes(c0, 4) == buf); CHECK(raw_bytes(c0, 4) == buf);
CHECK(raw_index_bytes(c0, 1, 3) == buf + 1); CHECK(raw_index_bytes(c0, 1, 3) == buf + 1);
CHECK(raw_bytes(cp, 4) == buf); CHECK(raw_bytes(cp, 4) == buf);
@@ -180,9 +177,6 @@ TEST_CASE("basic xspan usage") {
CHECK(b0.raw_size_in_bytes() == 0u); CHECK(b0.raw_size_in_bytes() == 0u);
CHECK(bp.raw_size_in_bytes() == 0u); CHECK(bp.raw_size_in_bytes() == 0u);
#endif #endif
CHECK(raw_bytes(b0, 999999) == buf);
CHECK(raw_bytes(bp, 999999) == buf);
CHECK(raw_bytes(c0, 4) == buf); CHECK(raw_bytes(c0, 4) == buf);
CHECK(raw_index_bytes(c0, 1, 3) == buf + 1); CHECK(raw_index_bytes(c0, 1, 3) == buf + 1);
CHECK(raw_bytes(cp, 4) == buf); CHECK(raw_bytes(cp, 4) == buf);
@@ -876,6 +870,195 @@ TEST_CASE("PtrOrSpan int") {
CHECK(a == buf + 8); CHECK(a == buf + 8);
} }
/*************************************************************************
//
**************************************************************************/
#ifdef UPX_VERSION_HEX
namespace {
template <class T>
static noinline void check_bele_a(const T &mb, size_t i) {
if (i < 2) {
CHECK_THROWS(get_ne16(mb));
CHECK_THROWS(get_be16(mb));
CHECK_THROWS(get_le16(mb));
CHECK_THROWS(set_ne16(mb, 0));
CHECK_THROWS(set_be16(mb, 0));
CHECK_THROWS(set_le16(mb, 0));
} else {
CHECK_NOTHROW(get_ne16(mb));
CHECK_NOTHROW(get_be16(mb));
CHECK_NOTHROW(get_le16(mb));
CHECK_NOTHROW(set_ne16(mb, 0));
CHECK_NOTHROW(set_be16(mb, 0));
CHECK_NOTHROW(set_le16(mb, 0));
}
if (i < 3) {
CHECK_THROWS(get_ne24(mb));
CHECK_THROWS(get_be24(mb));
CHECK_THROWS(get_le24(mb));
CHECK_THROWS(set_ne24(mb, 0));
CHECK_THROWS(set_be24(mb, 0));
CHECK_THROWS(set_le24(mb, 0));
} else {
CHECK_NOTHROW(get_ne24(mb));
CHECK_NOTHROW(get_be24(mb));
CHECK_NOTHROW(get_le24(mb));
CHECK_NOTHROW(set_ne24(mb, 0));
CHECK_NOTHROW(set_be24(mb, 0));
CHECK_NOTHROW(set_le24(mb, 0));
}
if (i < 4) {
CHECK_THROWS(get_ne32(mb));
CHECK_THROWS(get_be32(mb));
CHECK_THROWS(get_le32(mb));
CHECK_THROWS(set_ne32(mb, 0));
CHECK_THROWS(set_be32(mb, 0));
CHECK_THROWS(set_le32(mb, 0));
} else {
CHECK_NOTHROW(get_ne32(mb));
CHECK_NOTHROW(get_be32(mb));
CHECK_NOTHROW(get_le32(mb));
CHECK_NOTHROW(set_ne32(mb, 0));
CHECK_NOTHROW(set_be32(mb, 0));
CHECK_NOTHROW(set_le32(mb, 0));
}
if (i < 8) {
CHECK_THROWS(get_ne64(mb));
CHECK_THROWS(get_be64(mb));
CHECK_THROWS(get_le64(mb));
CHECK_THROWS(set_ne64(mb, 0));
CHECK_THROWS(set_be64(mb, 0));
CHECK_THROWS(set_le64(mb, 0));
} else {
CHECK_NOTHROW(get_ne64(mb));
CHECK_NOTHROW(get_be64(mb));
CHECK_NOTHROW(get_le64(mb));
CHECK_NOTHROW(set_ne64(mb, 0));
CHECK_NOTHROW(set_be64(mb, 0));
CHECK_NOTHROW(set_le64(mb, 0));
}
}
template <class T>
static noinline void check_bele_c(const T &mb, size_t i) {
if (i < 2) {
CHECK_THROWS(get_ne16(mb));
CHECK_THROWS(get_be16(mb));
CHECK_THROWS(get_le16(mb));
} else {
CHECK_NOTHROW(get_ne16(mb));
CHECK_NOTHROW(get_be16(mb));
CHECK_NOTHROW(get_le16(mb));
}
if (i < 3) {
CHECK_THROWS(get_ne24(mb));
CHECK_THROWS(get_be24(mb));
CHECK_THROWS(get_le24(mb));
} else {
CHECK_NOTHROW(get_ne24(mb));
CHECK_NOTHROW(get_be24(mb));
CHECK_NOTHROW(get_le24(mb));
}
if (i < 4) {
CHECK_THROWS(get_ne32(mb));
CHECK_THROWS(get_be32(mb));
CHECK_THROWS(get_le32(mb));
} else {
CHECK_NOTHROW(get_ne32(mb));
CHECK_NOTHROW(get_be32(mb));
CHECK_NOTHROW(get_le32(mb));
}
if (i < 8) {
CHECK_THROWS(get_ne64(mb));
CHECK_THROWS(get_be64(mb));
CHECK_THROWS(get_le64(mb));
} else {
CHECK_NOTHROW(get_ne64(mb));
CHECK_NOTHROW(get_be64(mb));
CHECK_NOTHROW(get_le64(mb));
}
}
} // namespace
#endif // UPX_VERSION_HEX
TEST_CASE("xspan global overloads") {
byte buf_a[16] = {};
const byte buf_c[16] = {};
for (size_t i = 0; i < 16; i++) {
XSPAN_0_VAR(byte, a0, buf_a, i);
XSPAN_P_VAR(byte, ap, buf_a, i);
XSPAN_S_VAR(byte, as, buf_a, i);
XSPAN_0_VAR(const byte, c0, buf_c, i);
XSPAN_P_VAR(const byte, cp, buf_c, i);
XSPAN_S_VAR(const byte, cs, buf_c, i);
#ifdef UPX_VERSION_HEX
check_bele_a(a0, i);
check_bele_a(ap, i);
check_bele_a(as, i);
check_bele_c(c0, i);
check_bele_c(cp, i);
check_bele_c(cs, i);
CHECK_THROWS(upx_adler32(a0, i + 1));
CHECK_THROWS(upx_adler32(ap, i + 1));
CHECK_THROWS(upx_adler32(as, i + 1));
CHECK_THROWS(upx_adler32(c0, i + 1));
CHECK_THROWS(upx_adler32(cp, i + 1));
CHECK_THROWS(upx_adler32(cs, i + 1));
if (i == 0) {
CHECK_THROWS(upx_safe_strlen(a0));
CHECK_THROWS(upx_safe_strlen(ap));
CHECK_THROWS(upx_safe_strlen(as));
CHECK_THROWS(upx_safe_strlen(c0));
CHECK_THROWS(upx_safe_strlen(cp));
CHECK_THROWS(upx_safe_strlen(cs));
}
#endif
CHECK_THROWS(memchr(a0, 0, i + 1)); // NOLINT(bugprone-unused-return-value)
CHECK_THROWS(memchr(ap, 0, i + 1)); // NOLINT(bugprone-unused-return-value)
CHECK_THROWS(memchr(as, 0, i + 1)); // NOLINT(bugprone-unused-return-value)
CHECK_THROWS(memchr(c0, 0, i + 1)); // NOLINT(bugprone-unused-return-value)
CHECK_THROWS(memchr(cp, 0, i + 1)); // NOLINT(bugprone-unused-return-value)
CHECK_THROWS(memchr(cs, 0, i + 1)); // NOLINT(bugprone-unused-return-value)
CHECK(memcmp(a0, a0, i) == 0);
CHECK(memcmp(ap, a0, i) == 0);
CHECK(memcmp(as, a0, i) == 0);
CHECK_THROWS(memcmp(a0, a0, i + 1)); // NOLINT(bugprone-unused-return-value)
CHECK_THROWS(memcmp(ap, a0, i + 1)); // NOLINT(bugprone-unused-return-value)
CHECK_THROWS(memcmp(as, a0, i + 1)); // NOLINT(bugprone-unused-return-value)
CHECK_NOTHROW(memcpy(a0, c0, i));
CHECK_NOTHROW(memcpy(ap, cp, i));
CHECK_NOTHROW(memcpy(as, cs, i));
CHECK_THROWS(memcpy(a0, c0, i + 1));
CHECK_THROWS(memcpy(ap, cp, i + 1));
CHECK_THROWS(memcpy(as, cs, i + 1));
CHECK_NOTHROW(memmove(a0, c0, i));
CHECK_NOTHROW(memmove(ap, cp, i));
CHECK_NOTHROW(memmove(as, cs, i));
CHECK_THROWS(memmove(a0, c0, i + 1));
CHECK_THROWS(memmove(ap, cp, i + 1));
CHECK_THROWS(memmove(as, cs, i + 1));
CHECK_NOTHROW(memset(a0, 255, i));
CHECK_NOTHROW(memset(ap, 255, i));
CHECK_NOTHROW(memset(as, 255, i));
CHECK_THROWS(memset(a0, 254, i + 1));
CHECK_THROWS(memset(ap, 254, i + 1));
CHECK_THROWS(memset(as, 254, i + 1));
}
}
/************************************************************************* /*************************************************************************
// codegen // codegen
**************************************************************************/ **************************************************************************/
+3 -2
View File
@@ -248,8 +248,9 @@ static void __UCL_CDECL my_free(ucl_voidp p) { free(p); }
} // extern "C" } // extern "C"
int upx_ucl_init(void) { int upx_ucl_init(void) {
#if (ACC_CC_MSC && ACC_ARCH_I386) && (_MSC_VER >= 1940) #if 1 && (ACC_CC_MSC && ACC_ARCH_I386) && (_MSC_VER >= 1940)
(void) ucl_init(); // TODO later // @COMPILER_BUG @MSVC_BUG
(void) ucl_init();
#else #else
if (ucl_init() != UCL_E_OK) if (ucl_init() != UCL_E_OK)
return -1; return -1;
+17 -11
View File
@@ -71,6 +71,10 @@ static_assert((-1) >> 31 == -1); // arithmetic right shift
static_assert(CHAR_MAX == 255); // -funsigned-char static_assert(CHAR_MAX == 255); // -funsigned-char
static_assert((char) (-1) == 255); // -funsigned-char static_assert((char) (-1) == 255); // -funsigned-char
// disable some more strict warnings
#if defined(__clang__) && __has_warning("-Wunnecessary-virtual-specifier")
#pragma clang diagnostic ignored "-Wunnecessary-virtual-specifier"
#endif
// enable some more strict warnings for Git developer builds // enable some more strict warnings for Git developer builds
#if defined(UPX_CONFIG_DISABLE_WSTRICT) && (UPX_CONFIG_DISABLE_WSTRICT + 0 == 0) #if defined(UPX_CONFIG_DISABLE_WSTRICT) && (UPX_CONFIG_DISABLE_WSTRICT + 0 == 0)
#if defined(UPX_CONFIG_DISABLE_WERROR) && (UPX_CONFIG_DISABLE_WERROR + 0 == 0) #if defined(UPX_CONFIG_DISABLE_WERROR) && (UPX_CONFIG_DISABLE_WERROR + 0 == 0)
@@ -96,6 +100,7 @@ static_assert((char) (-1) == 255); // -funsigned-char
#endif // UPX_CONFIG_DISABLE_WERROR #endif // UPX_CONFIG_DISABLE_WERROR
#endif // UPX_CONFIG_DISABLE_WSTRICT #endif // UPX_CONFIG_DISABLE_WSTRICT
// upx_is_constant_evaluated
#if __cplusplus >= 202002L // C++20 #if __cplusplus >= 202002L // C++20
#define upx_is_constant_evaluated std::is_constant_evaluated #define upx_is_constant_evaluated std::is_constant_evaluated
#elif __has_builtin(__builtin_is_constant_evaluated) // clang-9, gcc-10 #elif __has_builtin(__builtin_is_constant_evaluated) // clang-9, gcc-10
@@ -115,7 +120,7 @@ static_assert((char) (-1) == 255); // -funsigned-char
#define upx_std_atomic(Type) Type #define upx_std_atomic(Type) Type
#define upx_std_once_flag upx_std_atomic(size_t) #define upx_std_once_flag upx_std_atomic(size_t)
template <class NoexceptCallable> template <class NoexceptCallable>
inline void upx_std_call_once(upx_std_once_flag &flag, NoexceptCallable &&f) { inline void upx_std_call_once(upx_std_once_flag &flag, NoexceptCallable &&f) noexcept {
if (__acc_unlikely(!flag)) { if (__acc_unlikely(!flag)) {
flag = 1; flag = 1;
f(); f();
@@ -137,7 +142,7 @@ inline constexpr bool upx_is_integral_v = upx_is_integral<T>::value;
#define upx_fake_alignas_16 __attribute__((__aligned__(2))) // object file maximum 2 ??? #define upx_fake_alignas_16 __attribute__((__aligned__(2))) // object file maximum 2 ???
#define upx_fake_alignas__(x) upx_fake_alignas_##x #define upx_fake_alignas__(x) upx_fake_alignas_##x
#define alignas(x) upx_fake_alignas__(x) #define alignas(x) upx_fake_alignas__(x)
#define upx_alignas_max upx_fake_alignas_4 #define upx_alignas_max upx_fake_alignas_2
#endif #endif
#ifndef upx_alignas_max #ifndef upx_alignas_max
#define upx_alignas_max alignas(std::max_align_t) #define upx_alignas_max alignas(std::max_align_t)
@@ -193,11 +198,7 @@ struct alignas(1) upx_charptr_unit_type final { char hidden__; };
static_assert(sizeof(upx_charptr_unit_type) == 1); static_assert(sizeof(upx_charptr_unit_type) == 1);
// using the system off_t was a bad idea even back in 199x... // using the system off_t was a bad idea even back in 199x...
#if (__SIZEOF_INT128__ == 16) && 0
typedef upx_int128_t upx_off_t;
#else
typedef long long upx_off_t; typedef long long upx_off_t;
#endif
#undef off_t #undef off_t
#if 0 #if 0
// TODO later cleanup: at some future point we can do this: // TODO later cleanup: at some future point we can do this:
@@ -230,7 +231,7 @@ typedef long long upx_off_t;
#define very_likely __acc_very_likely #define very_likely __acc_very_likely
#define very_unlikely __acc_very_unlikely #define very_unlikely __acc_very_unlikely
// cosmetic: explicitly annotate some functions which may throw exceptions // cosmetic: explicitly annotate some functions which may throw exceptions;
// note that noexcept(false) is the default for all C++ functions anyway // note that noexcept(false) is the default for all C++ functions anyway
#define may_throw noexcept(false) #define may_throw noexcept(false)
@@ -376,6 +377,7 @@ inline void NO_printf(const char *, ...) noexcept {}
inline void NO_fprintf(FILE *, const char *, ...) noexcept attribute_format(2, 3); inline void NO_fprintf(FILE *, const char *, ...) noexcept attribute_format(2, 3);
inline void NO_fprintf(FILE *, const char *, ...) noexcept {} inline void NO_fprintf(FILE *, const char *, ...) noexcept {}
// upx_memcmp_inline
#if __has_builtin(__builtin_memcmp) #if __has_builtin(__builtin_memcmp)
#define upx_memcmp_inline __builtin_memcmp #define upx_memcmp_inline __builtin_memcmp
#elif defined(__clang__) || defined(__GNUC__) #elif defined(__clang__) || defined(__GNUC__)
@@ -383,6 +385,8 @@ inline void NO_fprintf(FILE *, const char *, ...) noexcept {}
#else #else
#define upx_memcmp_inline memcmp #define upx_memcmp_inline memcmp
#endif #endif
// upx_memcpy_inline
#if __has_builtin(__builtin_memcpy_inline) && 0 // TODO later: clang constexpr limitation? #if __has_builtin(__builtin_memcpy_inline) && 0 // TODO later: clang constexpr limitation?
#define upx_memcpy_inline __builtin_memcpy_inline #define upx_memcpy_inline __builtin_memcpy_inline
#elif __has_builtin(__builtin_memcpy) #elif __has_builtin(__builtin_memcpy)
@@ -393,6 +397,7 @@ inline void NO_fprintf(FILE *, const char *, ...) noexcept {}
#define upx_memcpy_inline memcpy #define upx_memcpy_inline memcpy
#endif #endif
// upx_return_address()
#if defined(__wasi__) #if defined(__wasi__)
#define upx_return_address() nullptr #define upx_return_address() nullptr
#elif __has_builtin(__builtin_return_address) #elif __has_builtin(__builtin_return_address)
@@ -802,14 +807,15 @@ int upx_doctest_check();
// util/membuffer.h // util/membuffer.h
class MemBuffer; class MemBuffer;
void *membuffer_get_void_ptr(MemBuffer &mb) noexcept; void *membuffer_get_void_ptr(MemBuffer &mb) noexcept;
unsigned membuffer_get_size(MemBuffer &mb) noexcept; const void *membuffer_get_void_ptr(const MemBuffer &mb) noexcept;
unsigned membuffer_get_size_in_bytes(const MemBuffer &mb) noexcept;
// main.cpp // main.cpp
extern const char *progname; extern const char *progname;
bool main_set_exit_code(int ec); bool main_set_exit_code(int ec);
int main_get_options(int argc, char **argv); int main_get_options(int argc, char **argv);
void main_get_envoptions(); void main_get_envoptions();
int upx_main(int argc, char *argv[]) may_throw; noinline int upx_main(int argc, char *argv[]) may_throw;
// msg.cpp // msg.cpp
void printSetNl(int need_nl) noexcept; void printSetNl(int need_nl) noexcept;
@@ -826,8 +832,8 @@ void infoHeader();
void infoWriting(const char *what, upx_int64_t size); void infoWriting(const char *what, upx_int64_t size);
// work.cpp // work.cpp
void do_one_file(const char *iname, char *oname) may_throw; noinline void do_one_file(const char *iname, char *oname) may_throw;
int do_files(int i, int argc, char *argv[]) may_throw; noinline int do_files(int i, int argc, char *argv[]) may_throw;
// help.cpp // help.cpp
extern const char gitrev[]; extern const char gitrev[];
+4 -4
View File
@@ -200,15 +200,15 @@ noreturn void throwEOFException(const char *msg = nullptr, int e = 0) may_throw;
// some C++ template wizardry is needed to overload throwCantPack() for varargs // some C++ template wizardry is needed to overload throwCantPack() for varargs
template <class T> template <class T>
void throwCantPack(const T *, ...) DELETED_FUNCTION; void throwCantPack(const T *, ...) DELETED_FUNCTION;
template <>
noreturn void throwCantPack(const char *format, ...) may_throw attribute_format(1, 2);
template <class T> template <class T>
void throwCantUnpack(const T *, ...) DELETED_FUNCTION; void throwCantUnpack(const T *, ...) DELETED_FUNCTION;
template <>
noreturn void throwCantUnpack(const char *format, ...) may_throw attribute_format(1, 2);
template <class T> template <class T>
void throwInternalError(const T *, ...) DELETED_FUNCTION; void throwInternalError(const T *, ...) DELETED_FUNCTION;
template <> template <>
noreturn void throwCantPack(const char *format, ...) may_throw attribute_format(1, 2);
template <>
noreturn void throwCantUnpack(const char *format, ...) may_throw attribute_format(1, 2);
template <>
noreturn void throwInternalError(const char *format, ...) may_throw attribute_format(1, 2); noreturn void throwInternalError(const char *format, ...) may_throw attribute_format(1, 2);
/* vim:set ts=4 sw=4 et: */ /* vim:set ts=4 sw=4 et: */
+4 -2
View File
@@ -129,7 +129,8 @@ void FileBase::closex() may_throw {
upx_off_t FileBase::seek(upx_off_t off, int whence) { upx_off_t FileBase::seek(upx_off_t off, int whence) {
if (!isOpen()) if (!isOpen())
throwIOException("bad seek 1"); throwIOException("bad seek 1");
mem_size_assert(1, off >= 0 ? off : -off); // sanity check if (!mem_size_valid_bytes(off >= 0 ? off : -off)) // sanity check
throwIOException("bad seek");
if (whence == SEEK_SET) { if (whence == SEEK_SET) {
if (off < 0) if (off < 0)
throwIOException("bad seek 2"); throwIOException("bad seek 2");
@@ -318,7 +319,8 @@ void OutputFile::rewrite(SPAN_P(const void) buf, int len) {
} }
upx_off_t OutputFile::seek(upx_off_t off, int whence) { upx_off_t OutputFile::seek(upx_off_t off, int whence) {
mem_size_assert(1, off >= 0 ? off : -off); // sanity check if (!mem_size_valid_bytes(off >= 0 ? off : -off)) // sanity check
throwIOException("bad seek");
assert(!opt->to_stdout); assert(!opt->to_stdout);
switch (whence) { switch (whence) {
case SEEK_SET: case SEEK_SET:
+8 -4
View File
@@ -49,7 +49,7 @@ const char gitrev[] = UPX_VERSION_GITREV;
const char gitrev[1] = {0}; const char gitrev[1] = {0};
#endif #endif
void show_header(void) { void show_header() {
FILE *f = con_term; FILE *f = con_term;
int fg; int fg;
@@ -85,7 +85,7 @@ void show_header(void) {
// usage // usage
**************************************************************************/ **************************************************************************/
void show_usage(void) { void show_usage() {
FILE *f = con_term; FILE *f = con_term;
con_fprintf(f, "Usage: %s [-123456789dlthVL] [-qvfk] [-o file] %sfile..\n", progname, con_fprintf(f, "Usage: %s [-123456789dlthVL] [-qvfk] [-o file] %sfile..\n", progname,
@@ -220,9 +220,12 @@ void show_help(int verbose) {
"%s" "%s"
" -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"
"%s"
" -h give %s help -L display software license\n%s", " -h give %s help -L display software license\n%s",
verbose == 0 ? "" : " --best compress best (can be slow for big files)\n", verbose == 0 ? "" : " --best compress best (can be slow for big files)\n",
verbose == 0 ? "more" : "this", verbose == 0 ? "" : "\n"); verbose == 0 ? "" : " --fileinfo show parameters of already-compressed file\n",
verbose == 0 ? "more" : "this",
verbose == 0 ? "" : "\n");
fg = con_fg(f, FG_YELLOW); fg = con_fg(f, FG_YELLOW);
con_fprintf(f, "Options:\n"); con_fprintf(f, "Options:\n");
@@ -339,6 +342,7 @@ void show_help(int verbose) {
fg = con_fg(f, fg); fg = con_fg(f, fg);
con_fprintf(f, con_fprintf(f,
" --preserve-build-id copy .gnu.note.build-id to compressed output\n" " --preserve-build-id copy .gnu.note.build-id to compressed output\n"
" --catch-sigsegv debug errors in hardware or de-compressor\n"
"\n"); "\n");
} }
// clang-format on // clang-format on
@@ -377,7 +381,7 @@ void show_help(int verbose) {
// license // license
**************************************************************************/ **************************************************************************/
void show_license(void) { void show_license() {
FILE *f = con_term; FILE *f = con_term;
show_header(); show_header();
+2 -1
View File
@@ -367,6 +367,8 @@ int ElfLinker::addLoader(const char *sname) {
return outputlen; return outputlen;
char *begin = strdup(sname); char *begin = strdup(sname);
assert(begin != nullptr);
const auto begin_deleter = upx::MallocDeleter(&begin, 1); // don't leak memory
char *end = begin + strlen(begin); char *end = begin + strlen(begin);
for (char *sect = begin; sect < end;) { for (char *sect = begin; sect < end;) {
for (char *tokend = sect; *tokend; tokend++) for (char *tokend = sect; *tokend; tokend++)
@@ -418,7 +420,6 @@ int ElfLinker::addLoader(const char *sname) {
} }
sect += strlen(sect) + 1; sect += strlen(sect) + 1;
} }
::free(begin);
return outputlen; return outputlen;
} }
+1 -1
View File
@@ -35,7 +35,7 @@ class ElfLinker /*not_final*/ : private upx::noncopyable {
friend class Packer; friend class Packer;
public: public:
const N_BELE_RTP::AbstractPolicy *const bele; // target endianness const N_BELE_RTP::AbstractPolicy *const bele; // TE - Target Endianness
protected: protected:
struct Section; struct Section;
struct Symbol; struct Symbol;
+9 -8
View File
@@ -67,12 +67,9 @@ static void handle_opterr(acc_getopt_p g, const char *f, void *v) {
static int exit_code = EXIT_OK; static int exit_code = EXIT_OK;
#if (WITH_GUI) #if (WITH_GUI)
static noinline void do_exit(void) { throw exit_code; } static noreturn void do_exit() { throw exit_code; }
#else #else
#if defined(__GNUC__) static noreturn void do_exit() {
static void do_exit(void) __attribute__((__noreturn__));
#endif
static void do_exit(void) {
static bool in_exit = false; static bool in_exit = false;
if (in_exit) if (in_exit)
@@ -115,7 +112,7 @@ static noinline void e_exit(int ec) {
do_exit(); do_exit();
} }
static noinline void e_usage(void) { static noinline void e_usage() {
if (opt->debug.getopt_throw_instead_of_exit) if (opt->debug.getopt_throw_instead_of_exit)
throw EXIT_USAGE; throw EXIT_USAGE;
show_usage(); show_usage();
@@ -217,7 +214,7 @@ static void check_and_update_options(int i, int argc) {
// misc // misc
**************************************************************************/ **************************************************************************/
static void e_help(void) { static void e_help() {
show_help(0); show_help(0);
e_exit(EXIT_USAGE); e_exit(EXIT_USAGE);
} }
@@ -742,6 +739,9 @@ static int do_option(int optc, const char *arg) {
case 678: case 678:
opt->o_unix.android_old = true; opt->o_unix.android_old = true;
break; break;
case 679:
opt->o_unix.catch_sigsegv = true;
break;
// ps1/exe // ps1/exe
case 670: case 670:
opt->ps1_exe.boot_only = true; opt->ps1_exe.boot_only = true;
@@ -840,8 +840,8 @@ int main_get_options(int argc, char **argv) {
{"force", 0, N, 'f'}, // force overwrite of output files {"force", 0, N, 'f'}, // force overwrite of output files
{"force-compress", 0, N, 'f'}, // and compression of suspicious files {"force-compress", 0, N, 'f'}, // and compression of suspicious files
{"force-overwrite", 0x90, N, 529}, // force overwrite of output files {"force-overwrite", 0x90, N, 529}, // force overwrite of output files
{"link", 0x90, N, 530}, // preserve hard link
{"info", 0, N, 'i'}, // info mode {"info", 0, N, 'i'}, // info mode
{"link", 0x90, N, 530}, // preserve hard link
{"no-env", 0x10, N, 519}, // no environment var {"no-env", 0x10, N, 519}, // no environment var
{"no-link", 0x90, N, 531}, // do not preserve hard link [default] {"no-link", 0x90, N, 531}, // do not preserve hard link [default]
{"no-mode", 0x10, N, 526}, // do not preserve mode (permissions) {"no-mode", 0x10, N, 526}, // do not preserve mode (permissions)
@@ -957,6 +957,7 @@ int main_get_options(int argc, char **argv) {
{"android-shlib", 0, N, 676}, {"android-shlib", 0, N, 676},
{"force-pie", 0x90, N, 677}, {"force-pie", 0x90, N, 677},
{"android-old", 0, N, 678}, {"android-old", 0, N, 678},
{"catch-sigsegv", 0, N, 679},
// ps1/exe // ps1/exe
{"boot-only", 0x90, N, 670}, {"boot-only", 0x90, N, 670},
{"no-align", 0x90, N, 671}, {"no-align", 0x90, N, 671},
+2 -1
View File
@@ -28,7 +28,8 @@
#include "conf.h" #include "conf.h"
static Options global_options; static Options global_options;
Options *opt = &global_options; // also see class PackMaster for per-file local options // also see class PackMaster for per-file local options
Options *opt = &global_options;
#if WITH_THREADS #if WITH_THREADS
std::mutex opt_lock_mutex; // for locking "opt" std::mutex opt_lock_mutex; // for locking "opt"
+3 -1
View File
@@ -30,7 +30,8 @@
struct Options; struct Options;
#define options_t Options // old name #define options_t Options // old name
extern Options *opt; // global options, see class PackMaster for per-file local options // global options, see class PackMaster for per-file local options
extern Options *opt;
#if WITH_THREADS #if WITH_THREADS
extern std::mutex opt_lock_mutex; // for locking "opt" extern std::mutex opt_lock_mutex; // for locking "opt"
@@ -161,6 +162,7 @@ struct Options final {
bool android_shlib; // keep some ElfXX_Shdr for dlopen() bool android_shlib; // keep some ElfXX_Shdr for dlopen()
bool android_old; // < Android_10 ==> no memfd_create, inconsistent __NR_ftruncate bool android_old; // < Android_10 ==> no memfd_create, inconsistent __NR_ftruncate
bool force_pie; // choose DF_1_PIE instead of is_shlib bool force_pie; // choose DF_1_PIE instead of is_shlib
bool catch_sigsegv; // to debug hardware or de-compressor
} o_unix; } o_unix;
struct { struct {
bool boot_only; bool boot_only;
+3 -1
View File
@@ -108,7 +108,8 @@ class Dummy {
/* Register usage information. */ // /* Register usage information. */ //
// PT_MIPS_RTPROC = 0x70000001, /* Runtime procedure table. */ // PT_MIPS_RTPROC = 0x70000001, /* Runtime procedure table. */
// PT_MIPS_OPTIONS = 0x70000002, // PT_MIPS_OPTIONS = 0x70000002,
PT_MIPS_ABIFLAGS = 0x70000003, /* FP mode requirement. */ PT_ARM_EXIDX = (0x70000000 + 1), /* ARM unwind segment. */
PT_MIPS_ABIFLAGS = 0x70000003, /* FP mode requirement. */
}; };
enum { // p_flags enum { // p_flags
@@ -148,6 +149,7 @@ class Dummy {
SHT_LOOS = 0x60000000, /* LOcal OS; SHT_ANDROID_REL{,A} is +1, +2 */ SHT_LOOS = 0x60000000, /* LOcal OS; SHT_ANDROID_REL{,A} is +1, +2 */
SHT_LOPROC = 0x70000000, /* Start of processor-specific */ SHT_LOPROC = 0x70000000, /* Start of processor-specific */
SHT_ARM_EXIDX = (SHT_LOPROC + 1), /* ARM unwind section. */
SHT_ARM_ATTRIBUTES = (SHT_LOPROC + 3), /* ARM attributes section. */ SHT_ARM_ATTRIBUTES = (SHT_LOPROC + 3), /* ARM attributes section. */
}; };
+187 -106
View File
@@ -487,17 +487,17 @@ PackLinuxElf32::slide_sh_offset(Elf32_Shdr *shdr)
{ {
unsigned sh_offset = get_te32(&shdr->sh_offset); unsigned sh_offset = get_te32(&shdr->sh_offset);
unsigned sh_addr = get_te32(&shdr->sh_addr); unsigned sh_addr = get_te32(&shdr->sh_addr);
char const *sh_name = get_te32(&shdr->sh_name) + shstrtab;
(void)sh_name; // convenience for debug
if (Elf32_Shdr::SHF_WRITE & get_te32(&shdr->sh_flags) if (Elf32_Shdr::SHF_WRITE & get_te32(&shdr->sh_flags)
|| (sh_offset && !sh_addr)) || (sh_offset && !sh_addr))
{ {
unsigned newoff = so_slide + sh_offset + (is_asl ? asl_delta : 0); unsigned newoff = so_slide + sh_offset + (is_asl ? asl_delta : 0);
if ((unsigned)this->file_size < newoff) { if (sh_addr // only check "real memory"
&& (unsigned)this->file_size < newoff) {
throwInternalError("bad slide %p %#x", shdr, (unsigned)so_slide); throwInternalError("bad slide %p %#x", shdr, (unsigned)so_slide);
} }
set_te32(&shdr->sh_offset, newoff); set_te32(&shdr->sh_offset, newoff);
if (sh_addr) // change only if non-zero
set_te32(&shdr->sh_addr,
so_slide + sh_addr + (is_asl ? asl_delta : 0));
return newoff; return newoff;
} }
return sh_offset; return sh_offset;
@@ -520,17 +520,17 @@ PackLinuxElf64::slide_sh_offset(Elf64_Shdr *shdr)
{ {
unsigned sh_offset = get_te64(&shdr->sh_offset); unsigned sh_offset = get_te64(&shdr->sh_offset);
unsigned sh_addr = get_te64(&shdr->sh_addr); unsigned sh_addr = get_te64(&shdr->sh_addr);
char const *sh_name = get_te32(&shdr->sh_name) + shstrtab;
(void)sh_name; // convenience for debug
if (Elf64_Shdr::SHF_WRITE & get_te64(&shdr->sh_flags) if (Elf64_Shdr::SHF_WRITE & get_te64(&shdr->sh_flags)
|| (sh_offset && !sh_addr)) || (sh_offset && !sh_addr))
{ {
unsigned newoff = so_slide + sh_offset + (is_asl ? asl_delta : 0); unsigned newoff = so_slide + sh_offset + (is_asl ? asl_delta : 0);
if ((unsigned)this->file_size < newoff) { if (sh_addr // only check "real memory"
&& (unsigned)this->file_size < newoff) {
throwInternalError("bad slide %p %#x", shdr, (unsigned)so_slide); throwInternalError("bad slide %p %#x", shdr, (unsigned)so_slide);
} }
set_te64(&shdr->sh_offset, newoff); set_te64(&shdr->sh_offset, newoff);
if (sh_addr) // change only if non-zero
set_te64(&shdr->sh_addr,
so_slide + sh_addr + (is_asl ? asl_delta : 0));
return newoff; return newoff;
} }
return sh_offset; return sh_offset;
@@ -641,25 +641,18 @@ off_t PackLinuxElf32::pack3(OutputFile *fo, Filter &ft)
Elf32_Phdr *const phdr0 = (Elf32_Phdr *)lowmem.subref( Elf32_Phdr *const phdr0 = (Elf32_Phdr *)lowmem.subref(
"bad e_phoff", e_phoff, e_phnum * sizeof(Elf32_Phdr)); "bad e_phoff", e_phoff, e_phnum * sizeof(Elf32_Phdr));
Elf32_Phdr *phdr = phdr0; Elf32_Phdr *phdr = phdr0, *outp = phdr0;
upx_off_t off = fo->st_size(); // 64 bits upx_off_t off = fo->st_size(); // 64 bits
so_slide = 0; so_slide = 0;
for (unsigned j = 0; j < e_phnum; ++j, ++phdr) { for (unsigned j = 0; j < e_phnum; ++j, ++phdr) {
// p_vaddr and p_paddr do not change! // p_vaddr and p_paddr do not change!
unsigned const len = get_te32(&phdr->p_filesz);
unsigned const ioff = get_te32(&phdri[j].p_offset); // without asl_delta unsigned const ioff = get_te32(&phdri[j].p_offset); // without asl_delta
unsigned align= get_te32(&phdr->p_align); unsigned align= get_te32(&phdr->p_align);
unsigned const type = get_te32(&phdr->p_type); unsigned const type = get_te32(&phdr->p_type);
if (Elf32_Phdr::PT_INTERP==type) { unsigned const len = get_te32(&phdr->p_filesz);
// Rotate to highest position, so it can be lopped if (Elf32_Phdr::PT_INTERP==type
// by decrementing e_phnum. || Elf32_Phdr::PT_ARM_EXIDX==type) {
memcpy((unsigned char *)ibuf, phdr, sizeof(*phdr)); // extract /* OMIT */ continue; // OMIT: reference to compressed data
memmove(phdr, 1+phdr, (e_phnum - (1+ j))*sizeof(*phdr)); // overlapping
memcpy(&phdr[e_phnum - (1+ j)], (unsigned char *)ibuf, sizeof(*phdr)); // to top
--phdr; --e_phnum;
set_te16(&ehdri.e_phnum, e_phnum);
set_te16(&((Elf32_Ehdr *)(unsigned char *)lowmem)->e_phnum, e_phnum);
continue;
} }
if (PT_LOAD == type) { if (PT_LOAD == type) {
if (!ioff) { // first PT_LOAD must contain everything written so far if (!ioff) { // first PT_LOAD must contain everything written so far
@@ -707,12 +700,21 @@ off_t PackLinuxElf32::pack3(OutputFile *fo, Filter &ft)
fo->seek(0, SEEK_END); fo->seek(0, SEEK_END);
} }
} }
continue; // all done with this PT_LOAD
} }
if (xct_off < ioff) { else if (Elf32_Phdr::PT_DYNAMIC == type
set_te32(&phdr->p_offset, so_slide + (is_asl ? asl_delta : 0) + ioff); || Elf32_Phdr::PT_GNU_RELRO == type) {
unsigned delta = so_slide + (is_asl ? asl_delta : 0);
set_te32(&phdr->p_offset, delta + ioff);
// unsigned x = get_te32(&phdr->p_vaddr);
// set_te32(&phdr->p_vaddr, delta + x);
// unsigned y = get_te32(&phdr->p_paddr);
// set_te32(&phdr->p_paddr, delta + y);
} }
*outp++ = *phdr; // propagate
} // end each Phdr } // end each Phdr
e_phnum = outp - phdr0;
set_te16(&ehdri.e_phnum, e_phnum);
set_te16(&((Elf32_Ehdr *)(unsigned char *)lowmem)->e_phnum, e_phnum);
if (sec_arm_attr || is_asl) { // must update Shdr.sh_offset for so_slide if (sec_arm_attr || is_asl) { // must update Shdr.sh_offset for so_slide
Elf32_Shdr *shdr = shdri; Elf32_Shdr *shdr = shdri;
@@ -769,6 +771,7 @@ off_t PackLinuxElf32::pack3(OutputFile *fo, Filter &ft)
return total_out; return total_out;
} }
// NYI 2025-12-10: should be updated from the Elf32::pack3 version
off_t PackLinuxElf64::pack3(OutputFile *fo, Filter &ft) off_t PackLinuxElf64::pack3(OutputFile *fo, Filter &ft)
{ {
if (!overlay_offset) { if (!overlay_offset) {
@@ -835,7 +838,7 @@ off_t PackLinuxElf64::pack3(OutputFile *fo, Filter &ft)
Elf64_Phdr *const phdr0 = (Elf64_Phdr *)lowmem.subref( Elf64_Phdr *const phdr0 = (Elf64_Phdr *)lowmem.subref(
"bad e_phoff", e_phoff, e_phnum * sizeof(Elf64_Phdr)); "bad e_phoff", e_phoff, e_phnum * sizeof(Elf64_Phdr));
Elf64_Phdr *phdr = phdr0; Elf64_Phdr *phdr = phdr0, *outp = phdr0;
upx_off_t off = fo->st_size(); // 64 bits upx_off_t off = fo->st_size(); // 64 bits
so_slide = 0; so_slide = 0;
for (unsigned j = 0; j < e_phnum; ++j, ++phdr) { for (unsigned j = 0; j < e_phnum; ++j, ++phdr) {
@@ -845,16 +848,9 @@ off_t PackLinuxElf64::pack3(OutputFile *fo, Filter &ft)
u64_t align= get_te64(&phdr->p_align); u64_t align= get_te64(&phdr->p_align);
unsigned const type = get_te32(&phdr->p_type); unsigned const type = get_te32(&phdr->p_type);
if (Elf64_Phdr::PT_INTERP==type) { if (Elf64_Phdr::PT_INTERP==type) {
// Rotate to highest position, so it can be lopped continue; // OMIT
// by decrementing e_phnum.
memcpy((unsigned char *)ibuf, phdr, sizeof(*phdr)); // extract
memmove(phdr, 1+phdr, (e_phnum - (1+ j))*sizeof(*phdr)); // overlapping
memcpy(&phdr[e_phnum - (1+ j)], (unsigned char *)ibuf, sizeof(*phdr)); // to top
--phdr; --e_phnum;
set_te16(&ehdri.e_phnum, e_phnum);
set_te16(&((Elf64_Ehdr *)(unsigned char *)lowmem)->e_phnum, e_phnum);
continue;
} }
*outp++ = *phdr; // propagate
if (PT_LOAD == type) { if (PT_LOAD == type) {
if (!ioff) { // first PT_LOAD must contain everything written so far if (!ioff) { // first PT_LOAD must contain everything written so far
set_te64(&phdr->p_filesz, sz_pack2 + lsize); // is this correct? set_te64(&phdr->p_filesz, sz_pack2 + lsize); // is this correct?
@@ -903,6 +899,9 @@ off_t PackLinuxElf64::pack3(OutputFile *fo, Filter &ft)
set_te64(&phdr->p_offset, so_slide + (is_asl ? asl_delta : 0) + ioff); set_te64(&phdr->p_offset, so_slide + (is_asl ? asl_delta : 0) + ioff);
} }
} // end each Phdr } // end each Phdr
e_phnum = outp - phdr0;
set_te16(&ehdri.e_phnum, e_phnum);
set_te16(&((Elf64_Ehdr *)(unsigned char *)lowmem)->e_phnum, e_phnum);
if (sec_arm_attr || is_asl) { // must update Shdr.sh_offset for so_slide if (sec_arm_attr || is_asl) { // must update Shdr.sh_offset for so_slide
// Update {DYNAMIC}.sh_offset by so_slide. // Update {DYNAMIC}.sh_offset by so_slide.
@@ -1532,9 +1531,9 @@ PackLinuxElf32::buildLinuxLoader(
// EXP_TAIL FIXME: unfilter // EXP_TAIL FIXME: unfilter
// SO_TAIL // SO_TAIL
// SO_MAIN C-language supervision based on PT_LOADs // SO_MAIN C-language supervision based on PT_LOADs
char sec[120]; memset(sec, 0, sizeof(sec)); // debug convenience char sec[200]; memset(sec, 0, sizeof(sec)); // debug convenience
int len = 0; int len = 0;
unsigned m_decompr = methods_used | (1u << ph_forced_method(ph.method)); unsigned m_decompr = methods_used | (1u << (0xFF & ph_forced_method(ph.method)));
len += snprintf(sec, sizeof(sec), "%s", "SO_HEAD,ptr_NEXT,EXP_HEAD"); len += snprintf(sec, sizeof(sec), "%s", "SO_HEAD,ptr_NEXT,EXP_HEAD");
// Start of dasiy-chain fall-through. // Start of dasiy-chain fall-through.
@@ -1554,10 +1553,13 @@ PackLinuxElf32::buildLinuxLoader(
len += snprintf(&sec[len], sizeof(sec) - len, ",%s", "EXP_TAIL"); len += snprintf(&sec[len], sizeof(sec) - len, ",%s", "EXP_TAIL");
// End of daisy-chain fall-through. // End of daisy-chain fall-through.
len += snprintf(&sec[len], sizeof(sec) - len, ",%s", // MIPS directly calls memfd_create
(sec_arm_attr || is_asl) if (this->e_machine != Elf32_Ehdr::EM_MIPS) {
? "HUMF_A,UMF_ANDROID" len += snprintf(&sec[len], sizeof(sec) - len, ",%s",
: "HUMF_L,UMF_LINUX"); (sec_arm_attr || is_asl)
? "HUMF_A,UMF_ANDROID"
: "HUMF_L,UMF_LINUX");
}
if (hasLoaderSection("STRCON")) { if (hasLoaderSection("STRCON")) {
len += snprintf(&sec[len], sizeof(sec) - len, ",%s", "STRCON"); len += snprintf(&sec[len], sizeof(sec) - len, ",%s", "STRCON");
} }
@@ -1581,9 +1583,9 @@ PackLinuxElf32::buildLinuxLoader(
|| this->e_machine==Elf32_Ehdr::EM_MIPS || this->e_machine==Elf32_Ehdr::EM_MIPS
) { // main program with ELF2 de-compressor (folded portion) ) { // main program with ELF2 de-compressor (folded portion)
initLoader(fold, szfold); initLoader(fold, szfold);
char sec[120]; memset(sec, 0, sizeof(sec)); // debug convenience char sec[200]; memset(sec, 0, sizeof(sec)); // debug convenience
int len = 0; int len = 0;
unsigned m_decompr = methods_used | (1u << ph_forced_method(ph.method)); unsigned m_decompr = methods_used | (1u << (0xFF & ph_forced_method(ph.method)));
len += snprintf(sec, sizeof(sec), "%s", ".text,EXP_HEAD"); len += snprintf(sec, sizeof(sec), "%s", ".text,EXP_HEAD");
if (((1u<<M_NRV2B_LE32)|(1u<<M_NRV2B_8)|(1u<<M_NRV2B_LE16)) & m_decompr) { if (((1u<<M_NRV2B_LE32)|(1u<<M_NRV2B_8)|(1u<<M_NRV2B_LE16)) & m_decompr) {
len += snprintf(&sec[len], sizeof(sec) - len, ",%s", "NRV2B"); len += snprintf(&sec[len], sizeof(sec) - len, ",%s", "NRV2B");
@@ -1678,7 +1680,11 @@ PackLinuxElf32::buildLinuxLoader(
|| this->e_machine==Elf32_Ehdr::EM_MIPS || this->e_machine==Elf32_Ehdr::EM_MIPS
) { // main program with ELF2 de-compressor ) { // main program with ELF2 de-compressor
addLoader("ELFMAINX"); addLoader("ELFMAINX");
if (this->e_machine==Elf32_Ehdr::EM_ARM) { // hardware is more problematic
if (opt->o_unix.catch_sigsegv && hasLoaderSection("ELFSIGSEGV"))
addLoader("ELFSIGSEGV");
addLoader("ELFMAINX2");
}
// Only if $ARCH-linux.elf-entry.S calls upx_mmap_and_fd instead of memfd_create // Only if $ARCH-linux.elf-entry.S calls upx_mmap_and_fd instead of memfd_create
if (this->e_machine != Elf32_Ehdr::EM_PPC if (this->e_machine != Elf32_Ehdr::EM_PPC
&& this->e_machine != Elf32_Ehdr::EM_MIPS) && this->e_machine != Elf32_Ehdr::EM_MIPS)
@@ -1689,7 +1695,7 @@ PackLinuxElf32::buildLinuxLoader(
defineSymbols(ft); defineSymbols(ft);
} }
else { // main program with ELF1 de-compressor else { // main program with ELF1 de-compressor
addStubEntrySections(ft, methods_used | (1u << ph_forced_method(ph.method)) ); addStubEntrySections(ft, methods_used | (1u << (0xFF & ph_forced_method(ph.method))) );
if (!xct_off) { // main program if (!xct_off) { // main program
defineSymbols(ft); defineSymbols(ft);
} }
@@ -1697,6 +1703,8 @@ PackLinuxElf32::buildLinuxLoader(
relocateLoader(); relocateLoader();
} }
unsigned bb1; // aid for possible debugging NRV/UCL
void void
PackLinuxElf64::buildLinuxLoader( PackLinuxElf64::buildLinuxLoader(
upx_byte const *const proto, upx_byte const *const proto,
@@ -1726,9 +1734,9 @@ PackLinuxElf64::buildLinuxLoader(
// EXP_TAIL FIXME: unfilter // EXP_TAIL FIXME: unfilter
// SO_TAIL // SO_TAIL
// SO_MAIN C-language supervision based on PT_LOADs // SO_MAIN C-language supervision based on PT_LOADs
char sec[120]; memset(sec, 0, sizeof(sec)); // debug convenience char sec[200]; memset(sec, 0, sizeof(sec)); // debug convenience
int len = 0; int len = 0;
unsigned m_decompr = methods_used | (1u << ph_forced_method(ph.method)); unsigned m_decompr = methods_used | (1u << (0xFF & ph_forced_method(ph.method)));
len += snprintf(sec, sizeof(sec), "%s", "SO_HEAD,ptr_NEXT,EXP_HEAD"); len += snprintf(sec, sizeof(sec), "%s", "SO_HEAD,ptr_NEXT,EXP_HEAD");
// Start of dasiy-chain fall-through. // Start of dasiy-chain fall-through.
@@ -1771,9 +1779,9 @@ PackLinuxElf64::buildLinuxLoader(
|| this->e_machine==Elf64_Ehdr::EM_PPC64 || this->e_machine==Elf64_Ehdr::EM_PPC64
) { // main program with ELF2 de-compressor (folded portion) ) { // main program with ELF2 de-compressor (folded portion)
initLoader(fold, szfold); initLoader(fold, szfold);
char sec[120]; memset(sec, 0, sizeof(sec)); // debug convenience char sec[200]; memset(sec, 0, sizeof(sec)); // debug convenience
int len = 0; int len = 0;
unsigned m_decompr = methods_used | (1u << ph_forced_method(ph.method)); unsigned m_decompr = methods_used | (1u << (0xFF & ph_forced_method(ph.method)));
len += snprintf(sec, sizeof(sec), "%s", ".text,EXP_HEAD"); len += snprintf(sec, sizeof(sec), "%s", ".text,EXP_HEAD");
if (((1u<<M_NRV2B_LE32)|(1u<<M_NRV2B_8)|(1u<<M_NRV2B_LE16)) & m_decompr) { if (((1u<<M_NRV2B_LE32)|(1u<<M_NRV2B_8)|(1u<<M_NRV2B_LE16)) & m_decompr) {
len += snprintf(&sec[len], sizeof(sec) - len, ",%s", "NRV2B"); len += snprintf(&sec[len], sizeof(sec) - len, ",%s", "NRV2B");
@@ -1868,7 +1876,14 @@ PackLinuxElf64::buildLinuxLoader(
|| this->e_machine==Elf64_Ehdr::EM_AARCH64 || this->e_machine==Elf64_Ehdr::EM_AARCH64
|| this->e_machine==Elf64_Ehdr::EM_PPC64 || this->e_machine==Elf64_Ehdr::EM_PPC64
) { // main program with ELF2 de-compressor ) { // main program with ELF2 de-compressor
addLoader("ELFMAINX,ELFMAINZ,FOLDEXEC,IDENTSTR"); addLoader("ELFMAINX");
// NYI for PPC64 {
if (opt->o_unix.catch_sigsegv && hasLoaderSection("ELFSIGSEGV"))
addLoader("ELFSIGSEGV");
if (this->e_machine!=Elf64_Ehdr::EM_PPC64)
addLoader("ELFMAINX2");
// } end NYI for PPC64
addLoader("ELFMAINZ,FOLDEXEC,IDENTSTR");
if (this->e_machine==Elf64_Ehdr::EM_PPC64 if (this->e_machine==Elf64_Ehdr::EM_PPC64
&& ehdri.e_ident[Elf64_Ehdr::EI_DATA]==Elf64_Ehdr::ELFDATA2MSB) { && ehdri.e_ident[Elf64_Ehdr::EI_DATA]==Elf64_Ehdr::ELFDATA2MSB) {
addLoader("ELFMAINZe"); addLoader("ELFMAINZe");
@@ -1878,7 +1893,7 @@ PackLinuxElf64::buildLinuxLoader(
} }
} }
else { // main program with ELF1 de-compressor else { // main program with ELF1 de-compressor
addStubEntrySections(ft, methods_used | (1u << ph_forced_method(ph.method)) ); addStubEntrySections(ft, methods_used | (1u << (0xFF & ph_forced_method(ph.method))) );
if (!xct_off) { // main program if (!xct_off) { // main program
defineSymbols(ft); defineSymbols(ft);
} }
@@ -2312,6 +2327,8 @@ unsigned PackLinuxElf32::elf_find_table_size(unsigned dt_type, unsigned sh_type)
x_rva = elf_unsigned_dynamic(dt_type); x_rva = elf_unsigned_dynamic(dt_type);
} }
Elf32_Phdr const *const x_phdr = elf_find_Phdr_for_va(x_rva, phdri, e_phnum); Elf32_Phdr const *const x_phdr = elf_find_Phdr_for_va(x_rva, phdri, e_phnum);
if (!x_phdr)
return ~0u; // corrupted Phdrs?
unsigned const d_off = x_rva - get_te32(&x_phdr->p_vaddr); unsigned const d_off = x_rva - get_te32(&x_phdr->p_vaddr);
unsigned const y_ndx = find_dt_ndx(d_off + get_te32(&x_phdr->p_offset)); unsigned const y_ndx = find_dt_ndx(d_off + get_te32(&x_phdr->p_offset));
if (~0u != y_ndx) { if (~0u != y_ndx) {
@@ -2373,10 +2390,11 @@ PackLinuxElf32::invert_pt_dynamic(Elf32_Dyn const *dynp, u32_t headway)
throwCantPack("bad DT_STRSZ %#x", strtab_max); throwCantPack("bad DT_STRSZ %#x", strtab_max);
} }
// Find end of DT_SYMTAB { // Find end of DT_SYMTAB
unsigned const tmp2 = elf_find_table_size(Elf32_Dyn::DT_SYMTAB, unsigned const tmp2 = elf_find_table_size(Elf32_Dyn::DT_SYMTAB,
Elf32_Shdr::SHT_DYNSYM); Elf32_Shdr::SHT_DYNSYM);
symnum_max = (~0u == tmp2) ? 0 : tmp1 / sizeof(Elf32_Sym); symnum_max = (~0u == tmp2) ? 0 : tmp2 / sizeof(Elf32_Sym);
}
unsigned v_sym = dt_table[Elf32_Dyn::DT_SYMTAB]; unsigned v_sym = dt_table[Elf32_Dyn::DT_SYMTAB];
if (v_sym) { if (v_sym) {
@@ -2394,6 +2412,12 @@ PackLinuxElf32::invert_pt_dynamic(Elf32_Dyn const *dynp, u32_t headway)
// Find end of DT_HASH // Find end of DT_HASH
hashend = (unsigned const *)(void const *)(elf_find_table_size( hashend = (unsigned const *)(void const *)(elf_find_table_size(
Elf32_Dyn::DT_HASH, Elf32_Shdr::SHT_HASH) + (char const *)hashtab); Elf32_Dyn::DT_HASH, Elf32_Shdr::SHT_HASH) + (char const *)hashtab);
if (!hashtab || (char const *)hashend <= (char const *)&hashtab[2]
|| file_image.getSizeInBytes()
< (unsigned)((char const *)&hashtab[2] - (char *)&file_image[0]) )
{
throwCantPack("bad DT_HASH %#x", v_hsh);
}
unsigned const nbucket = get_te32(&hashtab[0]); unsigned const nbucket = get_te32(&hashtab[0]);
unsigned const *const buckets = &hashtab[2]; unsigned const *const buckets = &hashtab[2];
@@ -3786,8 +3810,8 @@ PackLinuxElf32::generateElfHdr(
assert(get_te16(&h2->ehdr.e_phentsize) == sizeof(Elf32_Phdr)); assert(get_te16(&h2->ehdr.e_phentsize) == sizeof(Elf32_Phdr));
h2->ehdr.e_shoff = 0; h2->ehdr.e_shoff = 0;
set_te16(&h2->ehdr.e_shentsize, sizeof(Elf32_Shdr)); // libbfd-2.41-38.fc40
if (o_elf_shnum) { if (o_elf_shnum) {
set_te16(&h2->ehdr.e_shentsize, sizeof(Elf32_Shdr));
h2->ehdr.e_shnum = o_elf_shnum; h2->ehdr.e_shnum = o_elf_shnum;
h2->ehdr.e_shstrndx = o_elf_shnum - 1; h2->ehdr.e_shstrndx = o_elf_shnum - 1;
} }
@@ -3795,7 +3819,9 @@ PackLinuxElf32::generateElfHdr(
// https://bugzilla.redhat.com/show_bug.cgi?id=2131609 // https://bugzilla.redhat.com/show_bug.cgi?id=2131609
// 0==.e_shnum is a special case for libbfd // 0==.e_shnum is a special case for libbfd
// that requires 0==.e_shentsize in order to force "no Shdrs" // that requires 0==.e_shentsize in order to force "no Shdrs"
h2->ehdr.e_shentsize = 0; // But qemu 8.2.9 with libbfd-2.41-38.fc40 says EXEC format error
// and uses 0==.e_shoff instead.
// h2->ehdr.e_shentsize = 0;
h2->ehdr.e_shnum = 0; h2->ehdr.e_shnum = 0;
h2->ehdr.e_shstrndx = 0; h2->ehdr.e_shstrndx = 0;
} }
@@ -3995,7 +4021,7 @@ PackOpenBSDElf32x86::generateElfHdr(
h3->ehdr.e_shoff = 0; h3->ehdr.e_shoff = 0;
assert(get_te16(&h3->ehdr.e_ehsize) == sizeof(Elf32_Ehdr)); assert(get_te16(&h3->ehdr.e_ehsize) == sizeof(Elf32_Ehdr));
assert(get_te16(&h3->ehdr.e_phentsize) == sizeof(Elf32_Phdr)); assert(get_te16(&h3->ehdr.e_phentsize) == sizeof(Elf32_Phdr));
h3->ehdr.e_shentsize = 0; set_te16(&h3->ehdr.e_shentsize, sizeof(Elf32_Shdr)); // libbfd-2.41-38.fc40
h3->ehdr.e_shnum = 0; h3->ehdr.e_shnum = 0;
h3->ehdr.e_shstrndx = 0; h3->ehdr.e_shstrndx = 0;
@@ -4091,8 +4117,8 @@ PackLinuxElf64::generateElfHdr(
assert(get_te16(&h2->ehdr.e_phentsize) == sizeof(Elf64_Phdr)); assert(get_te16(&h2->ehdr.e_phentsize) == sizeof(Elf64_Phdr));
h2->ehdr.e_shoff = 0; h2->ehdr.e_shoff = 0;
set_te16(&h2->ehdr.e_shentsize, sizeof(Elf64_Shdr)); // libbfd-2.41-38.fc40
if (o_elf_shnum) { if (o_elf_shnum) {
set_te16(&h2->ehdr.e_shentsize, sizeof(Elf64_Shdr));
h2->ehdr.e_shnum = o_elf_shnum; h2->ehdr.e_shnum = o_elf_shnum;
h2->ehdr.e_shstrndx = o_elf_shnum - 1; h2->ehdr.e_shstrndx = o_elf_shnum - 1;
} }
@@ -4100,7 +4126,9 @@ PackLinuxElf64::generateElfHdr(
// https://bugzilla.redhat.com/show_bug.cgi?id=2131609 // https://bugzilla.redhat.com/show_bug.cgi?id=2131609
// 0==.e_shnum is a special case for libbfd // 0==.e_shnum is a special case for libbfd
// that requires 0==.e_shentsize in order to force "no Shdrs" // that requires 0==.e_shentsize in order to force "no Shdrs"
h2->ehdr.e_shentsize = 0; // But qemu 8.2.9 with libbfd-2.41-38.fc40 says EXEC format error
// and uses 0==.e_shoff instead.
// h2->ehdr.e_shentsize = 0;
h2->ehdr.e_shnum = 0; h2->ehdr.e_shnum = 0;
h2->ehdr.e_shstrndx = 0; h2->ehdr.e_shstrndx = 0;
} }
@@ -4300,7 +4328,7 @@ void PackLinuxElf32::pack1(OutputFile * /*fo*/, Filter &ft)
fi->readx(ibuf, filesz); fi->readx(ibuf, filesz);
ft = orig_ft; ft = orig_ft;
ph = orig_ph; ph = orig_ph;
ph.method = ph_force_method(methods[k]); ph.set_method(ph_force_method(methods[k]), offset);
ph.u_len = filesz; ph.u_len = filesz;
compressWithFilters(&ft, OVERHEAD, NULL_cconf, 10, true); compressWithFilters(&ft, OVERHEAD, NULL_cconf, 10, true);
sz_this += ph.c_len; sz_this += ph.c_len;
@@ -4313,7 +4341,7 @@ void PackLinuxElf32::pack1(OutputFile * /*fo*/, Filter &ft)
fi->readx(ibuf, sz_tail); fi->readx(ibuf, sz_tail);
ft = orig_ft; ft = orig_ft;
ph = orig_ph; ph = orig_ph;
ph.method = ph_force_method(methods[k]); ph.set_method(ph_force_method(methods[k]));
ph.u_len = sz_tail; ph.u_len = sz_tail;
compressWithFilters(&ft, OVERHEAD, NULL_cconf, 10, true); compressWithFilters(&ft, OVERHEAD, NULL_cconf, 10, true);
sz_this += ph.c_len; sz_this += ph.c_len;
@@ -4326,7 +4354,7 @@ void PackLinuxElf32::pack1(OutputFile * /*fo*/, Filter &ft)
} }
ft = orig_ft; ft = orig_ft;
ph = orig_ph; ph = orig_ph;
ph.method = ph_force_method(method_best); ph.set_method(ph_force_method(method_best));
} }
Elf32_Phdr *phdr = phdri; Elf32_Phdr *phdr = phdri;
@@ -5152,7 +5180,7 @@ void PackLinuxElf64::pack1(OutputFile * /*fo*/, Filter &ft)
fi->readx(ibuf, filesz); fi->readx(ibuf, filesz);
ft = orig_ft; ft = orig_ft;
ph = orig_ph; ph = orig_ph;
ph.method = ph_force_method(methods[k]); ph.set_method(ph_force_method(methods[k]));
ph.u_len = filesz; ph.u_len = filesz;
compressWithFilters(&ft, OVERHEAD, NULL_cconf, 10, true); compressWithFilters(&ft, OVERHEAD, NULL_cconf, 10, true);
sz_this += ph.c_len; sz_this += ph.c_len;
@@ -5165,7 +5193,7 @@ void PackLinuxElf64::pack1(OutputFile * /*fo*/, Filter &ft)
fi->readx(ibuf, sz_tail); fi->readx(ibuf, sz_tail);
ft = orig_ft; ft = orig_ft;
ph = orig_ph; ph = orig_ph;
ph.method = ph_force_method(methods[k]); ph.set_method(ph_force_method(methods[k]));
ph.u_len = sz_tail; ph.u_len = sz_tail;
compressWithFilters(&ft, OVERHEAD, NULL_cconf, 10, true); compressWithFilters(&ft, OVERHEAD, NULL_cconf, 10, true);
sz_this += ph.c_len; sz_this += ph.c_len;
@@ -5178,7 +5206,7 @@ void PackLinuxElf64::pack1(OutputFile * /*fo*/, Filter &ft)
} }
ft = orig_ft; ft = orig_ft;
ph = orig_ph; ph = orig_ph;
ph.method = ph_force_method(method_best); ph.set_method(ph_force_method(method_best));
} }
Elf64_Phdr *phdr = phdri; Elf64_Phdr *phdr = phdri;
@@ -6078,6 +6106,8 @@ unsigned PackLinuxElf32::forward_Shdrs(OutputFile *fo, Elf32_Ehdr *const eho)
// Keep _Shdr for SHF_WRITE. // Keep _Shdr for SHF_WRITE.
// Discard _Shdr with (0==sh_addr), except _Shdr[0] // Discard _Shdr with (0==sh_addr), except _Shdr[0]
// Keep ARM_ATTRIBUTES // Keep ARM_ATTRIBUTES
// Remove .ARM.extab(PROGBITS) and .ARM.exidx(SHT_ARM_EXIDX)
// because they refer to compressed .text(PT_LOAD)
unsigned const want_types_mask = 0 unsigned const want_types_mask = 0
| 1u<<SHT_PROGBITS // see comment above, and special code below | 1u<<SHT_PROGBITS // see comment above, and special code below
| 1u<<SHT_HASH | 1u<<SHT_HASH
@@ -6152,30 +6182,14 @@ unsigned PackLinuxElf32::forward_Shdrs(OutputFile *fo, Elf32_Ehdr *const eho)
|| (Elf32_Shdr::SHT_ARM_ATTRIBUTES == sh_type) || (Elf32_Shdr::SHT_ARM_ATTRIBUTES == sh_type)
) { ) {
*sh_out = *sh_in; // *sh_in is a candidate for fowarding *sh_out = *sh_in; // *sh_in is a candidate for fowarding
if (sh_offset > xct_off) { // may slide down: earlier compression
if (sh_offset >= xct_off_hi) { // easy: so_slide down
if (Elf32_Shdr::SHT_ARM_ATTRIBUTES != sh_type) {
slide_sh_offset(sh_out);
}
}
else { // somewhere in compressed; try proportional (aligned)
// But note that PROGBITS without SHF_ALLOC
// will be dropped below.
u32_t const slice = xct_off + (~0xFu & (unsigned)(
(sh_offset - xct_off) *
((sh_offset - xct_off) / (float)(xct_off_hi - xct_off))));
//set_te32(&sh_out->sh_addr, slice);
set_te32(&sh_out->sh_offset, slice);
}
u32_t const max_sz = total_out - get_te32(&sh_out->sh_offset);
if (sh_size > max_sz) { // avoid complaint "extends beyond EOF"
set_te32(&sh_out->sh_size, max_sz);
}
}
if (j == e_shstrndx) { // changes Elf32_Ehdr itself if (j == e_shstrndx) { // changes Elf32_Ehdr itself
set_te16(&eho->e_shstrndx, sh_out - set_te16(&eho->e_shstrndx, sh_out -
(Elf32_Shdr *)mb_shdro.getVoidPtr()); (Elf32_Shdr *)mb_shdro.getVoidPtr());
} }
if (Elf32_Shdr::SHT_ARM_EXIDX == sh_type
|| 0==strcmp(".ARM.extab", name)) {
/* OMIT */ continue; // OMIT: compressed contents
}
if (Elf32_Shdr::SHT_ARM_ATTRIBUTES == sh_type if (Elf32_Shdr::SHT_ARM_ATTRIBUTES == sh_type
|| (SHT_NOTE == sh_type && xct_off < sh_offset) || (SHT_NOTE == sh_type && xct_off < sh_offset)
) { // append a copy ) { // append a copy
@@ -6189,7 +6203,7 @@ unsigned PackLinuxElf32::forward_Shdrs(OutputFile *fo, Elf32_Ehdr *const eho)
if (!(Elf32_Shdr::SHF_ALLOC & sh_flags)) { if (!(Elf32_Shdr::SHF_ALLOC & sh_flags)) {
// .debug_*, .gnu_debuglink etc. Typically compressed // .debug_*, .gnu_debuglink etc. Typically compressed
// but not in RAM, and gdb (BFD) gets confused. // but not in RAM, and gdb (BFD) gets confused.
continue; // OMIT the commit: do not forward /* OMIT */ continue; // OMIT the commit: do not forward
} else } else
if (sh_offset <= xct_off if (sh_offset <= xct_off
&& 0 == strcmp(".text", name) ) { && 0 == strcmp(".text", name) ) {
@@ -6204,9 +6218,31 @@ unsigned PackLinuxElf32::forward_Shdrs(OutputFile *fo, Elf32_Ehdr *const eho)
n_shstrsec = sh_out; n_shstrsec = sh_out;
} else } else
if (strcmp(".dynstr", name)) { if (strcmp(".dynstr", name)) {
continue; // OMIT the commit of non-global symbol names /* OMIT */ continue; // OMIT the commit of non-global symbol names
} }
} }
if (sh_offset > xct_off) { // may slide down: earlier compression
if (sh_offset >= xct_off_hi) { // easy: so_slide down
if (Elf32_Shdr::SHT_ARM_ATTRIBUTES != sh_type
// && Elf32_Shdr::SHT_ARM_EXIDX != sh_type
) {
slide_sh_offset(sh_out);
}
}
else { // somewhere in compressed; try proportional (aligned)
// Note that PROGBITS without SHF_ALLOC is already omitted.
u32_t const slice = xct_off + (~0xFu & (unsigned)(
(sh_offset - xct_off) *
((sh_offset - xct_off) / (float)(xct_off_hi - xct_off))));
//set_te32(&sh_out->sh_addr, slice);
set_te32(&sh_out->sh_offset, slice);
}
u32_t const max_sz = total_out - get_te32(&sh_out->sh_offset);
if (sh_size > max_sz) { // avoid complaint "extends beyond EOF"
set_te32(&sh_out->sh_size, max_sz);
}
}
// Will be forwarded, but needs a name.
set_te32(&sh_out->sh_name, ptr_shstrings - (char *)mb_shstrings.getVoidPtr()); set_te32(&sh_out->sh_name, ptr_shstrings - (char *)mb_shstrings.getVoidPtr());
do { // stupid MSVC lacks stpcpy() do { // stupid MSVC lacks stpcpy()
*ptr_shstrings++ = *name; *ptr_shstrings++ = *name;
@@ -6252,6 +6288,7 @@ unsigned PackLinuxElf32::forward_Shdrs(OutputFile *fo, Elf32_Ehdr *const eho)
} }
} }
} }
UNUSED(ptr);
fo->seek(0, SEEK_SET); fo->seek(0, SEEK_SET);
fo->rewrite(eho, sizeof(*eho)); fo->rewrite(eho, sizeof(*eho));
@@ -6262,6 +6299,7 @@ unsigned PackLinuxElf32::forward_Shdrs(OutputFile *fo, Elf32_Ehdr *const eho)
return penalty; return penalty;
} }
// NYI 2025-12-10: should be merged from Elf32::forward_Shdrs
unsigned PackLinuxElf64::forward_Shdrs(OutputFile *fo, Elf64_Ehdr *const eho) unsigned PackLinuxElf64::forward_Shdrs(OutputFile *fo, Elf64_Ehdr *const eho)
{ {
if (!fo) { if (!fo) {
@@ -6273,7 +6311,9 @@ unsigned PackLinuxElf64::forward_Shdrs(OutputFile *fo, Elf64_Ehdr *const eho)
// Keep _Shdr for rtld data (below xct_off). // Keep _Shdr for rtld data (below xct_off).
// Discard _Shdr for compressed regions, except ".text" for gdb. // Discard _Shdr for compressed regions, except ".text" for gdb.
// Keep _Shdr with SHF_WRITE. // Keep _Shdr with SHF_WRITE.
// Keep ARM_ATTRIBUTES // Keep ARM_ATTRIBUTES.
// Remove .ARM.extab(PROGBITS) and .ARM.exidx(ARM_EXIDX)
// because they refer to compressed .text.
// Discard _Shdr with (0==sh_addr), except _Shdr[0] // Discard _Shdr with (0==sh_addr), except _Shdr[0]
unsigned const want_types_mask = unsigned const want_types_mask =
1u<<SHT_SYMTAB 1u<<SHT_SYMTAB
@@ -6321,7 +6361,6 @@ unsigned PackLinuxElf64::forward_Shdrs(OutputFile *fo, Elf64_Ehdr *const eho)
for (unsigned j = 1; j < e_shnum; ++j, ++sh_in) { for (unsigned j = 1; j < e_shnum; ++j, ++sh_in) {
char const *sh_name = &shstrtab[get_te32(&sh_in->sh_name)]; char const *sh_name = &shstrtab[get_te32(&sh_in->sh_name)];
(void)sh_name; // debugging
unsigned sh_type = get_te32(&sh_in->sh_type); unsigned sh_type = get_te32(&sh_in->sh_type);
u64_t sh_flags = get_te64(&sh_in->sh_flags); u64_t sh_flags = get_te64(&sh_in->sh_flags);
u64_t sh_addr = get_te64(&sh_in->sh_addr); u64_t sh_addr = get_te64(&sh_in->sh_addr);
@@ -6366,6 +6405,9 @@ unsigned PackLinuxElf64::forward_Shdrs(OutputFile *fo, Elf64_Ehdr *const eho)
set_te16(&eho->e_shstrndx, sh_out - set_te16(&eho->e_shstrndx, sh_out -
(Elf64_Shdr *)mb_shdro.getVoidPtr()); (Elf64_Shdr *)mb_shdro.getVoidPtr());
} }
if (0==strcmp(".ARM.extab", sh_name)) {
/* OMIT */ continue; // OMIT: compressed contents
}
if (j == e_shstrndx if (j == e_shstrndx
|| sec_arm_attr == sh_in || sec_arm_attr == sh_in
|| (SHT_NOTE == sh_type && xct_off < sh_offset) || (SHT_NOTE == sh_type && xct_off < sh_offset)
@@ -7303,8 +7345,11 @@ void PackLinuxElf32::un_DT_INIT(
|| Elf32_Dyn::DT_PREINIT_ARRAY == tag) { || Elf32_Dyn::DT_PREINIT_ARRAY == tag) {
// 'val' is the RVA of the first slot, which is the slot that // 'val' is the RVA of the first slot, which is the slot that
// the compressor changed to be the entry to the run-time stub. // the compressor changed to be the entry to the run-time stub.
Elf32_Rel *rp = (Elf32_Rel *)elf_find_dynamic(Elf32_Dyn::DT_NULL); Elf32_Dyn *dyn_null = elf_find_dynptr(Elf32_Dyn::DT_NULL);
((Elf32_Dyn *)elf_find_dynptr(Elf32_Dyn::DT_NULL))->d_val = 0; if (!dyn_null)
throwCantUnpack("bad PT_DYNAMIC .end");
Elf32_Rel *rp = (Elf32_Rel *)elf_find_dynamic(dyn_null->d_val);
dyn_null->d_val = 0;
if (rp) { if (rp) {
// Compressor saved the original *rp in dynsym[0] // Compressor saved the original *rp in dynsym[0]
Elf32_Rel *rp_unc = (Elf32_Rel *)&dynsym[0]; // pointer Elf32_Rel *rp_unc = (Elf32_Rel *)&dynsym[0]; // pointer
@@ -7403,6 +7448,8 @@ void PackLinuxElf32::un_DT_INIT(
Elf32_Ehdr const *const o_ehdr = (Elf32_Ehdr const *)(void *)lowmem; Elf32_Ehdr const *const o_ehdr = (Elf32_Ehdr const *)(void *)lowmem;
unsigned const o_phnum = o_ehdr->e_phnum; unsigned const o_phnum = o_ehdr->e_phnum;
if (((1<<16) - sizeof(Elf32_Ehdr)) / sizeof(Elf32_Phdr) < o_phnum)
throwCantUnpack("bad Ehdr.e_phnum %#x", o_phnum);
phdr = phdro; phdr = phdro;
for (unsigned j = 0; j < o_phnum; ++j, ++phdr) if (is_LOAD(phdr)) { for (unsigned j = 0; j < o_phnum; ++j, ++phdr) if (is_LOAD(phdr)) {
upx_uint32_t vaddr = get_te32(&phdr->p_vaddr); upx_uint32_t vaddr = get_te32(&phdr->p_vaddr);
@@ -7410,6 +7457,8 @@ void PackLinuxElf32::un_DT_INIT(
upx_uint32_t d = plt_va - vaddr - asl_delta; upx_uint32_t d = plt_va - vaddr - asl_delta;
if (d < filesz) { if (d < filesz) {
upx_uint32_t offset = get_te32(&phdr->p_offset); upx_uint32_t offset = get_te32(&phdr->p_offset);
if ((upx_uint32_t)file_size <= offset)
throwCantUnpack("bad phdr[%d].p_offset %#zx", j, (size_t)offset);
if (fo) { if (fo) {
fo->seek(d + offset, SEEK_SET); fo->seek(d + offset, SEEK_SET);
fo->rewrite(jump_slots, n_plt * sizeof(upx_uint32_t)); fo->rewrite(jump_slots, n_plt * sizeof(upx_uint32_t));
@@ -7479,12 +7528,15 @@ void PackLinuxElf64::un_DT_INIT(
} }
// Apparently the hard case is common for some Android IDEs. // Apparently the hard case is common for some Android IDEs.
// No DT_INIT; only DT_INIT_ARRAY. // No DT_INIT; only DT_INIT_ARRAY.
else if (Elf32_Dyn::DT_INIT_ARRAY == tag else if (Elf64_Dyn::DT_INIT_ARRAY == tag
|| Elf64_Dyn::DT_PREINIT_ARRAY == tag) { || Elf64_Dyn::DT_PREINIT_ARRAY == tag) {
// 'val' is the RVA of the first slot, which is the slot that // 'val' is the RVA of the first slot, which is the slot that
// the compressor changed to be the entry to the run-time stub. // the compressor changed to be the entry to the run-time stub.
Elf64_Rela *rp = (Elf64_Rela *)elf_find_dynamic(Elf64_Dyn::DT_NULL); Elf64_Dyn *dyn_null = elf_find_dynptr(Elf64_Dyn::DT_NULL);
((Elf64_Dyn *)elf_find_dynptr(Elf64_Dyn::DT_NULL))->d_val = 0; if (!dyn_null)
throwCantUnpack("bad PT_DYNAMIC .end");
Elf64_Rela *rp = (Elf64_Rela *)elf_find_dynamic(dyn_null->d_val);
dyn_null->d_val = 0;
if (rp) { if (rp) {
// Compressor saved the original *rp in dynsym[0] // Compressor saved the original *rp in dynsym[0]
Elf64_Rela *rp_unc = (Elf64_Rela *)&dynsym[0]; // pointer Elf64_Rela *rp_unc = (Elf64_Rela *)&dynsym[0]; // pointer
@@ -7547,6 +7599,8 @@ void PackLinuxElf64::un_DT_INIT(
Elf64_Ehdr const *const o_ehdr = (Elf64_Ehdr const *)(void *)lowmem; Elf64_Ehdr const *const o_ehdr = (Elf64_Ehdr const *)(void *)lowmem;
unsigned const o_phnum = o_ehdr->e_phnum; unsigned const o_phnum = o_ehdr->e_phnum;
if (((1<<16) - sizeof(Elf64_Ehdr)) / sizeof(Elf64_Phdr) < o_phnum)
throwCantUnpack("bad Ehdr.e_phnum %#x", o_phnum);
phdr = phdro; phdr = phdro;
for (unsigned j = 0; j < o_phnum; ++j, ++phdr) if (is_LOAD(phdr)) { for (unsigned j = 0; j < o_phnum; ++j, ++phdr) if (is_LOAD(phdr)) {
upx_uint64_t vaddr = get_te64(&phdr->p_vaddr); upx_uint64_t vaddr = get_te64(&phdr->p_vaddr);
@@ -7554,6 +7608,8 @@ void PackLinuxElf64::un_DT_INIT(
upx_uint64_t d = plt_va - vaddr - asl_delta; upx_uint64_t d = plt_va - vaddr - asl_delta;
if (d < filesz) { if (d < filesz) {
upx_uint64_t offset = get_te64(&phdr->p_offset); upx_uint64_t offset = get_te64(&phdr->p_offset);
if ((upx_uint64_t)file_size <= offset)
throwCantUnpack("bad phdr[%d].p_offset %#zx", j, (size_t)offset);
if (fo) { if (fo) {
fo->seek(d + offset, SEEK_SET); fo->seek(d + offset, SEEK_SET);
fo->rewrite(jump_slots, n_plt * sizeof(upx_uint64_t)); fo->rewrite(jump_slots, n_plt * sizeof(upx_uint64_t));
@@ -7620,7 +7676,7 @@ void PackLinuxElf64::unpack(OutputFile *fo)
fi->readx(&bhdr, szb_info); fi->readx(&bhdr, szb_info);
ph.u_len = get_te32(&bhdr.sz_unc); ph.u_len = get_te32(&bhdr.sz_unc);
ph.c_len = get_te32(&bhdr.sz_cpr); ph.c_len = get_te32(&bhdr.sz_cpr);
ph.method = bhdr.b_method; ph.set_method(bhdr.b_method, overlay_offset + sizeof(p_info));
if (ph.c_len > file_size_u || ph.c_len == 0 || ph.u_len == 0 if (ph.c_len > file_size_u || ph.c_len == 0 || ph.u_len == 0
|| ph.u_len > orig_file_size) || ph.u_len > orig_file_size)
throwCantUnpack("b_info corrupted"); throwCantUnpack("b_info corrupted");
@@ -7665,15 +7721,17 @@ void PackLinuxElf64::unpack(OutputFile *fo)
unsigned b_method = ibuf[0]; unsigned b_method = ibuf[0];
unsigned b_extra = ibuf[3]; unsigned b_extra = ibuf[3];
if (M_ZSTD >= b_method && 0 == b_extra) { if (M_ZSTD >= b_method && 0 == b_extra) {
fi->seek( -(upx_off_t)(ph.c_len + szb_info), SEEK_CUR); unsigned where = fi->seek( -(upx_off_t)(ph.c_len + szb_info), SEEK_CUR);
szb_info = 12; szb_info = 12;
fi->readx(&bhdr, szb_info); fi->readx(&bhdr, szb_info);
ph.filter_cto = bhdr.b_cto8; ph.filter_cto = bhdr.b_cto8;
ph.method = bhdr.b_method; ph.set_method(bhdr.b_method, where);
prev_method = bhdr.b_method; // FIXME if multiple de-compressors prev_method = bhdr.b_method; // FIXME if multiple de-compressors
fi->readx(ibuf, ph.c_len); fi->readx(ibuf, ph.c_len);
} }
} }
if (ph.u_len < sizeof(*ehdr))
throwCantUnpack("ElfXX_Ehdr corrupted");
decompress(ibuf, (upx_byte *)ehdr, false); decompress(ibuf, (upx_byte *)ehdr, false);
if (ehdr->e_type !=ehdri.e_type if (ehdr->e_type !=ehdri.e_type
|| ehdr->e_machine!=ehdri.e_machine || ehdr->e_machine!=ehdri.e_machine
@@ -7867,7 +7925,7 @@ void PackLinuxElf64::unpack(OutputFile *fo)
// check for end-of-file // check for end-of-file
fi->readx(&bhdr, szb_info); fi->readx(&bhdr, szb_info);
ph.method = bhdr.b_method; ph.set_method(bhdr.b_method, ~0u);
unsigned const sz_unc = ph.u_len = get_te32(&bhdr.sz_unc); unsigned const sz_unc = ph.u_len = get_te32(&bhdr.sz_unc);
if (sz_unc == 0) { // uncompressed size 0 -> EOF if (sz_unc == 0) { // uncompressed size 0 -> EOF
@@ -8372,6 +8430,8 @@ unsigned PackLinuxElf64::elf_find_table_size(unsigned dt_type, unsigned sh_type)
x_rva = elf_unsigned_dynamic(dt_type); x_rva = elf_unsigned_dynamic(dt_type);
} }
Elf64_Phdr const *const x_phdr = elf_find_Phdr_for_va(x_rva, phdri, e_phnum); Elf64_Phdr const *const x_phdr = elf_find_Phdr_for_va(x_rva, phdri, e_phnum);
if (!x_phdr)
return ~0u; // corrupted Phdrs?
unsigned const d_off = x_rva - get_te64(&x_phdr->p_vaddr); unsigned const d_off = x_rva - get_te64(&x_phdr->p_vaddr);
unsigned const y_ndx = find_dt_ndx(d_off + get_te64(&x_phdr->p_offset)); unsigned const y_ndx = find_dt_ndx(d_off + get_te64(&x_phdr->p_offset));
if (~0u != y_ndx) { if (~0u != y_ndx) {
@@ -8437,10 +8497,11 @@ PackLinuxElf64::invert_pt_dynamic(Elf64_Dyn const *dynp, upx_uint64_t headway)
throwCantPack("bad DT_STRSZ %#x", strtab_max); throwCantPack("bad DT_STRSZ %#x", strtab_max);
} }
// Find end of DT_SYMTAB { // Find end of DT_SYMTAB
unsigned const tmp2 = elf_find_table_size(Elf64_Dyn::DT_SYMTAB, unsigned const tmp2 = elf_find_table_size(Elf64_Dyn::DT_SYMTAB,
Elf64_Shdr::SHT_DYNSYM); Elf64_Shdr::SHT_DYNSYM);
symnum_max = (~0u == tmp2) ? 0 : tmp1 / sizeof(Elf64_Sym); symnum_max = (~0u == tmp2) ? 0 : tmp2 / sizeof(Elf64_Sym);
}
unsigned v_sym = dt_table[Elf64_Dyn::DT_SYMTAB]; unsigned v_sym = dt_table[Elf64_Dyn::DT_SYMTAB];
if (v_sym) { if (v_sym) {
@@ -8459,6 +8520,12 @@ PackLinuxElf64::invert_pt_dynamic(Elf64_Dyn const *dynp, upx_uint64_t headway)
// Find end of DT_HASH // Find end of DT_HASH
hashend = (unsigned const *)(void const *)(elf_find_table_size( hashend = (unsigned const *)(void const *)(elf_find_table_size(
Elf64_Dyn::DT_HASH, Elf64_Shdr::SHT_HASH) + (char const *)hashtab); Elf64_Dyn::DT_HASH, Elf64_Shdr::SHT_HASH) + (char const *)hashtab);
if (!hashtab || (char const *)hashend <= (char const *)&hashtab[2]
|| file_image.getSizeInBytes()
< (unsigned)((char const *)&hashtab[2] - (char *)&file_image[0]) )
{
throwCantPack("bad DT_HASH %#x", v_hsh);
}
unsigned const nbucket = get_te32(&hashtab[0]); unsigned const nbucket = get_te32(&hashtab[0]);
unsigned const *const buckets = &hashtab[2]; unsigned const *const buckets = &hashtab[2];
@@ -8622,6 +8689,7 @@ Elf32_Sym const *PackLinuxElf32::elf_lookup(char const *name) const
break; // end sentinel break; // end sentinel
} }
if (n_bucket) { if (n_bucket) {
void const *EOM = file_size + (char const *)file_image.getVoidPtr();
unsigned const m = elf_hash(name) % n_bucket; unsigned const m = elf_hash(name) % n_bucket;
unsigned n_visit = 0; unsigned n_visit = 0;
unsigned si; unsigned si;
@@ -8635,6 +8703,9 @@ Elf32_Sym const *PackLinuxElf32::elf_lookup(char const *name) const
return &dynsym[si]; return &dynsym[si];
if (l_sym <= &dynsym[n_visit++]) if (l_sym <= &dynsym[n_visit++])
throwCantPack("circular DT_HASH chain %d\n", si); throwCantPack("circular DT_HASH chain %d\n", si);
// Detect next si out-of-bounds
if ((unsigned)((unsigned int const *)EOM - chains) <= si)
throwCantPack("bad DT_HASH chain %d\n", si);
} }
} }
} }
@@ -8665,9 +8736,9 @@ Elf32_Sym const *PackLinuxElf32::elf_lookup(char const *name) const
if (1& (w>>hbit1) & (w>>hbit2)) { if (1& (w>>hbit1) & (w>>hbit2)) {
unsigned const hhead = get_te32(&buckets[h % n_bucket]); unsigned const hhead = get_te32(&buckets[h % n_bucket]);
if (n_bucket <= (hhead - symbias)) { if (symnum_max <= hhead || (hhead && hhead < symbias)) {
throwCantPack("bad DT_GNU_HASH n_bucket{%#x} <= buckets[%d]{%#x} - symbias{%#x}\n", throwCantPack("bad DT_GNU_HASH symnum_max{%#x} <= buckets[%d]{%#x} < symbias{%#x}\n",
n_bucket, h % n_bucket, hhead, symbias); symnum_max, h % n_bucket, hhead, symbias);
} }
if (hhead) { if (hhead) {
Elf32_Sym const *dsp = &dynsym[hhead]; Elf32_Sym const *dsp = &dynsym[hhead];
@@ -8723,6 +8794,7 @@ Elf64_Sym const *PackLinuxElf64::elf_lookup(char const *name) const
break; //end break; //end
} }
if (n_bucket) { // -rust-musl can have "empty" hashtab if (n_bucket) { // -rust-musl can have "empty" hashtab
void const *const EOM = file_size + (char const *)file_image.getVoidPtr();
unsigned const m = elf_hash(name) % n_bucket; unsigned const m = elf_hash(name) % n_bucket;
unsigned n_visit = 0; unsigned n_visit = 0;
unsigned si; unsigned si;
@@ -8736,6 +8808,9 @@ Elf64_Sym const *PackLinuxElf64::elf_lookup(char const *name) const
return &dynsym[si]; return &dynsym[si];
if (l_sym <= &dynsym[n_visit++]) if (l_sym <= &dynsym[n_visit++])
throwCantPack("circular DT_HASH chain %d\n", si); throwCantPack("circular DT_HASH chain %d\n", si);
// Detect next si out-of-bounds
if ((unsigned)((unsigned int const *)EOM - chains) <= si)
throwCantPack("bad DT_HASH chain %d\n", si);
} }
} }
} }
@@ -8766,6 +8841,10 @@ Elf64_Sym const *PackLinuxElf64::elf_lookup(char const *name) const
upx_uint64_t const w = get_te64(&bitmask[(n_bitmask -1) & (h>>6)]); upx_uint64_t const w = get_te64(&bitmask[(n_bitmask -1) & (h>>6)]);
if (1& (w>>hbit1) & (w>>hbit2)) { if (1& (w>>hbit1) & (w>>hbit2)) {
unsigned hhead = get_te32(&buckets[h % n_bucket]); unsigned hhead = get_te32(&buckets[h % n_bucket]);
if (symnum_max <= hhead || (hhead && hhead < symbias)) {
throwCantPack("bad DT_GNU_HASH symnum_max{%#x} <= buckets[%d]{%#x} < symbias{%#x}\n",
symnum_max, h % n_bucket, hhead, symbias);
}
if (hhead) { if (hhead) {
Elf64_Sym const *dsp = &dynsym[hhead]; Elf64_Sym const *dsp = &dynsym[hhead];
unsigned const *hp = &hasharr[hhead - symbias]; unsigned const *hp = &hasharr[hhead - symbias];
@@ -8851,7 +8930,7 @@ void PackLinuxElf32::unpack(OutputFile *fo)
fi->readx(&bhdr, szb_info); fi->readx(&bhdr, szb_info);
ph.u_len = get_te32(&bhdr.sz_unc); ph.u_len = get_te32(&bhdr.sz_unc);
ph.c_len = get_te32(&bhdr.sz_cpr); ph.c_len = get_te32(&bhdr.sz_cpr);
ph.method = bhdr.b_method; ph.set_method(bhdr.b_method, overlay_offset + sizeof(p_info));
if (ph.c_len > (unsigned)file_size || ph.c_len == 0 || ph.u_len == 0 if (ph.c_len > (unsigned)file_size || ph.c_len == 0 || ph.u_len == 0
|| ph.u_len > orig_file_size) || ph.u_len > orig_file_size)
throwCantUnpack("b_info corrupted"); throwCantUnpack("b_info corrupted");
@@ -8885,6 +8964,8 @@ void PackLinuxElf32::unpack(OutputFile *fo)
if (ibuf.getSize() < ph.c_len) if (ibuf.getSize() < ph.c_len)
throwCompressedDataViolation(); throwCompressedDataViolation();
fi->readx(ibuf, ph.c_len); fi->readx(ibuf, ph.c_len);
if (ph.u_len < sizeof(*ehdr))
throwCantUnpack("ElfXX_Ehdr corrupted");
decompress(ibuf, (upx_byte *)ehdr, false); decompress(ibuf, (upx_byte *)ehdr, false);
if (ehdr->e_type !=ehdri.e_type if (ehdr->e_type !=ehdri.e_type
|| ehdr->e_machine!=ehdri.e_machine || ehdr->e_machine!=ehdri.e_machine
@@ -9076,7 +9157,7 @@ void PackLinuxElf32::unpack(OutputFile *fo)
// check for end-of-file // check for end-of-file
fi->readx(&bhdr, szb_info); fi->readx(&bhdr, szb_info);
ph.method = bhdr.b_method; ph.set_method(bhdr.b_method, ~0u);
unsigned const sz_unc = ph.u_len = get_te32(&bhdr.sz_unc); unsigned const sz_unc = ph.u_len = get_te32(&bhdr.sz_unc);
if (sz_unc == 0) { // uncompressed size 0 -> EOF if (sz_unc == 0) { // uncompressed size 0 -> EOF
+2
View File
@@ -1418,6 +1418,7 @@ void PackMachBase<T>::pack1(OutputFile *const fo, Filter &/*ft*/) // generate e
unsigned const sz_threado = threado_size(); unsigned const sz_threado = threado_size();
MemBuffer space(sz_threado); memset(space, 0, sz_threado); MemBuffer space(sz_threado); memset(space, 0, sz_threado);
fo->write(space, sz_threado); fo->write(space, sz_threado);
UNUSED(cmdsize);
} }
else if (my_filetype == Mach_header::MH_DYLIB) { else if (my_filetype == Mach_header::MH_DYLIB) {
Mach_command const *ptr = (Mach_command const *)rawmseg; Mach_command const *ptr = (Mach_command const *)rawmseg;
@@ -1449,6 +1450,7 @@ void PackMachBase<T>::pack1(OutputFile *const fo, Filter &/*ft*/) // generate e
} }
memset(&linkitem, 0, sizeof(linkitem)); memset(&linkitem, 0, sizeof(linkitem));
fo->write(&linkitem, sizeof(linkitem)); fo->write(&linkitem, sizeof(linkitem));
UNUSED(cmdsize);
} }
sz_mach_headers = fo->getBytesWritten(); sz_mach_headers = fo->getBytesWritten();
gap = secTEXT.offset - sz_mach_headers; gap = secTEXT.offset - sz_mach_headers;
+6 -2
View File
@@ -485,7 +485,6 @@ unsigned PackUnix::unpackExtent(unsigned wanted, OutputFile *fo,
fi->readx(&hdr, szb_info); fi->readx(&hdr, szb_info);
int const sz_unc = ph.u_len = get_te32(&hdr.sz_unc); int const sz_unc = ph.u_len = get_te32(&hdr.sz_unc);
int const sz_cpr = ph.c_len = get_te32(&hdr.sz_cpr); int const sz_cpr = ph.c_len = get_te32(&hdr.sz_cpr);
ph.method = hdr.b_method;
ph.filter_cto = hdr.b_cto8; ph.filter_cto = hdr.b_cto8;
if (sz_unc == 0 || M_LZMA < hdr.b_method) { if (sz_unc == 0 || M_LZMA < hdr.b_method) {
@@ -508,6 +507,7 @@ unsigned PackUnix::unpackExtent(unsigned wanted, OutputFile *fo,
c_adler = upx_adler32(ibuf + j, sz_cpr, c_adler); c_adler = upx_adler32(ibuf + j, sz_cpr, c_adler);
if (sz_cpr < sz_unc) { // block was compressed if (sz_cpr < sz_unc) { // block was compressed
ph.set_method(hdr.b_method);
decompress(ibuf+j, ibuf+inlen, false); decompress(ibuf+j, ibuf+inlen, false);
if (12==szb_info) { // modern per-block filter if (12==szb_info) { // modern per-block filter
if (hdr.b_ftid) { if (hdr.b_ftid) {
@@ -658,7 +658,11 @@ void PackUnix::unpack(OutputFile *fo)
fi->readx(&bhdr, szb_info); fi->readx(&bhdr, szb_info);
ph.u_len = sz_unc = get_te32(&bhdr.sz_unc); ph.u_len = sz_unc = get_te32(&bhdr.sz_unc);
ph.c_len = sz_cpr = get_te32(&bhdr.sz_cpr); ph.c_len = sz_cpr = get_te32(&bhdr.sz_cpr);
ph.method = bhdr.b_method; if (szb_info < sizeof(b_info)) { // some upx version 11
bhdr.b_method = ph.method;
bhdr.b_ftid = ph.filter;
bhdr.b_cto8 = ph.filter_cto;
}
if (sz_unc == 0) // uncompressed size 0 -> EOF if (sz_unc == 0) // uncompressed size 0 -> EOF
{ {
+6 -6
View File
@@ -857,9 +857,9 @@ void Packer::relocateLoader() {
} }
/************************************************************************* /*************************************************************************
// void Packer::compressWithFilters(): // void Packer::compressWithFilters():
// Try compression with several methods and filters, choose the best // Try compression with several methods and filters, choose the best
/ or first working one. Needs buildLoader(). // or first working one. Needs buildLoader().
// //
// Required inputs: // Required inputs:
// this->ph // this->ph
@@ -1015,9 +1015,9 @@ void Packer::compressWithFilters(byte *i_ptr,
byte *const hdr_ptr, const unsigned hdr_len, byte *const hdr_ptr, const unsigned hdr_len,
Filter *const parm_ft, // updated Filter *const parm_ft, // updated
const unsigned overlap_range, const unsigned overlap_range,
upx_compress_config_t const *const cconf, const upx_compress_config_t *const cconf,
int filter_strategy, // in+out for prepareFilters int filter_strategy, // in+out for prepareFilters
bool const inhibit_compression_check) { const bool inhibit_compression_check) {
parm_ft->buf_len = f_len; parm_ft->buf_len = f_len;
// struct copies // struct copies
const PackHeader orig_ph = this->ph; const PackHeader orig_ph = this->ph;
@@ -1219,7 +1219,7 @@ void Packer::compressWithFilters(Filter *ft, const unsigned overlap_range,
} }
void Packer::compressWithFilters(Filter *ft, const unsigned overlap_range, void Packer::compressWithFilters(Filter *ft, const unsigned overlap_range,
upx_compress_config_t const *cconf, int filter_strategy, const upx_compress_config_t *cconf, int filter_strategy,
unsigned filter_off, unsigned ibuf_off, unsigned obuf_off, unsigned filter_off, unsigned ibuf_off, unsigned obuf_off,
byte *const hdr_ptr, unsigned hdr_len, byte *const hdr_ptr, unsigned hdr_len,
bool inhibit_compression_check) { bool inhibit_compression_check) {
+11 -11
View File
@@ -48,7 +48,7 @@ protected:
public: public:
virtual ~PackerBase() noexcept {} virtual ~PackerBase() noexcept {}
// getVersion() enables detecting forward incompatibility of unpack() // getVersion() enables detecting forward incompatibility of unpack()
// by old upx when newer upx changes the format of compressed output. // by old UPX when newer UPX changes the format of compressed output.
virtual int getVersion() const = 0; virtual int getVersion() const = 0;
// A unique integer ID for this executable format; see UPX_F_xxx in conf.h. // A unique integer ID for this executable format; see UPX_F_xxx in conf.h.
virtual int getFormat() const = 0; virtual int getFormat() const = 0;
@@ -58,11 +58,11 @@ public:
virtual const int *getFilters() const = 0; virtual const int *getFilters() const = 0;
// canPack() should throw a cantPackException explaining why it cannot pack // canPack() should throw a cantPackException explaining why it cannot pack
// a recognized format. // a recognized format.
// canPack() can also return -1 to fail early; see class PackMaster // canPack() can also return -1 to fail early; see class PackMaster
virtual tribool canPack() = 0; virtual tribool canPack() = 0;
// canUnpack() should throw a cantUnpackException explaining why it cannot unpack // canUnpack() should throw a cantUnpackException explaining why it cannot unpack
// a recognized format. // a recognized format.
// canUnpack() can also return -1 to fail early; see class PackMaster // canUnpack() can also return -1 to fail early; see class PackMaster
virtual tribool canUnpack() = 0; virtual tribool canUnpack() = 0;
@@ -162,7 +162,7 @@ protected:
unsigned f_len, // subset of [*i_ptr, +i_len) unsigned f_len, // subset of [*i_ptr, +i_len)
byte *const hdr_ptr, unsigned hdr_len, byte *const hdr_ptr, unsigned hdr_len,
Filter *parm_ft, // updated Filter *parm_ft, // updated
unsigned overlap_range, upx_compress_config_t const *cconf, unsigned overlap_range, const upx_compress_config_t *cconf,
int filter_strategy, bool inhibit_compression_check = false); int filter_strategy, bool inhibit_compression_check = false);
// util for verifying overlapping decompression // util for verifying overlapping decompression
@@ -248,7 +248,7 @@ protected:
int patch_le32(void *b, int blen, const void *old, unsigned new_); int patch_le32(void *b, int blen, const void *old, unsigned new_);
void checkPatch(void *b, int blen, int boff, int size); void checkPatch(void *b, int blen, int boff, int size);
// relocation util // relocation util [see packer_r.cpp]
static unsigned optimizeReloc(unsigned relocnum, SPAN_P(byte) relocs, SPAN_S(byte) out, static unsigned optimizeReloc(unsigned relocnum, SPAN_P(byte) relocs, SPAN_S(byte) out,
SPAN_P(byte) image, unsigned image_size, int bits, bool bswap, SPAN_P(byte) image, unsigned image_size, int bits, bool bswap,
int *big); int *big);
@@ -260,7 +260,7 @@ protected:
// permissive version using "void *" // permissive version using "void *"
inline unsigned get_te16(const void *p) const noexcept { return bele->get16(p); } inline unsigned get_te16(const void *p) const noexcept { return bele->get16(p); }
inline unsigned get_te32(const void *p) const noexcept { return bele->get32(p); } inline unsigned get_te32(const void *p) const noexcept { return bele->get32(p); }
inline unsigned get_te64_32(const void *p) const { return (unsigned) bele->get64(p); } inline unsigned get_te64_32(const void *p) const may_throw { return (unsigned) bele->get64(p); }
inline upx_uint64_t get_te64(const void *p) const noexcept { return bele->get64(p); } inline upx_uint64_t get_te64(const void *p) const noexcept { return bele->get64(p); }
inline void set_te16(void *p, unsigned v) noexcept { bele->set16(p, v); } inline void set_te16(void *p, unsigned v) noexcept { bele->set16(p, v); }
inline void set_te32(void *p, unsigned v) noexcept { bele->set32(p, v); } inline void set_te32(void *p, unsigned v) noexcept { bele->set32(p, v); }
@@ -293,11 +293,11 @@ protected:
return bele->get32(p); return bele->get32(p);
} }
template <class T, class = enable_if_te64<T> > template <class T, class = enable_if_te64<T> >
inline unsigned get_te64_32(const T *p) const { inline unsigned get_te64_32(const T *p) const may_throw {
upx_uint64_t val = get_te64(p); upx_uint64_t v = bele->get64(p);
if (val >> 32) if ((v >> 32) != 0)
throwCantPack("64-bit value too big %#llx", val); throwCantPack("64-bit value too big %#llx", v);
return (unsigned) val; return (unsigned) v;
} }
template <class T, class = enable_if_te64<T> > template <class T, class = enable_if_te64<T> >
inline upx_uint64_t get_te64(const T *p) const noexcept { inline upx_uint64_t get_te64(const T *p) const noexcept {
+10
View File
@@ -45,6 +45,16 @@ void PackHeader::reset() noexcept {
compress_result.reset(); compress_result.reset();
} }
int PackHeader::set_method(int m, unsigned offset) {
unsigned mc = ~(0x80u << 24) & m; // see ph_forced_method
unsigned lo = 0xFF & m;
// See packer_c.cpp for "hi bytes" in M_LZMA_003 and M_LZMA_407.
// "hi bytes" are not allowed unless M_LZMA.
if ((lo < M_NRV2B_LE32 || M_LZMA < lo || (M_LZMA != lo && mc != lo)) && ~0u != offset)
throwCantPack("bad method %#x at %#x", (unsigned) m, offset);
return method = m;
}
/************************************************************************* /*************************************************************************
// extremely simple checksum for the header itself (since version 10) // extremely simple checksum for the header itself (since version 10)
**************************************************************************/ **************************************************************************/
+3 -2
View File
@@ -39,12 +39,13 @@ struct PackHeader final {
~PackHeader() noexcept = default; ~PackHeader() noexcept = default;
void reset() noexcept; void reset() noexcept;
int set_method(int m, unsigned offset = 0); // check, then assign
int getPackHeaderSize() const;
void putPackHeader(SPAN_S(byte) p) const; void putPackHeader(SPAN_S(byte) p) const;
bool decodePackHeaderFromBuf(SPAN_S(const byte) b, int blen); bool decodePackHeaderFromBuf(SPAN_S(const byte) b, int blen);
int getPackHeaderSize() const;
// fields stored in compressed file => see stub/src/include/header.S // fields stored in compressed file => see stub/src/include/header.S
// enum { magic = UPX_MAGIC_LE32 }; // enum { magic = UPX_MAGIC_LE32 };
int version; int version;
+2
View File
@@ -25,6 +25,8 @@
<markus@oberhumer.com> <ezerotven+github@gmail.com> <markus@oberhumer.com> <ezerotven+github@gmail.com>
*/ */
// dispatch to a concrete subclass of class PackerBase; see work.cpp
#include "conf.h" #include "conf.h"
#include "file.h" #include "file.h"
#include "packmast.h" #include "packmast.h"
+91 -45
View File
@@ -96,6 +96,7 @@ PeFile::PeFile(InputFile *f) : super(f) {
use_tls_callbacks = false; use_tls_callbacks = false;
oloadconf = nullptr; oloadconf = nullptr;
soloadconf = 0; soloadconf = 0;
dbgCET = nullptr;
isdll = false; isdll = false;
isrtm = false; isrtm = false;
@@ -580,14 +581,15 @@ void PeFile32::processRelocs() // pass1
// deliberately corrupt. Sometimes it is even tuned to cause us trouble! // deliberately corrupt. Sometimes it is even tuned to cause us trouble!
// Use an extra check to avoid AccessViolation (SIGSEGV) when appending // Use an extra check to avoid AccessViolation (SIGSEGV) when appending
// the relocs into one array. // the relocs into one array.
if ((4 * relocnum + 8192) < if ((sizeof(LE32) * relocnum + 8192) <
(sorelocs + 4 * (2 + xcounts[IMAGE_REL_BASED_LOW] + xcounts[IMAGE_REL_BASED_HIGH]))) (sorelocs +
sizeof(LE32) * (2 + xcounts[IMAGE_REL_BASED_LOW] + xcounts[IMAGE_REL_BASED_HIGH])))
throwCantUnpack("Invalid relocs"); throwCantUnpack("Invalid relocs");
// append relocs type "LOW" then "HIGH" // append relocs type "LOW" then "HIGH"
for (unsigned ic = IMAGE_REL_BASED_LOW; ic >= IMAGE_REL_BASED_HIGH; ic--) { for (unsigned ic = IMAGE_REL_BASED_LOW; ic >= IMAGE_REL_BASED_HIGH; ic--) {
memcpy(orelocs + sorelocs, fix[ic], 4 * xcounts[ic]); memcpy(orelocs + sorelocs, fix[ic], sizeof(LE32) * xcounts[ic]);
sorelocs += 4 * xcounts[ic]; sorelocs += sizeof(LE32) * xcounts[ic];
set_le32(orelocs + sorelocs, 0); set_le32(orelocs + sorelocs, 0);
if (xcounts[ic]) { if (xcounts[ic]) {
sorelocs += 4; sorelocs += 4;
@@ -1224,7 +1226,15 @@ void PeFile::Export::convert(unsigned eoffs, unsigned esize) {
size += len; size += len;
iv.add_interval(edir.name, len); iv.add_interval(edir.name, len);
len = 4 * edir.functions; // This test is weak because it does not consider other necessary storage.
// But it does detect outrageous individual members.
// Note: sizeof(LE32) <= sizeof(char *)
if (UPX_RSIZE_MAX_MEM / sizeof(char *) <= edir.functions ||
UPX_RSIZE_MAX_MEM / sizeof(char *) <= edir.names) {
throwCantPack("export directory too big: functions=%#x names=%#x",
(unsigned) edir.functions, (unsigned) edir.names);
}
len = sizeof(LE32) * edir.functions;
functionptrs = New(char, len + 1); functionptrs = New(char, len + 1);
memcpy(functionptrs, base + edir.addrtable, len); memcpy(functionptrs, base + edir.addrtable, len);
size += len; size += len;
@@ -1233,14 +1243,14 @@ void PeFile::Export::convert(unsigned eoffs, unsigned esize) {
unsigned ic; unsigned ic;
names = New(char *, edir.names + edir.functions + 1); names = New(char *, edir.names + edir.functions + 1);
for (ic = 0; ic < edir.names; ic++) { for (ic = 0; ic < edir.names; ic++) {
char *n = base + get_le32(base + edir.nameptrtable + ic * 4); char *n = base + get_le32(base + edir.nameptrtable + ic * sizeof(LE32));
len = strlen(n) + 1; len = strlen(n) + 1;
names[ic] = strdup(n); names[ic] = strdup(n);
size += len; size += len;
iv.add_interval(get_le32(base + edir.nameptrtable + ic * 4), len); iv.add_interval(get_le32(base + edir.nameptrtable + ic * sizeof(LE32)), len);
} }
iv.add_interval(edir.nameptrtable, 4 * edir.names); iv.add_interval(edir.nameptrtable, sizeof(LE32) * edir.names);
size += 4 * edir.names; size += sizeof(LE32) * edir.names;
LE32 *fp = (LE32 *) functionptrs; LE32 *fp = (LE32 *) functionptrs;
// export forwarders // export forwarders
@@ -1270,8 +1280,8 @@ void PeFile::Export::convert(unsigned eoffs, unsigned esize) {
void PeFile::Export::build(char *newbase, unsigned newoffs) { void PeFile::Export::build(char *newbase, unsigned newoffs) {
char *const functionp = newbase + sizeof(edir); char *const functionp = newbase + sizeof(edir);
char *const namep = functionp + 4 * edir.functions; char *const namep = functionp + sizeof(LE32) * edir.functions;
char *const ordinalp = namep + 4 * edir.names; char *const ordinalp = namep + sizeof(LE32) * edir.names;
char *const enamep = ordinalp + 2 * edir.names; char *const enamep = ordinalp + 2 * edir.names;
char *exports = enamep + strlen(ename) + 1; char *exports = enamep + strlen(ename) + 1;
@@ -1286,15 +1296,15 @@ void PeFile::Export::build(char *newbase, unsigned newoffs) {
unsigned ic; unsigned ic;
for (ic = 0; ic < edir.names; ic++) { for (ic = 0; ic < edir.names; ic++) {
strcpy(exports, names[ic]); strcpy(exports, names[ic]);
set_le32(namep + 4 * ic, newoffs + ptr_diff_bytes(exports, newbase)); set_le32(namep + sizeof(LE32) * ic, newoffs + ptr_diff_bytes(exports, newbase));
exports += strlen(exports) + 1; exports += strlen(exports) + 1;
} }
memcpy(functionp, functionptrs, 4 * edir.functions); memcpy(functionp, functionptrs, sizeof(LE32) * edir.functions);
for (ic = 0; ic < edir.functions; ic++) for (ic = 0; ic < edir.functions; ic++)
if (names[edir.names + ic]) { if (names[edir.names + ic]) {
strcpy(exports, names[edir.names + ic]); strcpy(exports, names[edir.names + ic]);
set_le32(functionp + 4 * ic, newoffs + ptr_diff_bytes(exports, newbase)); set_le32(functionp + sizeof(LE32) * ic, newoffs + ptr_diff_bytes(exports, newbase));
exports += strlen(exports) + 1; exports += strlen(exports) + 1;
} }
@@ -1470,29 +1480,39 @@ void PeFile::processTls2(Reloc *const rel, const Interval *const iv, unsigned ne
if (sotls == 0) if (sotls == 0)
return; return;
// add new relocation entries
// add new relocation entries
if (tls_handler_offset > 0 && tls_handler_offset_reloc > 0) if (tls_handler_offset > 0 && tls_handler_offset_reloc > 0)
rel->add_reloc(tls_handler_offset + tls_handler_offset_reloc, reloc_type); rel->add_reloc(tls_handler_offset + tls_handler_offset_reloc, reloc_type);
unsigned ic;
// NEW: if TLS callbacks are used, relocate the VA of the callback chain, too - Stefan Widmann // NEW: if TLS callbacks are used, relocate the VA of the callback chain, too - Stefan Widmann
for (ic = 0; ic < (use_tls_callbacks ? 4 * cb_size : 3 * cb_size); ic += cb_size) for (unsigned ic = 0; ic < (unsigned) (use_tls_callbacks ? 4 : 3); ic++)
rel->add_reloc(newaddr + ic, reloc_type); rel->add_reloc(newaddr + ic * cb_size, reloc_type);
SPAN_S_VAR(tls, const tlsp, mb_otls); SPAN_S_VAR(tls, const tlsp, mb_otls);
// now the relocation entries in the tls data area // now the relocation entries in the tls data area
for (ic = 0; ic < iv->ivnum; ic += 4) { for (unsigned ic = 0; ic < iv->ivnum; ic++) {
SPAN_S_VAR(byte, const pp, SPAN_S_VAR(byte, const pp,
otls + (iv->ivarr[ic].start - (tlsp->datastart - imagebase) + sizeof(tls))); otls + (iv->ivarr[ic].start - (tlsp->datastart - imagebase) + sizeof(tls)));
LEXX *const p = (LEXX *) raw_bytes(pp, sizeof(LEXX)); LEXX *const p = (LEXX *) raw_bytes(pp, sizeof(LEXX));
cb_value_t kc = *p; cb_value_t kc = *p;
if (kc < tlsp->dataend && kc >= tlsp->datastart) { if (kc >= tlsp->datastart && kc < tlsp->dataend) {
// add a relocation entry referring to an address inside of the original tls data area
// - as the new tls area is moved, the referred address have to be also adjusted
kc += newaddr + sizeof(tls) - tlsp->datastart; kc += newaddr + sizeof(tls) - tlsp->datastart;
*p = kc + imagebase; *p = kc + imagebase;
rel->add_reloc(kc, iv->ivarr[ic].len); rel->add_reloc(kc, iv->ivarr[ic].len);
} else } else {
rel->add_reloc(kc - imagebase, iv->ivarr[ic].len); // add a relocation entry referring to an address outside of the original tls data area
// by adding the difference of the new tlsdatastart and the old tlsdatastart to
// the address of the original relocation record
const unsigned a =
iv->ivarr[ic].start + (newaddr + sizeof(tls)) - (tlsp->datastart - imagebase);
// Must not overwrite compressed data
if (a < newaddr && !opt->win32_pe.strip_relocs)
throwCantPack("relocation too low (%#x < %#x); try --strip-relocs", a, newaddr);
rel->add_reloc(a, iv->ivarr[ic].len);
}
} }
const unsigned tls_data_size = tlsp->dataend - tlsp->datastart; const unsigned tls_data_size = tlsp->dataend - tlsp->datastart;
@@ -1716,13 +1736,15 @@ PeFile::Resource::upx_rnode *PeFile::Resource::convert(const void *rnode, upx_rn
branch->name = nullptr; branch->name = nullptr;
branch->parent = parent; branch->parent = parent;
branch->nc = ic; branch->nc = ic;
branch->children = New(upx_rnode *, ic); branch->children = New0(upx_rnode *, ic);
branch->data = *node; branch->data = *node;
if (!root) // first one
root = branch; // prevent leak if xcheck throws (hacked unpack or test)
for (const res_dir_entry *rde = node->entries + ic - 1; --ic >= 0; rde--) { for (const res_dir_entry *rde = node->entries + ic - 1; --ic >= 0; rde--) {
upx_rnode *child = convert(start + (rde->child & 0x7fffffff), branch, level + 1); upx_rnode *child = convert(start + (rde->child & 0x7fffffff), branch, level + 1);
xcheck(child);
branch->children[ic] = child; branch->children[ic] = child;
xcheck(child);
child->id = rde->tnl; child->id = rde->tnl;
if (child->id & 0x80000000) { if (child->id & 0x80000000) {
const byte *p = start + (child->id & 0x7fffffff); const byte *p = start + (child->id & 0x7fffffff);
@@ -2071,25 +2093,32 @@ unsigned PeFile::stripDebug(unsigned overlaystart) {
if (IDADDR(PEDIR_DEBUG) == 0) if (IDADDR(PEDIR_DEBUG) == 0)
return overlaystart; return overlaystart;
struct alignas(1) DebugDir final {
byte _[16]; // flags, time/date, version, type
LE32 size;
byte __[4]; // rva
LE32 fpos;
};
COMPILE_TIME_ASSERT(sizeof(DebugDir) == 28) COMPILE_TIME_ASSERT(sizeof(DebugDir) == 28)
COMPILE_TIME_ASSERT_ALIGNED1(DebugDir) COMPILE_TIME_ASSERT_ALIGNED1(DebugDir)
COMPILE_TIME_ASSERT(sizeof(((DebugDir *) nullptr)->_) == 16)
COMPILE_TIME_ASSERT(sizeof(((DebugDir *) nullptr)->__) == 4)
const unsigned skip = IDADDR(PEDIR_DEBUG); const unsigned skip = IDADDR(PEDIR_DEBUG);
const unsigned take = IDSIZE(PEDIR_DEBUG); const unsigned take = IDSIZE(PEDIR_DEBUG);
const DebugDir *dd = (const DebugDir *) ibuf.subref("bad debug %#x", skip, take); DebugDir *const dd0 = (DebugDir *) ibuf.subref("bad debug %#x", skip, take);
for (unsigned ic = 0; ic < IDSIZE(PEDIR_DEBUG) / sizeof(DebugDir); ic++, dd++) DebugDir *dd = dd0;
for (unsigned ic = 0; ic < IDSIZE(PEDIR_DEBUG) / sizeof(DebugDir); ic++, dd++) {
if (IMAGE_DEBUG_TYPE_EX_DLLCHARACTERISTICS == dd->type && dd->size == sizeof(LE32) &&
dd->fpos <= (file_size_u - sizeof(LE32))) {
// fpos need not belong to any PEDIR_* section.
// Read directly from input file, but keep position (paranoia).
LE32 word;
upx_off_t const now_pos = fi->tell();
fi->seek(dd->fpos, SEEK_SET);
fi->read(&word, sizeof(word));
fi->seek(now_pos, SEEK_SET);
if (IMAGE_DLLCHARACTERISTICS_EX_CET_COMPAT & word) {
*(dbgCET = dd0) = *dd; // remember presence; copy to front
}
}
if (overlaystart == dd->fpos) if (overlaystart == dd->fpos)
overlaystart += dd->size; overlaystart += dd->size;
ibuf.fill(IDADDR(PEDIR_DEBUG), IDSIZE(PEDIR_DEBUG), FILLVAL); }
ibuf.fill((!dbgCET ? 0 : sizeof(DebugDir)) + IDADDR(PEDIR_DEBUG),
(!dbgCET ? 0 : -(int) sizeof(DebugDir)) + IDSIZE(PEDIR_DEBUG), FILLVAL);
return overlaystart; return overlaystart;
} }
@@ -2476,8 +2505,8 @@ void PeFile::pack0(OutputFile *fo, ht &ih, ht &oh, unsigned subsystem_mask,
obuf.clear(ph.c_len, c_len - ph.c_len); obuf.clear(ph.c_len, c_len - ph.c_len);
const unsigned aligned_sotls = ALIGN_UP(sotls, usizeof(LEXX)); const unsigned aligned_sotls = ALIGN_UP(sotls, usizeof(LEXX));
const unsigned s1size = const unsigned s1size = ALIGN_UP(ic + c_len + codesize, usizeof(LEXX)) + aligned_sotls +
ALIGN_UP(ic + c_len + codesize, usizeof(LEXX)) + aligned_sotls + soloadconf; soloadconf + (dbgCET ? (sizeof(LE32) + sizeof(*dbgCET)) : 0);
const unsigned s1addr = (newvsize - (ic + c_len) + oam1) & ~oam1; const unsigned s1addr = (newvsize - (ic + c_len) + oam1) & ~oam1;
const unsigned ncsection = (s1addr + s1size + oam1) & ~oam1; const unsigned ncsection = (s1addr + s1size + oam1) & ~oam1;
@@ -2495,7 +2524,7 @@ void PeFile::pack0(OutputFile *fo, ht &ih, ht &oh, unsigned subsystem_mask,
oh.chksum = 0; oh.chksum = 0;
// fill the data directory // fill the data directory
ODADDR(PEDIR_DEBUG) = 0; ODADDR(PEDIR_DEBUG) = 0; // dbgCET later
ODSIZE(PEDIR_DEBUG) = 0; ODSIZE(PEDIR_DEBUG) = 0;
ODADDR(PEDIR_IAT) = 0; ODADDR(PEDIR_IAT) = 0;
ODSIZE(PEDIR_IAT) = 0; ODSIZE(PEDIR_IAT) = 0;
@@ -2503,7 +2532,8 @@ void PeFile::pack0(OutputFile *fo, ht &ih, ht &oh, unsigned subsystem_mask,
ODSIZE(PEDIR_BOUND_IMPORT) = 0; ODSIZE(PEDIR_BOUND_IMPORT) = 0;
// tls & loadconf are put into section 1 // tls & loadconf are put into section 1
ic = s1addr + s1size - aligned_sotls - soloadconf; ic = s1addr + s1size - aligned_sotls - soloadconf -
(dbgCET ? (sizeof(LE32) + sizeof(*dbgCET)) : 0);
if (use_tls_callbacks) if (use_tls_callbacks)
tls_handler_offset = linker->getSymbolOffset("PETLSC2") + upxsection; tls_handler_offset = linker->getSymbolOffset("PETLSC2") + upxsection;
@@ -2518,6 +2548,11 @@ void PeFile::pack0(OutputFile *fo, ht &ih, ht &oh, unsigned subsystem_mask,
ODSIZE(PEDIR_LOAD_CONFIG) = soloadconf; ODSIZE(PEDIR_LOAD_CONFIG) = soloadconf;
ic += soloadconf; ic += soloadconf;
if (dbgCET) {
ODADDR(PEDIR_DEBUG) = ic;
ODSIZE(PEDIR_DEBUG) = sizeof(*dbgCET);
ic += sizeof(LE32) + ODSIZE(PEDIR_DEBUG);
}
const bool rel_at_sections_start = last_section_rsrc_only; const bool rel_at_sections_start = last_section_rsrc_only;
ic = ncsection; ic = ncsection;
@@ -2663,6 +2698,19 @@ void PeFile::pack0(OutputFile *fo, ht &ih, ht &oh, unsigned subsystem_mask,
fo->write(ibuf, sizeof(LEXX) - ic); fo->write(ibuf, sizeof(LEXX) - ic);
fo->write(otls, aligned_sotls); fo->write(otls, aligned_sotls);
fo->write(oloadconf, soloadconf); fo->write(oloadconf, soloadconf);
if (dbgCET) {
ic = fo->getBytesWritten();
dbgCET->fpos = ic + sizeof(*dbgCET);
dbgCET->rva = rvamin + 0x400 + dbgCET->fpos; // 0x400 => soheaders
LE32 word;
set_le32(&word, IMAGE_DLLCHARACTERISTICS_EX_CET_COMPAT);
if (0) { // set all bytes t0 zero
memset(dbgCET, 0, sizeof(*dbgCET));
set_le32(&word, 0);
}
fo->write(dbgCET, sizeof(*dbgCET));
fo->write(&word, sizeof(word));
}
if ((ic = fo->getBytesWritten() & fam1) != 0) if ((ic = fo->getBytesWritten() & fam1) != 0)
fo->write(ibuf, oh.filealign - ic); fo->write(ibuf, oh.filealign - ic);
if (!last_section_rsrc_only) if (!last_section_rsrc_only)
@@ -2683,7 +2731,7 @@ void PeFile::pack0(OutputFile *fo, ht &ih, ht &oh, unsigned subsystem_mask,
fo->write(ibuf, oh.filealign - ic); fo->write(ibuf, oh.filealign - ic);
} }
#if 0 #if 0 // (debug) print section sizes
printf("%-13s: program hdr : %8d bytes\n", getName(), (int) sizeof(oh)); printf("%-13s: program hdr : %8d bytes\n", getName(), (int) sizeof(oh));
printf("%-13s: sections : %8d bytes\n", getName(), (int) sizeof(osection[0]) * oobjs); printf("%-13s: sections : %8d bytes\n", getName(), (int) sizeof(osection[0]) * oobjs);
printf("%-13s: ident : %8d bytes\n", getName(), (int) identsize); printf("%-13s: ident : %8d bytes\n", getName(), (int) identsize);
@@ -2758,12 +2806,12 @@ void PeFile::rebuildRelocs(SPAN_S(byte) & extra_info, unsigned bits, unsigned fl
SPAN_S_VAR(byte, const wrkmem, mb_wrkmem); SPAN_S_VAR(byte, const wrkmem, mb_wrkmem);
for (unsigned ic = 0; ic < relocnum; ic++) { for (unsigned ic = 0; ic < relocnum; ic++) {
OPTR_VAR(byte, const p, obuf + get_le32(wrkmem + 4 * ic)); OPTR_VAR(byte, const p, obuf + get_le32(wrkmem + sizeof(LE32) * ic));
if (bits == 32) if (bits == 32)
set_le32(p, get_le32(p) + imagebase + rvamin); set_le32(p, get_le32(p) + imagebase + rvamin);
else else
set_le64(p, get_le64(p) + imagebase + rvamin); set_le64(p, get_le64(p) + imagebase + rvamin);
rel.add_reloc(rvamin + get_le32(wrkmem + 4 * ic), rel.add_reloc(rvamin + get_le32(wrkmem + sizeof(LE32) * ic),
bits == 32 ? IMAGE_REL_BASED_HIGHLOW : IMAGE_REL_BASED_DIR64); bits == 32 ? IMAGE_REL_BASED_HIGHLOW : IMAGE_REL_BASED_DIR64);
} }
rel.finish(oxrelocs, soxrelocs); rel.finish(oxrelocs, soxrelocs);
@@ -3018,8 +3066,6 @@ void PeFile::unpack0(OutputFile *fo, const ht &ih, ht &oh, ord_mask_t ord_mask,
// memset(eistart, 0, ptr_udiff_bytes(extra_info, eistart) + 4); // memset(eistart, 0, ptr_udiff_bytes(extra_info, eistart) + 4);
// fill the data directory // fill the data directory
ODADDR(PEDIR_DEBUG) = 0;
ODSIZE(PEDIR_DEBUG) = 0;
ODADDR(PEDIR_IAT) = 0; ODADDR(PEDIR_IAT) = 0;
ODSIZE(PEDIR_IAT) = 0; ODSIZE(PEDIR_IAT) = 0;
ODADDR(PEDIR_BOUND_IMPORT) = 0; ODADDR(PEDIR_BOUND_IMPORT) = 0;
+11
View File
@@ -519,6 +519,17 @@ protected:
void build(char *base, unsigned newoffs); void build(char *base, unsigned newoffs);
unsigned getsize() const { return size; } unsigned getsize() const { return size; }
}; };
struct alignas(1) DebugDir final {
LE32 flags, date_time, version;
LE32 type;
LE32 size;
LE32 rva;
LE32 fpos;
};
enum { IMAGE_DEBUG_TYPE_EX_DLLCHARACTERISTICS = 20 };
enum { IMAGE_DLLCHARACTERISTICS_EX_CET_COMPAT = 0x001 };
struct DebugDir *dbgCET = nullptr;
}; };
class PeFile32 : public PeFile { class PeFile32 : public PeFile {
+9 -7
View File
@@ -167,7 +167,7 @@ all: $$(all.targets)
@echo "timestamp" > $@ @echo "timestamp" > $@
.DELETE_ON_ERROR: .upx-stubtools-stamp .DELETE_ON_ERROR: .upx-stubtools-stamp
%/.tmp-stamp: %/.tmp-stamp:
@mkdir -p $(dir $@) @mkdir -p "$(dir $@)"
@echo "timestamp" > $@ @echo "timestamp" > $@
.PRECIOUS: %/.tmp-stamp .PRECIOUS: %/.tmp-stamp
.all-stamp: $$(STUBS) .all-stamp: $$(STUBS)
@@ -208,6 +208,7 @@ ECHO_e = /bin/echo -e
ECHO_E = /bin/echo -E ECHO_E = /bin/echo -E
PERL = perl PERL = perl
PYTHON2 = python2 PYTHON2 = python2
PYTHON3 = python3
UNIX2DOS := $(PERL) -i -pe 's/$$/\r/;' UNIX2DOS := $(PERL) -i -pe 's/$$/\r/;'
# trim (strip) trailing whitespace # trim (strip) trailing whitespace
@@ -240,15 +241,15 @@ define tc
endef endef
# default tools # default tools
tc.default.bin2h = $(PYTHON2) $(top_srcdir)/src/stub/scripts/bin2h.py --ident=auto-stub tc.default.bin2h = $(PYTHON3) "$(top_srcdir)/src/stub/scripts/bin2h.py" --ident=auto-stub
##tc.default.bin2h-c = $(call tc,bin2h) --compress=14,15,0 ##tc.default.bin2h-c = $(call tc,bin2h) --compress=14,15,0
tc.default.bin2h-c = $(call tc,bin2h) --compress=0 tc.default.bin2h-c = $(call tc,bin2h) --compress=0
tc.default.brandelf = $(PYTHON2) $(top_srcdir)/src/stub/scripts/brandelf.py $(if $(tc_bfdname),--bfdname=$(tc_bfdname)) tc.default.brandelf = $(PYTHON3) "$(top_srcdir)/src/stub/scripts/brandelf.py" $(if $(tc_bfdname),--bfdname=$(tc_bfdname))
tc.default.gpp_inc = $(PYTHON2) $(top_srcdir)/src/stub/scripts/gpp_inc.py tc.default.gpp_inc = $(PYTHON3) "$(top_srcdir)/src/stub/scripts/gpp_inc.py"
tc.default.gpp_mkdep = $(PYTHON2) $(top_srcdir)/src/stub/scripts/gpp_inc.py -o /dev/null tc.default.gpp_mkdep = $(PYTHON3) "$(top_srcdir)/src/stub/scripts/gpp_inc.py" -o /dev/null
tc.default.pp-as = i386-linux-gcc-3.4.6 -E -nostdinc -x assembler-with-cpp -Wall tc.default.pp-as = i386-linux-gcc-3.4.6 -E -nostdinc -x assembler-with-cpp -Wall
tc.default.sstrip = sstrip-20060518 tc.default.sstrip = sstrip-20060518
tc.default.xstrip = $(PYTHON2) $(top_srcdir)/src/stub/scripts/xstrip.py tc.default.xstrip = $(PYTHON3) "$(top_srcdir)/src/stub/scripts/xstrip.py"
# default multiarch-binutils # default multiarch-binutils
tc.default.m-ar = multiarch-ar-2.17 tc.default.m-ar = multiarch-ar-2.17
@@ -318,7 +319,7 @@ endef
define tc.default.f-embed_objinfo_without_xstrip_keep_dot_text define tc.default.f-embed_objinfo_without_xstrip_keep_dot_text
chmod a-x $1 chmod a-x $1
$(call tc,objcopy) -R .data -R .bss $1 $(call tc,objcopy) -R .data -R .bss $1
$(call tc,objcopy) -R .comment -R .note -R .note.GNU-stack -R .reginfo $1 $(call tc,objcopy) -R .comment -R .note -R .note.GNU-stack -R .reginfo $1
$(call tc,objcopy) --strip-unneeded --keep-symbol=_start --keep-symbol=upx_so_main $1 $(call tc,objcopy) --strip-unneeded --keep-symbol=_start --keep-symbol=upx_so_main $1
# #
@@ -550,6 +551,7 @@ amd64-win64.pe.h : tc_objdump_disasm_options = -M intel-mnemonic
tc.amd64-win64.pe.gcc = amd64-linux-gcc-4.1.1 -m64 -nostdinc -DWINDOWS_BACK=1 -MMD -MT $@ tc.amd64-win64.pe.gcc = amd64-linux-gcc-4.1.1 -m64 -nostdinc -DWINDOWS_BACK=1 -MMD -MT $@
tc.amd64-win64.pe.gcc += -fno-exceptions -fno-asynchronous-unwind-tables tc.amd64-win64.pe.gcc += -fno-exceptions -fno-asynchronous-unwind-tables
tc.amd64-win64.pe.gcc += -mno-red-zone
tc.amd64-win64.pe.gcc += -Wall -W -Wcast-align -Wcast-qual -Wstrict-prototypes -Wwrite-strings -Werror tc.amd64-win64.pe.gcc += -Wall -W -Wcast-align -Wcast-qual -Wstrict-prototypes -Wwrite-strings -Werror
tc.amd64-win64.pe.objdump = multiarch-objdump-2.23.90 tc.amd64-win64.pe.objdump = multiarch-objdump-2.23.90
+182 -74
View File
@@ -1,5 +1,5 @@
/* amd64-linux.elf-entry.h /* amd64-linux.elf-entry.h
created from amd64-linux.elf-entry.bin, 1141 (0x475) bytes created from amd64-linux.elf-entry.bin, 2869 (0xb35) bytes
This file is part of the UPX executable compressor. This file is part of the UPX executable compressor.
@@ -32,81 +32,189 @@
/* clang-format off */ /* clang-format off */
#define STUB_AMD64_LINUX_ELF_ENTRY_SIZE 1141 #define STUB_AMD64_LINUX_ELF_ENTRY_SIZE 2869
#define STUB_AMD64_LINUX_ELF_ENTRY_ADLER32 0xd3b74a90 #define STUB_AMD64_LINUX_ELF_ENTRY_ADLER32 0xf865154a
#define STUB_AMD64_LINUX_ELF_ENTRY_CRC32 0x52b418e2 #define STUB_AMD64_LINUX_ELF_ENTRY_CRC32 0xe81955ed
unsigned char stub_amd64_linux_elf_entry[1141] = { unsigned char stub_amd64_linux_elf_entry[2869] = {
/* 0x0000 */ 127, 69, 76, 70, 2, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x0000 */ 127, 69, 76, 70, 2, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
/* 0x0010 */ 1, 0, 62, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x0010 */ 1, 0, 62, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
/* 0x0020 */ 0, 0, 0, 0, 0, 0, 0, 0, 16, 2, 0, 0, 0, 0, 0, 0, /* 0x0020 */ 0, 0, 0, 0, 0, 0, 0, 0, 80, 5, 0, 0, 0, 0, 0, 0,
/* 0x0030 */ 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, /* 0x0030 */ 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0,
/* 0x0040 */ 243, 15, 30,250, 89, 84, 95, 81, 82, 49,192, 72,175,117,252, 72, /* 0x0040 */ 243, 15, 30,250, 89, 84, 95, 81, 82, 76,141, 61, 0, 0, 0, 0,
/* 0x0050 */ 175,117,252, 87,186, 0, 16, 0, 0, 94, 72,173,133,192,116, 8, /* 0x0050 */ 87, 41,210, 82, 72,141, 5, 45, 0, 0, 0, 80,104, 4, 0, 0,
/* 0x0060 */ 131,248, 6, 72,173,117,243,146, 88, 72,247,218, 82, 80,104,117, /* 0x0060 */ 4, 72,141, 5, 43, 0, 0, 0, 80, 76,141, 61,219, 2, 0, 0,
/* 0x0070 */ 112, 88, 0, 84, 95,106, 16, 94,184, 63, 1, 0, 0, 15, 5,133, /* 0x0070 */ 84, 94,106, 11, 95,106, 8, 65, 90,106, 13, 88, 15, 5, 72,131,
/* 0x0080 */ 192,121, 29,133,246,116, 4, 49,246,235,237, 72,141, 53, 28, 1, /* 0x0080 */ 196, 32, 95,233,216, 2, 0, 0,243, 15, 30,250,184, 15, 0, 0,
/* 0x0090 */ 0, 0,173,146,173, 86,150, 95,106, 2, 88,232, 0, 1, 0, 0, /* 0x0090 */ 0, 15, 5,243, 15, 30,250, 82,186, 26, 0, 0, 0, 72,141, 53,
/* 0x00a0 */ 73,137,196, 89, 72,141, 61,145,255,255,255,139, 15, 72, 41,207, /* 0x00a0 */ 111, 0, 0, 0,106, 2, 95,106, 1, 88, 15, 5, 49,246, 72,141,
/* 0x00b0 */ 72,141, 53, 0, 0, 0, 0,173,147, 65,137,221,173,146,131,194, /* 0x00b0 */ 61,120, 0, 0, 0,106, 2, 88, 15, 5, 73,137,196,187, 0, 16,
/* 0x00c0 */ 16, 82,106,255, 87, 72, 41,217, 81, 72, 1,251, 83, 84, 93, 72, /* 0x00c0 */ 0, 0, 72, 41,220,137,218, 84, 94, 76,137,231, 49,192, 15, 5,
/* 0x00d0 */ 41,212, 72,131,228,192, 84, 95,173, 80,173,102,131,248, 2,116, /* 0x00d0 */ 133,192,126, 14,137,194, 84, 94,106, 2, 95,106, 1, 88, 15, 5,
/* 0x00e0 */ 1,244, 88, 72, 1,240, 80, 85, 49,219, 49,201, 72,141, 21,204, /* 0x00e0 */ 235,227, 76,137,231, 72, 1,220,106, 3, 88, 15, 5, 90,106, 57,
/* 0x00f0 */ 0, 0, 0,106,255, 93,252,168,164,255,210,114,251,141, 65, 1, /* 0x00f0 */ 88,232, 0, 0, 0, 0,133,192, 15,132,141, 1, 0, 0,235,254,
/* 0x0100 */ 255,210, 17,192,255,210,115,248,131,232, 3,114, 12,193,224, 8, /* 0x0100 */ 47,112,114,111, 99, 47,115,101,108,102, 47, 99,109,100,108,105,
/* 0x0110 */ 172,131,240,255,116, 47, 72, 99,232,141, 65, 1,255,210, 17,201, /* 0x0110 */ 110,101, 0, 10, 10, 83, 73, 71, 83, 69, 71, 86, 32, 97,100,100,
/* 0x0120 */ 255,210, 17,201,117, 13,137,193,131,192, 2,255,210, 17,201,255, /* 0x0120 */ 114,101,115,115, 32,115,112, 97, 99,101, 58, 10, 0, 47,112,114,
/* 0x0130 */ 210,115,248,129,253, 0,243,255,255, 17,193, 86, 72,141, 52, 47, /* 0x0130 */ 111, 99, 47,115,101,108,102, 47,109, 97,112,115, 0, 45,113, 0,
/* 0x0140 */ 243,164, 94,235,180, 93, 89, 72, 57,206,116, 1,244, 72,139, 69, /* 0x0140 */ 47,117,115,114, 47, 98,105,110, 47,103,100, 98, 0,115,101,116,
/* 0x0150 */ 48, 72,137, 4, 36, 72,139, 85, 32, 72,131,234, 16, 84, 94, 76, /* 0x0150 */ 32,112,114,111,109,112,116, 10,105,110,102,111, 32,105,110,102,
/* 0x0160 */ 137,231, 82,106, 1, 88,232, 53, 0, 0, 0, 72, 1,198, 41,194, /* 0x0160 */ 101,114,105,111,114,115, 10,112,114,105,110,116, 32, 34,114, 56,
/* 0x0170 */ 117,241, 94, 85, 92, 77, 49,201, 77,137,224,106, 1, 65, 90,106, /* 0x0170 */ 32, 45, 32,114, 49, 53, 34, 10,120, 47, 56,120,103, 32, 36,114,
/* 0x0180 */ 5, 90, 41,255,106, 9, 88,232, 20, 0, 0, 0, 80, 72,137, 69, /* 0x0180 */ 100,120, 32, 43, 32, 53, 42, 56, 10,112,114,105,110,116, 32, 34,
/* 0x0190 */ 24, 65, 80, 95,106, 3, 88, 15, 5, 88, 72,131,192, 8,255,224, /* 0x0190 */ 114,100,105, 44, 32,114,115,105, 44, 32,114, 98,112, 44, 32,114,
/* 0x01a0 */ 80, 15, 5, 89, 72, 61, 0,240,255,255,114, 1,244,195,192, 1, /* 0x01a0 */ 98,120, 34, 10,120, 47, 52,120,103, 10,112,114,105,110,116, 32,
/* 0x01b0 */ 0, 0, 2, 0, 65, 0, 47,100,101,118, 47,115,104,109, 0,243, /* 0x01b0 */ 34,114,100,120, 44, 32,114, 97,120, 44, 32,114, 99,120, 44, 32,
/* 0x01c0 */ 15, 30,250, 1,219,116, 2,243,195,139, 30, 72,131,238,252, 17, /* 0x01c0 */ 114,115,112, 34, 10,120, 47, 52,120,103, 10,112,114,105,110,116,
/* 0x01d0 */ 219,243,195, 0, 0, 0, 0, 0,102,105,108,101, 32,102,111,114, /* 0x01d0 */ 32, 34,114,105,112, 44, 32,101,102,108, 34, 10,120, 47, 50,120,
/* 0x01e0 */ 109, 97,116, 32,101,108,102, 54, 52, 45,120, 56, 54, 45, 54, 52, /* 0x01e0 */ 103, 10,115,101,116, 32, 36,112, 99, 32, 61, 32, 42, 40,108,111,
/* 0x01f0 */ 10, 10, 83,101, 99,116,105,111,110,115, 58, 10, 73,100,120, 32, /* 0x01f0 */ 110,103, 32, 42, 41, 40, 36,114,100,120, 32, 43, 32, 49, 54, 56,
/* 0x0200 */ 78, 97,109,101, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 83,105, /* 0x0200 */ 41, 10,112,114,105,110,116, 32, 34,102, 97,117,108,116,105,110,
/* 0x0210 */ 122,101, 32, 32, 32, 32, 32, 32, 86, 77, 65, 32, 32, 32, 32, 32, /* 0x0210 */ 103, 32,105,110,115,116,114, 34, 10,120, 47,105, 32, 36,112, 99,
/* 0x0220 */ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 76, 77, 65, 32, 32, 32, /* 0x0220 */ 10,112,114,105,110,116, 32, 34,102, 97,117,108,116, 32, 99,111,
/* 0x0230 */ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 70,105,108,101, /* 0x0230 */ 110,116,101,120,116, 34, 10,120, 47, 49, 54,105, 32, 36,112, 99,
/* 0x0240 */ 32,111,102,102, 32, 32, 65,108,103,110, 32, 32, 70,108, 97,103, /* 0x0240 */ 32, 45, 32, 48,120, 50, 48, 10,112,114,105,110,116, 32, 34,117,
/* 0x0250 */ 115, 10, 32, 32, 48, 32, 69, 76, 70, 77, 65, 73, 78, 88, 32, 32, /* 0x0250 */ 115,101,114, 32,115,116, 97, 99,107, 34, 10,120, 47, 54, 52,120,
/* 0x0260 */ 32, 32, 32, 32, 48, 49, 57, 51, 32, 32, 48, 32, 32, 48, 32, 32, /* 0x0260 */ 103, 32, 42, 40,108,111,110,103, 32, 42, 41, 40, 36,114,100,120,
/* 0x0270 */ 48, 52, 48, 32, 32, 50, 42, 42, 48, 32, 32, 67, 79, 78, 84, 69, /* 0x0270 */ 32, 43, 32, 53, 42, 56, 32, 43, 32, 49, 53, 42, 56, 41, 10,107,
/* 0x0280 */ 78, 84, 83, 10, 32, 32, 49, 32, 69, 76, 70, 77, 65, 73, 78, 90, /* 0x0280 */ 105,108,108, 10,113,117,105,116, 32, 49, 0, 72,129,236, 0, 16,
/* 0x0290 */ 32, 32, 32, 32, 32, 32, 48, 52, 32, 32, 48, 32, 32, 48, 32, 32, /* 0x0290 */ 0, 0, 72,141, 61,103,254,255,255,106, 0, 94,106, 2, 88,232,
/* 0x02a0 */ 48, 49,100, 52, 32, 32, 50, 42, 42, 50, 32, 32, 67, 79, 78, 84, /* 0x02a0 */ 0, 0, 0, 0, 80, 95, 84, 94,104, 0, 16, 0, 0, 90,106, 0,
/* 0x02b0 */ 69, 78, 84, 83, 10, 83, 89, 77, 66, 79, 76, 32, 84, 65, 66, 76, /* 0x02b0 */ 88,232, 0, 0, 0, 0,106, 3, 88,232, 0, 0, 0, 0,106,110,
/* 0x02c0 */ 69, 58, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x02c0 */ 88, 15, 5, 80, 94, 49,192, 80, 80, 84, 95,232, 89, 0, 0, 0,
/* 0x02d0 */ 48, 48, 48, 32,108, 32, 32, 32, 32,100, 32, 32, 69, 76, 70, 77, /* 0x02d0 */ 84, 94,106, 0, 86, 72,131,198, 16, 86, 72,141, 5, 92,254,255,
/* 0x02e0 */ 65, 73, 78, 90, 32, 48, 32, 69, 76, 70, 77, 65, 73, 78, 90, 10, /* 0x02e0 */ 255, 80, 72,131,192, 3, 80, 49,255,106, 3, 88, 15, 5, 80, 84,
/* 0x02f0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x02f0 */ 95,106, 22, 88,232, 0, 0, 0, 0, 95, 72,193,239, 32,104, 62,
/* 0x0300 */ 32,108, 32, 32, 32, 32,100, 32, 32, 69, 76, 70, 77, 65, 73, 78, /* 0x0300 */ 1, 0, 0, 90, 72,141, 53, 66,254,255,255,106, 1, 88,232, 0,
/* 0x0310 */ 88, 32, 48, 32, 69, 76, 70, 77, 65, 73, 78, 88, 10, 48, 48, 48, /* 0x0310 */ 0, 0, 0,106, 3, 88, 15, 5,106, 0, 90, 84, 94, 72,139, 62,
/* 0x0320 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,103, 32, /* 0x0320 */ 106, 59, 88,232, 0, 0, 0, 0,244,106, 10, 89,137,240,232, 4,
/* 0x0330 */ 32, 32, 32, 32, 32, 32, 69, 76, 70, 77, 65, 73, 78, 88, 32, 48, /* 0x0330 */ 0, 0, 0,198, 7, 0,195, 49,210,247,241, 82,133,192,116, 5,
/* 0x0340 */ 32, 95,115,116, 97,114,116, 10, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x0340 */ 232,242,255,255,255, 88,131,192, 48,170,195,243, 15, 30,250,106,
/* 0x0350 */ 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 32, 32, 32, 32, 32, 32, /* 0x0350 */ 8, 65, 90, 49,210, 49,246,106, 11, 95,106, 13, 88, 15, 5,195,
/* 0x0360 */ 32, 42, 85, 78, 68, 42, 32, 48, 32, 79, 95, 66, 73, 78, 70, 79, /* 0x0360 */ 49,192, 72,175,117,252, 72,175,117,252, 87,186, 0, 16, 0, 0,
/* 0x0370 */ 10, 10, 82, 69, 76, 79, 67, 65, 84, 73, 79, 78, 32, 82, 69, 67, /* 0x0370 */ 94, 72,173,133,192,116, 8,131,248, 6, 72,173,117,243,146, 88,
/* 0x0380 */ 79, 82, 68, 83, 32, 70, 79, 82, 32, 91, 69, 76, 70, 77, 65, 73, /* 0x0380 */ 72,247,218, 82, 80,104,117,112, 88, 0, 84, 95,106, 16, 94,184,
/* 0x0390 */ 78, 88, 93, 58, 10, 79, 70, 70, 83, 69, 84, 32, 32, 32, 32, 32, /* 0x0390 */ 63, 1, 0, 0, 15, 5,133,192,121, 29,133,246,116, 4, 49,246,
/* 0x03a0 */ 32, 32, 32, 32, 32, 32, 84, 89, 80, 69, 32, 32, 32, 32, 32, 32, /* 0x03a0 */ 235,237, 72,141, 53, 38, 1, 0, 0,173,146,173, 86,150, 95,106,
/* 0x03b0 */ 32, 32, 32, 32, 32, 32, 32, 32, 86, 65, 76, 85, 69, 10, 48, 48, /* 0x03b0 */ 2, 88,232, 10, 1, 0, 0, 73,137,196, 89, 72,141, 61, 0, 0,
/* 0x03c0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 55, 51, 32, 82, /* 0x03c0 */ 0, 0,139, 15, 72, 41,207, 72,141, 53, 0, 0, 0, 0,173,147,
/* 0x03d0 */ 95, 88, 56, 54, 95, 54, 52, 95, 80, 67, 51, 50, 32, 32, 32, 32, /* 0x03d0 */ 65,137,221,173,146,131,194, 16, 82,106,255, 87, 72, 41,217, 81,
/* 0x03e0 */ 32, 69, 76, 70, 77, 65, 73, 78, 90, 43, 48,120,102,102,102,102, /* 0x03e0 */ 72, 1,251, 83, 84, 93, 72, 41,212, 72,131,228,192, 84, 95,173,
/* 0x03f0 */ 102,102,102,102,102,102,102,102,102,102,102, 99, 10, 10, 82, 69, /* 0x03f0 */ 80,173,102,131,248, 2,116, 1,244, 88, 72, 1,240, 80, 85, 49,
/* 0x0400 */ 76, 79, 67, 65, 84, 73, 79, 78, 32, 82, 69, 67, 79, 82, 68, 83, /* 0x0400 */ 219, 49,201, 72,141, 21,214, 0, 0, 0,106,255, 93,252,168,164,
/* 0x0410 */ 32, 70, 79, 82, 32, 91, 69, 76, 70, 77, 65, 73, 78, 90, 93, 58, /* 0x0410 */ 255,210,114,251,141, 65, 1,255,210, 17,192,255,210,115,248,131,
/* 0x0420 */ 10, 79, 70, 70, 83, 69, 84, 32, 32, 32, 32, 32, 32, 32, 32, 32, /* 0x0420 */ 232, 3,114, 12,193,224, 8,172,131,240,255,116, 47, 72, 99,232,
/* 0x0430 */ 32, 32, 84, 89, 80, 69, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, /* 0x0430 */ 141, 65, 1,255,210, 17,201,255,210, 17,201,117, 13,137,193,131,
/* 0x0440 */ 32, 32, 32, 32, 86, 65, 76, 85, 69, 10, 48, 48, 48, 48, 48, 48, /* 0x0440 */ 192, 2,255,210, 17,201,255,210,115,248,129,253, 0,243,255,255,
/* 0x0450 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 82, 95, 88, 56, 54, /* 0x0450 */ 17,193, 86, 72,141, 52, 47,243,164, 94,235,180, 93, 89, 72, 57,
/* 0x0460 */ 95, 54, 52, 95, 51, 50, 32, 32, 32, 32, 32, 32, 32, 79, 95, 66, /* 0x0460 */ 206,116, 1,244, 72,139, 69, 48, 72,137, 4, 36, 76,137,124, 36,
/* 0x0470 */ 73, 78, 70, 79, 10 /* 0x0470 */ 8, 72,139, 85, 32, 72,131,234, 16, 84, 94, 76,137,231, 82,106,
/* 0x0480 */ 1, 88,232, 58, 0, 0, 0, 72, 1,198, 41,194,117,241, 94, 85,
/* 0x0490 */ 92, 77, 49,201, 77,137,224,106, 1, 65, 90,106, 5, 90, 41,255,
/* 0x04a0 */ 106, 9, 88,232, 25, 0, 0, 0, 80, 72,137, 69, 24, 65, 80, 95,
/* 0x04b0 */ 106, 3, 88, 15, 5, 88, 72,131,192, 16,255,224,243, 15, 30,250,
/* 0x04c0 */ 195, 80, 15, 5, 89, 72, 61, 0,240,255,255,114, 1,244,195,192,
/* 0x04d0 */ 1, 0, 0, 2, 0, 65, 0, 47,100,101,118, 47,115,104,109, 0,
/* 0x04e0 */ 243, 15, 30,250, 1,219,116, 2,243,195,139, 30, 72,131,238,252,
/* 0x04f0 */ 17,219,243,195, 0, 0, 0, 0,102,105,108,101, 32,102,111,114,
/* 0x0500 */ 109, 97,116, 32,101,108,102, 54, 52, 45,120, 56, 54, 45, 54, 52,
/* 0x0510 */ 10, 10, 83,101, 99,116,105,111,110,115, 58, 10, 73,100,120, 32,
/* 0x0520 */ 78, 97,109,101, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 83,105,
/* 0x0530 */ 122,101, 32, 32, 32, 32, 32, 32, 86, 77, 65, 32, 32, 32, 32, 32,
/* 0x0540 */ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 76, 77, 65, 32, 32, 32,
/* 0x0550 */ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 70,105,108,101,
/* 0x0560 */ 32,111,102,102, 32, 32, 65,108,103,110, 32, 32, 70,108, 97,103,
/* 0x0570 */ 115, 10, 32, 32, 48, 32, 69, 76, 70, 77, 65, 73, 78, 88, 32, 32,
/* 0x0580 */ 32, 32, 32, 32, 48, 49, 48, 32, 32, 48, 32, 32, 48, 32, 32, 48,
/* 0x0590 */ 52, 48, 32, 32, 50, 42, 42, 48, 32, 32, 67, 79, 78, 84, 69, 78,
/* 0x05a0 */ 84, 83, 10, 32, 32, 49, 32, 69, 76, 70, 83, 73, 71, 83, 69, 71,
/* 0x05b0 */ 86, 32, 32, 32, 32, 48, 51, 49, 48, 32, 32, 48, 32, 32, 48, 32,
/* 0x05c0 */ 32, 48, 53, 48, 32, 32, 50, 42, 42, 48, 32, 32, 67, 79, 78, 84,
/* 0x05d0 */ 69, 78, 84, 83, 10, 32, 32, 50, 32, 69, 76, 70, 77, 65, 73, 78,
/* 0x05e0 */ 88, 50, 32, 32, 32, 32, 32, 48, 49, 57, 52, 32, 32, 48, 32, 32,
/* 0x05f0 */ 48, 32, 32, 48, 51, 54, 48, 32, 32, 50, 42, 42, 48, 32, 32, 67,
/* 0x0600 */ 79, 78, 84, 69, 78, 84, 83, 10, 32, 32, 51, 32, 69, 76, 70, 77,
/* 0x0610 */ 65, 73, 78, 90, 32, 32, 32, 32, 32, 32, 48, 52, 32, 32, 48, 32,
/* 0x0620 */ 32, 48, 32, 32, 48, 52,102, 52, 32, 32, 50, 42, 42, 50, 32, 32,
/* 0x0630 */ 67, 79, 78, 84, 69, 78, 84, 83, 10, 83, 89, 77, 66, 79, 76, 32,
/* 0x0640 */ 84, 65, 66, 76, 69, 58, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x0650 */ 48, 48, 48, 48, 48, 48, 48, 32,108, 32, 32, 32, 32,100, 32, 32,
/* 0x0660 */ 69, 76, 70, 77, 65, 73, 78, 88, 32, 48, 32, 69, 76, 70, 77, 65,
/* 0x0670 */ 73, 78, 88, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x0680 */ 48, 48, 48, 48, 32,108, 32, 32, 32, 32,100, 32, 32, 69, 76, 70,
/* 0x0690 */ 77, 65, 73, 78, 88, 50, 32, 48, 32, 69, 76, 70, 77, 65, 73, 78,
/* 0x06a0 */ 88, 50, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x06b0 */ 48, 48, 48, 32,108, 32, 32, 32, 32,100, 32, 32, 69, 76, 70, 77,
/* 0x06c0 */ 65, 73, 78, 90, 32, 48, 32, 69, 76, 70, 77, 65, 73, 78, 90, 10,
/* 0x06d0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x06e0 */ 32,108, 32, 32, 32, 32,100, 32, 32, 69, 76, 70, 83, 73, 71, 83,
/* 0x06f0 */ 69, 71, 86, 32, 48, 32, 69, 76, 70, 83, 73, 71, 83, 69, 71, 86,
/* 0x0700 */ 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x0710 */ 48, 32,103, 32, 32, 32, 32, 32, 32, 32, 69, 76, 70, 77, 65, 73,
/* 0x0720 */ 78, 88, 32, 48, 32, 95,115,116, 97,114,116, 10, 48, 48, 48, 48,
/* 0x0730 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 32, 32,
/* 0x0740 */ 32, 32, 32, 32, 32, 42, 85, 78, 68, 42, 32, 48, 32, 79, 95, 66,
/* 0x0750 */ 73, 78, 70, 79, 10, 10, 82, 69, 76, 79, 67, 65, 84, 73, 79, 78,
/* 0x0760 */ 32, 82, 69, 67, 79, 82, 68, 83, 32, 70, 79, 82, 32, 91, 69, 76,
/* 0x0770 */ 70, 77, 65, 73, 78, 88, 93, 58, 10, 79, 70, 70, 83, 69, 84, 32,
/* 0x0780 */ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 84, 89, 80, 69, 32, 32,
/* 0x0790 */ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 86, 65, 76, 85,
/* 0x07a0 */ 69, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x07b0 */ 48, 99, 32, 82, 95, 88, 56, 54, 95, 54, 52, 95, 80, 67, 51, 50,
/* 0x07c0 */ 32, 32, 32, 32, 32, 69, 76, 70, 77, 65, 73, 78, 88, 50, 43, 48,
/* 0x07d0 */ 120, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 49, 53,
/* 0x07e0 */ 56, 10, 10, 82, 69, 76, 79, 67, 65, 84, 73, 79, 78, 32, 82, 69,
/* 0x07f0 */ 67, 79, 82, 68, 83, 32, 70, 79, 82, 32, 91, 69, 76, 70, 83, 73,
/* 0x0800 */ 71, 83, 69, 71, 86, 93, 58, 10, 79, 70, 70, 83, 69, 84, 32, 32,
/* 0x0810 */ 32, 32, 32, 32, 32, 32, 32, 32, 32, 84, 89, 80, 69, 32, 32, 32,
/* 0x0820 */ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 86, 65, 76, 85, 69,
/* 0x0830 */ 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 97,
/* 0x0840 */ 50, 32, 82, 95, 88, 56, 54, 95, 54, 52, 95, 80, 67, 51, 50, 32,
/* 0x0850 */ 32, 32, 32, 32, 69, 76, 70, 77, 65, 73, 78, 88, 50, 43, 48,120,
/* 0x0860 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 49, 53,100,
/* 0x0870 */ 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 50, 53,
/* 0x0880 */ 48, 32, 82, 95, 88, 56, 54, 95, 54, 52, 95, 80, 67, 51, 50, 32,
/* 0x0890 */ 32, 32, 32, 32, 69, 76, 70, 77, 65, 73, 78, 88, 50, 43, 48,120,
/* 0x08a0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 49, 53,100,
/* 0x08b0 */ 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 50, 54,
/* 0x08c0 */ 50, 32, 82, 95, 88, 56, 54, 95, 54, 52, 95, 80, 67, 51, 50, 32,
/* 0x08d0 */ 32, 32, 32, 32, 69, 76, 70, 77, 65, 73, 78, 88, 50, 43, 48,120,
/* 0x08e0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 49, 53,100,
/* 0x08f0 */ 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 50, 54,
/* 0x0900 */ 97, 32, 82, 95, 88, 56, 54, 95, 54, 52, 95, 80, 67, 51, 50, 32,
/* 0x0910 */ 32, 32, 32, 32, 69, 76, 70, 77, 65, 73, 78, 88, 50, 43, 48,120,
/* 0x0920 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 49, 53,100,
/* 0x0930 */ 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 50, 97,
/* 0x0940 */ 53, 32, 82, 95, 88, 56, 54, 95, 54, 52, 95, 80, 67, 51, 50, 32,
/* 0x0950 */ 32, 32, 32, 32, 69, 76, 70, 77, 65, 73, 78, 88, 50, 43, 48,120,
/* 0x0960 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 49, 53,100,
/* 0x0970 */ 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 50, 98,
/* 0x0980 */ 102, 32, 82, 95, 88, 56, 54, 95, 54, 52, 95, 80, 67, 51, 50, 32,
/* 0x0990 */ 32, 32, 32, 32, 69, 76, 70, 77, 65, 73, 78, 88, 50, 43, 48,120,
/* 0x09a0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 49, 53,100,
/* 0x09b0 */ 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 50,100,
/* 0x09c0 */ 52, 32, 82, 95, 88, 56, 54, 95, 54, 52, 95, 80, 67, 51, 50, 32,
/* 0x09d0 */ 32, 32, 32, 32, 69, 76, 70, 77, 65, 73, 78, 88, 50, 43, 48,120,
/* 0x09e0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 49, 53,100,
/* 0x09f0 */ 10, 10, 82, 69, 76, 79, 67, 65, 84, 73, 79, 78, 32, 82, 69, 67,
/* 0x0a00 */ 79, 82, 68, 83, 32, 70, 79, 82, 32, 91, 69, 76, 70, 77, 65, 73,
/* 0x0a10 */ 78, 88, 50, 93, 58, 10, 79, 70, 70, 83, 69, 84, 32, 32, 32, 32,
/* 0x0a20 */ 32, 32, 32, 32, 32, 32, 32, 84, 89, 80, 69, 32, 32, 32, 32, 32,
/* 0x0a30 */ 32, 32, 32, 32, 32, 32, 32, 32, 32, 86, 65, 76, 85, 69, 10, 48,
/* 0x0a40 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 53,101, 32,
/* 0x0a50 */ 82, 95, 88, 56, 54, 95, 54, 52, 95, 80, 67, 51, 50, 32, 32, 32,
/* 0x0a60 */ 32, 32, 69, 76, 70, 77, 65, 73, 78, 88, 43, 48,120,102,102,102,
/* 0x0a70 */ 102,102,102,102,102,102,102,102,102,102,102,102, 56, 10, 48, 48,
/* 0x0a80 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 54, 97, 32, 82,
/* 0x0a90 */ 95, 88, 56, 54, 95, 54, 52, 95, 80, 67, 51, 50, 32, 32, 32, 32,
/* 0x0aa0 */ 32, 69, 76, 70, 77, 65, 73, 78, 90, 43, 48,120,102,102,102,102,
/* 0x0ab0 */ 102,102,102,102,102,102,102,102,102,102,102, 99, 10, 10, 82, 69,
/* 0x0ac0 */ 76, 79, 67, 65, 84, 73, 79, 78, 32, 82, 69, 67, 79, 82, 68, 83,
/* 0x0ad0 */ 32, 70, 79, 82, 32, 91, 69, 76, 70, 77, 65, 73, 78, 90, 93, 58,
/* 0x0ae0 */ 10, 79, 70, 70, 83, 69, 84, 32, 32, 32, 32, 32, 32, 32, 32, 32,
/* 0x0af0 */ 32, 32, 84, 89, 80, 69, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
/* 0x0b00 */ 32, 32, 32, 32, 86, 65, 76, 85, 69, 10, 48, 48, 48, 48, 48, 48,
/* 0x0b10 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 82, 95, 88, 56, 54,
/* 0x0b20 */ 95, 54, 52, 95, 51, 50, 32, 32, 32, 32, 32, 32, 32, 79, 95, 66,
/* 0x0b30 */ 73, 78, 70, 79, 10
}; };
+1303 -1279
View File
File diff suppressed because it is too large Load Diff
+399 -373
View File
@@ -1,5 +1,5 @@
/* amd64-linux.elf-so_entry.h /* amd64-linux.elf-so_entry.h
created from amd64-linux.elf-so_entry.bin, 6372 (0x18e4) bytes created from amd64-linux.elf-so_entry.bin, 6790 (0x1a86) bytes
This file is part of the UPX executable compressor. This file is part of the UPX executable compressor.
@@ -32,14 +32,14 @@
/* clang-format off */ /* clang-format off */
#define STUB_AMD64_LINUX_ELF_SO_ENTRY_SIZE 6372 #define STUB_AMD64_LINUX_ELF_SO_ENTRY_SIZE 6790
#define STUB_AMD64_LINUX_ELF_SO_ENTRY_ADLER32 0xf9607bd7 #define STUB_AMD64_LINUX_ELF_SO_ENTRY_ADLER32 0x184ce0bd
#define STUB_AMD64_LINUX_ELF_SO_ENTRY_CRC32 0x7ca0bbfb #define STUB_AMD64_LINUX_ELF_SO_ENTRY_CRC32 0x9737eb34
unsigned char stub_amd64_linux_elf_so_entry[6372] = { unsigned char stub_amd64_linux_elf_so_entry[6790] = {
/* 0x0000 */ 127, 69, 76, 70, 2, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x0000 */ 127, 69, 76, 70, 2, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
/* 0x0010 */ 1, 0, 62, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x0010 */ 1, 0, 62, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
/* 0x0020 */ 0, 0, 0, 0, 0, 0, 0, 0,120, 4, 0, 0, 0, 0, 0, 0, /* 0x0020 */ 0, 0, 0, 0, 0, 0, 0, 0,224, 4, 0, 0, 0, 0, 0, 0,
/* 0x0030 */ 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 64, 0, 16, 0, 13, 0, /* 0x0030 */ 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 64, 0, 16, 0, 13, 0,
/* 0x0040 */ 233, 0, 0, 0, 0,233, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x0040 */ 233, 0, 0, 0, 0,233, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
/* 0x0050 */ 72,137, 92, 36,224, 72,137,108, 36,232, 76,137,100, 36,240, 76, /* 0x0050 */ 72,137, 92, 36,224, 72,137,108, 36,232, 76,137,100, 36,240, 76,
@@ -65,375 +65,401 @@ unsigned char stub_amd64_linux_elf_so_entry[6372] = {
/* 0x0190 */ 100, 36,240, 76,137,108, 36,248, 72,131,236, 40, 73,137,252, 65, /* 0x0190 */ 100, 36,240, 76,137,108, 36,248, 72,131,236, 40, 73,137,252, 65,
/* 0x01a0 */ 137,245, 72,141, 45, 0, 0, 0, 0,190, 16, 0, 0, 0, 72,137, /* 0x01a0 */ 137,245, 72,141, 45, 0, 0, 0, 0,190, 16, 0, 0, 0, 72,137,
/* 0x01b0 */ 239,232, 0, 0, 0, 0,137,195,131,248,234,117, 15,190, 0, 0, /* 0x01b0 */ 239,232, 0, 0, 0, 0,137,195,131,248,234,117, 15,190, 0, 0,
/* 0x01c0 */ 0, 0, 72,137,239,232, 0, 0, 0, 0,137,195,133,219,121, 31, /* 0x01c0 */ 0, 0, 72,137,239,232, 0, 0, 0, 0,137,195,133,219,121, 68,
/* 0x01d0 */ 72,141, 61, 0, 0, 0, 0,186,192, 1, 0, 0,190, 2, 0, 65, /* 0x01d0 */ 72,141, 61, 0, 0, 0, 0,186,192, 1, 0, 0,190, 2, 0, 65,
/* 0x01e0 */ 0,232, 0, 0, 0, 0,137,195, 72, 99,208,133,192,120, 77, 68, /* 0x01e0 */ 0,232, 0, 0, 0, 0,137,195,133,192,121, 40, 72, 99,208,131,
/* 0x01f0 */ 137,238,137,223,232, 0, 0, 0, 0, 72, 99,208,133,192,120, 60, /* 0x01f0 */ 248,235,117,109, 72,141, 53, 0, 0, 0, 0,186, 61, 0, 0, 0,
/* 0x0200 */ 73,131,252, 1, 25,201,131,225,240,131,193, 17, 68,137,238, 65, /* 0x0200 */ 191, 2, 0, 0, 0,232, 0, 0, 0, 0,191,127, 0, 0, 0,232,
/* 0x0210 */ 185, 0, 0, 0, 0, 65,137,216,186, 3, 0, 0, 0, 76,137,231, /* 0x0210 */ 0, 0, 0, 0, 68,137,238,137,223,232, 0, 0, 0, 0, 72, 99,
/* 0x0220 */ 232, 0, 0, 0, 0, 73,137,196,232, 0, 0, 0, 0, 76,137,226, /* 0x0220 */ 208,133,192,120, 60, 73,131,252, 1, 25,201,131,225,240,131,193,
/* 0x0230 */ 73, 57,196,115, 7,141, 67, 1, 74,141, 20, 32, 72,137,208, 72, /* 0x0230 */ 17, 68,137,238, 65,185, 0, 0, 0, 0, 65,137,216,186, 3, 0,
/* 0x0240 */ 139, 92, 36, 8, 72,139,108, 36, 16, 76,139,100, 36, 24, 76,139, /* 0x0240 */ 0, 0, 76,137,231,232, 0, 0, 0, 0, 73,137,196,232, 0, 0,
/* 0x0250 */ 108, 36, 32, 72,131,196, 40,195,144, 82, 86, 87, 83, 85, 72,137, /* 0x0250 */ 0, 0, 76,137,226, 73, 57,196,115, 7,141, 67, 1, 74,141, 20,
/* 0x0260 */ 229, 72,141, 29, 0, 0, 0, 0, 72,141, 5,217,255,255,255, 80, /* 0x0260 */ 32, 72,137,208, 72,139, 92, 36, 8, 72,139,108, 36, 16, 76,139,
/* 0x0270 */ 139, 3, 80, 72, 41,196, 72,131,228,240, 41,210, 72,141, 53, 74, /* 0x0270 */ 100, 36, 24, 76,139,108, 36, 32, 72,131,196, 40,195, 0, 0, 0,
/* 0x0280 */ 1, 0, 0, 41,255,104, 1, 1, 0, 0,232, 43, 1, 0, 0,133, /* 0x0280 */ 144, 82, 86, 87, 83, 85, 72,137,229, 72,141, 29, 0, 0, 0, 0,
/* 0x0290 */ 192,120, 52, 80,186, 0, 2, 0, 0, 72,141,116, 36, 8, 95, 87, /* 0x0290 */ 72,141, 5,217,255,255,255, 80,139, 3, 80, 72, 41,196, 72,131,
/* 0x02a0 */ 106, 0,232, 19, 1, 0, 0, 76,141, 4, 48, 95,106, 3,232, 7, /* 0x02a0 */ 228,240, 41,210, 72,141, 53, 74, 1, 0, 0, 41,255,104, 1, 1,
/* 0x02b0 */ 1, 0, 0, 72,137,230, 72,173, 72,145, 72,173, 72,131,249, 6, /* 0x02b0 */ 0, 0,232, 43, 1, 0, 0,133,192,120, 52, 80,186, 0, 2, 0,
/* 0x02c0 */ 116, 10, 76, 57,198,124,239,184, 0, 16, 0, 0, 72,247,216, 80, /* 0x02c0 */ 0, 72,141,116, 36, 8, 95, 87,106, 0,232, 19, 1, 0, 0, 76,
/* 0x02d0 */ 72,141, 21, 27, 0, 0, 0, 72,141,124, 36, 8, 85,139, 75, 4, /* 0x02d0 */ 141, 4, 48, 95,106, 3,232, 7, 1, 0, 0, 72,137,230, 72,173,
/* 0x02e0 */ 72,141,115, 12, 72, 1,241, 81, 49,219, 49,201,106,255, 93,252, /* 0x02e0 */ 72,145, 72,173, 72,131,249, 6,116, 10, 76, 57,198,124,239,184,
/* 0x02f0 */ 235, 20,243, 15, 30,250, 1,219,116, 2,243,195,139, 30, 72,131, /* 0x02f0 */ 0, 16, 0, 0, 72,247,216, 80, 72,141, 21, 27, 0, 0, 0, 72,
/* 0x0300 */ 238,252, 17,219,195,164,255,210,114,251,141, 65, 1,255,210, 17, /* 0x0300 */ 141,124, 36, 8, 85,139, 75, 4, 72,141,115, 12, 72, 1,241, 81,
/* 0x0310 */ 192,255,210,115,248,131,232, 3,114, 12,193,224, 8,172,131,240, /* 0x0310 */ 49,219, 49,201,106,255, 93,252,235, 20,243, 15, 30,250, 1,219,
/* 0x0320 */ 255,116, 47, 72, 99,232,141, 65, 1,255,210, 17,201,255,210, 17, /* 0x0320 */ 116, 2,243,195,139, 30, 72,131,238,252, 17,219,195,164,255,210,
/* 0x0330 */ 201,117, 13,137,193,131,192, 2,255,210, 17,201,255,210,115,248, /* 0x0330 */ 114,251,141, 65, 1,255,210, 17,192,255,210,115,248,131,232, 3,
/* 0x0340 */ 129,253, 0,243,255,255, 17,193, 86, 72,141, 52, 47,243,164, 94, /* 0x0340 */ 114, 12,193,224, 8,172,131,240,255,116, 47, 72, 99,232,141, 65,
/* 0x0350 */ 235,180, 89, 72, 57,206,116, 1,244, 93,104,117,112, 88, 0, 84, /* 0x0350 */ 1,255,210, 17,201,255,210, 17,201,117, 13,137,193,131,192, 2,
/* 0x0360 */ 95,106, 16, 94,184, 63, 1, 0, 0, 15, 5,133,192,121, 9,133, /* 0x0360 */ 255,210, 17,201,255,210,115,248,129,253, 0,243,255,255, 17,193,
/* 0x0370 */ 246,116, 4, 49,246,235,237,244, 89,143, 4, 36, 80, 95, 84, 94, /* 0x0370 */ 86, 72,141, 52, 47,243,164, 94,235,180, 89, 72, 57,206,116, 1,
/* 0x0380 */ 80, 72,139, 85,240,106, 1,232, 46, 0, 0, 0, 65, 88, 72,141, /* 0x0380 */ 244, 93,104,117,112, 88, 0, 84, 95,106, 16, 94,184, 63, 1, 0,
/* 0x0390 */ 101,240, 94, 86, 69, 41,201,106, 2, 65, 90,106, 5, 90, 41,255, /* 0x0390 */ 0, 15, 5,133,192,121, 9,133,246,116, 4, 49,246,235,237,244,
/* 0x03a0 */ 106, 9,232, 19, 0, 0, 0, 80, 65, 80, 95,106, 3,232, 8, 0, /* 0x03a0 */ 89,143, 4, 36, 80, 95, 84, 94, 80, 72,139, 85,240,106, 1,232,
/* 0x03b0 */ 0, 0, 88, 80, 72,131,192, 16,255,224, 72,139, 68, 36, 8, 15, /* 0x03b0 */ 46, 0, 0, 0, 65, 88, 72,141,101,240, 94, 86, 69, 41,201,106,
/* 0x03c0 */ 5, 72, 61, 0,240,255,255,114, 1,204,194, 8, 0, 47,112,114, /* 0x03c0 */ 2, 65, 90,106, 5, 90, 41,255,106, 9,232, 19, 0, 0, 0, 80,
/* 0x03d0 */ 111, 99, 47,115,101,108,102, 47, 97,117,120,118, 0, 0, 0, 0, /* 0x03d0 */ 65, 80, 95,106, 3,232, 8, 0, 0, 0, 88, 80, 72,131,192, 16,
/* 0x03e0 */ 117,112,120, 0, 47,100,101,118, 47,115,104,109, 0,109,101,109, /* 0x03e0 */ 255,224, 72,139, 68, 36, 8, 15, 5, 72, 61, 0,240,255,255,114,
/* 0x03f0 */ 102,100, 95, 99,114,101, 97,116,101, 0,117,112,120, 0, 47,100, /* 0x03f0 */ 1,204,194, 8, 0, 47,112,114,111, 99, 47,115,101,108,102, 47,
/* 0x0400 */ 101,118, 47,115,104,109, 0, 0, 46,115,121,109,116, 97, 98, 0, /* 0x0400 */ 97,117,120,118, 0, 0, 0, 0,117,112,120, 0, 47,100,101,118,
/* 0x0410 */ 46,115,116,114,116, 97, 98, 0, 46,115,104,115,116,114,116, 97, /* 0x0410 */ 47,115,104,109, 0,109,101,109,102,100, 95, 99,114,101, 97,116,
/* 0x0420 */ 98, 0, 46,114,101,108, 97, 72, 85, 77, 70, 95, 65, 0, 46,114, /* 0x0420 */ 101, 0,117,112,120, 0, 47,100,101,118, 47,115,104,109, 0, 85,
/* 0x0430 */ 101,108, 97, 72, 85, 77, 70, 95, 76, 0, 46,114,101,108, 97, 85, /* 0x0430 */ 80, 88, 45, 53, 46, 48, 32,119, 97,110,116,115, 32,109,101,109,
/* 0x0440 */ 77, 70, 95, 65, 78, 68, 82, 79, 73, 68, 0, 46,114,101,108, 97, /* 0x0440 */ 102,100, 95, 99,114,101, 97,116,101, 40, 41, 44, 32,111,114, 32,
/* 0x0450 */ 85, 77, 70, 95, 76, 73, 78, 85, 88, 0, 46,114,101,108, 97, 69, /* 0x0450 */ 110,101,101,100,115, 32, 47,100,101,118, 47,115,104,109, 40, 44,
/* 0x0460 */ 76, 70, 77, 65, 73, 78, 88, 0, 69, 76, 70, 77, 65, 73, 78, 90, /* 0x0460 */ 79, 95, 84, 77, 80, 70, 73, 76, 69, 44, 41, 10, 0, 0, 46,115,
/* 0x0470 */ 0, 83, 84, 82, 67, 79, 78, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x0470 */ 121,109,116, 97, 98, 0, 46,115,116,114,116, 97, 98, 0, 46,115,
/* 0x0480 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x0480 */ 104,115,116,114,116, 97, 98, 0, 46,114,101,108, 97, 72, 85, 77,
/* 0x0490 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x0490 */ 70, 95, 65, 0, 46,114,101,108, 97, 72, 85, 77, 70, 95, 76, 0,
/* 0x04a0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x04a0 */ 46,114,101,108, 97, 85, 77, 70, 95, 65, 78, 68, 82, 79, 73, 68,
/* 0x04b0 */ 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 1, 0, 0, 0, /* 0x04b0 */ 0, 46,114,101,108, 97, 85, 77, 70, 95, 76, 73, 78, 85, 88, 0,
/* 0x04c0 */ 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x04c0 */ 46,114,101,108, 97, 69, 76, 70, 77, 65, 73, 78, 88, 0, 69, 76,
/* 0x04d0 */ 64, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, /* 0x04d0 */ 70, 77, 65, 73, 78, 90, 0, 83, 84, 82, 67, 79, 78, 0, 0, 0,
/* 0x04e0 */ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, /* 0x04e0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
/* 0x04f0 */ 0, 0, 0, 0, 0, 0, 0, 0, 27, 0, 0, 0, 4, 0, 0, 0, /* 0x04f0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
/* 0x0500 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x0500 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
/* 0x0510 */ 160, 10, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, /* 0x0510 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
/* 0x0520 */ 14, 0, 0, 0, 1, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, /* 0x0520 */ 32, 0, 0, 0, 1, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0,
/* 0x0530 */ 24, 0, 0, 0, 0, 0, 0, 0, 44, 0, 0, 0, 1, 0, 0, 0, /* 0x0530 */ 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0,
/* 0x0540 */ 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x0540 */ 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
/* 0x0550 */ 69, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, /* 0x0550 */ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
/* 0x0560 */ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, /* 0x0560 */ 27, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
/* 0x0570 */ 0, 0, 0, 0, 0, 0, 0, 0, 39, 0, 0, 0, 4, 0, 0, 0, /* 0x0570 */ 0, 0, 0, 0, 0, 0, 0, 0, 32, 11, 0, 0, 0, 0, 0, 0,
/* 0x0580 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x0580 */ 24, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 1, 0, 0, 0,
/* 0x0590 */ 184, 10, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, /* 0x0590 */ 8, 0, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0,
/* 0x05a0 */ 14, 0, 0, 0, 3, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, /* 0x05a0 */ 44, 0, 0, 0, 1, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0,
/* 0x05b0 */ 24, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 1, 0, 0, 0, /* 0x05b0 */ 0, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 0, 0, 0, 0,
/* 0x05c0 */ 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x05c0 */ 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
/* 0x05d0 */ 80, 0, 0, 0, 0, 0, 0, 0, 51, 1, 0, 0, 0, 0, 0, 0, /* 0x05d0 */ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
/* 0x05e0 */ 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, /* 0x05e0 */ 39, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
/* 0x05f0 */ 0, 0, 0, 0, 0, 0, 0, 0, 51, 0, 0, 0, 4, 0, 0, 0, /* 0x05f0 */ 0, 0, 0, 0, 0, 0, 0, 0, 56, 11, 0, 0, 0, 0, 0, 0,
/* 0x0600 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x0600 */ 24, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 3, 0, 0, 0,
/* 0x0610 */ 208, 10, 0, 0, 0, 0, 0, 0, 32, 1, 0, 0, 0, 0, 0, 0, /* 0x0610 */ 8, 0, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0,
/* 0x0620 */ 14, 0, 0, 0, 5, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, /* 0x0620 */ 56, 0, 0, 0, 1, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0,
/* 0x0630 */ 24, 0, 0, 0, 0, 0, 0, 0, 73, 0, 0, 0, 1, 0, 0, 0, /* 0x0630 */ 0, 0, 0, 0, 0, 0, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0,
/* 0x0640 */ 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x0640 */ 51, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
/* 0x0650 */ 132, 1, 0, 0, 0, 0, 0, 0,212, 0, 0, 0, 0, 0, 0, 0, /* 0x0650 */ 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
/* 0x0660 */ 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, /* 0x0660 */ 51, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
/* 0x0670 */ 0, 0, 0, 0, 0, 0, 0, 0, 68, 0, 0, 0, 4, 0, 0, 0, /* 0x0670 */ 0, 0, 0, 0, 0, 0, 0, 0, 80, 11, 0, 0, 0, 0, 0, 0,
/* 0x0680 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x0680 */ 32, 1, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 5, 0, 0, 0,
/* 0x0690 */ 240, 11, 0, 0, 0, 0, 0, 0,192, 0, 0, 0, 0, 0, 0, 0, /* 0x0690 */ 8, 0, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0,
/* 0x06a0 */ 14, 0, 0, 0, 7, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, /* 0x06a0 */ 73, 0, 0, 0, 1, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0,
/* 0x06b0 */ 24, 0, 0, 0, 0, 0, 0, 0, 88, 0, 0, 0, 1, 0, 0, 0, /* 0x06b0 */ 0, 0, 0, 0, 0, 0, 0, 0,132, 1, 0, 0, 0, 0, 0, 0,
/* 0x06c0 */ 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x06c0 */ 249, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
/* 0x06d0 */ 88, 2, 0, 0, 0, 0, 0, 0,136, 1, 0, 0, 0, 0, 0, 0, /* 0x06d0 */ 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
/* 0x06e0 */ 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, /* 0x06e0 */ 68, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
/* 0x06f0 */ 0, 0, 0, 0, 0, 0, 0, 0, 83, 0, 0, 0, 4, 0, 0, 0, /* 0x06f0 */ 0, 0, 0, 0, 0, 0, 0, 0,112, 12, 0, 0, 0, 0, 0, 0,
/* 0x0700 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x0700 */ 8, 1, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 7, 0, 0, 0,
/* 0x0710 */ 176, 12, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, /* 0x0710 */ 8, 0, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0,
/* 0x0720 */ 14, 0, 0, 0, 9, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, /* 0x0720 */ 88, 0, 0, 0, 1, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0,
/* 0x0730 */ 24, 0, 0, 0, 0, 0, 0, 0, 97, 0, 0, 0, 1, 0, 0, 0, /* 0x0730 */ 0, 0, 0, 0, 0, 0, 0, 0,128, 2, 0, 0, 0, 0, 0, 0,
/* 0x0740 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x0740 */ 136, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
/* 0x0750 */ 224, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x0750 */ 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
/* 0x0760 */ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, /* 0x0760 */ 83, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
/* 0x0770 */ 0, 0, 0, 0, 0, 0, 0, 0,106, 0, 0, 0, 1, 0, 0, 0, /* 0x0770 */ 0, 0, 0, 0, 0, 0, 0, 0,120, 13, 0, 0, 0, 0, 0, 0,
/* 0x0780 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x0780 */ 24, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 9, 0, 0, 0,
/* 0x0790 */ 224, 3, 0, 0, 0, 0, 0, 0, 39, 0, 0, 0, 0, 0, 0, 0, /* 0x0790 */ 8, 0, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0,
/* 0x07a0 */ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, /* 0x07a0 */ 97, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
/* 0x07b0 */ 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 3, 0, 0, 0, /* 0x07b0 */ 0, 0, 0, 0, 0, 0, 0, 0, 8, 4, 0, 0, 0, 0, 0, 0,
/* 0x07c0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x07c0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
/* 0x07d0 */ 7, 4, 0, 0, 0, 0, 0, 0,113, 0, 0, 0, 0, 0, 0, 0, /* 0x07d0 */ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
/* 0x07e0 */ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, /* 0x07e0 */ 106, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
/* 0x07f0 */ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, /* 0x07f0 */ 0, 0, 0, 0, 0, 0, 0, 0, 8, 4, 0, 0, 0, 0, 0, 0,
/* 0x0800 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x0800 */ 101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
/* 0x0810 */ 120, 8, 0, 0, 0, 0, 0, 0,176, 1, 0, 0, 0, 0, 0, 0, /* 0x0810 */ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
/* 0x0820 */ 15, 0, 0, 0, 9, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, /* 0x0820 */ 17, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
/* 0x0830 */ 24, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 3, 0, 0, 0, /* 0x0830 */ 0, 0, 0, 0, 0, 0, 0, 0,109, 4, 0, 0, 0, 0, 0, 0,
/* 0x0840 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x0840 */ 113, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
/* 0x0850 */ 40, 10, 0, 0, 0, 0, 0, 0,115, 0, 0, 0, 0, 0, 0, 0, /* 0x0850 */ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
/* 0x0860 */ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, /* 0x0860 */ 1, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
/* 0x0870 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x0870 */ 0, 0, 0, 0, 0, 0, 0, 0,224, 8, 0, 0, 0, 0, 0, 0,
/* 0x0880 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x0880 */ 200, 1, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 9, 0, 0, 0,
/* 0x0890 */ 0, 0, 0, 0, 3, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x0890 */ 8, 0, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0,
/* 0x08a0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 12, 0, /* 0x08a0 */ 9, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
/* 0x08b0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x08b0 */ 0, 0, 0, 0, 0, 0, 0, 0,168, 10, 0, 0, 0, 0, 0, 0,
/* 0x08c0 */ 1, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x08c0 */ 120, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
/* 0x08d0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 1, 0, /* 0x08d0 */ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
/* 0x08e0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x08e0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
/* 0x08f0 */ 0, 0, 0, 0, 3, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x08f0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 11, 0,
/* 0x0900 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 5, 0, /* 0x0900 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
/* 0x0910 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x0910 */ 0, 0, 0, 0, 3, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0,
/* 0x0920 */ 0, 0, 0, 0, 3, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x0920 */ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 9, 0,
/* 0x0930 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 9, 0, /* 0x0930 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
/* 0x0940 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x0940 */ 0, 0, 0, 0, 3, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
/* 0x0950 */ 8, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x0950 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 3, 0,
/* 0x0960 */ 0, 0, 0, 0, 0, 0, 0, 0, 22, 0, 0, 0, 16, 0, 0, 0, /* 0x0960 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
/* 0x0970 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x0970 */ 0, 0, 0, 0, 3, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0,
/* 0x0980 */ 32, 0, 0, 0, 18, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x0980 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 7, 0,
/* 0x0990 */ 51, 1, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 16, 0, 0, 0, /* 0x0990 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
/* 0x09a0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x09a0 */ 0, 0, 0, 0, 3, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0,
/* 0x09b0 */ 61, 0, 0, 0, 18, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x09b0 */ 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 16, 0, 0, 0,
/* 0x09c0 */ 212, 0, 0, 0, 0, 0, 0, 0, 83, 0, 0, 0, 16, 0, 0, 0, /* 0x09c0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
/* 0x09d0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x09d0 */ 22, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
/* 0x09e0 */ 89, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x09e0 */ 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 18, 0, 5, 0,
/* 0x09f0 */ 0, 0, 0, 0, 0, 0, 0, 0,102, 0, 0, 0, 16, 0, 0, 0, /* 0x09f0 */ 0, 0, 0, 0, 0, 0, 0, 0, 51, 1, 0, 0, 0, 0, 0, 0,
/* 0x0a00 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x0a00 */ 56, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
/* 0x0a10 */ 110, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x0a10 */ 0, 0, 0, 0, 0, 0, 0, 0, 61, 0, 0, 0, 18, 0, 7, 0,
/* 0x0a20 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 95,115,116, 97,114,116, 0, /* 0x0a20 */ 0, 0, 0, 0, 0, 0, 0, 0,249, 0, 0, 0, 0, 0, 0, 0,
/* 0x0a30 */ 103,101,116, 95,112, 97,103,101, 95,109, 97,115,107, 0,102,116, /* 0x0a30 */ 83, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
/* 0x0a40 */ 114,117,110, 99, 97,116,101, 0,117,112,120, 95,109,109, 97,112, /* 0x0a40 */ 0, 0, 0, 0, 0, 0, 0, 0, 89, 0, 0, 0, 16, 0, 0, 0,
/* 0x0a50 */ 95, 97,110,100, 95,102,100, 95, 97,110,100,114,111,105,100, 0, /* 0x0a50 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
/* 0x0a60 */ 109,109, 97,112, 0,117,112,120, 95,109,109, 97,112, 95, 97,110, /* 0x0a60 */ 102, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
/* 0x0a70 */ 100, 95,102,100, 95,108,105,110,117,120, 0,119,114,105,116,101, /* 0x0a70 */ 0, 0, 0, 0, 0, 0, 0, 0,110, 0, 0, 0, 16, 0, 0, 0,
/* 0x0a80 */ 0,109,101,109,102,100, 95, 99,114,101, 97,116,101, 0,109,121, /* 0x0a80 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
/* 0x0a90 */ 95, 98,107,112,116, 0,111,112,101,110, 0, 0, 0, 0, 0, 0, /* 0x0a90 */ 115, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
/* 0x0aa0 */ 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 11, 0, 0, 0, /* 0x0aa0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 95,115,116, 97,114,116, 0,
/* 0x0ab0 */ 252,255,255,255,255,255,255,255, 1, 0, 0, 0, 0, 0, 0, 0, /* 0x0ab0 */ 103,101,116, 95,112, 97,103,101, 95,109, 97,115,107, 0,102,116,
/* 0x0ac0 */ 2, 0, 0, 0, 13, 0, 0, 0,252,255,255,255,255,255,255,255, /* 0x0ac0 */ 114,117,110, 99, 97,116,101, 0,117,112,120, 95,109,109, 97,112,
/* 0x0ad0 */ 33, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, /* 0x0ad0 */ 95, 97,110,100, 95,102,100, 95, 97,110,100,114,111,105,100, 0,
/* 0x0ae0 */ 252,255,255,255,255,255,255,255, 46, 0, 0, 0, 0, 0, 0, 0, /* 0x0ae0 */ 109,109, 97,112, 0,117,112,120, 95,109,109, 97,112, 95, 97,110,
/* 0x0af0 */ 4, 0, 0, 0, 15, 0, 0, 0,252,255,255,255,255,255,255,255, /* 0x0af0 */ 100, 95,102,100, 95,108,105,110,117,120, 0,119,114,105,116,101,
/* 0x0b00 */ 67, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 15, 0, 0, 0, /* 0x0b00 */ 0,109,101,109,102,100, 95, 99,114,101, 97,116,101, 0,109,121,
/* 0x0b10 */ 252,255,255,255,255,255,255,255, 82, 0, 0, 0, 0, 0, 0, 0, /* 0x0b10 */ 95, 98,107,112,116, 0,101,120,105,116, 0,111,112,101,110, 0,
/* 0x0b20 */ 2, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x0b20 */ 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 11, 0, 0, 0,
/* 0x0b30 */ 97, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 17, 0, 0, 0, /* 0x0b30 */ 252,255,255,255,255,255,255,255, 1, 0, 0, 0, 0, 0, 0, 0,
/* 0x0b40 */ 252,255,255,255,255,255,255,255,111, 0, 0, 0, 0, 0, 0, 0, /* 0x0b40 */ 2, 0, 0, 0, 13, 0, 0, 0,252,255,255,255,255,255,255,255,
/* 0x0b50 */ 2, 0, 0, 0, 2, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, /* 0x0b50 */ 33, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0,
/* 0x0b60 */ 121, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 16, 0, 0, 0, /* 0x0b60 */ 252,255,255,255,255,255,255,255, 46, 0, 0, 0, 0, 0, 0, 0,
/* 0x0b70 */ 252,255,255,255,255,255,255,255,131, 0, 0, 0, 0, 0, 0, 0, /* 0x0b70 */ 4, 0, 0, 0, 15, 0, 0, 0,252,255,255,255,255,255,255,255,
/* 0x0b80 */ 4, 0, 0, 0, 9, 0, 0, 0,252,255,255,255,255,255,255,255, /* 0x0b80 */ 67, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 15, 0, 0, 0,
/* 0x0b90 */ 168, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 10, 0, 0, 0, /* 0x0b90 */ 252,255,255,255,255,255,255,255, 82, 0, 0, 0, 0, 0, 0, 0,
/* 0x0ba0 */ 252,255,255,255,255,255,255,255,185, 0, 0, 0, 0, 0, 0, 0, /* 0x0ba0 */ 2, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
/* 0x0bb0 */ 4, 0, 0, 0, 9, 0, 0, 0,252,255,255,255,255,255,255,255, /* 0x0bb0 */ 97, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 18, 0, 0, 0,
/* 0x0bc0 */ 208, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 14, 0, 0, 0, /* 0x0bc0 */ 252,255,255,255,255,255,255,255,111, 0, 0, 0, 0, 0, 0, 0,
/* 0x0bd0 */ 252,255,255,255,255,255,255,255,248, 0, 0, 0, 0, 0, 0, 0, /* 0x0bd0 */ 2, 0, 0, 0, 2, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0,
/* 0x0be0 */ 4, 0, 0, 0, 12, 0, 0, 0,252,255,255,255,255,255,255,255, /* 0x0be0 */ 121, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 16, 0, 0, 0,
/* 0x0bf0 */ 33, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, /* 0x0bf0 */ 252,255,255,255,255,255,255,255,131, 0, 0, 0, 0, 0, 0, 0,
/* 0x0c00 */ 22, 0, 0, 0, 0, 0, 0, 0, 46, 0, 0, 0, 0, 0, 0, 0, /* 0x0c00 */ 4, 0, 0, 0, 9, 0, 0, 0,252,255,255,255,255,255,255,255,
/* 0x0c10 */ 4, 0, 0, 0, 15, 0, 0, 0,252,255,255,255,255,255,255,255, /* 0x0c10 */ 168, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 10, 0, 0, 0,
/* 0x0c20 */ 66, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 15, 0, 0, 0, /* 0x0c20 */ 252,255,255,255,255,255,255,255,185, 0, 0, 0, 0, 0, 0, 0,
/* 0x0c30 */ 252,255,255,255,255,255,255,255, 79, 0, 0, 0, 0, 0, 0, 0, /* 0x0c30 */ 4, 0, 0, 0, 9, 0, 0, 0,252,255,255,255,255,255,255,255,
/* 0x0c40 */ 2, 0, 0, 0, 2, 0, 0, 0, 26, 0, 0, 0, 0, 0, 0, 0, /* 0x0c40 */ 208, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 14, 0, 0, 0,
/* 0x0c50 */ 94, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 17, 0, 0, 0, /* 0x0c50 */ 252,255,255,255,255,255,255,255,248, 0, 0, 0, 0, 0, 0, 0,
/* 0x0c60 */ 252,255,255,255,255,255,255,255,113, 0, 0, 0, 0, 0, 0, 0, /* 0x0c60 */ 4, 0, 0, 0, 12, 0, 0, 0,252,255,255,255,255,255,255,255,
/* 0x0c70 */ 4, 0, 0, 0, 10, 0, 0, 0,252,255,255,255,255,255,255,255, /* 0x0c70 */ 33, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0,
/* 0x0c80 */ 157, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 12, 0, 0, 0, /* 0x0c80 */ 22, 0, 0, 0, 0, 0, 0, 0, 46, 0, 0, 0, 0, 0, 0, 0,
/* 0x0c90 */ 252,255,255,255,255,255,255,255,165, 0, 0, 0, 0, 0, 0, 0, /* 0x0c90 */ 4, 0, 0, 0, 15, 0, 0, 0,252,255,255,255,255,255,255,255,
/* 0x0ca0 */ 4, 0, 0, 0, 9, 0, 0, 0,252,255,255,255,255,255,255,255, /* 0x0ca0 */ 66, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 15, 0, 0, 0,
/* 0x0cb0 */ 12, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, /* 0x0cb0 */ 252,255,255,255,255,255,255,255, 79, 0, 0, 0, 0, 0, 0, 0,
/* 0x0cc0 */ 252,255,255,255,255,255,255,255,102,105,108,101, 32,102,111,114, /* 0x0cc0 */ 2, 0, 0, 0, 2, 0, 0, 0, 26, 0, 0, 0, 0, 0, 0, 0,
/* 0x0cd0 */ 109, 97,116, 32,101,108,102, 54, 52, 45,120, 56, 54, 45, 54, 52, /* 0x0cd0 */ 94, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 18, 0, 0, 0,
/* 0x0ce0 */ 10, 10, 83,101, 99,116,105,111,110,115, 58, 10, 73,100,120, 32, /* 0x0ce0 */ 252,255,255,255,255,255,255,255,115, 0, 0, 0, 0, 0, 0, 0,
/* 0x0cf0 */ 78, 97,109,101, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 83,105, /* 0x0cf0 */ 2, 0, 0, 0, 2, 0, 0, 0, 35, 0, 0, 0, 0, 0, 0, 0,
/* 0x0d00 */ 122,101, 32, 32, 32, 32, 32, 32, 86, 77, 65, 32, 32, 32, 32, 32, /* 0x0d00 */ 130, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 14, 0, 0, 0,
/* 0x0d10 */ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 76, 77, 65, 32, 32, 32, /* 0x0d10 */ 252,255,255,255,255,255,255,255,140, 0, 0, 0, 0, 0, 0, 0,
/* 0x0d20 */ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 70,105,108,101, /* 0x0d20 */ 4, 0, 0, 0, 17, 0, 0, 0,252,255,255,255,255,255,255,255,
/* 0x0d30 */ 32,111,102,102, 32, 32, 65,108,103,110, 32, 32, 70,108, 97,103, /* 0x0d30 */ 150, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 10, 0, 0, 0,
/* 0x0d40 */ 115, 10, 32, 32, 48, 32, 72, 85, 77, 70, 95, 65, 32, 32, 32, 32, /* 0x0d40 */ 252,255,255,255,255,255,255,255,194, 0, 0, 0, 0, 0, 0, 0,
/* 0x0d50 */ 32, 32, 32, 32, 48, 53, 32, 32, 48, 32, 32, 48, 32, 32, 48, 52, /* 0x0d50 */ 4, 0, 0, 0, 12, 0, 0, 0,252,255,255,255,255,255,255,255,
/* 0x0d60 */ 48, 32, 32, 50, 42, 42, 48, 32, 32, 67, 79, 78, 84, 69, 78, 84, /* 0x0d60 */ 202, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 9, 0, 0, 0,
/* 0x0d70 */ 83, 10, 32, 32, 49, 32, 72, 85, 77, 70, 95, 76, 32, 32, 32, 32, /* 0x0d70 */ 252,255,255,255,255,255,255,255, 12, 0, 0, 0, 0, 0, 0, 0,
/* 0x0d80 */ 32, 32, 32, 32, 48, 53, 32, 32, 48, 32, 32, 48, 32, 32, 48, 52, /* 0x0d80 */ 2, 0, 0, 0, 1, 0, 0, 0,252,255,255,255,255,255,255,255,
/* 0x0d90 */ 53, 32, 32, 50, 42, 42, 48, 32, 32, 67, 79, 78, 84, 69, 78, 84, /* 0x0d90 */ 102,105,108,101, 32,102,111,114,109, 97,116, 32,101,108,102, 54,
/* 0x0da0 */ 83, 10, 32, 32, 50, 32, 85, 77, 70, 95, 65, 78, 68, 82, 79, 73, /* 0x0da0 */ 52, 45,120, 56, 54, 45, 54, 52, 10, 10, 83,101, 99,116,105,111,
/* 0x0db0 */ 68, 32, 32, 32, 48, 49, 51, 51, 32, 32, 48, 32, 32, 48, 32, 32, /* 0x0db0 */ 110,115, 58, 10, 73,100,120, 32, 78, 97,109,101, 32, 32, 32, 32,
/* 0x0dc0 */ 48, 53, 48, 32, 32, 50, 42, 42, 52, 32, 32, 67, 79, 78, 84, 69, /* 0x0dc0 */ 32, 32, 32, 32, 32, 32, 83,105,122,101, 32, 32, 32, 32, 32, 32,
/* 0x0dd0 */ 78, 84, 83, 10, 32, 32, 51, 32, 85, 77, 70, 95, 76, 73, 78, 85, /* 0x0dd0 */ 86, 77, 65, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
/* 0x0de0 */ 88, 32, 32, 32, 32, 32, 48,100, 52, 32, 32, 48, 32, 32, 48, 32, /* 0x0de0 */ 32, 32, 76, 77, 65, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
/* 0x0df0 */ 32, 48, 49, 56, 52, 32, 32, 50, 42, 42, 50, 32, 32, 67, 79, 78, /* 0x0df0 */ 32, 32, 32, 32, 70,105,108,101, 32,111,102,102, 32, 32, 65,108,
/* 0x0e00 */ 84, 69, 78, 84, 83, 10, 32, 32, 52, 32, 69, 76, 70, 77, 65, 73, /* 0x0e00 */ 103,110, 32, 32, 70,108, 97,103,115, 10, 32, 32, 48, 32, 72, 85,
/* 0x0e10 */ 78, 88, 32, 32, 32, 32, 32, 32, 48, 49, 56, 56, 32, 32, 48, 32, /* 0x0e10 */ 77, 70, 95, 65, 32, 32, 32, 32, 32, 32, 32, 32, 48, 53, 32, 32,
/* 0x0e20 */ 32, 48, 32, 32, 48, 50, 53, 56, 32, 32, 50, 42, 42, 50, 32, 32, /* 0x0e20 */ 48, 32, 32, 48, 32, 32, 48, 52, 48, 32, 32, 50, 42, 42, 48, 32,
/* 0x0e30 */ 67, 79, 78, 84, 69, 78, 84, 83, 10, 32, 32, 53, 32, 69, 76, 70, /* 0x0e30 */ 32, 67, 79, 78, 84, 69, 78, 84, 83, 10, 32, 32, 49, 32, 72, 85,
/* 0x0e40 */ 77, 65, 73, 78, 90, 32, 32, 32, 32, 32, 32, 48, 32, 32, 48, 32, /* 0x0e40 */ 77, 70, 95, 76, 32, 32, 32, 32, 32, 32, 32, 32, 48, 53, 32, 32,
/* 0x0e50 */ 32, 48, 32, 32, 48, 51,101, 48, 32, 32, 50, 42, 42, 48, 32, 32, /* 0x0e50 */ 48, 32, 32, 48, 32, 32, 48, 52, 53, 32, 32, 50, 42, 42, 48, 32,
/* 0x0e60 */ 67, 79, 78, 84, 69, 78, 84, 83, 10, 32, 32, 54, 32, 83, 84, 82, /* 0x0e60 */ 32, 67, 79, 78, 84, 69, 78, 84, 83, 10, 32, 32, 50, 32, 85, 77,
/* 0x0e70 */ 67, 79, 78, 32, 32, 32, 32, 32, 32, 32, 32, 48, 50, 55, 32, 32, /* 0x0e70 */ 70, 95, 65, 78, 68, 82, 79, 73, 68, 32, 32, 32, 48, 49, 51, 51,
/* 0x0e80 */ 48, 32, 32, 48, 32, 32, 48, 51,101, 48, 32, 32, 50, 42, 42, 48, /* 0x0e80 */ 32, 32, 48, 32, 32, 48, 32, 32, 48, 53, 48, 32, 32, 50, 42, 42,
/* 0x0e90 */ 32, 32, 67, 79, 78, 84, 69, 78, 84, 83, 10, 83, 89, 77, 66, 79, /* 0x0e90 */ 52, 32, 32, 67, 79, 78, 84, 69, 78, 84, 83, 10, 32, 32, 51, 32,
/* 0x0ea0 */ 76, 32, 84, 65, 66, 76, 69, 58, 10, 48, 48, 48, 48, 48, 48, 48, /* 0x0ea0 */ 85, 77, 70, 95, 76, 73, 78, 85, 88, 32, 32, 32, 32, 32, 48,102,
/* 0x0eb0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,108, 32, 32, 32, 32,100, /* 0x0eb0 */ 57, 32, 32, 48, 32, 32, 48, 32, 32, 48, 49, 56, 52, 32, 32, 50,
/* 0x0ec0 */ 32, 32, 69, 76, 70, 77, 65, 73, 78, 90, 32, 48, 32, 69, 76, 70, /* 0x0ec0 */ 42, 42, 50, 32, 32, 67, 79, 78, 84, 69, 78, 84, 83, 10, 32, 32,
/* 0x0ed0 */ 77, 65, 73, 78, 90, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x0ed0 */ 52, 32, 69, 76, 70, 77, 65, 73, 78, 88, 32, 32, 32, 32, 32, 32,
/* 0x0ee0 */ 48, 48, 48, 48, 48, 48, 32,108, 32, 32, 32, 32,100, 32, 32, 83, /* 0x0ee0 */ 48, 49, 56, 56, 32, 32, 48, 32, 32, 48, 32, 32, 48, 50, 56, 48,
/* 0x0ef0 */ 84, 82, 67, 79, 78, 32, 48, 32, 83, 84, 82, 67, 79, 78, 10, 48, /* 0x0ef0 */ 32, 32, 50, 42, 42, 50, 32, 32, 67, 79, 78, 84, 69, 78, 84, 83,
/* 0x0f00 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, /* 0x0f00 */ 10, 32, 32, 53, 32, 69, 76, 70, 77, 65, 73, 78, 90, 32, 32, 32,
/* 0x0f10 */ 108, 32, 32, 32, 32, 32, 32, 32, 69, 76, 70, 77, 65, 73, 78, 88, /* 0x0f10 */ 32, 32, 32, 48, 32, 32, 48, 32, 32, 48, 32, 32, 48, 52, 48, 56,
/* 0x0f20 */ 32, 48, 32, 95,115,116, 97,114,116, 10, 48, 48, 48, 48, 48, 48, /* 0x0f20 */ 32, 32, 50, 42, 42, 48, 32, 32, 67, 79, 78, 84, 69, 78, 84, 83,
/* 0x0f30 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,108, 32, 32, 32, 32, /* 0x0f30 */ 10, 32, 32, 54, 32, 83, 84, 82, 67, 79, 78, 32, 32, 32, 32, 32,
/* 0x0f40 */ 100, 32, 32, 72, 85, 77, 70, 95, 65, 32, 48, 32, 72, 85, 77, 70, /* 0x0f40 */ 32, 32, 32, 48, 54, 53, 32, 32, 48, 32, 32, 48, 32, 32, 48, 52,
/* 0x0f50 */ 95, 65, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x0f50 */ 48, 56, 32, 32, 50, 42, 42, 48, 32, 32, 67, 79, 78, 84, 69, 78,
/* 0x0f60 */ 48, 48, 48, 32,108, 32, 32, 32, 32,100, 32, 32, 72, 85, 77, 70, /* 0x0f60 */ 84, 83, 10, 83, 89, 77, 66, 79, 76, 32, 84, 65, 66, 76, 69, 58,
/* 0x0f70 */ 95, 76, 32, 48, 32, 72, 85, 77, 70, 95, 76, 10, 48, 48, 48, 48, /* 0x0f70 */ 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x0f80 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,108, 32, 32, /* 0x0f80 */ 48, 32,108, 32, 32, 32, 32,100, 32, 32, 69, 76, 70, 77, 65, 73,
/* 0x0f90 */ 32, 32,100, 32, 32, 85, 77, 70, 95, 65, 78, 68, 82, 79, 73, 68, /* 0x0f90 */ 78, 90, 32, 48, 32, 69, 76, 70, 77, 65, 73, 78, 90, 10, 48, 48,
/* 0x0fa0 */ 32, 48, 32, 85, 77, 70, 95, 65, 78, 68, 82, 79, 73, 68, 10, 48, /* 0x0fa0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,108,
/* 0x0fb0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, /* 0x0fb0 */ 32, 32, 32, 32,100, 32, 32, 83, 84, 82, 67, 79, 78, 32, 48, 32,
/* 0x0fc0 */ 108, 32, 32, 32, 32,100, 32, 32, 85, 77, 70, 95, 76, 73, 78, 85, /* 0x0fc0 */ 83, 84, 82, 67, 79, 78, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x0fd0 */ 88, 32, 48, 32, 85, 77, 70, 95, 76, 73, 78, 85, 88, 10, 48, 48, /* 0x0fd0 */ 48, 48, 48, 48, 48, 48, 48, 32,108, 32, 32, 32, 32, 32, 32, 32,
/* 0x0fe0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,108, /* 0x0fe0 */ 69, 76, 70, 77, 65, 73, 78, 88, 32, 48, 32, 95,115,116, 97,114,
/* 0x0ff0 */ 32, 32, 32, 32,100, 32, 32, 69, 76, 70, 77, 65, 73, 78, 88, 32, /* 0x0ff0 */ 116, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1000 */ 48, 32, 69, 76, 70, 77, 65, 73, 78, 88, 10, 48, 48, 48, 48, 48, /* 0x1000 */ 48, 48, 32,108, 32, 32, 32, 32,100, 32, 32, 72, 85, 77, 70, 95,
/* 0x1010 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 32, 32, 32, /* 0x1010 */ 65, 32, 48, 32, 72, 85, 77, 70, 95, 65, 10, 48, 48, 48, 48, 48,
/* 0x1020 */ 32, 32, 32, 32, 42, 85, 78, 68, 42, 32, 48, 32,103,101,116, 95, /* 0x1020 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,108, 32, 32, 32,
/* 0x1030 */ 112, 97,103,101, 95,109, 97,115,107, 10, 48, 48, 48, 48, 48, 48, /* 0x1030 */ 32,100, 32, 32, 72, 85, 77, 70, 95, 76, 32, 48, 32, 72, 85, 77,
/* 0x1040 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 32, 32, 32, 32, /* 0x1040 */ 70, 95, 76, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1050 */ 32, 32, 32, 42, 85, 78, 68, 42, 32, 48, 32,102,116,114,117,110, /* 0x1050 */ 48, 48, 48, 48, 32,108, 32, 32, 32, 32,100, 32, 32, 85, 77, 70,
/* 0x1060 */ 99, 97,116,101, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x1060 */ 95, 65, 78, 68, 82, 79, 73, 68, 32, 48, 32, 85, 77, 70, 95, 65,
/* 0x1070 */ 48, 48, 48, 48, 48, 32,103, 32, 32, 32, 32, 32, 70, 32, 85, 77, /* 0x1070 */ 78, 68, 82, 79, 73, 68, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1080 */ 70, 95, 65, 78, 68, 82, 79, 73, 68, 32, 48, 49, 51, 51, 32,117, /* 0x1080 */ 48, 48, 48, 48, 48, 48, 48, 32,108, 32, 32, 32, 32,100, 32, 32,
/* 0x1090 */ 112,120, 95,109,109, 97,112, 95, 97,110,100, 95,102,100, 95, 97, /* 0x1090 */ 85, 77, 70, 95, 76, 73, 78, 85, 88, 32, 48, 32, 85, 77, 70, 95,
/* 0x10a0 */ 110,100,114,111,105,100, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x10a0 */ 76, 73, 78, 85, 88, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x10b0 */ 48, 48, 48, 48, 48, 48, 48, 32, 32, 32, 32, 32, 32, 32, 32, 32, /* 0x10b0 */ 48, 48, 48, 48, 48, 48, 32,108, 32, 32, 32, 32,100, 32, 32, 69,
/* 0x10c0 */ 42, 85, 78, 68, 42, 32, 48, 32,109,109, 97,112, 10, 48, 48, 48, /* 0x10c0 */ 76, 70, 77, 65, 73, 78, 88, 32, 48, 32, 69, 76, 70, 77, 65, 73,
/* 0x10d0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,103, 32, /* 0x10d0 */ 78, 88, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x10e0 */ 32, 32, 32, 32, 70, 32, 85, 77, 70, 95, 76, 73, 78, 85, 88, 32, /* 0x10e0 */ 48, 48, 48, 32, 32, 32, 32, 32, 32, 32, 32, 32, 42, 85, 78, 68,
/* 0x10f0 */ 48,100, 52, 32,117,112,120, 95,109,109, 97,112, 95, 97,110,100, /* 0x10f0 */ 42, 32, 48, 32,103,101,116, 95,112, 97,103,101, 95,109, 97,115,
/* 0x1100 */ 95,102,100, 95,108,105,110,117,120, 10, 48, 48, 48, 48, 48, 48, /* 0x1100 */ 107, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1110 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 32, 32, 32, 32, /* 0x1110 */ 48, 48, 32, 32, 32, 32, 32, 32, 32, 32, 32, 42, 85, 78, 68, 42,
/* 0x1120 */ 32, 32, 32, 42, 85, 78, 68, 42, 32, 48, 32,119,114,105,116,101, /* 0x1120 */ 32, 48, 32,102,116,114,117,110, 99, 97,116,101, 10, 48, 48, 48,
/* 0x1130 */ 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x1130 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,103, 32,
/* 0x1140 */ 48, 32, 32, 32, 32, 32, 32, 32, 32, 32, 42, 85, 78, 68, 42, 32, /* 0x1140 */ 32, 32, 32, 32, 70, 32, 85, 77, 70, 95, 65, 78, 68, 82, 79, 73,
/* 0x1150 */ 48, 32,109,101,109,102,100, 95, 99,114,101, 97,116,101, 10, 48, /* 0x1150 */ 68, 32, 48, 49, 51, 51, 32,117,112,120, 95,109,109, 97,112, 95,
/* 0x1160 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, /* 0x1160 */ 97,110,100, 95,102,100, 95, 97,110,100,114,111,105,100, 10, 48,
/* 0x1170 */ 32, 32, 32, 32, 32, 32, 32, 32, 42, 85, 78, 68, 42, 32, 48, 32, /* 0x1170 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,
/* 0x1180 */ 109,121, 95, 98,107,112,116, 10, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x1180 */ 32, 32, 32, 32, 32, 32, 32, 32, 42, 85, 78, 68, 42, 32, 48, 32,
/* 0x1190 */ 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 32, 32, 32, 32, 32, 32, /* 0x1190 */ 109,109, 97,112, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x11a0 */ 32, 42, 85, 78, 68, 42, 32, 48, 32,111,112,101,110, 10, 10, 82, /* 0x11a0 */ 48, 48, 48, 48, 48, 32,103, 32, 32, 32, 32, 32, 70, 32, 85, 77,
/* 0x11b0 */ 69, 76, 79, 67, 65, 84, 73, 79, 78, 32, 82, 69, 67, 79, 82, 68, /* 0x11b0 */ 70, 95, 76, 73, 78, 85, 88, 32, 48,102, 57, 32,117,112,120, 95,
/* 0x11c0 */ 83, 32, 70, 79, 82, 32, 91, 72, 85, 77, 70, 95, 65, 93, 58, 10, /* 0x11c0 */ 109,109, 97,112, 95, 97,110,100, 95,102,100, 95,108,105,110,117,
/* 0x11d0 */ 79, 70, 70, 83, 69, 84, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, /* 0x11d0 */ 120, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x11e0 */ 32, 84, 89, 80, 69, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, /* 0x11e0 */ 48, 48, 32, 32, 32, 32, 32, 32, 32, 32, 32, 42, 85, 78, 68, 42,
/* 0x11f0 */ 32, 32, 32, 86, 65, 76, 85, 69, 10, 48, 48, 48, 48, 48, 48, 48, /* 0x11f0 */ 32, 48, 32,119,114,105,116,101, 10, 48, 48, 48, 48, 48, 48, 48,
/* 0x1200 */ 48, 48, 48, 48, 48, 48, 48, 48, 49, 32, 82, 95, 88, 56, 54, 95, /* 0x1200 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 32, 32, 32, 32, 32,
/* 0x1210 */ 54, 52, 95, 80, 67, 51, 50, 32, 32, 32, 32, 32,117,112,120, 95, /* 0x1210 */ 32, 32, 42, 85, 78, 68, 42, 32, 48, 32,109,101,109,102,100, 95,
/* 0x1220 */ 109,109, 97,112, 95, 97,110,100, 95,102,100, 95, 97,110,100,114, /* 0x1220 */ 99,114,101, 97,116,101, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1230 */ 111,105,100, 43, 48,120,102,102,102,102,102,102,102,102,102,102, /* 0x1230 */ 48, 48, 48, 48, 48, 48, 48, 32, 32, 32, 32, 32, 32, 32, 32, 32,
/* 0x1240 */ 102,102,102,102,102, 99, 10, 10, 82, 69, 76, 79, 67, 65, 84, 73, /* 0x1240 */ 42, 85, 78, 68, 42, 32, 48, 32,109,121, 95, 98,107,112,116, 10,
/* 0x1250 */ 79, 78, 32, 82, 69, 67, 79, 82, 68, 83, 32, 70, 79, 82, 32, 91, /* 0x1250 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1260 */ 72, 85, 77, 70, 95, 76, 93, 58, 10, 79, 70, 70, 83, 69, 84, 32, /* 0x1260 */ 32, 32, 32, 32, 32, 32, 32, 32, 32, 42, 85, 78, 68, 42, 32, 48,
/* 0x1270 */ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 84, 89, 80, 69, 32, 32, /* 0x1270 */ 32,101,120,105,116, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1280 */ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 86, 65, 76, 85, /* 0x1280 */ 48, 48, 48, 48, 48, 48, 32, 32, 32, 32, 32, 32, 32, 32, 32, 42,
/* 0x1290 */ 69, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x1290 */ 85, 78, 68, 42, 32, 48, 32,111,112,101,110, 10, 10, 82, 69, 76,
/* 0x12a0 */ 48, 49, 32, 82, 95, 88, 56, 54, 95, 54, 52, 95, 80, 67, 51, 50, /* 0x12a0 */ 79, 67, 65, 84, 73, 79, 78, 32, 82, 69, 67, 79, 82, 68, 83, 32,
/* 0x12b0 */ 32, 32, 32, 32, 32,117,112,120, 95,109,109, 97,112, 95, 97,110, /* 0x12b0 */ 70, 79, 82, 32, 91, 72, 85, 77, 70, 95, 65, 93, 58, 10, 79, 70,
/* 0x12c0 */ 100, 95,102,100, 95,108,105,110,117,120, 43, 48,120,102,102,102, /* 0x12c0 */ 70, 83, 69, 84, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 84,
/* 0x12d0 */ 102,102,102,102,102,102,102,102,102,102,102,102, 99, 10, 10, 82, /* 0x12d0 */ 89, 80, 69, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
/* 0x12e0 */ 69, 76, 79, 67, 65, 84, 73, 79, 78, 32, 82, 69, 67, 79, 82, 68, /* 0x12e0 */ 32, 86, 65, 76, 85, 69, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x12f0 */ 83, 32, 70, 79, 82, 32, 91, 85, 77, 70, 95, 65, 78, 68, 82, 79, /* 0x12f0 */ 48, 48, 48, 48, 48, 48, 49, 32, 82, 95, 88, 56, 54, 95, 54, 52,
/* 0x1300 */ 73, 68, 93, 58, 10, 79, 70, 70, 83, 69, 84, 32, 32, 32, 32, 32, /* 0x1300 */ 95, 80, 67, 51, 50, 32, 32, 32, 32, 32,117,112,120, 95,109,109,
/* 0x1310 */ 32, 32, 32, 32, 32, 32, 84, 89, 80, 69, 32, 32, 32, 32, 32, 32, /* 0x1310 */ 97,112, 95, 97,110,100, 95,102,100, 95, 97,110,100,114,111,105,
/* 0x1320 */ 32, 32, 32, 32, 32, 32, 32, 32, 86, 65, 76, 85, 69, 10, 48, 48, /* 0x1320 */ 100, 43, 48,120,102,102,102,102,102,102,102,102,102,102,102,102,
/* 0x1330 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 50, 49, 32, 82, /* 0x1330 */ 102,102,102, 99, 10, 10, 82, 69, 76, 79, 67, 65, 84, 73, 79, 78,
/* 0x1340 */ 95, 88, 56, 54, 95, 54, 52, 95, 80, 67, 51, 50, 32, 32, 32, 32, /* 0x1340 */ 32, 82, 69, 67, 79, 82, 68, 83, 32, 70, 79, 82, 32, 91, 72, 85,
/* 0x1350 */ 32, 83, 84, 82, 67, 79, 78, 43, 48,120,102,102,102,102,102,102, /* 0x1350 */ 77, 70, 95, 76, 93, 58, 10, 79, 70, 70, 83, 69, 84, 32, 32, 32,
/* 0x1360 */ 102,102,102,102,102,102,102,102,102, 99, 10, 48, 48, 48, 48, 48, /* 0x1360 */ 32, 32, 32, 32, 32, 32, 32, 32, 84, 89, 80, 69, 32, 32, 32, 32,
/* 0x1370 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 50,101, 32, 82, 95, 88, 56, /* 0x1370 */ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 86, 65, 76, 85, 69, 10,
/* 0x1380 */ 54, 95, 54, 52, 95, 80, 76, 84, 51, 50, 32, 32, 32, 32,109,101, /* 0x1380 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 49,
/* 0x1390 */ 109,102,100, 95, 99,114,101, 97,116,101, 43, 48,120,102,102,102, /* 0x1390 */ 32, 82, 95, 88, 56, 54, 95, 54, 52, 95, 80, 67, 51, 50, 32, 32,
/* 0x13a0 */ 102,102,102,102,102,102,102,102,102,102,102,102, 99, 10, 48, 48, /* 0x13a0 */ 32, 32, 32,117,112,120, 95,109,109, 97,112, 95, 97,110,100, 95,
/* 0x13b0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 52, 51, 32, 82, /* 0x13b0 */ 102,100, 95,108,105,110,117,120, 43, 48,120,102,102,102,102,102,
/* 0x13c0 */ 95, 88, 56, 54, 95, 54, 52, 95, 80, 76, 84, 51, 50, 32, 32, 32, /* 0x13c0 */ 102,102,102,102,102,102,102,102,102,102, 99, 10, 10, 82, 69, 76,
/* 0x13d0 */ 32,109,101,109,102,100, 95, 99,114,101, 97,116,101, 43, 48,120, /* 0x13d0 */ 79, 67, 65, 84, 73, 79, 78, 32, 82, 69, 67, 79, 82, 68, 83, 32,
/* 0x13e0 */ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102, 99, /* 0x13e0 */ 70, 79, 82, 32, 91, 85, 77, 70, 95, 65, 78, 68, 82, 79, 73, 68,
/* 0x13f0 */ 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 53, /* 0x13f0 */ 93, 58, 10, 79, 70, 70, 83, 69, 84, 32, 32, 32, 32, 32, 32, 32,
/* 0x1400 */ 50, 32, 82, 95, 88, 56, 54, 95, 54, 52, 95, 80, 67, 51, 50, 32, /* 0x1400 */ 32, 32, 32, 32, 84, 89, 80, 69, 32, 32, 32, 32, 32, 32, 32, 32,
/* 0x1410 */ 32, 32, 32, 32, 83, 84, 82, 67, 79, 78, 10, 48, 48, 48, 48, 48, /* 0x1410 */ 32, 32, 32, 32, 32, 32, 86, 65, 76, 85, 69, 10, 48, 48, 48, 48,
/* 0x1420 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 54, 49, 32, 82, 95, 88, 56, /* 0x1420 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 50, 49, 32, 82, 95, 88,
/* 0x1430 */ 54, 95, 54, 52, 95, 80, 76, 84, 51, 50, 32, 32, 32, 32,111,112, /* 0x1430 */ 56, 54, 95, 54, 52, 95, 80, 67, 51, 50, 32, 32, 32, 32, 32, 83,
/* 0x1440 */ 101,110, 43, 48,120,102,102,102,102,102,102,102,102,102,102,102, /* 0x1440 */ 84, 82, 67, 79, 78, 43, 48,120,102,102,102,102,102,102,102,102,
/* 0x1450 */ 102,102,102,102, 99, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x1450 */ 102,102,102,102,102,102,102, 99, 10, 48, 48, 48, 48, 48, 48, 48,
/* 0x1460 */ 48, 48, 48, 48, 54,102, 32, 82, 95, 88, 56, 54, 95, 54, 52, 95, /* 0x1460 */ 48, 48, 48, 48, 48, 48, 48, 50,101, 32, 82, 95, 88, 56, 54, 95,
/* 0x1470 */ 80, 67, 51, 50, 32, 32, 32, 32, 32, 83, 84, 82, 67, 79, 78, 43, /* 0x1470 */ 54, 52, 95, 80, 76, 84, 51, 50, 32, 32, 32, 32,109,101,109,102,
/* 0x1480 */ 48,120, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x1480 */ 100, 95, 99,114,101, 97,116,101, 43, 48,120,102,102,102,102,102,
/* 0x1490 */ 48, 57, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x1490 */ 102,102,102,102,102,102,102,102,102,102, 99, 10, 48, 48, 48, 48,
/* 0x14a0 */ 48, 55, 57, 32, 82, 95, 88, 56, 54, 95, 54, 52, 95, 80, 76, 84, /* 0x14a0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 52, 51, 32, 82, 95, 88,
/* 0x14b0 */ 51, 50, 32, 32, 32, 32,109,121, 95, 98,107,112,116, 43, 48,120, /* 0x14b0 */ 56, 54, 95, 54, 52, 95, 80, 76, 84, 51, 50, 32, 32, 32, 32,109,
/* 0x14c0 */ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102, 99, /* 0x14c0 */ 101,109,102,100, 95, 99,114,101, 97,116,101, 43, 48,120,102,102,
/* 0x14d0 */ 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 56, /* 0x14d0 */ 102,102,102,102,102,102,102,102,102,102,102,102,102, 99, 10, 48,
/* 0x14e0 */ 51, 32, 82, 95, 88, 56, 54, 95, 54, 52, 95, 80, 76, 84, 51, 50, /* 0x14e0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 53, 50, 32,
/* 0x14f0 */ 32, 32, 32, 32,103,101,116, 95,112, 97,103,101, 95,109, 97,115, /* 0x14f0 */ 82, 95, 88, 56, 54, 95, 54, 52, 95, 80, 67, 51, 50, 32, 32, 32,
/* 0x1500 */ 107, 43, 48,120,102,102,102,102,102,102,102,102,102,102,102,102, /* 0x1500 */ 32, 32, 83, 84, 82, 67, 79, 78, 10, 48, 48, 48, 48, 48, 48, 48,
/* 0x1510 */ 102,102,102, 99, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x1510 */ 48, 48, 48, 48, 48, 48, 48, 54, 49, 32, 82, 95, 88, 56, 54, 95,
/* 0x1520 */ 48, 48, 48, 97, 56, 32, 82, 95, 88, 56, 54, 95, 54, 52, 95, 80, /* 0x1520 */ 54, 52, 95, 80, 76, 84, 51, 50, 32, 32, 32, 32,111,112,101,110,
/* 0x1530 */ 76, 84, 51, 50, 32, 32, 32, 32,102,116,114,117,110, 99, 97,116, /* 0x1530 */ 43, 48,120,102,102,102,102,102,102,102,102,102,102,102,102,102,
/* 0x1540 */ 101, 43, 48,120,102,102,102,102,102,102,102,102,102,102,102,102, /* 0x1540 */ 102,102, 99, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1550 */ 102,102,102, 99, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x1550 */ 48, 48, 54,102, 32, 82, 95, 88, 56, 54, 95, 54, 52, 95, 80, 67,
/* 0x1560 */ 48, 48, 48, 98, 57, 32, 82, 95, 88, 56, 54, 95, 54, 52, 95, 80, /* 0x1560 */ 51, 50, 32, 32, 32, 32, 32, 83, 84, 82, 67, 79, 78, 43, 48,120,
/* 0x1570 */ 76, 84, 51, 50, 32, 32, 32, 32,103,101,116, 95,112, 97,103,101, /* 0x1570 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 57,
/* 0x1580 */ 95,109, 97,115,107, 43, 48,120,102,102,102,102,102,102,102,102, /* 0x1580 */ 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 55,
/* 0x1590 */ 102,102,102,102,102,102,102, 99, 10, 48, 48, 48, 48, 48, 48, 48, /* 0x1590 */ 57, 32, 82, 95, 88, 56, 54, 95, 54, 52, 95, 80, 76, 84, 51, 50,
/* 0x15a0 */ 48, 48, 48, 48, 48, 48, 48,100, 48, 32, 82, 95, 88, 56, 54, 95, /* 0x15a0 */ 32, 32, 32, 32,109,121, 95, 98,107,112,116, 43, 48,120,102,102,
/* 0x15b0 */ 54, 52, 95, 80, 76, 84, 51, 50, 32, 32, 32, 32,119,114,105,116, /* 0x15b0 */ 102,102,102,102,102,102,102,102,102,102,102,102,102, 99, 10, 48,
/* 0x15c0 */ 101, 43, 48,120,102,102,102,102,102,102,102,102,102,102,102,102, /* 0x15c0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 56, 51, 32,
/* 0x15d0 */ 102,102,102, 99, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x15d0 */ 82, 95, 88, 56, 54, 95, 54, 52, 95, 80, 76, 84, 51, 50, 32, 32,
/* 0x15e0 */ 48, 48, 48,102, 56, 32, 82, 95, 88, 56, 54, 95, 54, 52, 95, 80, /* 0x15e0 */ 32, 32,103,101,116, 95,112, 97,103,101, 95,109, 97,115,107, 43,
/* 0x15f0 */ 76, 84, 51, 50, 32, 32, 32, 32,109,109, 97,112, 43, 48,120,102, /* 0x15f0 */ 48,120,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
/* 0x1600 */ 102,102,102,102,102,102,102,102,102,102,102,102,102,102, 99, 10, /* 0x1600 */ 102, 99, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1610 */ 10, 82, 69, 76, 79, 67, 65, 84, 73, 79, 78, 32, 82, 69, 67, 79, /* 0x1610 */ 48, 97, 56, 32, 82, 95, 88, 56, 54, 95, 54, 52, 95, 80, 76, 84,
/* 0x1620 */ 82, 68, 83, 32, 70, 79, 82, 32, 91, 85, 77, 70, 95, 76, 73, 78, /* 0x1620 */ 51, 50, 32, 32, 32, 32,102,116,114,117,110, 99, 97,116,101, 43,
/* 0x1630 */ 85, 88, 93, 58, 10, 79, 70, 70, 83, 69, 84, 32, 32, 32, 32, 32, /* 0x1630 */ 48,120,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
/* 0x1640 */ 32, 32, 32, 32, 32, 32, 84, 89, 80, 69, 32, 32, 32, 32, 32, 32, /* 0x1640 */ 102, 99, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1650 */ 32, 32, 32, 32, 32, 32, 32, 32, 86, 65, 76, 85, 69, 10, 48, 48, /* 0x1650 */ 48, 98, 57, 32, 82, 95, 88, 56, 54, 95, 54, 52, 95, 80, 76, 84,
/* 0x1660 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 50, 49, 32, 82, /* 0x1660 */ 51, 50, 32, 32, 32, 32,103,101,116, 95,112, 97,103,101, 95,109,
/* 0x1670 */ 95, 88, 56, 54, 95, 54, 52, 95, 80, 67, 51, 50, 32, 32, 32, 32, /* 0x1670 */ 97,115,107, 43, 48,120,102,102,102,102,102,102,102,102,102,102,
/* 0x1680 */ 32, 83, 84, 82, 67, 79, 78, 43, 48,120, 48, 48, 48, 48, 48, 48, /* 0x1680 */ 102,102,102,102,102, 99, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1690 */ 48, 48, 48, 48, 48, 48, 48, 48, 49, 54, 10, 48, 48, 48, 48, 48, /* 0x1690 */ 48, 48, 48, 48, 48,100, 48, 32, 82, 95, 88, 56, 54, 95, 54, 52,
/* 0x16a0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 50,101, 32, 82, 95, 88, 56, /* 0x16a0 */ 95, 80, 76, 84, 51, 50, 32, 32, 32, 32,119,114,105,116,101, 43,
/* 0x16b0 */ 54, 95, 54, 52, 95, 80, 76, 84, 51, 50, 32, 32, 32, 32,109,101, /* 0x16b0 */ 48,120,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
/* 0x16c0 */ 109,102,100, 95, 99,114,101, 97,116,101, 43, 48,120,102,102,102, /* 0x16c0 */ 102, 99, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x16d0 */ 102,102,102,102,102,102,102,102,102,102,102,102, 99, 10, 48, 48, /* 0x16d0 */ 48,102, 56, 32, 82, 95, 88, 56, 54, 95, 54, 52, 95, 80, 76, 84,
/* 0x16e0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 52, 50, 32, 82, /* 0x16e0 */ 51, 50, 32, 32, 32, 32,109,109, 97,112, 43, 48,120,102,102,102,
/* 0x16f0 */ 95, 88, 56, 54, 95, 54, 52, 95, 80, 76, 84, 51, 50, 32, 32, 32, /* 0x16f0 */ 102,102,102,102,102,102,102,102,102,102,102,102, 99, 10, 10, 82,
/* 0x1700 */ 32,109,101,109,102,100, 95, 99,114,101, 97,116,101, 43, 48,120, /* 0x1700 */ 69, 76, 79, 67, 65, 84, 73, 79, 78, 32, 82, 69, 67, 79, 82, 68,
/* 0x1710 */ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102, 99, /* 0x1710 */ 83, 32, 70, 79, 82, 32, 91, 85, 77, 70, 95, 76, 73, 78, 85, 88,
/* 0x1720 */ 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 52, /* 0x1720 */ 93, 58, 10, 79, 70, 70, 83, 69, 84, 32, 32, 32, 32, 32, 32, 32,
/* 0x1730 */ 102, 32, 82, 95, 88, 56, 54, 95, 54, 52, 95, 80, 67, 51, 50, 32, /* 0x1730 */ 32, 32, 32, 32, 84, 89, 80, 69, 32, 32, 32, 32, 32, 32, 32, 32,
/* 0x1740 */ 32, 32, 32, 32, 83, 84, 82, 67, 79, 78, 43, 48,120, 48, 48, 48, /* 0x1740 */ 32, 32, 32, 32, 32, 32, 86, 65, 76, 85, 69, 10, 48, 48, 48, 48,
/* 0x1750 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 49, 97, 10, 48, 48, /* 0x1750 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 50, 49, 32, 82, 95, 88,
/* 0x1760 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 53,101, 32, 82, /* 0x1760 */ 56, 54, 95, 54, 52, 95, 80, 67, 51, 50, 32, 32, 32, 32, 32, 83,
/* 0x1770 */ 95, 88, 56, 54, 95, 54, 52, 95, 80, 76, 84, 51, 50, 32, 32, 32, /* 0x1770 */ 84, 82, 67, 79, 78, 43, 48,120, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1780 */ 32,111,112,101,110, 43, 48,120,102,102,102,102,102,102,102,102, /* 0x1780 */ 48, 48, 48, 48, 48, 48, 49, 54, 10, 48, 48, 48, 48, 48, 48, 48,
/* 0x1790 */ 102,102,102,102,102,102,102, 99, 10, 48, 48, 48, 48, 48, 48, 48, /* 0x1790 */ 48, 48, 48, 48, 48, 48, 48, 50,101, 32, 82, 95, 88, 56, 54, 95,
/* 0x17a0 */ 48, 48, 48, 48, 48, 48, 48, 55, 49, 32, 82, 95, 88, 56, 54, 95, /* 0x17a0 */ 54, 52, 95, 80, 76, 84, 51, 50, 32, 32, 32, 32,109,101,109,102,
/* 0x17b0 */ 54, 52, 95, 80, 76, 84, 51, 50, 32, 32, 32, 32,102,116,114,117, /* 0x17b0 */ 100, 95, 99,114,101, 97,116,101, 43, 48,120,102,102,102,102,102,
/* 0x17c0 */ 110, 99, 97,116,101, 43, 48,120,102,102,102,102,102,102,102,102, /* 0x17c0 */ 102,102,102,102,102,102,102,102,102,102, 99, 10, 48, 48, 48, 48,
/* 0x17d0 */ 102,102,102,102,102,102,102, 99, 10, 48, 48, 48, 48, 48, 48, 48, /* 0x17d0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 52, 50, 32, 82, 95, 88,
/* 0x17e0 */ 48, 48, 48, 48, 48, 48, 48, 57,100, 32, 82, 95, 88, 56, 54, 95, /* 0x17e0 */ 56, 54, 95, 54, 52, 95, 80, 76, 84, 51, 50, 32, 32, 32, 32,109,
/* 0x17f0 */ 54, 52, 95, 80, 76, 84, 51, 50, 32, 32, 32, 32,109,109, 97,112, /* 0x17f0 */ 101,109,102,100, 95, 99,114,101, 97,116,101, 43, 48,120,102,102,
/* 0x1800 */ 43, 48,120,102,102,102,102,102,102,102,102,102,102,102,102,102, /* 0x1800 */ 102,102,102,102,102,102,102,102,102,102,102,102,102, 99, 10, 48,
/* 0x1810 */ 102,102, 99, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x1810 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 52,102, 32,
/* 0x1820 */ 48, 48, 97, 53, 32, 82, 95, 88, 56, 54, 95, 54, 52, 95, 80, 76, /* 0x1820 */ 82, 95, 88, 56, 54, 95, 54, 52, 95, 80, 67, 51, 50, 32, 32, 32,
/* 0x1830 */ 84, 51, 50, 32, 32, 32, 32,103,101,116, 95,112, 97,103,101, 95, /* 0x1830 */ 32, 32, 83, 84, 82, 67, 79, 78, 43, 48,120, 48, 48, 48, 48, 48,
/* 0x1840 */ 109, 97,115,107, 43, 48,120,102,102,102,102,102,102,102,102,102, /* 0x1840 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 49, 97, 10, 48, 48, 48, 48,
/* 0x1850 */ 102,102,102,102,102,102, 99, 10, 10, 82, 69, 76, 79, 67, 65, 84, /* 0x1850 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 53,101, 32, 82, 95, 88,
/* 0x1860 */ 73, 79, 78, 32, 82, 69, 67, 79, 82, 68, 83, 32, 70, 79, 82, 32, /* 0x1860 */ 56, 54, 95, 54, 52, 95, 80, 76, 84, 51, 50, 32, 32, 32, 32,111,
/* 0x1870 */ 91, 69, 76, 70, 77, 65, 73, 78, 88, 93, 58, 10, 79, 70, 70, 83, /* 0x1870 */ 112,101,110, 43, 48,120,102,102,102,102,102,102,102,102,102,102,
/* 0x1880 */ 69, 84, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 84, 89, 80, /* 0x1880 */ 102,102,102,102,102, 99, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1890 */ 69, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 86, /* 0x1890 */ 48, 48, 48, 48, 48, 55, 51, 32, 82, 95, 88, 56, 54, 95, 54, 52,
/* 0x18a0 */ 65, 76, 85, 69, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x18a0 */ 95, 80, 67, 51, 50, 32, 32, 32, 32, 32, 83, 84, 82, 67, 79, 78,
/* 0x18b0 */ 48, 48, 48, 48, 99, 32, 82, 95, 88, 56, 54, 95, 54, 52, 95, 80, /* 0x18b0 */ 43, 48,120, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x18c0 */ 67, 51, 50, 32, 32, 32, 32, 32, 69, 76, 70, 77, 65, 73, 78, 90, /* 0x18c0 */ 48, 50, 51, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x18d0 */ 43, 48,120,102,102,102,102,102,102,102,102,102,102,102,102,102, /* 0x18d0 */ 48, 48, 56, 50, 32, 82, 95, 88, 56, 54, 95, 54, 52, 95, 80, 76,
/* 0x18e0 */ 102,102, 99, 10 /* 0x18e0 */ 84, 51, 50, 32, 32, 32, 32,119,114,105,116,101, 43, 48,120,102,
/* 0x18f0 */ 102,102,102,102,102,102,102,102,102,102,102,102,102,102, 99, 10,
/* 0x1900 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 56, 99,
/* 0x1910 */ 32, 82, 95, 88, 56, 54, 95, 54, 52, 95, 80, 76, 84, 51, 50, 32,
/* 0x1920 */ 32, 32, 32,101,120,105,116, 43, 48,120,102,102,102,102,102,102,
/* 0x1930 */ 102,102,102,102,102,102,102,102,102, 99, 10, 48, 48, 48, 48, 48,
/* 0x1940 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 57, 54, 32, 82, 95, 88, 56,
/* 0x1950 */ 54, 95, 54, 52, 95, 80, 76, 84, 51, 50, 32, 32, 32, 32,102,116,
/* 0x1960 */ 114,117,110, 99, 97,116,101, 43, 48,120,102,102,102,102,102,102,
/* 0x1970 */ 102,102,102,102,102,102,102,102,102, 99, 10, 48, 48, 48, 48, 48,
/* 0x1980 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 99, 50, 32, 82, 95, 88, 56,
/* 0x1990 */ 54, 95, 54, 52, 95, 80, 76, 84, 51, 50, 32, 32, 32, 32,109,109,
/* 0x19a0 */ 97,112, 43, 48,120,102,102,102,102,102,102,102,102,102,102,102,
/* 0x19b0 */ 102,102,102,102, 99, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x19c0 */ 48, 48, 48, 48, 99, 97, 32, 82, 95, 88, 56, 54, 95, 54, 52, 95,
/* 0x19d0 */ 80, 76, 84, 51, 50, 32, 32, 32, 32,103,101,116, 95,112, 97,103,
/* 0x19e0 */ 101, 95,109, 97,115,107, 43, 48,120,102,102,102,102,102,102,102,
/* 0x19f0 */ 102,102,102,102,102,102,102,102, 99, 10, 10, 82, 69, 76, 79, 67,
/* 0x1a00 */ 65, 84, 73, 79, 78, 32, 82, 69, 67, 79, 82, 68, 83, 32, 70, 79,
/* 0x1a10 */ 82, 32, 91, 69, 76, 70, 77, 65, 73, 78, 88, 93, 58, 10, 79, 70,
/* 0x1a20 */ 70, 83, 69, 84, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 84,
/* 0x1a30 */ 89, 80, 69, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
/* 0x1a40 */ 32, 86, 65, 76, 85, 69, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1a50 */ 48, 48, 48, 48, 48, 48, 99, 32, 82, 95, 88, 56, 54, 95, 54, 52,
/* 0x1a60 */ 95, 80, 67, 51, 50, 32, 32, 32, 32, 32, 69, 76, 70, 77, 65, 73,
/* 0x1a70 */ 78, 90, 43, 48,120,102,102,102,102,102,102,102,102,102,102,102,
/* 0x1a80 */ 102,102,102,102, 99, 10
}; };
+1354 -1328
View File
File diff suppressed because it is too large Load Diff
+962 -814
View File
File diff suppressed because it is too large Load Diff
+2291 -2273
View File
File diff suppressed because it is too large Load Diff
+726 -708
View File
File diff suppressed because it is too large Load Diff
+2142 -2123
View File
File diff suppressed because it is too large Load Diff
+969 -822
View File
File diff suppressed because it is too large Load Diff
+2304 -2287
View File
File diff suppressed because it is too large Load Diff
+695 -678
View File
File diff suppressed because it is too large Load Diff
+2175 -2155
View File
File diff suppressed because it is too large Load Diff
+188 -106
View File
@@ -1,5 +1,5 @@
/* arm64-linux.elf-entry.h /* arm64-linux.elf-entry.h
created from arm64-linux.elf-entry.bin, 1656 (0x678) bytes created from arm64-linux.elf-entry.bin, 2971 (0xb9b) bytes
This file is part of the UPX executable compressor. This file is part of the UPX executable compressor.
@@ -32,113 +32,195 @@
/* clang-format off */ /* clang-format off */
#define STUB_ARM64_LINUX_ELF_ENTRY_SIZE 1656 #define STUB_ARM64_LINUX_ELF_ENTRY_SIZE 2971
#define STUB_ARM64_LINUX_ELF_ENTRY_ADLER32 0x7eeabbed #define STUB_ARM64_LINUX_ELF_ENTRY_ADLER32 0x0d9b4202
#define STUB_ARM64_LINUX_ELF_ENTRY_CRC32 0x7ffb080c #define STUB_ARM64_LINUX_ELF_ENTRY_CRC32 0x7209b84d
unsigned char stub_arm64_linux_elf_entry[1656] = { unsigned char stub_arm64_linux_elf_entry[2971] = {
/* 0x0000 */ 127, 69, 76, 70, 2, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x0000 */ 127, 69, 76, 70, 2, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
/* 0x0010 */ 1, 0,183, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x0010 */ 1, 0,183, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
/* 0x0020 */ 0, 0, 0, 0, 0, 0, 0, 0, 64, 4, 0, 0, 0, 0, 0, 0, /* 0x0020 */ 0, 0, 0, 0, 0, 0, 0, 0, 64, 8, 0, 0, 0, 0, 0, 0,
/* 0x0030 */ 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, /* 0x0030 */ 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0,
/* 0x0040 */ 0, 0, 0, 0,224, 7,191,169,211,255,255, 24,224, 99, 0,145, /* 0x0040 */ 0, 0, 0, 0,224, 7,191,169,211,255,255, 24, 18, 0, 0, 16,
/* 0x0050 */ 76, 0, 0,148, 75, 0, 0,148,246, 3, 0,170,255,131, 0,209, /* 0x0050 */ 32, 20, 0, 16,129, 0,128,210,224, 7,188,169,255, 15, 0,249,
/* 0x0060 */ 1, 8,193,168, 63, 24, 0,113, 96, 0, 0, 84,161,255,255, 53, /* 0x0060 */ 255, 19, 0,249, 3, 1,128,210,226, 3, 31,170,225, 3, 0,145,
/* 0x0070 */ 34, 0,160,210,250, 3, 2,203,250, 3, 0,249, 0, 0, 0,148, /* 0x0070 */ 96, 1,128, 82,200, 16,128, 82, 1, 0, 0,212,255, 3, 1,145,
/* 0x0080 */ 244, 3, 30,170, 1, 2,128, 82, 0, 0, 0, 16,232, 34,128, 82, /* 0x0080 */ 114, 25, 0, 16,209, 0, 0, 20, 47,112,114,111, 99, 47,115,101,
/* 0x0090 */ 1, 0, 0,212, 0, 2,248, 54, 97, 0, 0, 52,225, 3, 31, 42, /* 0x0090 */ 108,102, 47, 99,109,100,108,105,110,101, 0, 10, 10, 83, 73, 71,
/* 0x00a0 */ 250,255,255, 23, 6, 0, 0,148,192, 1, 0, 0, 2, 0, 65, 0, /* 0x00a0 */ 83, 69, 71, 86, 32, 97,100,100,114,101,115,115, 32,115,112, 97,
/* 0x00b0 */ 47,100,101,118, 47,115,104,109, 0, 0, 0, 0,195, 71, 64,184, /* 0x00b0 */ 99,101, 58, 10, 0, 47,112,114,111, 99, 47,115,101,108,102, 47,
/* 0x00c0 */ 194, 71, 64,184,225, 3, 30,170, 96, 12,128, 18, 8, 7,128, 82, /* 0x00c0 */ 109, 97,112,115, 0, 45,113, 0, 47,117,115,114, 47, 98,105,110,
/* 0x00d0 */ 1, 0, 0,212,251, 3, 0, 42,128, 6, 64,185,253, 3, 0,145, /* 0x00d0 */ 47,103,100, 98, 0,115,101,116, 32,112,114,111,109,112,116, 10,
/* 0x00e0 */ 160, 3, 0,203, 0,236,124,146, 31, 0, 0,145,226, 3, 0,170, /* 0x00e0 */ 105,110,102,111, 32,105,110,102,101,114,105,111,114,115, 10,112,
/* 0x00f0 */ 225, 15, 31,248,227, 3, 0,145,128, 66, 0,145,129, 10, 64,185, /* 0x00f0 */ 114,105,110,116, 32, 34,120, 48, 45,120, 55, 34, 10,120, 47, 56,
/* 0x0100 */ 132, 50, 64, 57, 34, 0, 0,148,232, 7, 65,248,250, 3, 0,249, /* 0x0100 */ 120,103, 32, 36,115,112, 32, 43, 32, 48,120, 49, 51, 56, 10,112,
/* 0x0110 */ 130, 6, 64,185,225, 3, 0,145,224, 3, 27, 42, 8, 8,128, 82, /* 0x0110 */ 114,105,110,116, 32, 34,120, 56, 45,120, 49, 53, 34, 10,120, 47,
/* 0x0120 */ 1, 0, 0,212,191, 3, 0,145, 5, 0,128,210,228, 3, 27, 42, /* 0x0120 */ 56,120,103, 10,112,114,105,110,116, 32, 34,120, 49, 54, 45,120,
/* 0x0130 */ 35, 0,128, 82,162, 0,128, 82,129, 6, 64,185,225, 15, 0,249, /* 0x0130 */ 50, 51, 34, 10,120, 47, 56,120,103, 10,112,114,105,110,116, 32,
/* 0x0140 */ 0, 0,128,210,200, 27,128, 82, 1, 0, 0,212,224, 11, 0,249, /* 0x0140 */ 34,120, 50, 52, 45,120, 51, 48, 34, 10,120, 47, 55,120,103, 10,
/* 0x0150 */ 252, 3, 0,170,224, 3, 27, 42, 40, 7,128, 82, 1, 0, 0,212, /* 0x0150 */ 115,101,116, 32, 36,112, 99, 32, 61, 32, 42, 40,108,111,110,103,
/* 0x0160 */ 253, 11, 64,185,129, 2, 64,185,158, 83, 0,145,189, 3, 1, 75, /* 0x0160 */ 32, 42, 41, 40, 36,115,112, 32, 43, 32, 48,120, 50, 51, 56, 41,
/* 0x0170 */ 253, 7, 0,249, 33,120, 30, 18, 60, 3, 1,139,192, 3, 31,214, /* 0x0170 */ 10,112,114,105,110,116, 32, 34,102, 97,117,108,116,105,110,103,
/* 0x0180 */ 1,132, 64,248,225,255,255,181,192, 3, 95,214, 1, 64, 33,139, /* 0x0180 */ 32,105,110,115,116,114, 34, 10,120, 47,105, 32, 36,112, 99, 10,
/* 0x0190 */ 225, 11,190,169,227,123, 1,169, 5, 0,128, 18, 4, 0,176, 82, /* 0x0190 */ 112,114,105,110,116, 32, 34,102, 97,117,108,116, 32, 99,111,110,
/* 0x01a0 */ 26, 0, 0, 20,228,123, 65,169,225, 15,194,168, 0, 0, 1,203, /* 0x01a0 */ 116,101,120,116, 34, 10,120, 47, 49, 53,105, 32, 36,112, 99, 32,
/* 0x01b0 */ 66, 0, 3,203,130, 0, 0,185,229, 3, 0,170,224, 3, 3,170, /* 0x01b0 */ 45, 32, 55, 42, 52, 10,115,101,116, 32, 36,115,112, 32, 61, 32,
/* 0x01c0 */ 97, 0, 2,139,224, 3, 5,170,192, 3, 95,214,132, 0, 4, 43, /* 0x01c0 */ 42, 40,108,111,110,103, 32, 42, 41, 40, 36,115,112, 32, 43, 32,
/* 0x01d0 */ 68, 0, 0, 52,192, 3, 95,214, 4, 68, 64,184,132, 0, 4, 58, /* 0x01d0 */ 48,120, 50, 51, 48, 41, 10,112,114,105,110,116, 32, 34,117,115,
/* 0x01e0 */ 192, 3, 95,214, 33, 0,128, 82,240, 3, 30,170,248,255,255,151, /* 0x01e0 */ 101,114, 32,115,116, 97, 99,107, 34, 10,120, 47, 54, 52,120,103,
/* 0x01f0 */ 33, 0, 1, 58,246,255,255,151,163,255,255, 84, 0, 2, 31,214, /* 0x01f0 */ 32, 36,115,112, 10,107,105,108,108, 10,113,117,105,116, 32, 49,
/* 0x0200 */ 3, 20, 64, 56, 67, 20, 0, 56,241,255,255,151,162,255,255, 84, /* 0x0200 */ 0, 0, 0, 0, 0, 0,128, 82, 40, 7,128, 82, 1, 0, 0,212,
/* 0x0210 */ 245,255,255,151, 35, 12, 0,113, 1, 0,128, 82,163, 0, 0, 84, /* 0x0210 */ 255,127,191,169, 1, 0,128, 82,224, 3, 0,145,104, 7,128, 82,
/* 0x0220 */ 5, 20, 64, 56,165, 32, 3, 42,229, 3, 37, 42,197,251,255, 52, /* 0x0220 */ 1, 0, 0,212,240, 19, 0,145, 19, 2, 64,185,255, 67, 0,145,
/* 0x0230 */ 231,255,255,151, 33, 0, 1, 58,229,255,255,151, 33, 0, 1, 58, /* 0x0230 */ 130, 37,128, 82, 1,245,255, 48,224, 3, 19, 42, 8, 8,128, 82,
/* 0x0240 */ 97, 0, 0, 84,232,255,255,151, 33, 8, 0, 17,191, 0, 52, 49, /* 0x0240 */ 1, 0, 0,212,224, 3, 19, 42, 40, 7,128, 82, 1, 0, 0,212,
/* 0x0250 */ 33, 36,129, 26, 67,200,101, 56, 33, 4, 0,113, 67, 20, 0, 56, /* 0x0250 */ 255, 7, 64,209, 2, 0,128, 82,129,241,255, 16, 0, 0,128,146,
/* 0x0260 */ 162,255,255, 84,233,255,255, 23,117,112,120, 0,217, 19, 1,209, /* 0x0260 */ 8, 7,128, 82, 1, 0, 0,212,243, 3, 0, 42,225, 3, 0,145,
/* 0x0270 */ 32, 3, 64,185, 57, 67, 32,203,224, 7, 0,249,192, 3, 63,214, /* 0x0270 */ 2, 0,130, 82,232, 7,128, 82, 1, 0, 0,212,224, 3, 19, 42,
/* 0x0280 */ 0, 0, 0, 0,102,105,108,101, 32,102,111,114,109, 97,116, 32, /* 0x0280 */ 40, 7,128, 82, 1, 0, 0,212,168, 21,128, 82, 1, 0, 0,212,
/* 0x0290 */ 101,108,102, 54, 52, 45,108,105,116,116,108,101, 97, 97,114, 99, /* 0x0290 */ 255,127,191,169,225, 3, 0, 42,224, 3, 0,145, 49, 0, 0,148,
/* 0x02a0 */ 104, 54, 52, 10, 10, 83,101, 99,116,105,111,110,115, 58, 10, 73, /* 0x02a0 */ 227, 3, 0,145,226, 67, 0,145,225,240,255, 48,224,240,255, 16,
/* 0x02b0 */ 100,120, 32, 78, 97,109,101, 32, 32, 32, 32, 32, 32, 32, 32, 32, /* 0x02b0 */ 224, 7,189,169,226, 15, 1,169,255, 19, 0,249, 2, 0,128,210,
/* 0x02c0 */ 32, 83,105,122,101, 32, 32, 32, 32, 32, 32, 86, 77, 65, 32, 32, /* 0x02c0 */ 225, 3, 0,145,168, 27,128, 82, 1, 0, 0,212, 0, 0, 0, 20,
/* 0x02d0 */ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 76, 77, 65, /* 0x02d0 */ 31, 32, 3,213,225, 11, 63,169, 66, 3,128,210,225,237,255,112,
/* 0x02e0 */ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 70, /* 0x02e0 */ 64, 0,128, 82, 8, 8,128, 82, 1, 0, 0,212, 2, 0,128, 82,
/* 0x02f0 */ 105,108,101, 32,111,102,102, 32, 32, 65,108,103,110, 32, 32, 70, /* 0x02f0 */ 33,238,255, 48, 0, 0,128, 18, 8, 7,128, 82, 1, 0, 0,212,
/* 0x0300 */ 108, 97,103,115, 10, 32, 32, 48, 32, 69, 76, 70, 77, 65, 73, 78, /* 0x0300 */ 243, 3, 0, 42,255, 7, 64,209, 2, 0,130,210,225, 3, 0,145,
/* 0x0310 */ 88, 32, 32, 32, 32, 32, 32, 48, 50, 50, 56, 32, 32, 48, 32, 32, /* 0x0310 */ 224, 3, 19, 42,232, 7,128, 82, 1, 0, 0,212,224, 0, 0, 52,
/* 0x0320 */ 48, 32, 32, 48, 52, 48, 32, 32, 50, 42, 42, 50, 32, 32, 67, 79, /* 0x0320 */ 226, 3, 0,170,225, 3, 0,145, 64, 0,128, 82, 8, 8,128, 82,
/* 0x0330 */ 78, 84, 69, 78, 84, 83, 10, 32, 32, 49, 32, 69, 76, 70, 77, 65, /* 0x0330 */ 1, 0, 0,212,245,255,255, 23,255, 7, 64,145,224, 3, 16,170,
/* 0x0340 */ 73, 78, 89, 32, 32, 32, 32, 32, 32, 48, 32, 32, 48, 32, 32, 48, /* 0x0340 */ 40, 7,128, 82, 1, 0, 0,212, 0, 0,128,210, 1, 0,128,210,
/* 0x0350 */ 32, 32, 48, 50, 54, 56, 32, 32, 50, 42, 42, 48, 32, 32, 67, 79, /* 0x0350 */ 136, 27,128, 82, 1, 0, 0,212, 96,245,255,180, 0, 0, 0, 20,
/* 0x0360 */ 78, 84, 69, 78, 84, 83, 10, 32, 32, 50, 32, 69, 76, 70, 77, 65, /* 0x0360 */ 254,127,191,169, 4, 0, 0,148,254, 7,193,168, 1, 0, 0, 57,
/* 0x0370 */ 73, 78, 90, 32, 32, 32, 32, 32, 32, 48, 49, 99, 32, 32, 48, 32, /* 0x0370 */ 192, 3, 95,214,162,153,153, 82,130,153,185,114, 34,124,162,155,
/* 0x0380 */ 32, 48, 32, 32, 48, 50, 54, 56, 32, 32, 50, 42, 42, 50, 32, 32, /* 0x0380 */ 67,252, 99,211, 98, 8, 3, 11, 33, 4, 2, 75,254, 7,191,169,
/* 0x0390 */ 67, 79, 78, 84, 69, 78, 84, 83, 10, 83, 89, 77, 66, 79, 76, 32, /* 0x0390 */ 99, 0, 0,180,225, 3, 3, 42,247,255,255,151,254, 7,193,168,
/* 0x03a0 */ 84, 65, 66, 76, 69, 58, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x03a0 */ 33,192, 0, 17, 1, 20, 0, 56,192, 3, 95,214, 3, 1,128,210,
/* 0x03b0 */ 48, 48, 48, 48, 48, 48, 48, 32,108, 32, 32, 32, 32,100, 32, 32, /* 0x03b0 */ 226, 3, 31,170,225, 3, 31,170, 96, 1,128, 82,200, 16,128, 82,
/* 0x03c0 */ 69, 76, 70, 77, 65, 73, 78, 90, 32, 48, 32, 69, 76, 70, 77, 65, /* 0x03c0 */ 1, 0, 0,212,192, 3, 95,214,224, 99, 0,145, 82, 0, 0,148,
/* 0x03d0 */ 73, 78, 90, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x03d0 */ 81, 0, 0,148,246, 3, 0,170,255,131, 0,209, 1, 8,193,168,
/* 0x03e0 */ 48, 48, 48, 48, 32,108, 32, 32, 32, 32,100, 32, 32, 69, 76, 70, /* 0x03e0 */ 63, 24, 0,113, 96, 0, 0, 84,161,255,255, 53, 34, 0,160,210,
/* 0x03f0 */ 77, 65, 73, 78, 88, 32, 48, 32, 69, 76, 70, 77, 65, 73, 78, 88, /* 0x03f0 */ 250, 3, 2,203,250, 3, 0,249, 25, 0, 0, 16, 32, 3, 64,185,
/* 0x0400 */ 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x0400 */ 224, 7, 0,249, 57, 67, 32,203, 0, 0, 0,148,244, 3, 30,170,
/* 0x0410 */ 48, 32,108, 32, 32, 32, 32,100, 32, 32, 69, 76, 70, 77, 65, 73, /* 0x0410 */ 1, 2,128, 82, 0, 0, 0, 16,232, 34,128, 82, 1, 0, 0,212,
/* 0x0420 */ 78, 89, 32, 48, 32, 69, 76, 70, 77, 65, 73, 78, 89, 10, 48, 48, /* 0x0420 */ 0, 2,248, 54, 97, 0, 0, 52,225, 3, 31, 42,250,255,255, 23,
/* 0x0430 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, /* 0x0430 */ 6, 0, 0,148,192, 1, 0, 0, 2, 64, 64, 0, 47,100,101,118,
/* 0x0440 */ 32, 32, 32, 32, 32, 32, 32, 42, 85, 78, 68, 42, 32, 48, 32, 77, /* 0x0440 */ 47,115,104,109, 0, 0, 0, 0,195, 71, 64,184,194, 71, 64,184,
/* 0x0450 */ 70, 76, 71, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x0450 */ 225, 3, 30,170, 96, 12,128, 18, 8, 7,128, 82, 1, 0, 0,212,
/* 0x0460 */ 48, 48, 48, 52, 32,103, 32, 32, 32, 32, 32, 32, 32, 69, 76, 70, /* 0x0460 */ 251, 3, 0, 42,128, 6, 64,185,253, 3, 0,145,160, 3, 0,203,
/* 0x0470 */ 77, 65, 73, 78, 88, 32, 48, 32, 95,115,116, 97,114,116, 10, 48, /* 0x0470 */ 0,236,124,146, 31, 0, 0,145,226, 3, 0,170,225, 15, 31,248,
/* 0x0480 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 49, 52, 99, 32, /* 0x0480 */ 227, 3, 0,145,128, 66, 0,145,129, 10, 64,185,132, 50, 64, 57,
/* 0x0490 */ 103, 32, 32, 32, 32, 32, 70, 32, 69, 76, 70, 77, 65, 73, 78, 88, /* 0x0490 */ 36, 0, 0,148,232, 7, 65,248,250, 3, 0,249,242, 7, 0,249,
/* 0x04a0 */ 32, 48,100, 99, 32,117, 99,108, 95,110,114,118, 50, 98, 95,100, /* 0x04a0 */ 130, 6, 64,185,225, 3, 0,145,224, 3, 27, 42, 8, 8,128, 82,
/* 0x04b0 */ 101, 99,111,109,112,114,101,115,115, 95, 51, 50, 10, 48, 48, 48, /* 0x04b0 */ 1, 0, 0,212,191, 3, 0,145, 5, 0,128,210,228, 3, 27, 42,
/* 0x04c0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,103, 32, /* 0x04c0 */ 35, 0,128, 82,162, 0,128, 82,129, 6, 64,185,225, 15, 0,249,
/* 0x04d0 */ 32, 32, 32, 32, 32, 32, 69, 76, 70, 77, 65, 73, 78, 89, 32, 48, /* 0x04d0 */ 0, 0,128,210,200, 27,128, 82, 1, 0, 0,212,224, 11, 0,249,
/* 0x04e0 */ 32,101,110,100, 95,100,101, 99,111,109,112,114,101,115,115, 10, /* 0x04e0 */ 252, 3, 0,170,224, 3, 27, 42, 40, 7,128, 82, 1, 0, 0,212,
/* 0x04f0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x04f0 */ 253, 11, 64,185,129, 2, 64,185,158,115, 0,145,189, 3, 1, 75,
/* 0x0500 */ 32, 32, 32, 32, 32, 32, 32, 32, 32, 42, 85, 78, 68, 42, 32, 48, /* 0x0500 */ 253, 7, 0,249, 33,120, 30, 18, 60, 3, 1,139,192, 3, 31,214,
/* 0x0510 */ 32, 79, 95, 66, 73, 78, 70, 79, 10, 10, 82, 69, 76, 79, 67, 65, /* 0x0510 */ 192, 3, 95,214, 1,132, 64,248,225,255,255,181,192, 3, 95,214,
/* 0x0520 */ 84, 73, 79, 78, 32, 82, 69, 67, 79, 82, 68, 83, 32, 70, 79, 82, /* 0x0520 */ 1, 64, 33,139,225, 11,190,169,227,123, 1,169, 5, 0,128, 18,
/* 0x0530 */ 32, 91, 69, 76, 70, 77, 65, 73, 78, 88, 93, 58, 10, 79, 70, 70, /* 0x0530 */ 4, 0,176, 82, 26, 0, 0, 20,228,123, 65,169,225, 15,194,168,
/* 0x0540 */ 83, 69, 84, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 84, 89, /* 0x0540 */ 0, 0, 1,203, 66, 0, 3,203,130, 0, 0,185,229, 3, 0,170,
/* 0x0550 */ 80, 69, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, /* 0x0550 */ 224, 3, 3,170, 97, 0, 2,139,224, 3, 5,170,192, 3, 95,214,
/* 0x0560 */ 86, 65, 76, 85, 69, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x0560 */ 132, 0, 4, 43, 68, 0, 0, 52,192, 3, 95,214, 4, 68, 64,184,
/* 0x0570 */ 48, 48, 48, 48, 48, 48, 32, 82, 95, 65, 65, 82, 67, 72, 54, 52, /* 0x0570 */ 132, 0, 4, 58,192, 3, 95,214, 33, 0,128, 82,240, 3, 30,170,
/* 0x0580 */ 95, 65, 66, 83, 51, 50, 32, 32, 32, 77, 70, 76, 71, 10, 48, 48, /* 0x0580 */ 248,255,255,151, 33, 0, 1, 58,246,255,255,151,163,255,255, 84,
/* 0x0590 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 51, 99, 32, 82, /* 0x0590 */ 0, 2, 31,214, 3, 20, 64, 56, 67, 20, 0, 56,241,255,255,151,
/* 0x05a0 */ 95, 65, 65, 82, 67, 72, 54, 52, 95, 67, 65, 76, 76, 50, 54, 32, /* 0x05a0 */ 162,255,255, 84,245,255,255,151, 35, 12, 0,113, 1, 0,128, 82,
/* 0x05b0 */ 32, 69, 76, 70, 77, 65, 73, 78, 90, 43, 48,120, 48, 48, 48, 48, /* 0x05b0 */ 163, 0, 0, 84, 5, 20, 64, 56,165, 32, 3, 42,229, 3, 37, 42,
/* 0x05c0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 52, 10, 48, 48, 48, /* 0x05c0 */ 197,251,255, 52,231,255,255,151, 33, 0, 1, 58,229,255,255,151,
/* 0x05d0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 52, 56, 32, 82, 95, /* 0x05d0 */ 33, 0, 1, 58, 97, 0, 0, 84,232,255,255,151, 33, 8, 0, 17,
/* 0x05e0 */ 65, 65, 82, 67, 72, 54, 52, 95, 65, 68, 82, 95, 80, 82, 69, 76, /* 0x05e0 */ 191, 0, 52, 49, 33, 36,129, 26, 67,200,101, 56, 33, 4, 0,113,
/* 0x05f0 */ 95, 76, 79, 50, 49, 32, 32, 69, 76, 70, 77, 65, 73, 78, 90, 10, /* 0x05f0 */ 67, 20, 0, 56,162,255,255, 84,233,255,255, 23,117,112,120, 0,
/* 0x0600 */ 10, 82, 69, 76, 79, 67, 65, 84, 73, 79, 78, 32, 82, 69, 67, 79, /* 0x0600 */ 192, 3, 63,214, 0, 0, 0, 0,102,105,108,101, 32,102,111,114,
/* 0x0610 */ 82, 68, 83, 32, 70, 79, 82, 32, 91, 69, 76, 70, 77, 65, 73, 78, /* 0x0610 */ 109, 97,116, 32,101,108,102, 54, 52, 45,108,105,116,116,108,101,
/* 0x0620 */ 90, 93, 58, 10, 79, 70, 70, 83, 69, 84, 32, 32, 32, 32, 32, 32, /* 0x0620 */ 97, 97,114, 99,104, 54, 52, 10, 10, 83,101, 99,116,105,111,110,
/* 0x0630 */ 32, 32, 32, 32, 32, 84, 89, 80, 69, 32, 32, 32, 32, 32, 32, 32, /* 0x0630 */ 115, 58, 10, 73,100,120, 32, 78, 97,109,101, 32, 32, 32, 32, 32,
/* 0x0640 */ 32, 32, 32, 32, 32, 32, 32, 86, 65, 76, 85, 69, 10, 48, 48, 48, /* 0x0640 */ 32, 32, 32, 32, 32, 83,105,122,101, 32, 32, 32, 32, 32, 32, 86,
/* 0x0650 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 49, 56, 32, 82, 95, /* 0x0650 */ 77, 65, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
/* 0x0660 */ 65, 65, 82, 67, 72, 54, 52, 95, 65, 66, 83, 51, 50, 32, 32, 32, /* 0x0660 */ 32, 76, 77, 65, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
/* 0x0670 */ 79, 95, 66, 73, 78, 70, 79, 10 /* 0x0670 */ 32, 32, 32, 70,105,108,101, 32,111,102,102, 32, 32, 65,108,103,
/* 0x0680 */ 110, 32, 32, 70,108, 97,103,115, 10, 32, 32, 48, 32, 69, 76, 70,
/* 0x0690 */ 77, 65, 73, 78, 88, 32, 32, 32, 32, 32, 32, 48, 49, 48, 32, 32,
/* 0x06a0 */ 48, 32, 32, 48, 32, 32, 48, 52, 48, 32, 32, 50, 42, 42, 48, 32,
/* 0x06b0 */ 32, 67, 79, 78, 84, 69, 78, 84, 83, 10, 32, 32, 49, 32, 69, 76,
/* 0x06c0 */ 70, 83, 73, 71, 83, 69, 71, 86, 32, 32, 32, 32, 48, 51, 55, 56,
/* 0x06d0 */ 32, 32, 48, 32, 32, 48, 32, 32, 48, 53, 48, 32, 32, 50, 42, 42,
/* 0x06e0 */ 50, 32, 32, 67, 79, 78, 84, 69, 78, 84, 83, 10, 32, 32, 50, 32,
/* 0x06f0 */ 69, 76, 70, 77, 65, 73, 78, 88, 50, 32, 32, 32, 32, 32, 48, 50,
/* 0x0700 */ 51, 52, 32, 32, 48, 32, 32, 48, 32, 32, 48, 51, 99, 56, 32, 32,
/* 0x0710 */ 50, 42, 42, 50, 32, 32, 67, 79, 78, 84, 69, 78, 84, 83, 10, 32,
/* 0x0720 */ 32, 51, 32, 69, 76, 70, 77, 65, 73, 78, 89, 32, 32, 32, 32, 32,
/* 0x0730 */ 32, 48, 32, 32, 48, 32, 32, 48, 32, 32, 48, 53,102, 99, 32, 32,
/* 0x0740 */ 50, 42, 42, 48, 32, 32, 67, 79, 78, 84, 69, 78, 84, 83, 10, 32,
/* 0x0750 */ 32, 52, 32, 69, 76, 70, 77, 65, 73, 78, 90, 32, 32, 32, 32, 32,
/* 0x0760 */ 32, 48, 99, 32, 32, 48, 32, 32, 48, 32, 32, 48, 53,102, 99, 32,
/* 0x0770 */ 32, 50, 42, 42, 50, 32, 32, 67, 79, 78, 84, 69, 78, 84, 83, 10,
/* 0x0780 */ 83, 89, 77, 66, 79, 76, 32, 84, 65, 66, 76, 69, 58, 10, 48, 48,
/* 0x0790 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,108,
/* 0x07a0 */ 32, 32, 32, 32,100, 32, 32, 69, 76, 70, 77, 65, 73, 78, 88, 32,
/* 0x07b0 */ 48, 32, 69, 76, 70, 77, 65, 73, 78, 88, 10, 48, 48, 48, 48, 48,
/* 0x07c0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,108, 32, 32, 32,
/* 0x07d0 */ 32,100, 32, 32, 69, 76, 70, 77, 65, 73, 78, 88, 50, 32, 48, 32,
/* 0x07e0 */ 69, 76, 70, 77, 65, 73, 78, 88, 50, 10, 48, 48, 48, 48, 48, 48,
/* 0x07f0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,108, 32, 32, 32, 32,
/* 0x0800 */ 100, 32, 32, 69, 76, 70, 77, 65, 73, 78, 90, 32, 48, 32, 69, 76,
/* 0x0810 */ 70, 77, 65, 73, 78, 90, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x0820 */ 48, 48, 48, 48, 48, 48, 48, 32,108, 32, 32, 32, 32,100, 32, 32,
/* 0x0830 */ 69, 76, 70, 83, 73, 71, 83, 69, 71, 86, 32, 48, 32, 69, 76, 70,
/* 0x0840 */ 83, 73, 71, 83, 69, 71, 86, 10, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x0850 */ 48, 48, 48, 48, 48, 48, 48, 48, 32,108, 32, 32, 32, 32,100, 32,
/* 0x0860 */ 32, 69, 76, 70, 77, 65, 73, 78, 89, 32, 48, 32, 69, 76, 70, 77,
/* 0x0870 */ 65, 73, 78, 89, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x0880 */ 48, 48, 48, 48, 48, 32, 32, 32, 32, 32, 32, 32, 32, 32, 42, 85,
/* 0x0890 */ 78, 68, 42, 32, 48, 32, 77, 70, 76, 71, 10, 48, 48, 48, 48, 48,
/* 0x08a0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 52, 32,103, 32, 32, 32,
/* 0x08b0 */ 32, 32, 32, 32, 69, 76, 70, 77, 65, 73, 78, 88, 32, 48, 32, 95,
/* 0x08c0 */ 115,116, 97,114,116, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x08d0 */ 48, 48, 48, 49, 53, 56, 32,103, 32, 32, 32, 32, 32, 70, 32, 69,
/* 0x08e0 */ 76, 70, 77, 65, 73, 78, 88, 50, 32, 48,100, 99, 32,117, 99,108,
/* 0x08f0 */ 95,110,114,118, 50, 98, 95,100,101, 99,111,109,112,114,101,115,
/* 0x0900 */ 115, 95, 51, 50, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x0910 */ 48, 48, 48, 48, 48, 32,103, 32, 32, 32, 32, 32, 32, 32, 69, 76,
/* 0x0920 */ 70, 77, 65, 73, 78, 89, 32, 48, 32,101,110,100, 95,100,101, 99,
/* 0x0930 */ 111,109,112,114,101,115,115, 10, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x0940 */ 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 32, 32, 32, 32, 32, 32,
/* 0x0950 */ 32, 42, 85, 78, 68, 42, 32, 48, 32, 79, 95, 66, 73, 78, 70, 79,
/* 0x0960 */ 10, 10, 82, 69, 76, 79, 67, 65, 84, 73, 79, 78, 32, 82, 69, 67,
/* 0x0970 */ 79, 82, 68, 83, 32, 70, 79, 82, 32, 91, 69, 76, 70, 77, 65, 73,
/* 0x0980 */ 78, 88, 93, 58, 10, 79, 70, 70, 83, 69, 84, 32, 32, 32, 32, 32,
/* 0x0990 */ 32, 32, 32, 32, 32, 32, 84, 89, 80, 69, 32, 32, 32, 32, 32, 32,
/* 0x09a0 */ 32, 32, 32, 32, 32, 32, 32, 32, 86, 65, 76, 85, 69, 10, 48, 48,
/* 0x09b0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 82,
/* 0x09c0 */ 95, 65, 65, 82, 67, 72, 54, 52, 95, 65, 66, 83, 51, 50, 32, 32,
/* 0x09d0 */ 32, 77, 70, 76, 71, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x09e0 */ 48, 48, 48, 48, 48, 99, 32, 82, 95, 65, 65, 82, 67, 72, 54, 52,
/* 0x09f0 */ 95, 65, 68, 82, 95, 80, 82, 69, 76, 95, 76, 79, 50, 49, 32, 32,
/* 0x0a00 */ 69, 76, 70, 77, 65, 73, 78, 88, 50, 43, 48,120, 48, 48, 48, 48,
/* 0x0a10 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 49, 52, 56, 10, 10, 82, 69,
/* 0x0a20 */ 76, 79, 67, 65, 84, 73, 79, 78, 32, 82, 69, 67, 79, 82, 68, 83,
/* 0x0a30 */ 32, 70, 79, 82, 32, 91, 69, 76, 70, 77, 65, 73, 78, 88, 50, 93,
/* 0x0a40 */ 58, 10, 79, 70, 70, 83, 69, 84, 32, 32, 32, 32, 32, 32, 32, 32,
/* 0x0a50 */ 32, 32, 32, 84, 89, 80, 69, 32, 32, 32, 32, 32, 32, 32, 32, 32,
/* 0x0a60 */ 32, 32, 32, 32, 32, 86, 65, 76, 85, 69, 10, 48, 48, 48, 48, 48,
/* 0x0a70 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 51, 48, 32, 82, 95, 65, 65,
/* 0x0a80 */ 82, 67, 72, 54, 52, 95, 65, 68, 82, 95, 80, 82, 69, 76, 95, 76,
/* 0x0a90 */ 79, 50, 49, 32, 32, 69, 76, 70, 77, 65, 73, 78, 88, 45, 48,120,
/* 0x0aa0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 52,
/* 0x0ab0 */ 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 52,
/* 0x0ac0 */ 48, 32, 82, 95, 65, 65, 82, 67, 72, 54, 52, 95, 67, 65, 76, 76,
/* 0x0ad0 */ 50, 54, 32, 32, 69, 76, 70, 77, 65, 73, 78, 90, 43, 48,120, 48,
/* 0x0ae0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 52, 10,
/* 0x0af0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 52, 99,
/* 0x0b00 */ 32, 82, 95, 65, 65, 82, 67, 72, 54, 52, 95, 65, 68, 82, 95, 80,
/* 0x0b10 */ 82, 69, 76, 95, 76, 79, 50, 49, 32, 32, 69, 76, 70, 77, 65, 73,
/* 0x0b20 */ 78, 90, 10, 10, 82, 69, 76, 79, 67, 65, 84, 73, 79, 78, 32, 82,
/* 0x0b30 */ 69, 67, 79, 82, 68, 83, 32, 70, 79, 82, 32, 91, 69, 76, 70, 77,
/* 0x0b40 */ 65, 73, 78, 90, 93, 58, 10, 79, 70, 70, 83, 69, 84, 32, 32, 32,
/* 0x0b50 */ 32, 32, 32, 32, 32, 32, 32, 32, 84, 89, 80, 69, 32, 32, 32, 32,
/* 0x0b60 */ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 86, 65, 76, 85, 69, 10,
/* 0x0b70 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 56,
/* 0x0b80 */ 32, 82, 95, 65, 65, 82, 67, 72, 54, 52, 95, 65, 66, 83, 51, 50,
/* 0x0b90 */ 32, 32, 32, 79, 95, 66, 73, 78, 70, 79, 10
}; };
+1108 -1101
View File
File diff suppressed because it is too large Load Diff
+1244 -1236
View File
File diff suppressed because it is too large Load Diff
+963 -815
View File
File diff suppressed because it is too large Load Diff
+2292 -2274
View File
File diff suppressed because it is too large Load Diff
+286 -279
View File
@@ -1,5 +1,5 @@
/* i386-linux.elf-entry.h /* i386-linux.elf-entry.h
created from i386-linux.elf-entry.bin, 5683 (0x1633) bytes created from i386-linux.elf-entry.bin, 5797 (0x16a5) bytes
This file is part of the UPX executable compressor. This file is part of the UPX executable compressor.
@@ -32,14 +32,14 @@
/* clang-format off */ /* clang-format off */
#define STUB_I386_LINUX_ELF_ENTRY_SIZE 5683 #define STUB_I386_LINUX_ELF_ENTRY_SIZE 5797
#define STUB_I386_LINUX_ELF_ENTRY_ADLER32 0x58b72665 #define STUB_I386_LINUX_ELF_ENTRY_ADLER32 0x4b714499
#define STUB_I386_LINUX_ELF_ENTRY_CRC32 0x73fec3f8 #define STUB_I386_LINUX_ELF_ENTRY_CRC32 0x1fdf2a57
unsigned char stub_i386_linux_elf_entry[5683] = { unsigned char stub_i386_linux_elf_entry[5797] = {
/* 0x0000 */ 127, 69, 76, 70, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x0000 */ 127, 69, 76, 70, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
/* 0x0010 */ 1, 0, 3, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x0010 */ 1, 0, 3, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
/* 0x0020 */ 36, 8, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 40, 0, /* 0x0020 */ 148, 8, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 40, 0,
/* 0x0030 */ 16, 0, 13, 0,233,252,255,255,255,233,252,255,255,255, 0, 0, /* 0x0030 */ 16, 0, 13, 0,233,252,255,255,255,233,252,255,255,255, 0, 0,
/* 0x0040 */ 85,137,229, 87, 86, 83,129,236, 68, 16, 0, 0,186, 0, 0, 0, /* 0x0040 */ 85,137,229, 87, 86, 83,129,236, 68, 16, 0, 0,186, 0, 0, 0,
/* 0x0050 */ 0,232, 4, 0, 0, 0,117,112,120, 0, 95,185, 16, 0, 0, 0, /* 0x0050 */ 0,232, 4, 0, 0, 0,117,112,120, 0, 95,185, 16, 0, 0, 0,
@@ -117,280 +117,287 @@ unsigned char stub_i386_linux_elf_entry[5683] = {
/* 0x04d0 */ 76, 36, 20, 73,131,249,255,116, 30,138, 22,131,202, 32, 15,190, /* 0x04d0 */ 76, 36, 20, 73,131,249,255,116, 30,138, 22,131,202, 32, 15,190,
/* 0x04e0 */ 210,138, 3,131,200, 32, 15,190,192, 67, 70, 41,194,137,208,117, /* 0x04e0 */ 210,138, 3,131,200, 32, 15,190,192, 67, 70, 41,194,137,208,117,
/* 0x04f0 */ 11, 73,131,249,255,117,226,184, 0, 0, 0, 0, 91, 94,195, 0, /* 0x04f0 */ 11, 73,131,249,255,117,226,184, 0, 0, 0, 0, 91, 94,195, 0,
/* 0x0500 */ 85,137,229, 87, 86, 83,131,236, 20,139,125, 12,232, 4, 0, 0, /* 0x0500 */ 85,137,229, 87, 86, 83,131,236, 24,139,125, 12,232, 4, 0, 0,
/* 0x0510 */ 0,117,112,120, 0, 90,185, 16, 0, 0, 0,184,100, 1, 0, 0, /* 0x0510 */ 0,117,112,120, 0, 90,185, 16, 0, 0, 0,184,100, 1, 0, 0,
/* 0x0520 */ 137,211,205,128,137,198,131,248,234,117, 16,185, 0, 0, 0, 0, /* 0x0520 */ 137,211,205,128,137,198,131,248,234,117, 16,185, 0, 0, 0, 0,
/* 0x0530 */ 184,100, 1, 0, 0,137,211,205,128,137,198,133,246,121, 40,232, /* 0x0530 */ 184,100, 1, 0, 0,137,211,205,128,137,198,133,246, 15,137,148,
/* 0x0540 */ 9, 0, 0, 0, 47,100,101,118, 47,115,104,109, 0, 94,185, 2, /* 0x0540 */ 0, 0, 0,232, 9, 0, 0, 0, 47,100,101,118, 47,115,104,109,
/* 0x0550 */ 0, 65, 0,186,192, 1, 0, 0,137,243,106, 5, 88,205,128,137, /* 0x0550 */ 0, 94,185, 2, 0, 65, 0,186,192, 1, 0, 0,137,243,106, 5,
/* 0x0560 */ 198,137,194,133,192,120, 62,137,243,137,249,106, 93, 88,205,128, /* 0x0560 */ 88,205,128,137,198,133,192,121,110,137,194,131,248,235, 15,133,
/* 0x0570 */ 137,194,133,192,120, 47,106, 0, 86,131,125, 8, 1, 25,192,131, /* 0x0570 */ 161, 0, 0, 0,184, 2, 0, 0, 0,232, 62, 0, 0, 0, 85, 80,
/* 0x0580 */ 224,240,131,192, 17, 80,106, 3, 87,255,117, 8,232,252,255,255, /* 0x0580 */ 88, 45, 53, 46, 48, 32,119, 97,110,116,115, 32,109,101,109,102,
/* 0x0590 */ 255,137,195,232,252,255,255,255,131,196, 24,137,218, 57,195,115, /* 0x0590 */ 100, 95, 99,114,101, 97,116,101, 40, 41, 44, 32,111,114, 32,110,
/* 0x05a0 */ 4,141, 84, 30, 1,137,208,141,101,244, 91, 94, 95,201,195, 0, /* 0x05a0 */ 101,101,100,115, 32, 47,100,101,118, 47,115,104,109, 40, 44, 79,
/* 0x05b0 */ 243, 15, 30,251,232,252,255,255,255,243, 15, 30,251, 1,219,116, /* 0x05b0 */ 95, 84, 77, 80, 70, 73, 76, 69, 44, 41, 10, 0, 89,186, 61, 0,
/* 0x05c0 */ 2,243,195,139, 30,131,238,252, 17,219,195, 94,131,236, 28,141, /* 0x05c0 */ 0, 0,137,195,106, 4, 88,205,128,184,127, 0, 0, 0,137,195,
/* 0x05d0 */ 124, 36, 32,232,198, 1, 0, 0,232,193, 1, 0, 0,139, 7,139, /* 0x05d0 */ 106, 1, 88,205,128,235,254,137,243,137,249,106, 93, 88,205,128,
/* 0x05e0 */ 79, 4,131,199, 8,131,248, 6,116, 9,185, 0, 16, 0, 0,133, /* 0x05e0 */ 137,194,133,192,120, 47,106, 0, 86,131,125, 8, 1, 25,192,131,
/* 0x05f0 */ 192,117,234,247,217,137,229,137, 77, 24,141,186,243,255,255,255, /* 0x05f0 */ 224,240,131,192, 17, 80,106, 3, 87,255,117, 8,232,252,255,255,
/* 0x0600 */ 139, 15, 41,207,137,125, 8,173, 1,199,137,125, 0, 41,193,137, /* 0x0600 */ 255,137,195,232,252,255,255,255,131,196, 24,137,218, 57,195,115,
/* 0x0610 */ 77, 4,139, 30,141,187, 45, 1, 0, 0,137,125, 16, 41,252,131, /* 0x0610 */ 4,141, 84, 30, 1,137,208,141,101,244, 91, 94, 95,201,195, 0,
/* 0x0620 */ 228,248, 87,141,124, 28, 4,137,233, 41,249,176,165,243,170, 95, /* 0x0620 */ 243, 15, 30,251,232,252,255,255,255,243, 15, 30,251, 1,219,116,
/* 0x0630 */ 141, 67, 20, 1,224,131,224,248, 80,137,193, 41,225,137, 76, 36, /* 0x0630 */ 2,243,195,139, 30,131,238,252, 17,219,195, 94,131,236, 28,141,
/* 0x0640 */ 4,139, 77, 24,137, 12, 36,185, 34, 0, 0, 0,137, 76, 36, 8, /* 0x0640 */ 124, 36, 32,232,196, 1, 0, 0,232,191, 1, 0, 0,139, 7,139,
/* 0x0650 */ 49,201, 82, 80,137, 8, 87, 81,232,252,255,255,255,131,196, 12, /* 0x0650 */ 79, 4,131,199, 8,131,248, 6,116, 9,185, 0, 16, 0, 0,133,
/* 0x0660 */ 169, 0, 8, 0, 0,116, 1,244, 90,137,193,193,232, 12,193,224, /* 0x0660 */ 192,117,234,247,217,137,229,137, 77, 24,141,186,243,255,255,255,
/* 0x0670 */ 12,137, 69, 12, 41,193,131,233, 1,137, 77, 20,141,124, 36, 12, /* 0x0670 */ 139, 15, 41,207,137,125, 8,173, 1,199,137,125, 0, 41,193,137,
/* 0x0680 */ 85,139, 78, 4,141,118, 12, 1,241, 81, 49,219, 49,201,131,205, /* 0x0680 */ 77, 4,139, 30,141,187, 45, 1, 0, 0,137,125, 16, 41,252,131,
/* 0x0690 */ 255,252,168,164,255,210,114,251,141, 65, 1,255,210, 17,192,255, /* 0x0690 */ 228,248, 87,141,124, 28, 4,137,233, 41,249,176,165,243,170, 95,
/* 0x06a0 */ 210,115,248,131,232, 3,114, 11,193,224, 8,172,131,240,255,116, /* 0x06a0 */ 141, 67, 20, 1,224,131,224,248, 80,137,193, 41,225,137, 76, 36,
/* 0x06b0 */ 45,137,197,141, 65, 1,255,210, 17,201,255,210, 17,201,117, 13, /* 0x06b0 */ 4,139, 77, 24,137, 12, 36,185, 34, 0, 0, 0,137, 76, 36, 8,
/* 0x06c0 */ 137,193,131,192, 2,255,210, 17,201,255,210,115,248,129,253, 0, /* 0x06c0 */ 49,201, 82, 80,137, 8, 87, 81,232,252,255,255,255,131,196, 12,
/* 0x06d0 */ 243,255,255, 17,193, 86,141, 52, 47,243,164, 94,235,182, 89, 57, /* 0x06d0 */ 169, 0, 8, 0, 0,116, 1,244, 90,137,193,193,232, 12,193,224,
/* 0x06e0 */ 206,116, 1,244, 93,139,125, 20,139, 85, 16,137,225,137,251,176, /* 0x06e0 */ 12,137, 69, 12, 41,193, 73,137, 77, 20,141,124, 36, 12, 85,139,
/* 0x06f0 */ 4,232, 40, 0, 0, 0,137,236,106, 0, 87,106, 18,106, 5,255, /* 0x06f0 */ 78, 4,141,118, 12, 1,241, 81, 49,219, 49,201,131,205,255,252,
/* 0x0700 */ 117, 16,255,117, 12,232,252,255,255,255,131,196, 24,137,251,176, /* 0x0700 */ 168,164,255,210,114,251,141, 65, 1,255,210, 17,192,255,210,115,
/* 0x0710 */ 6,232, 8, 0, 0, 0,139, 69, 12,131,192, 12,255,224, 15,182, /* 0x0710 */ 248,131,232, 3,114, 11,193,224, 8,172,131,240,255,116, 45,137,
/* 0x0720 */ 192, 80,205,128, 89, 61, 0,240,255,255,114, 1,244,195, 83,141, /* 0x0720 */ 197,141, 65, 1,255,210, 17,201,255,210, 17,201,117, 13,137,193,
/* 0x0730 */ 92, 36, 8,176, 90,232,228,255,255,255, 91,195, 41,192,195,135, /* 0x0730 */ 131,192, 2,255,210, 17,201,255,210,115,248,129,253, 0,243,255,
/* 0x0740 */ 92, 36, 4,139, 76, 36, 8,106,106, 88,205,128,139, 92, 36, 4, /* 0x0740 */ 255, 17,193, 86,141, 52, 47,243,164, 94,235,182, 89, 57,206,116,
/* 0x0750 */ 195, 85,137,229, 83,139, 93, 8,106,122, 88,205,128, 91, 93,195, /* 0x0750 */ 1,244, 93,139,125, 20,139, 85, 16,137,225,137,251,176, 4,232,
/* 0x0760 */ 85,137,229, 83,139, 93, 8,139, 77, 12,255, 53, 39, 0, 0, 0, /* 0x0760 */ 40, 0, 0, 0,137,236,106, 0, 87,106, 18,106, 5,255,117, 16,
/* 0x0770 */ 88,205,128, 91, 93,195, 85,137,229, 87,139, 77, 16,139, 69, 12, /* 0x0770 */ 255,117, 12,232,252,255,255,255,131,196, 24,137,251,176, 6,232,
/* 0x0780 */ 139,125, 8,243,170, 95, 93,195, 85,137,229, 87, 86,139, 77, 16, /* 0x0780 */ 8, 0, 0, 0,139, 69, 12,131,192, 12,255,224, 15,182,192, 80,
/* 0x0790 */ 139,117, 12,139,125, 8,243,164,137,248, 94, 95, 93,195,139, 7, /* 0x0790 */ 205,128, 89, 61, 0,240,255,255,114, 1,244,195, 83,141, 92, 36,
/* 0x07a0 */ 131,199, 4,133,192,117,247,195,204,195,184, 0,240,255,255,195, /* 0x07a0 */ 8,176, 90,232,228,255,255,255, 91,195, 41,192,195,135, 92, 36,
/* 0x07b0 */ 90,232, 23, 0, 0, 0, 0, 0, 0, 0, 0, 46,115,121,109,116, /* 0x07b0 */ 4,139, 76, 36, 8,106,106, 88,205,128,139, 92, 36, 4,195, 85,
/* 0x07c0 */ 97, 98, 0, 46,115,116,114,116, 97, 98, 0, 46,115,104,115,116, /* 0x07c0 */ 137,229, 83,139, 93, 8,106,122, 88,205,128, 91, 93,195, 85,137,
/* 0x07d0 */ 114,116, 97, 98, 0, 46,114,101,108, 72, 85, 77, 70, 95, 65, 0, /* 0x07d0 */ 229, 83,139, 93, 8,139, 77, 12,255, 53, 39, 0, 0, 0, 88,205,
/* 0x07e0 */ 46,114,101,108, 72, 85, 77, 70, 95, 76, 0, 46,114,101,108, 85, /* 0x07e0 */ 128, 91, 93,195, 85,137,229, 87,139, 77, 16,139, 69, 12,139,125,
/* 0x07f0 */ 77, 70, 95, 65, 78, 68, 82, 79, 73, 68, 0, 46,114,101,108, 85, /* 0x07f0 */ 8,243,170, 95, 93,195, 85,137,229, 87, 86,139, 77, 16,139,117,
/* 0x0800 */ 77, 70, 95, 76, 73, 78, 85, 88, 0, 46,114,101,108, 69, 76, 70, /* 0x0800 */ 12,139,125, 8,243,164,137,248, 94, 95, 93,195,139, 7,131,199,
/* 0x0810 */ 77, 65, 73, 78, 88, 0, 46,114,101,108, 69, 76, 70, 77, 65, 73, /* 0x0810 */ 4,133,192,117,247,195,204,195,184, 0,240,255,255,195, 0, 0,
/* 0x0820 */ 78, 90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x0820 */ 90,232, 23, 0, 0, 0, 0, 0, 0, 0, 0, 46,115,121,109,116,
/* 0x0830 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x0830 */ 97, 98, 0, 46,115,116,114,116, 97, 98, 0, 46,115,104,115,116,
/* 0x0840 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 0, 0, /* 0x0840 */ 114,116, 97, 98, 0, 46,114,101,108, 72, 85, 77, 70, 95, 65, 0,
/* 0x0850 */ 1, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, /* 0x0850 */ 46,114,101,108, 72, 85, 77, 70, 95, 76, 0, 46,114,101,108, 85,
/* 0x0860 */ 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, /* 0x0860 */ 77, 70, 95, 65, 78, 68, 82, 79, 73, 68, 0, 46,114,101,108, 85,
/* 0x0870 */ 0, 0, 0, 0, 27, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, /* 0x0870 */ 77, 70, 95, 76, 73, 78, 85, 88, 0, 46,114,101,108, 69, 76, 70,
/* 0x0880 */ 0, 0, 0, 0,140, 12, 0, 0, 8, 0, 0, 0, 14, 0, 0, 0, /* 0x0880 */ 77, 65, 73, 78, 88, 0, 46,114,101,108, 69, 76, 70, 77, 65, 73,
/* 0x0890 */ 1, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 42, 0, 0, 0, /* 0x0890 */ 78, 90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
/* 0x08a0 */ 1, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 57, 0, 0, 0, /* 0x08a0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
/* 0x08b0 */ 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, /* 0x08b0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 0, 0,
/* 0x08c0 */ 0, 0, 0, 0, 38, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, /* 0x08c0 */ 1, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0,
/* 0x08d0 */ 0, 0, 0, 0,148, 12, 0, 0, 8, 0, 0, 0, 14, 0, 0, 0, /* 0x08d0 */ 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,
/* 0x08e0 */ 3, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 53, 0, 0, 0, /* 0x08e0 */ 0, 0, 0, 0, 27, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0,
/* 0x08f0 */ 1, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, /* 0x08f0 */ 0, 0, 0, 0,252, 12, 0, 0, 8, 0, 0, 0, 14, 0, 0, 0,
/* 0x0900 */ 191, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, /* 0x0900 */ 1, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 42, 0, 0, 0,
/* 0x0910 */ 0, 0, 0, 0, 49, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, /* 0x0910 */ 1, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 57, 0, 0, 0,
/* 0x0920 */ 0, 0, 0, 0,156, 12, 0, 0, 80, 0, 0, 0, 14, 0, 0, 0, /* 0x0920 */ 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,
/* 0x0930 */ 5, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 69, 0, 0, 0, /* 0x0930 */ 0, 0, 0, 0, 38, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0,
/* 0x0940 */ 1, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, /* 0x0940 */ 0, 0, 0, 0, 4, 13, 0, 0, 8, 0, 0, 0, 14, 0, 0, 0,
/* 0x0950 */ 175, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, /* 0x0950 */ 3, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 53, 0, 0, 0,
/* 0x0960 */ 0, 0, 0, 0, 65, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, /* 0x0960 */ 1, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0,
/* 0x0970 */ 0, 0, 0, 0,236, 12, 0, 0, 16, 0, 0, 0, 14, 0, 0, 0, /* 0x0970 */ 191, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0,
/* 0x0980 */ 7, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 83, 0, 0, 0, /* 0x0980 */ 0, 0, 0, 0, 49, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0,
/* 0x0990 */ 1, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0,176, 5, 0, 0, /* 0x0990 */ 0, 0, 0, 0, 12, 13, 0, 0, 80, 0, 0, 0, 14, 0, 0, 0,
/* 0x09a0 */ 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, /* 0x09a0 */ 5, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 69, 0, 0, 0,
/* 0x09b0 */ 0, 0, 0, 0, 79, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, /* 0x09b0 */ 1, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0,
/* 0x09c0 */ 0, 0, 0, 0,252, 12, 0, 0, 24, 0, 0, 0, 14, 0, 0, 0, /* 0x09c0 */ 31, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0,
/* 0x09d0 */ 9, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 96, 0, 0, 0, /* 0x09d0 */ 0, 0, 0, 0, 65, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0,
/* 0x09e0 */ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,176, 7, 0, 0, /* 0x09e0 */ 0, 0, 0, 0, 92, 13, 0, 0, 16, 0, 0, 0, 14, 0, 0, 0,
/* 0x09f0 */ 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, /* 0x09f0 */ 7, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 83, 0, 0, 0,
/* 0x0a00 */ 0, 0, 0, 0, 92, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, /* 0x0a00 */ 1, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 32, 6, 0, 0,
/* 0x0a10 */ 0, 0, 0, 0, 20, 13, 0, 0, 16, 0, 0, 0, 14, 0, 0, 0, /* 0x0a10 */ 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0,
/* 0x0a20 */ 11, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 17, 0, 0, 0, /* 0x0a20 */ 0, 0, 0, 0, 79, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0,
/* 0x0a30 */ 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,186, 7, 0, 0, /* 0x0a30 */ 0, 0, 0, 0,108, 13, 0, 0, 24, 0, 0, 0, 14, 0, 0, 0,
/* 0x0a40 */ 105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, /* 0x0a40 */ 9, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 96, 0, 0, 0,
/* 0x0a50 */ 0, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, /* 0x0a50 */ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 8, 0, 0,
/* 0x0a60 */ 0, 0, 0, 0,164, 10, 0, 0, 80, 1, 0, 0, 15, 0, 0, 0, /* 0x0a60 */ 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,
/* 0x0a70 */ 7, 0, 0, 0, 4, 0, 0, 0, 16, 0, 0, 0, 9, 0, 0, 0, /* 0x0a70 */ 0, 0, 0, 0, 92, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0,
/* 0x0a80 */ 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,244, 11, 0, 0, /* 0x0a80 */ 0, 0, 0, 0,132, 13, 0, 0, 16, 0, 0, 0, 14, 0, 0, 0,
/* 0x0a90 */ 152, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, /* 0x0a90 */ 11, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 17, 0, 0, 0,
/* 0x0aa0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x0aa0 */ 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42, 8, 0, 0,
/* 0x0ab0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x0ab0 */ 105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,
/* 0x0ac0 */ 3, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x0ac0 */ 0, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0,
/* 0x0ad0 */ 3, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x0ad0 */ 0, 0, 0, 0, 20, 11, 0, 0, 80, 1, 0, 0, 15, 0, 0, 0,
/* 0x0ae0 */ 3, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x0ae0 */ 7, 0, 0, 0, 4, 0, 0, 0, 16, 0, 0, 0, 9, 0, 0, 0,
/* 0x0af0 */ 3, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x0af0 */ 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,100, 12, 0, 0,
/* 0x0b00 */ 3, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x0b00 */ 152, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,
/* 0x0b10 */ 3, 0, 7, 0, 1, 0, 0, 0,250, 1, 0, 0, 0, 0, 0, 0, /* 0x0b10 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
/* 0x0b20 */ 16, 0, 9, 0, 15, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, /* 0x0b20 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
/* 0x0b30 */ 16, 0, 9, 0, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x0b30 */ 3, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
/* 0x0b40 */ 16, 0, 0, 0, 39, 0, 0, 0,216, 1, 0, 0, 0, 0, 0, 0, /* 0x0b40 */ 3, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
/* 0x0b50 */ 16, 0, 9, 0, 47, 0, 0, 0, 0, 0, 0, 0, 53, 2, 0, 0, /* 0x0b50 */ 3, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
/* 0x0b60 */ 18, 0, 5, 0, 71, 0, 0, 0,126, 1, 0, 0, 0, 0, 0, 0, /* 0x0b60 */ 3, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
/* 0x0b70 */ 16, 0, 9, 0, 76, 0, 0, 0, 0, 0, 0, 0,175, 0, 0, 0, /* 0x0b70 */ 3, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
/* 0x0b80 */ 18, 0, 7, 0, 98, 0, 0, 0,161, 1, 0, 0, 0, 0, 0, 0, /* 0x0b80 */ 3, 0, 7, 0, 1, 0, 0, 0,248, 1, 0, 0, 0, 0, 0, 0,
/* 0x0b90 */ 16, 0, 9, 0,104, 0, 0, 0,140, 1, 0, 0, 0, 0, 0, 0, /* 0x0b90 */ 16, 0, 9, 0, 15, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0,
/* 0x0ba0 */ 16, 0, 9, 0,119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x0ba0 */ 16, 0, 9, 0, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
/* 0x0bb0 */ 16, 0, 9, 0,126, 0, 0, 0,198, 1, 0, 0, 0, 0, 0, 0, /* 0x0bb0 */ 16, 0, 0, 0, 39, 0, 0, 0,214, 1, 0, 0, 0, 0, 0, 0,
/* 0x0bc0 */ 16, 0, 9, 0,133, 0, 0, 0,248, 1, 0, 0, 0, 0, 0, 0, /* 0x0bc0 */ 16, 0, 9, 0, 47, 0, 0, 0, 0, 0, 0, 0, 53, 2, 0, 0,
/* 0x0bd0 */ 16, 0, 9, 0,141, 0, 0, 0,143, 1, 0, 0, 0, 0, 0, 0, /* 0x0bd0 */ 18, 0, 5, 0, 71, 0, 0, 0,124, 1, 0, 0, 0, 0, 0, 0,
/* 0x0be0 */ 16, 0, 9, 0,146, 0, 0, 0,176, 1, 0, 0, 0, 0, 0, 0, /* 0x0be0 */ 16, 0, 9, 0, 76, 0, 0, 0, 0, 0, 0, 0, 31, 1, 0, 0,
/* 0x0bf0 */ 16, 0, 9, 0, 0,103,101,116, 95,112, 97,103,101, 95,109, 97, /* 0x0bf0 */ 18, 0, 7, 0, 98, 0, 0, 0,159, 1, 0, 0, 0, 0, 0, 0,
/* 0x0c00 */ 115,107, 0,117,112,120, 95,109,109, 97,112, 95, 97,110,100, 95, /* 0x0c00 */ 16, 0, 9, 0,104, 0, 0, 0,138, 1, 0, 0, 0, 0, 0, 0,
/* 0x0c10 */ 102,100, 0, 79, 95, 66, 73, 78, 70, 79, 0,109,101,109,112, 99, /* 0x0c10 */ 16, 0, 9, 0,119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
/* 0x0c20 */ 112,121, 0,117,112,120, 95,109,109, 97,112, 95, 97,110,100, 95, /* 0x0c20 */ 16, 0, 9, 0,126, 0, 0, 0,196, 1, 0, 0, 0, 0, 0, 0,
/* 0x0c30 */ 102,100, 95, 97,110,100,114,111,105,100, 0,109,109, 97,112, 0, /* 0x0c30 */ 16, 0, 9, 0,133, 0, 0, 0,246, 1, 0, 0, 0, 0, 0, 0,
/* 0x0c40 */ 117,112,120, 95,109,109, 97,112, 95, 97,110,100, 95,102,100, 95, /* 0x0c40 */ 16, 0, 9, 0,141, 0, 0, 0,141, 1, 0, 0, 0, 0, 0, 0,
/* 0x0c50 */ 108,105,110,117,120, 0,117,110, 97,109,101, 0,103,101,116, 95, /* 0x0c50 */ 16, 0, 9, 0,146, 0, 0, 0,174, 1, 0, 0, 0, 0, 0, 0,
/* 0x0c60 */ 117,112,120,102,110, 95,112, 97,116,104, 0, 95,115,116, 97,114, /* 0x0c60 */ 16, 0, 9, 0, 0,103,101,116, 95,112, 97,103,101, 95,109, 97,
/* 0x0c70 */ 116, 0,109,101,109,115,101,116, 0,109,121, 95, 98,107,112,116, /* 0x0c70 */ 115,107, 0,117,112,120, 95,109,109, 97,112, 95, 97,110,100, 95,
/* 0x0c80 */ 0,115,116, 97,116, 0,109,107,100,105,114, 0, 1, 0, 0, 0, /* 0x0c80 */ 102,100, 0, 79, 95, 66, 73, 78, 70, 79, 0,109,101,109,112, 99,
/* 0x0c90 */ 2, 11, 0, 0, 1, 0, 0, 0, 2, 13, 0, 0,124, 0, 0, 0, /* 0x0c90 */ 112,121, 0,117,112,120, 95,109,109, 97,112, 95, 97,110,100, 95,
/* 0x0ca0 */ 2, 18, 0, 0,241, 0, 0, 0, 2, 15, 0, 0,111, 1, 0, 0, /* 0x0ca0 */ 102,100, 95, 97,110,100,114,111,105,100, 0,109,109, 97,112, 0,
/* 0x0cb0 */ 2, 7, 0, 0,224, 1, 0, 0, 2, 7, 0, 0, 18, 2, 0, 0, /* 0x0cb0 */ 117,112,120, 95,109,109, 97,112, 95, 97,110,100, 95,102,100, 95,
/* 0x0cc0 */ 2, 12, 0, 0, 73, 2, 0, 0, 2, 17, 0, 0,152, 2, 0, 0, /* 0x0cc0 */ 108,105,110,117,120, 0,117,110, 97,109,101, 0,103,101,116, 95,
/* 0x0cd0 */ 2, 18, 0, 0, 94, 3, 0, 0, 2, 18, 0, 0,146, 3, 0, 0, /* 0x0cd0 */ 117,112,120,102,110, 95,112, 97,116,104, 0, 95,115,116, 97,114,
/* 0x0ce0 */ 2, 10, 0, 0,238, 3, 0, 0, 2, 10, 0, 0,141, 0, 0, 0, /* 0x0ce0 */ 116, 0,109,101,109,115,101,116, 0,109,121, 95, 98,107,112,116,
/* 0x0cf0 */ 2, 12, 0, 0,148, 0, 0, 0, 2, 7, 0, 0, 5, 0, 0, 0, /* 0x0cf0 */ 0,115,116, 97,116, 0,109,107,100,105,114, 0, 1, 0, 0, 0,
/* 0x0d00 */ 2, 2, 0, 0,169, 0, 0, 0, 2, 8, 0, 0, 86, 1, 0, 0, /* 0x0d00 */ 2, 11, 0, 0, 1, 0, 0, 0, 2, 13, 0, 0,124, 0, 0, 0,
/* 0x0d10 */ 2, 12, 0, 0, 2, 0, 0, 0, 2, 1, 0, 0, 6, 0, 0, 0, /* 0x0d10 */ 2, 18, 0, 0,241, 0, 0, 0, 2, 15, 0, 0,111, 1, 0, 0,
/* 0x0d20 */ 1, 9, 0, 0,102,105,108,101, 32,102,111,114,109, 97,116, 32, /* 0x0d20 */ 2, 7, 0, 0,224, 1, 0, 0, 2, 7, 0, 0, 18, 2, 0, 0,
/* 0x0d30 */ 101,108,102, 51, 50, 45,105, 51, 56, 54, 10, 10, 83,101, 99,116, /* 0x0d30 */ 2, 12, 0, 0, 73, 2, 0, 0, 2, 17, 0, 0,152, 2, 0, 0,
/* 0x0d40 */ 105,111,110,115, 58, 10, 73,100,120, 32, 78, 97,109,101, 32, 32, /* 0x0d40 */ 2, 18, 0, 0, 94, 3, 0, 0, 2, 18, 0, 0,146, 3, 0, 0,
/* 0x0d50 */ 32, 32, 32, 32, 32, 32, 32, 32, 83,105,122,101, 32, 32, 32, 32, /* 0x0d50 */ 2, 10, 0, 0,238, 3, 0, 0, 2, 10, 0, 0,253, 0, 0, 0,
/* 0x0d60 */ 32, 32, 86, 77, 65, 32, 32, 32, 32, 32, 32, 32, 76, 77, 65, 32, /* 0x0d60 */ 2, 12, 0, 0, 4, 1, 0, 0, 2, 7, 0, 0, 5, 0, 0, 0,
/* 0x0d70 */ 32, 32, 32, 32, 32, 32, 70,105,108,101, 32,111,102,102, 32, 32, /* 0x0d70 */ 2, 2, 0, 0,169, 0, 0, 0, 2, 8, 0, 0, 84, 1, 0, 0,
/* 0x0d80 */ 65,108,103,110, 32, 32, 70,108, 97,103,115, 10, 32, 32, 48, 32, /* 0x0d80 */ 2, 12, 0, 0, 2, 0, 0, 0, 2, 1, 0, 0, 6, 0, 0, 0,
/* 0x0d90 */ 72, 85, 77, 70, 95, 65, 32, 32, 32, 32, 32, 32, 32, 32, 48, 53, /* 0x0d90 */ 1, 9, 0, 0,102,105,108,101, 32,102,111,114,109, 97,116, 32,
/* 0x0da0 */ 32, 32, 48, 32, 32, 48, 32, 32, 48, 51, 52, 32, 32, 50, 42, 42, /* 0x0da0 */ 101,108,102, 51, 50, 45,105, 51, 56, 54, 10, 10, 83,101, 99,116,
/* 0x0db0 */ 48, 32, 32, 67, 79, 78, 84, 69, 78, 84, 83, 10, 32, 32, 49, 32, /* 0x0db0 */ 105,111,110,115, 58, 10, 73,100,120, 32, 78, 97,109,101, 32, 32,
/* 0x0dc0 */ 72, 85, 77, 70, 95, 76, 32, 32, 32, 32, 32, 32, 32, 32, 48, 53, /* 0x0dc0 */ 32, 32, 32, 32, 32, 32, 32, 32, 83,105,122,101, 32, 32, 32, 32,
/* 0x0dd0 */ 32, 32, 48, 32, 32, 48, 32, 32, 48, 51, 57, 32, 32, 50, 42, 42, /* 0x0dd0 */ 32, 32, 86, 77, 65, 32, 32, 32, 32, 32, 32, 32, 76, 77, 65, 32,
/* 0x0de0 */ 48, 32, 32, 67, 79, 78, 84, 69, 78, 84, 83, 10, 32, 32, 50, 32, /* 0x0de0 */ 32, 32, 32, 32, 32, 32, 70,105,108,101, 32,111,102,102, 32, 32,
/* 0x0df0 */ 85, 77, 70, 95, 65, 78, 68, 82, 79, 73, 68, 32, 32, 32, 48, 52, /* 0x0df0 */ 65,108,103,110, 32, 32, 70,108, 97,103,115, 10, 32, 32, 48, 32,
/* 0x0e00 */ 98,102, 32, 32, 48, 32, 32, 48, 32, 32, 48, 52, 48, 32, 32, 50, /* 0x0e00 */ 72, 85, 77, 70, 95, 65, 32, 32, 32, 32, 32, 32, 32, 32, 48, 53,
/* 0x0e10 */ 42, 42, 50, 32, 32, 67, 79, 78, 84, 69, 78, 84, 83, 10, 32, 32, /* 0x0e10 */ 32, 32, 48, 32, 32, 48, 32, 32, 48, 51, 52, 32, 32, 50, 42, 42,
/* 0x0e20 */ 51, 32, 85, 77, 70, 95, 76, 73, 78, 85, 88, 32, 32, 32, 32, 32, /* 0x0e20 */ 48, 32, 32, 67, 79, 78, 84, 69, 78, 84, 83, 10, 32, 32, 49, 32,
/* 0x0e30 */ 48, 97,102, 32, 32, 48, 32, 32, 48, 32, 32, 48, 53, 48, 48, 32, /* 0x0e30 */ 72, 85, 77, 70, 95, 76, 32, 32, 32, 32, 32, 32, 32, 32, 48, 53,
/* 0x0e40 */ 32, 50, 42, 42, 50, 32, 32, 67, 79, 78, 84, 69, 78, 84, 83, 10, /* 0x0e40 */ 32, 32, 48, 32, 32, 48, 32, 32, 48, 51, 57, 32, 32, 50, 42, 42,
/* 0x0e50 */ 32, 32, 52, 32, 69, 76, 70, 77, 65, 73, 78, 88, 32, 32, 32, 32, /* 0x0e50 */ 48, 32, 32, 67, 79, 78, 84, 69, 78, 84, 83, 10, 32, 32, 50, 32,
/* 0x0e60 */ 32, 32, 48, 50, 48, 48, 32, 32, 48, 32, 32, 48, 32, 32, 48, 53, /* 0x0e60 */ 85, 77, 70, 95, 65, 78, 68, 82, 79, 73, 68, 32, 32, 32, 48, 52,
/* 0x0e70 */ 98, 48, 32, 32, 50, 42, 42, 50, 32, 32, 67, 79, 78, 84, 69, 78, /* 0x0e70 */ 98,102, 32, 32, 48, 32, 32, 48, 32, 32, 48, 52, 48, 32, 32, 50,
/* 0x0e80 */ 84, 83, 10, 32, 32, 53, 32, 69, 76, 70, 77, 65, 73, 78, 90, 32, /* 0x0e80 */ 42, 42, 50, 32, 32, 67, 79, 78, 84, 69, 78, 84, 83, 10, 32, 32,
/* 0x0e90 */ 32, 32, 32, 32, 32, 48, 97, 32, 32, 48, 32, 32, 48, 32, 32, 48, /* 0x0e90 */ 51, 32, 85, 77, 70, 95, 76, 73, 78, 85, 88, 32, 32, 32, 32, 32,
/* 0x0ea0 */ 55, 98, 48, 32, 32, 50, 42, 42, 48, 32, 32, 67, 79, 78, 84, 69, /* 0x0ea0 */ 48, 49, 49,102, 32, 32, 48, 32, 32, 48, 32, 32, 48, 53, 48, 48,
/* 0x0eb0 */ 78, 84, 83, 10, 83, 89, 77, 66, 79, 76, 32, 84, 65, 66, 76, 69, /* 0x0eb0 */ 32, 32, 50, 42, 42, 50, 32, 32, 67, 79, 78, 84, 69, 78, 84, 83,
/* 0x0ec0 */ 58, 10, 48, 48, 48, 48, 48, 48, 48, 48, 32,108, 32, 32, 32, 32, /* 0x0ec0 */ 10, 32, 32, 52, 32, 69, 76, 70, 77, 65, 73, 78, 88, 32, 32, 32,
/* 0x0ed0 */ 100, 32, 32, 69, 76, 70, 77, 65, 73, 78, 88, 32, 48, 32, 69, 76, /* 0x0ed0 */ 32, 32, 32, 48, 50, 48, 48, 32, 32, 48, 32, 32, 48, 32, 32, 48,
/* 0x0ee0 */ 70, 77, 65, 73, 78, 88, 10, 48, 48, 48, 48, 48, 48, 48, 48, 32, /* 0x0ee0 */ 54, 50, 48, 32, 32, 50, 42, 42, 50, 32, 32, 67, 79, 78, 84, 69,
/* 0x0ef0 */ 108, 32, 32, 32, 32,100, 32, 32, 69, 76, 70, 77, 65, 73, 78, 90, /* 0x0ef0 */ 78, 84, 83, 10, 32, 32, 53, 32, 69, 76, 70, 77, 65, 73, 78, 90,
/* 0x0f00 */ 32, 48, 32, 69, 76, 70, 77, 65, 73, 78, 90, 10, 48, 48, 48, 48, /* 0x0f00 */ 32, 32, 32, 32, 32, 32, 48, 97, 32, 32, 48, 32, 32, 48, 32, 32,
/* 0x0f10 */ 48, 48, 48, 48, 32,108, 32, 32, 32, 32,100, 32, 32, 72, 85, 77, /* 0x0f10 */ 48, 56, 50, 48, 32, 32, 50, 42, 42, 48, 32, 32, 67, 79, 78, 84,
/* 0x0f20 */ 70, 95, 65, 32, 48, 32, 72, 85, 77, 70, 95, 65, 10, 48, 48, 48, /* 0x0f20 */ 69, 78, 84, 83, 10, 83, 89, 77, 66, 79, 76, 32, 84, 65, 66, 76,
/* 0x0f30 */ 48, 48, 48, 48, 48, 32,108, 32, 32, 32, 32,100, 32, 32, 72, 85, /* 0x0f30 */ 69, 58, 10, 48, 48, 48, 48, 48, 48, 48, 48, 32,108, 32, 32, 32,
/* 0x0f40 */ 77, 70, 95, 76, 32, 48, 32, 72, 85, 77, 70, 95, 76, 10, 48, 48, /* 0x0f40 */ 32,100, 32, 32, 69, 76, 70, 77, 65, 73, 78, 88, 32, 48, 32, 69,
/* 0x0f50 */ 48, 48, 48, 48, 48, 48, 32,108, 32, 32, 32, 32,100, 32, 32, 85, /* 0x0f50 */ 76, 70, 77, 65, 73, 78, 88, 10, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x0f60 */ 77, 70, 95, 65, 78, 68, 82, 79, 73, 68, 32, 48, 32, 85, 77, 70, /* 0x0f60 */ 32,108, 32, 32, 32, 32,100, 32, 32, 69, 76, 70, 77, 65, 73, 78,
/* 0x0f70 */ 95, 65, 78, 68, 82, 79, 73, 68, 10, 48, 48, 48, 48, 48, 48, 48, /* 0x0f70 */ 90, 32, 48, 32, 69, 76, 70, 77, 65, 73, 78, 90, 10, 48, 48, 48,
/* 0x0f80 */ 48, 32,108, 32, 32, 32, 32,100, 32, 32, 85, 77, 70, 95, 76, 73, /* 0x0f80 */ 48, 48, 48, 48, 48, 32,108, 32, 32, 32, 32,100, 32, 32, 72, 85,
/* 0x0f90 */ 78, 85, 88, 32, 48, 32, 85, 77, 70, 95, 76, 73, 78, 85, 88, 10, /* 0x0f90 */ 77, 70, 95, 65, 32, 48, 32, 72, 85, 77, 70, 95, 65, 10, 48, 48,
/* 0x0fa0 */ 48, 48, 48, 48, 48, 49,102, 97, 32,103, 32, 32, 32, 32, 32, 32, /* 0x0fa0 */ 48, 48, 48, 48, 48, 48, 32,108, 32, 32, 32, 32,100, 32, 32, 72,
/* 0x0fb0 */ 32, 69, 76, 70, 77, 65, 73, 78, 88, 32, 48, 32,103,101,116, 95, /* 0x0fb0 */ 85, 77, 70, 95, 76, 32, 48, 32, 72, 85, 77, 70, 95, 76, 10, 48,
/* 0x0fc0 */ 112, 97,103,101, 95,109, 97,115,107, 10, 48, 48, 48, 48, 48, 50, /* 0x0fc0 */ 48, 48, 48, 48, 48, 48, 48, 32,108, 32, 32, 32, 32,100, 32, 32,
/* 0x0fd0 */ 48, 48, 32,103, 32, 32, 32, 32, 32, 32, 32, 69, 76, 70, 77, 65, /* 0x0fd0 */ 85, 77, 70, 95, 65, 78, 68, 82, 79, 73, 68, 32, 48, 32, 85, 77,
/* 0x0fe0 */ 73, 78, 88, 32, 48, 32,117,112,120, 95,109,109, 97,112, 95, 97, /* 0x0fe0 */ 70, 95, 65, 78, 68, 82, 79, 73, 68, 10, 48, 48, 48, 48, 48, 48,
/* 0x0ff0 */ 110,100, 95,102,100, 10, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, /* 0x0ff0 */ 48, 48, 32,108, 32, 32, 32, 32,100, 32, 32, 85, 77, 70, 95, 76,
/* 0x1000 */ 32, 32, 32, 32, 32, 32, 32, 42, 85, 78, 68, 42, 32, 48, 32, 79, /* 0x1000 */ 73, 78, 85, 88, 32, 48, 32, 85, 77, 70, 95, 76, 73, 78, 85, 88,
/* 0x1010 */ 95, 66, 73, 78, 70, 79, 10, 48, 48, 48, 48, 48, 49,100, 56, 32, /* 0x1010 */ 10, 48, 48, 48, 48, 48, 49,102, 56, 32,103, 32, 32, 32, 32, 32,
/* 0x1020 */ 103, 32, 32, 32, 32, 32, 32, 32, 69, 76, 70, 77, 65, 73, 78, 88, /* 0x1020 */ 32, 32, 69, 76, 70, 77, 65, 73, 78, 88, 32, 48, 32,103,101,116,
/* 0x1030 */ 32, 48, 32,109,101,109,112, 99,112,121, 10, 48, 48, 48, 48, 48, /* 0x1030 */ 95,112, 97,103,101, 95,109, 97,115,107, 10, 48, 48, 48, 48, 48,
/* 0x1040 */ 48, 48, 48, 32,103, 32, 32, 32, 32, 32, 70, 32, 85, 77, 70, 95, /* 0x1040 */ 50, 48, 48, 32,103, 32, 32, 32, 32, 32, 32, 32, 69, 76, 70, 77,
/* 0x1050 */ 65, 78, 68, 82, 79, 73, 68, 32, 48, 50, 51, 53, 32,117,112,120, /* 0x1050 */ 65, 73, 78, 88, 32, 48, 32,117,112,120, 95,109,109, 97,112, 95,
/* 0x1060 */ 95,109,109, 97,112, 95, 97,110,100, 95,102,100, 95, 97,110,100, /* 0x1060 */ 97,110,100, 95,102,100, 10, 48, 48, 48, 48, 48, 48, 48, 48, 32,
/* 0x1070 */ 114,111,105,100, 10, 48, 48, 48, 48, 48, 49, 55,101, 32,103, 32, /* 0x1070 */ 32, 32, 32, 32, 32, 32, 32, 32, 42, 85, 78, 68, 42, 32, 48, 32,
/* 0x1080 */ 32, 32, 32, 32, 32, 32, 69, 76, 70, 77, 65, 73, 78, 88, 32, 48, /* 0x1080 */ 79, 95, 66, 73, 78, 70, 79, 10, 48, 48, 48, 48, 48, 49,100, 54,
/* 0x1090 */ 32,109,109, 97,112, 10, 48, 48, 48, 48, 48, 48, 48, 48, 32,103, /* 0x1090 */ 32,103, 32, 32, 32, 32, 32, 32, 32, 69, 76, 70, 77, 65, 73, 78,
/* 0x10a0 */ 32, 32, 32, 32, 32, 70, 32, 85, 77, 70, 95, 76, 73, 78, 85, 88, /* 0x10a0 */ 88, 32, 48, 32,109,101,109,112, 99,112,121, 10, 48, 48, 48, 48,
/* 0x10b0 */ 32, 48, 97,102, 32,117,112,120, 95,109,109, 97,112, 95, 97,110, /* 0x10b0 */ 48, 48, 48, 48, 32,103, 32, 32, 32, 32, 32, 70, 32, 85, 77, 70,
/* 0x10c0 */ 100, 95,102,100, 95,108,105,110,117,120, 10, 48, 48, 48, 48, 48, /* 0x10c0 */ 95, 65, 78, 68, 82, 79, 73, 68, 32, 48, 50, 51, 53, 32,117,112,
/* 0x10d0 */ 49, 97, 49, 32,103, 32, 32, 32, 32, 32, 32, 32, 69, 76, 70, 77, /* 0x10d0 */ 120, 95,109,109, 97,112, 95, 97,110,100, 95,102,100, 95, 97,110,
/* 0x10e0 */ 65, 73, 78, 88, 32, 48, 32,117,110, 97,109,101, 10, 48, 48, 48, /* 0x10e0 */ 100,114,111,105,100, 10, 48, 48, 48, 48, 48, 49, 55, 99, 32,103,
/* 0x10f0 */ 48, 48, 49, 56, 99, 32,103, 32, 32, 32, 32, 32, 32, 32, 69, 76, /* 0x10f0 */ 32, 32, 32, 32, 32, 32, 32, 69, 76, 70, 77, 65, 73, 78, 88, 32,
/* 0x1100 */ 70, 77, 65, 73, 78, 88, 32, 48, 32,103,101,116, 95,117,112,120, /* 0x1100 */ 48, 32,109,109, 97,112, 10, 48, 48, 48, 48, 48, 48, 48, 48, 32,
/* 0x1110 */ 102,110, 95,112, 97,116,104, 10, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x1110 */ 103, 32, 32, 32, 32, 32, 70, 32, 85, 77, 70, 95, 76, 73, 78, 85,
/* 0x1120 */ 32,103, 32, 32, 32, 32, 32, 32, 32, 69, 76, 70, 77, 65, 73, 78, /* 0x1120 */ 88, 32, 48, 49, 49,102, 32,117,112,120, 95,109,109, 97,112, 95,
/* 0x1130 */ 88, 32, 48, 32, 95,115,116, 97,114,116, 10, 48, 48, 48, 48, 48, /* 0x1130 */ 97,110,100, 95,102,100, 95,108,105,110,117,120, 10, 48, 48, 48,
/* 0x1140 */ 49, 99, 54, 32,103, 32, 32, 32, 32, 32, 32, 32, 69, 76, 70, 77, /* 0x1140 */ 48, 48, 49, 57,102, 32,103, 32, 32, 32, 32, 32, 32, 32, 69, 76,
/* 0x1150 */ 65, 73, 78, 88, 32, 48, 32,109,101,109,115,101,116, 10, 48, 48, /* 0x1150 */ 70, 77, 65, 73, 78, 88, 32, 48, 32,117,110, 97,109,101, 10, 48,
/* 0x1160 */ 48, 48, 48, 49,102, 56, 32,103, 32, 32, 32, 32, 32, 32, 32, 69, /* 0x1160 */ 48, 48, 48, 48, 49, 56, 97, 32,103, 32, 32, 32, 32, 32, 32, 32,
/* 0x1170 */ 76, 70, 77, 65, 73, 78, 88, 32, 48, 32,109,121, 95, 98,107,112, /* 0x1170 */ 69, 76, 70, 77, 65, 73, 78, 88, 32, 48, 32,103,101,116, 95,117,
/* 0x1180 */ 116, 10, 48, 48, 48, 48, 48, 49, 56,102, 32,103, 32, 32, 32, 32, /* 0x1180 */ 112,120,102,110, 95,112, 97,116,104, 10, 48, 48, 48, 48, 48, 48,
/* 0x1190 */ 32, 32, 32, 69, 76, 70, 77, 65, 73, 78, 88, 32, 48, 32,115,116, /* 0x1190 */ 48, 48, 32,103, 32, 32, 32, 32, 32, 32, 32, 69, 76, 70, 77, 65,
/* 0x11a0 */ 97,116, 10, 48, 48, 48, 48, 48, 49, 98, 48, 32,103, 32, 32, 32, /* 0x11a0 */ 73, 78, 88, 32, 48, 32, 95,115,116, 97,114,116, 10, 48, 48, 48,
/* 0x11b0 */ 32, 32, 32, 32, 69, 76, 70, 77, 65, 73, 78, 88, 32, 48, 32,109, /* 0x11b0 */ 48, 48, 49, 99, 52, 32,103, 32, 32, 32, 32, 32, 32, 32, 69, 76,
/* 0x11c0 */ 107,100,105,114, 10, 10, 82, 69, 76, 79, 67, 65, 84, 73, 79, 78, /* 0x11c0 */ 70, 77, 65, 73, 78, 88, 32, 48, 32,109,101,109,115,101,116, 10,
/* 0x11d0 */ 32, 82, 69, 67, 79, 82, 68, 83, 32, 70, 79, 82, 32, 91, 72, 85, /* 0x11d0 */ 48, 48, 48, 48, 48, 49,102, 54, 32,103, 32, 32, 32, 32, 32, 32,
/* 0x11e0 */ 77, 70, 95, 65, 93, 58, 10, 79, 70, 70, 83, 69, 84, 32, 32, 32, /* 0x11e0 */ 32, 69, 76, 70, 77, 65, 73, 78, 88, 32, 48, 32,109,121, 95, 98,
/* 0x11f0 */ 84, 89, 80, 69, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, /* 0x11f0 */ 107,112,116, 10, 48, 48, 48, 48, 48, 49, 56,100, 32,103, 32, 32,
/* 0x1200 */ 32, 32, 86, 65, 76, 85, 69, 10, 48, 48, 48, 48, 48, 48, 48, 49, /* 0x1200 */ 32, 32, 32, 32, 32, 69, 76, 70, 77, 65, 73, 78, 88, 32, 48, 32,
/* 0x1210 */ 32, 82, 95, 51, 56, 54, 95, 80, 67, 51, 50, 32, 32, 32, 32, 32, /* 0x1210 */ 115,116, 97,116, 10, 48, 48, 48, 48, 48, 49, 97,101, 32,103, 32,
/* 0x1220 */ 32, 32, 32,117,112,120, 95,109,109, 97,112, 95, 97,110,100, 95, /* 0x1220 */ 32, 32, 32, 32, 32, 32, 69, 76, 70, 77, 65, 73, 78, 88, 32, 48,
/* 0x1230 */ 102,100, 95, 97,110,100,114,111,105,100, 10, 10, 82, 69, 76, 79, /* 0x1230 */ 32,109,107,100,105,114, 10, 10, 82, 69, 76, 79, 67, 65, 84, 73,
/* 0x1240 */ 67, 65, 84, 73, 79, 78, 32, 82, 69, 67, 79, 82, 68, 83, 32, 70, /* 0x1240 */ 79, 78, 32, 82, 69, 67, 79, 82, 68, 83, 32, 70, 79, 82, 32, 91,
/* 0x1250 */ 79, 82, 32, 91, 72, 85, 77, 70, 95, 76, 93, 58, 10, 79, 70, 70, /* 0x1250 */ 72, 85, 77, 70, 95, 65, 93, 58, 10, 79, 70, 70, 83, 69, 84, 32,
/* 0x1260 */ 83, 69, 84, 32, 32, 32, 84, 89, 80, 69, 32, 32, 32, 32, 32, 32, /* 0x1260 */ 32, 32, 84, 89, 80, 69, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
/* 0x1270 */ 32, 32, 32, 32, 32, 32, 32, 32, 86, 65, 76, 85, 69, 10, 48, 48, /* 0x1270 */ 32, 32, 32, 32, 86, 65, 76, 85, 69, 10, 48, 48, 48, 48, 48, 48,
/* 0x1280 */ 48, 48, 48, 48, 48, 49, 32, 82, 95, 51, 56, 54, 95, 80, 67, 51, /* 0x1280 */ 48, 49, 32, 82, 95, 51, 56, 54, 95, 80, 67, 51, 50, 32, 32, 32,
/* 0x1290 */ 50, 32, 32, 32, 32, 32, 32, 32, 32,117,112,120, 95,109,109, 97, /* 0x1290 */ 32, 32, 32, 32, 32,117,112,120, 95,109,109, 97,112, 95, 97,110,
/* 0x12a0 */ 112, 95, 97,110,100, 95,102,100, 95,108,105,110,117,120, 10, 10, /* 0x12a0 */ 100, 95,102,100, 95, 97,110,100,114,111,105,100, 10, 10, 82, 69,
/* 0x12b0 */ 82, 69, 76, 79, 67, 65, 84, 73, 79, 78, 32, 82, 69, 67, 79, 82, /* 0x12b0 */ 76, 79, 67, 65, 84, 73, 79, 78, 32, 82, 69, 67, 79, 82, 68, 83,
/* 0x12c0 */ 68, 83, 32, 70, 79, 82, 32, 91, 85, 77, 70, 95, 65, 78, 68, 82, /* 0x12c0 */ 32, 70, 79, 82, 32, 91, 72, 85, 77, 70, 95, 76, 93, 58, 10, 79,
/* 0x12d0 */ 79, 73, 68, 93, 58, 10, 79, 70, 70, 83, 69, 84, 32, 32, 32, 84, /* 0x12d0 */ 70, 70, 83, 69, 84, 32, 32, 32, 84, 89, 80, 69, 32, 32, 32, 32,
/* 0x12e0 */ 89, 80, 69, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, /* 0x12e0 */ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 86, 65, 76, 85, 69, 10,
/* 0x12f0 */ 32, 86, 65, 76, 85, 69, 10, 48, 48, 48, 48, 48, 48, 55, 99, 32, /* 0x12f0 */ 48, 48, 48, 48, 48, 48, 48, 49, 32, 82, 95, 51, 56, 54, 95, 80,
/* 0x1300 */ 82, 95, 51, 56, 54, 95, 80, 67, 51, 50, 32, 32, 32, 32, 32, 32, /* 0x1300 */ 67, 51, 50, 32, 32, 32, 32, 32, 32, 32, 32,117,112,120, 95,109,
/* 0x1310 */ 32, 32,109,121, 95, 98,107,112,116, 10, 48, 48, 48, 48, 48, 48, /* 0x1310 */ 109, 97,112, 95, 97,110,100, 95,102,100, 95,108,105,110,117,120,
/* 0x1320 */ 102, 49, 32, 82, 95, 51, 56, 54, 95, 80, 67, 51, 50, 32, 32, 32, /* 0x1320 */ 10, 10, 82, 69, 76, 79, 67, 65, 84, 73, 79, 78, 32, 82, 69, 67,
/* 0x1330 */ 32, 32, 32, 32, 32,103,101,116, 95,117,112,120,102,110, 95,112, /* 0x1330 */ 79, 82, 68, 83, 32, 70, 79, 82, 32, 91, 85, 77, 70, 95, 65, 78,
/* 0x1340 */ 97,116,104, 10, 48, 48, 48, 48, 48, 49, 54,102, 32, 82, 95, 51, /* 0x1340 */ 68, 82, 79, 73, 68, 93, 58, 10, 79, 70, 70, 83, 69, 84, 32, 32,
/* 0x1350 */ 56, 54, 95, 80, 67, 51, 50, 32, 32, 32, 32, 32, 32, 32, 32,103, /* 0x1350 */ 32, 84, 89, 80, 69, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
/* 0x1360 */ 101,116, 95,112, 97,103,101, 95,109, 97,115,107, 10, 48, 48, 48, /* 0x1360 */ 32, 32, 32, 86, 65, 76, 85, 69, 10, 48, 48, 48, 48, 48, 48, 55,
/* 0x1370 */ 48, 48, 49,101, 48, 32, 82, 95, 51, 56, 54, 95, 80, 67, 51, 50, /* 0x1370 */ 99, 32, 82, 95, 51, 56, 54, 95, 80, 67, 51, 50, 32, 32, 32, 32,
/* 0x1380 */ 32, 32, 32, 32, 32, 32, 32, 32,103,101,116, 95,112, 97,103,101, /* 0x1380 */ 32, 32, 32, 32,109,121, 95, 98,107,112,116, 10, 48, 48, 48, 48,
/* 0x1390 */ 95,109, 97,115,107, 10, 48, 48, 48, 48, 48, 50, 49, 50, 32, 82, /* 0x1390 */ 48, 48,102, 49, 32, 82, 95, 51, 56, 54, 95, 80, 67, 51, 50, 32,
/* 0x13a0 */ 95, 51, 56, 54, 95, 80, 67, 51, 50, 32, 32, 32, 32, 32, 32, 32, /* 0x13a0 */ 32, 32, 32, 32, 32, 32, 32,103,101,116, 95,117,112,120,102,110,
/* 0x13b0 */ 32,109,109, 97,112, 10, 48, 48, 48, 48, 48, 50, 52, 57, 32, 82, /* 0x13b0 */ 95,112, 97,116,104, 10, 48, 48, 48, 48, 48, 49, 54,102, 32, 82,
/* 0x13c0 */ 95, 51, 56, 54, 95, 80, 67, 51, 50, 32, 32, 32, 32, 32, 32, 32, /* 0x13c0 */ 95, 51, 56, 54, 95, 80, 67, 51, 50, 32, 32, 32, 32, 32, 32, 32,
/* 0x13d0 */ 32,109,101,109,115,101,116, 10, 48, 48, 48, 48, 48, 50, 57, 56, /* 0x13d0 */ 32,103,101,116, 95,112, 97,103,101, 95,109, 97,115,107, 10, 48,
/* 0x13e0 */ 32, 82, 95, 51, 56, 54, 95, 80, 67, 51, 50, 32, 32, 32, 32, 32, /* 0x13e0 */ 48, 48, 48, 48, 49,101, 48, 32, 82, 95, 51, 56, 54, 95, 80, 67,
/* 0x13f0 */ 32, 32, 32,109,121, 95, 98,107,112,116, 10, 48, 48, 48, 48, 48, /* 0x13f0 */ 51, 50, 32, 32, 32, 32, 32, 32, 32, 32,103,101,116, 95,112, 97,
/* 0x1400 */ 51, 53,101, 32, 82, 95, 51, 56, 54, 95, 80, 67, 51, 50, 32, 32, /* 0x1400 */ 103,101, 95,109, 97,115,107, 10, 48, 48, 48, 48, 48, 50, 49, 50,
/* 0x1410 */ 32, 32, 32, 32, 32, 32,109,121, 95, 98,107,112,116, 10, 48, 48, /* 0x1410 */ 32, 82, 95, 51, 56, 54, 95, 80, 67, 51, 50, 32, 32, 32, 32, 32,
/* 0x1420 */ 48, 48, 48, 51, 57, 50, 32, 82, 95, 51, 56, 54, 95, 80, 67, 51, /* 0x1420 */ 32, 32, 32,109,109, 97,112, 10, 48, 48, 48, 48, 48, 50, 52, 57,
/* 0x1430 */ 50, 32, 32, 32, 32, 32, 32, 32, 32,109,101,109,112, 99,112,121, /* 0x1430 */ 32, 82, 95, 51, 56, 54, 95, 80, 67, 51, 50, 32, 32, 32, 32, 32,
/* 0x1440 */ 10, 48, 48, 48, 48, 48, 51,101,101, 32, 82, 95, 51, 56, 54, 95, /* 0x1440 */ 32, 32, 32,109,101,109,115,101,116, 10, 48, 48, 48, 48, 48, 50,
/* 0x1450 */ 80, 67, 51, 50, 32, 32, 32, 32, 32, 32, 32, 32,109,101,109,112, /* 0x1450 */ 57, 56, 32, 82, 95, 51, 56, 54, 95, 80, 67, 51, 50, 32, 32, 32,
/* 0x1460 */ 99,112,121, 10, 10, 82, 69, 76, 79, 67, 65, 84, 73, 79, 78, 32, /* 0x1460 */ 32, 32, 32, 32, 32,109,121, 95, 98,107,112,116, 10, 48, 48, 48,
/* 0x1470 */ 82, 69, 67, 79, 82, 68, 83, 32, 70, 79, 82, 32, 91, 85, 77, 70, /* 0x1470 */ 48, 48, 51, 53,101, 32, 82, 95, 51, 56, 54, 95, 80, 67, 51, 50,
/* 0x1480 */ 95, 76, 73, 78, 85, 88, 93, 58, 10, 79, 70, 70, 83, 69, 84, 32, /* 0x1480 */ 32, 32, 32, 32, 32, 32, 32, 32,109,121, 95, 98,107,112,116, 10,
/* 0x1490 */ 32, 32, 84, 89, 80, 69, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, /* 0x1490 */ 48, 48, 48, 48, 48, 51, 57, 50, 32, 82, 95, 51, 56, 54, 95, 80,
/* 0x14a0 */ 32, 32, 32, 32, 86, 65, 76, 85, 69, 10, 48, 48, 48, 48, 48, 48, /* 0x14a0 */ 67, 51, 50, 32, 32, 32, 32, 32, 32, 32, 32,109,101,109,112, 99,
/* 0x14b0 */ 56,100, 32, 82, 95, 51, 56, 54, 95, 80, 67, 51, 50, 32, 32, 32, /* 0x14b0 */ 112,121, 10, 48, 48, 48, 48, 48, 51,101,101, 32, 82, 95, 51, 56,
/* 0x14c0 */ 32, 32, 32, 32, 32,109,109, 97,112, 10, 48, 48, 48, 48, 48, 48, /* 0x14c0 */ 54, 95, 80, 67, 51, 50, 32, 32, 32, 32, 32, 32, 32, 32,109,101,
/* 0x14d0 */ 57, 52, 32, 82, 95, 51, 56, 54, 95, 80, 67, 51, 50, 32, 32, 32, /* 0x14d0 */ 109,112, 99,112,121, 10, 10, 82, 69, 76, 79, 67, 65, 84, 73, 79,
/* 0x14e0 */ 32, 32, 32, 32, 32,103,101,116, 95,112, 97,103,101, 95,109, 97, /* 0x14e0 */ 78, 32, 82, 69, 67, 79, 82, 68, 83, 32, 70, 79, 82, 32, 91, 85,
/* 0x14f0 */ 115,107, 10, 10, 82, 69, 76, 79, 67, 65, 84, 73, 79, 78, 32, 82, /* 0x14f0 */ 77, 70, 95, 76, 73, 78, 85, 88, 93, 58, 10, 79, 70, 70, 83, 69,
/* 0x1500 */ 69, 67, 79, 82, 68, 83, 32, 70, 79, 82, 32, 91, 69, 76, 70, 77, /* 0x1500 */ 84, 32, 32, 32, 84, 89, 80, 69, 32, 32, 32, 32, 32, 32, 32, 32,
/* 0x1510 */ 65, 73, 78, 88, 93, 58, 10, 79, 70, 70, 83, 69, 84, 32, 32, 32, /* 0x1510 */ 32, 32, 32, 32, 32, 32, 86, 65, 76, 85, 69, 10, 48, 48, 48, 48,
/* 0x1520 */ 84, 89, 80, 69, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, /* 0x1520 */ 48, 48,102,100, 32, 82, 95, 51, 56, 54, 95, 80, 67, 51, 50, 32,
/* 0x1530 */ 32, 32, 86, 65, 76, 85, 69, 10, 48, 48, 48, 48, 48, 48, 48, 53, /* 0x1530 */ 32, 32, 32, 32, 32, 32, 32,109,109, 97,112, 10, 48, 48, 48, 48,
/* 0x1540 */ 32, 82, 95, 51, 56, 54, 95, 80, 67, 51, 50, 32, 32, 32, 32, 32, /* 0x1540 */ 48, 49, 48, 52, 32, 82, 95, 51, 56, 54, 95, 80, 67, 51, 50, 32,
/* 0x1550 */ 32, 32, 32, 69, 76, 70, 77, 65, 73, 78, 90, 10, 48, 48, 48, 48, /* 0x1550 */ 32, 32, 32, 32, 32, 32, 32,103,101,116, 95,112, 97,103,101, 95,
/* 0x1560 */ 48, 48, 97, 57, 32, 82, 95, 51, 56, 54, 95, 80, 67, 51, 50, 32, /* 0x1560 */ 109, 97,115,107, 10, 10, 82, 69, 76, 79, 67, 65, 84, 73, 79, 78,
/* 0x1570 */ 32, 32, 32, 32, 32, 32, 32,117,112,120, 95,109,109, 97,112, 95, /* 0x1570 */ 32, 82, 69, 67, 79, 82, 68, 83, 32, 70, 79, 82, 32, 91, 69, 76,
/* 0x1580 */ 97,110,100, 95,102,100, 10, 48, 48, 48, 48, 48, 49, 53, 54, 32, /* 0x1580 */ 70, 77, 65, 73, 78, 88, 93, 58, 10, 79, 70, 70, 83, 69, 84, 32,
/* 0x1590 */ 82, 95, 51, 56, 54, 95, 80, 67, 51, 50, 32, 32, 32, 32, 32, 32, /* 0x1590 */ 32, 32, 84, 89, 80, 69, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
/* 0x15a0 */ 32, 32,109,109, 97,112, 10, 10, 82, 69, 76, 79, 67, 65, 84, 73, /* 0x15a0 */ 32, 32, 32, 32, 86, 65, 76, 85, 69, 10, 48, 48, 48, 48, 48, 48,
/* 0x15b0 */ 79, 78, 32, 82, 69, 67, 79, 82, 68, 83, 32, 70, 79, 82, 32, 91, /* 0x15b0 */ 48, 53, 32, 82, 95, 51, 56, 54, 95, 80, 67, 51, 50, 32, 32, 32,
/* 0x15c0 */ 69, 76, 70, 77, 65, 73, 78, 90, 93, 58, 10, 79, 70, 70, 83, 69, /* 0x15c0 */ 32, 32, 32, 32, 32, 69, 76, 70, 77, 65, 73, 78, 90, 10, 48, 48,
/* 0x15d0 */ 84, 32, 32, 32, 84, 89, 80, 69, 32, 32, 32, 32, 32, 32, 32, 32, /* 0x15d0 */ 48, 48, 48, 48, 97, 57, 32, 82, 95, 51, 56, 54, 95, 80, 67, 51,
/* 0x15e0 */ 32, 32, 32, 32, 32, 32, 86, 65, 76, 85, 69, 10, 48, 48, 48, 48, /* 0x15e0 */ 50, 32, 32, 32, 32, 32, 32, 32, 32,117,112,120, 95,109,109, 97,
/* 0x15f0 */ 48, 48, 48, 50, 32, 82, 95, 51, 56, 54, 95, 80, 67, 51, 50, 32, /* 0x15f0 */ 112, 95, 97,110,100, 95,102,100, 10, 48, 48, 48, 48, 48, 49, 53,
/* 0x1600 */ 32, 32, 32, 32, 32, 32, 32, 69, 76, 70, 77, 65, 73, 78, 88, 10, /* 0x1600 */ 52, 32, 82, 95, 51, 56, 54, 95, 80, 67, 51, 50, 32, 32, 32, 32,
/* 0x1610 */ 48, 48, 48, 48, 48, 48, 48, 54, 32, 82, 95, 51, 56, 54, 95, 51, /* 0x1610 */ 32, 32, 32, 32,109,109, 97,112, 10, 10, 82, 69, 76, 79, 67, 65,
/* 0x1620 */ 50, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 79, 95, 66, 73, 78, /* 0x1620 */ 84, 73, 79, 78, 32, 82, 69, 67, 79, 82, 68, 83, 32, 70, 79, 82,
/* 0x1630 */ 70, 79, 10 /* 0x1630 */ 32, 91, 69, 76, 70, 77, 65, 73, 78, 90, 93, 58, 10, 79, 70, 70,
/* 0x1640 */ 83, 69, 84, 32, 32, 32, 84, 89, 80, 69, 32, 32, 32, 32, 32, 32,
/* 0x1650 */ 32, 32, 32, 32, 32, 32, 32, 32, 86, 65, 76, 85, 69, 10, 48, 48,
/* 0x1660 */ 48, 48, 48, 48, 48, 50, 32, 82, 95, 51, 56, 54, 95, 80, 67, 51,
/* 0x1670 */ 50, 32, 32, 32, 32, 32, 32, 32, 32, 69, 76, 70, 77, 65, 73, 78,
/* 0x1680 */ 88, 10, 48, 48, 48, 48, 48, 48, 48, 54, 32, 82, 95, 51, 56, 54,
/* 0x1690 */ 95, 51, 50, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 79, 95, 66,
/* 0x16a0 */ 73, 78, 70, 79, 10
}; };
+1136 -1125
View File
File diff suppressed because it is too large Load Diff
+272 -265
View File
@@ -1,5 +1,5 @@
/* i386-linux.elf-so_entry.h /* i386-linux.elf-so_entry.h
created from i386-linux.elf-so_entry.bin, 5461 (0x1555) bytes created from i386-linux.elf-so_entry.bin, 5575 (0x15c7) bytes
This file is part of the UPX executable compressor. This file is part of the UPX executable compressor.
@@ -32,14 +32,14 @@
/* clang-format off */ /* clang-format off */
#define STUB_I386_LINUX_ELF_SO_ENTRY_SIZE 5461 #define STUB_I386_LINUX_ELF_SO_ENTRY_SIZE 5575
#define STUB_I386_LINUX_ELF_SO_ENTRY_ADLER32 0x8c26e90f #define STUB_I386_LINUX_ELF_SO_ENTRY_ADLER32 0xcd9b0983
#define STUB_I386_LINUX_ELF_SO_ENTRY_CRC32 0x4d59693c #define STUB_I386_LINUX_ELF_SO_ENTRY_CRC32 0x2f7643c5
unsigned char stub_i386_linux_elf_so_entry[5461] = { unsigned char stub_i386_linux_elf_so_entry[5575] = {
/* 0x0000 */ 127, 69, 76, 70, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x0000 */ 127, 69, 76, 70, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
/* 0x0010 */ 1, 0, 3, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x0010 */ 1, 0, 3, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
/* 0x0020 */ 80, 8, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 40, 0, /* 0x0020 */ 192, 8, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 40, 0,
/* 0x0030 */ 16, 0, 13, 0,233,252,255,255,255,233,252,255,255,255, 0, 0, /* 0x0030 */ 16, 0, 13, 0,233,252,255,255,255,233,252,255,255,255, 0, 0,
/* 0x0040 */ 85,137,229, 87, 86, 83,129,236, 68, 16, 0, 0,186, 0, 0, 0, /* 0x0040 */ 85,137,229, 87, 86, 83,129,236, 68, 16, 0, 0,186, 0, 0, 0,
/* 0x0050 */ 0,232, 4, 0, 0, 0,117,112,120, 0, 95,185, 16, 0, 0, 0, /* 0x0050 */ 0,232, 4, 0, 0, 0,117,112,120, 0, 95,185, 16, 0, 0, 0,
@@ -117,266 +117,273 @@ unsigned char stub_i386_linux_elf_so_entry[5461] = {
/* 0x04d0 */ 76, 36, 20, 73,131,249,255,116, 30,138, 22,131,202, 32, 15,190, /* 0x04d0 */ 76, 36, 20, 73,131,249,255,116, 30,138, 22,131,202, 32, 15,190,
/* 0x04e0 */ 210,138, 3,131,200, 32, 15,190,192, 67, 70, 41,194,137,208,117, /* 0x04e0 */ 210,138, 3,131,200, 32, 15,190,192, 67, 70, 41,194,137,208,117,
/* 0x04f0 */ 11, 73,131,249,255,117,226,184, 0, 0, 0, 0, 91, 94,195, 0, /* 0x04f0 */ 11, 73,131,249,255,117,226,184, 0, 0, 0, 0, 91, 94,195, 0,
/* 0x0500 */ 85,137,229, 87, 86, 83,131,236, 20,139,125, 12,232, 4, 0, 0, /* 0x0500 */ 85,137,229, 87, 86, 83,131,236, 24,139,125, 12,232, 4, 0, 0,
/* 0x0510 */ 0,117,112,120, 0, 90,185, 16, 0, 0, 0,184,100, 1, 0, 0, /* 0x0510 */ 0,117,112,120, 0, 90,185, 16, 0, 0, 0,184,100, 1, 0, 0,
/* 0x0520 */ 137,211,205,128,137,198,131,248,234,117, 16,185, 0, 0, 0, 0, /* 0x0520 */ 137,211,205,128,137,198,131,248,234,117, 16,185, 0, 0, 0, 0,
/* 0x0530 */ 184,100, 1, 0, 0,137,211,205,128,137,198,133,246,121, 40,232, /* 0x0530 */ 184,100, 1, 0, 0,137,211,205,128,137,198,133,246, 15,137,148,
/* 0x0540 */ 9, 0, 0, 0, 47,100,101,118, 47,115,104,109, 0, 94,185, 2, /* 0x0540 */ 0, 0, 0,232, 9, 0, 0, 0, 47,100,101,118, 47,115,104,109,
/* 0x0550 */ 0, 65, 0,186,192, 1, 0, 0,137,243,106, 5, 88,205,128,137, /* 0x0550 */ 0, 94,185, 2, 0, 65, 0,186,192, 1, 0, 0,137,243,106, 5,
/* 0x0560 */ 198,137,194,133,192,120, 62,137,243,137,249,106, 93, 88,205,128, /* 0x0560 */ 88,205,128,137,198,133,192,121,110,137,194,131,248,235, 15,133,
/* 0x0570 */ 137,194,133,192,120, 47,106, 0, 86,131,125, 8, 1, 25,192,131, /* 0x0570 */ 161, 0, 0, 0,184, 2, 0, 0, 0,232, 62, 0, 0, 0, 85, 80,
/* 0x0580 */ 224,240,131,192, 17, 80,106, 3, 87,255,117, 8,232,252,255,255, /* 0x0580 */ 88, 45, 53, 46, 48, 32,119, 97,110,116,115, 32,109,101,109,102,
/* 0x0590 */ 255,137,195,232,252,255,255,255,131,196, 24,137,218, 57,195,115, /* 0x0590 */ 100, 95, 99,114,101, 97,116,101, 40, 41, 44, 32,111,114, 32,110,
/* 0x05a0 */ 4,141, 84, 30, 1,137,208,141,101,244, 91, 94, 95,201,195, 0, /* 0x05a0 */ 101,101,100,115, 32, 47,100,101,118, 47,115,104,109, 40, 44, 79,
/* 0x05b0 */ 96,232,128, 0, 0, 0,243, 15, 30,251, 1,219,116, 2,243,195, /* 0x05b0 */ 95, 84, 77, 80, 70, 73, 76, 69, 44, 41, 10, 0, 89,186, 61, 0,
/* 0x05c0 */ 139, 30,131,238,252, 17,219,195, 94,102,131,126, 8, 2,116, 1, /* 0x05c0 */ 0, 0,137,195,106, 4, 88,205,128,184,127, 0, 0, 0,137,195,
/* 0x05d0 */ 244,139, 14,141,137, 24, 1, 0, 0, 81,106, 90, 87,141, 66,234, /* 0x05d0 */ 106, 1, 88,205,128,235,254,137,243,137,249,106, 93, 88,205,128,
/* 0x05e0 */ 80, 82, 86,137,229,129,236, 24, 1, 0, 0,131,228,248,106, 0, /* 0x05e0 */ 137,194,133,192,120, 47,106, 0, 86,131,125, 8, 1, 25,192,131,
/* 0x05f0 */ 137,231, 87, 81,106, 0,232,245, 0, 0, 0,131,196, 12,169, 0, /* 0x05f0 */ 224,240,131,192, 17, 80,106, 3, 87,255,117, 8,232,252,255,255,
/* 0x0600 */ 8, 0, 0,116, 1,244,137,194,193,232, 12,193,224, 12, 41,194, /* 0x0600 */ 255,137,195,232,252,255,255,255,131,196, 24,137,218, 57,195,115,
/* 0x0610 */ 74,139,117, 0,139, 62, 1,199,137,120, 8,137,230,185, 24, 1, /* 0x0610 */ 4,141, 84, 30, 1,137,208,141,101,244, 91, 94, 95,201,195, 0,
/* 0x0620 */ 0, 0,243,164,137,236,137, 68, 36, 16, 94, 82,255, 54, 84,139, /* 0x0620 */ 96,232,128, 0, 0, 0,243, 15, 30,251, 1,219,116, 2,243,195,
/* 0x0630 */ 78, 4,141,118, 12,137,199, 1,241, 81,139, 84, 36, 16, 49,219, /* 0x0630 */ 139, 30,131,238,252, 17,219,195, 94,102,131,126, 8, 2,116, 1,
/* 0x0640 */ 49,201,131,205,255,252,168,164,255,210,114,251,141, 65, 1,255, /* 0x0640 */ 244,139, 14,141,137, 24, 1, 0, 0, 81,106, 90, 87,141, 66,234,
/* 0x0650 */ 210, 17,192,255,210,115,248,131,232, 3,114, 11,193,224, 8,172, /* 0x0650 */ 80, 82, 86,137,229,129,236, 24, 1, 0, 0,131,228,248,106, 0,
/* 0x0660 */ 131,240,255,116, 45,137,197,141, 65, 1,255,210, 17,201,255,210, /* 0x0660 */ 137,231, 87, 81,106, 0,232,245, 0, 0, 0,131,196, 12,169, 0,
/* 0x0670 */ 17,201,117, 13,137,193,131,192, 2,255,210, 17,201,255,210,115, /* 0x0670 */ 8, 0, 0,116, 1,244,137,194,193,232, 12,193,224, 12, 41,194,
/* 0x0680 */ 248,129,253, 0,243,255,255, 17,193, 86,141, 52, 47,243,164, 94, /* 0x0680 */ 74,139,117, 0,139, 62, 1,199,137,120, 8,137,230,185, 24, 1,
/* 0x0690 */ 235,182, 89, 57,206,116, 1,244, 89,139,124, 36, 20,139, 68, 36, /* 0x0690 */ 0, 0,243,164,137,236,137, 68, 36, 16, 94, 82,255, 54, 84,139,
/* 0x06a0 */ 16,137, 7, 88,137, 71, 8,139, 84, 36, 20,137,249, 91, 88,106, /* 0x06a0 */ 78, 4,141,118, 12,137,199, 1,241, 81,139, 84, 36, 16, 49,219,
/* 0x06b0 */ 0, 83,106, 4, 88,205,128,106, 18,106, 5, 82, 87,137,227,106, /* 0x06b0 */ 49,201,131,205,255,252,168,164,255,210,114,251,141, 65, 1,255,
/* 0x06c0 */ 90, 88,205,128,139, 92, 36, 16,131,196, 24,106, 6, 88,205,128, /* 0x06c0 */ 210, 17,192,255,210,115,248,131,232, 3,114, 11,193,224, 8,172,
/* 0x06d0 */ 131,199, 12,255,231,141, 92, 36, 4,106, 90, 88,205,128, 61, 0, /* 0x06d0 */ 131,240,255,116, 45,137,197,141, 65, 1,255,210, 17,201,255,210,
/* 0x06e0 */ 240,255,255,114, 1,244,194, 24, 0,184, 0,240,255,255,195, 0, /* 0x06e0 */ 17,201,117, 13,137,193,131,192, 2,255,210, 17,201,255,210,115,
/* 0x06f0 */ 49,192,195,135, 92, 36, 4,139, 76, 36, 8,176,106,232, 98, 0, /* 0x06f0 */ 248,129,253, 0,243,255,255, 17,193, 86,141, 52, 47,243,164, 94,
/* 0x0700 */ 0, 0,139, 92, 36, 4,195, 85,137,229, 83,139, 93, 8,176,122, /* 0x0700 */ 235,182, 89, 57,206,116, 1,244, 89,139,124, 36, 20,139, 68, 36,
/* 0x0710 */ 232, 79, 0, 0, 0, 91, 93,195, 85,137,229, 83,139, 93, 8,139, /* 0x0710 */ 16,137, 7, 88,137, 71, 8,139, 84, 36, 20,137,249, 91, 88,106,
/* 0x0720 */ 77, 12,176, 39,232, 59, 0, 0, 0, 91, 93,195, 85,137,229, 87, /* 0x0720 */ 0, 83,106, 4, 88,205,128,106, 18,106, 5, 82, 87,137,227,106,
/* 0x0730 */ 139, 77, 16,139, 69, 12,139,125, 8,243,170, 95, 93,195, 85,137, /* 0x0730 */ 90, 88,205,128,139, 92, 36, 16,131,196, 24,106, 6, 88,205,128,
/* 0x0740 */ 229, 87, 86,139, 77, 16,139,117, 12,139,125, 8,243,164,137,248, /* 0x0740 */ 131,199, 12,255,231,141, 92, 36, 4,106, 90, 88,205,128, 61, 0,
/* 0x0750 */ 94, 95, 93,195,204,195, 83,141, 92, 36, 8,176, 90,232, 2, 0, /* 0x0750 */ 240,255,255,114, 1,244,194, 24, 0,184, 0,240,255,255,195, 0,
/* 0x0760 */ 0, 0, 91,195, 15,182,192, 80,205,128, 90, 61, 0,240,255,255, /* 0x0760 */ 49,192,195,135, 92, 36, 4,139, 76, 36, 8,176,106,232, 98, 0,
/* 0x0770 */ 115, 1,195,244,129,236, 0, 2, 0, 0, 49,210,232, 16, 0, 0, /* 0x0770 */ 0, 0,139, 92, 36, 4,195, 85,137,229, 83,139, 93, 8,176,122,
/* 0x0780 */ 0, 47,112,114,111, 99, 47,115,101,108,102, 47, 97,117,120,118, /* 0x0780 */ 232, 79, 0, 0, 0, 91, 93,195, 85,137,229, 83,139, 93, 8,139,
/* 0x0790 */ 0, 89,106,156, 91,184, 39, 1, 0, 0,205,128,133,192,124, 40, /* 0x0790 */ 77, 12,176, 39,232, 59, 0, 0, 0, 91, 93,195, 85,137,229, 87,
/* 0x07a0 */ 137,197,186, 0, 2, 0, 0,137,225,137,195,106, 3, 88,205,128, /* 0x07a0 */ 139, 77, 16,139, 69, 12,139,125, 8,243,170, 95, 93,195, 85,137,
/* 0x07b0 */ 133,192,124, 20,137,193,137,230,173,133,192,116, 11,131,248, 6, /* 0x07b0 */ 229, 87, 86,139, 77, 16,139,117, 12,139,125, 8,243,164,137,248,
/* 0x07c0 */ 173,116, 10,131,233, 8,117,240,184, 0, 16, 0, 0,247,216,129, /* 0x07c0 */ 94, 95, 93,195,204,195, 83,141, 92, 36, 8,176, 90,232, 2, 0,
/* 0x07d0 */ 196, 0, 2, 0, 0, 80,137,235,106, 6, 88,205,128, 95, 90,232, /* 0x07d0 */ 0, 0, 91,195, 15,182,192, 80,205,128, 90, 61, 0,240,255,255,
/* 0x07e0 */ 20, 0, 0, 0, 0, 46,115,121,109,116, 97, 98, 0, 46,115,116, /* 0x07e0 */ 115, 1,195,244,129,236, 0, 2, 0, 0, 49,210,232, 16, 0, 0,
/* 0x07f0 */ 114,116, 97, 98, 0, 46,115,104,115,116,114,116, 97, 98, 0, 46, /* 0x07f0 */ 0, 47,112,114,111, 99, 47,115,101,108,102, 47, 97,117,120,118,
/* 0x0800 */ 114,101,108, 72, 85, 77, 70, 95, 65, 0, 46,114,101,108, 72, 85, /* 0x0800 */ 0, 89,106,156, 91,184, 39, 1, 0, 0,205,128,133,192,124, 40,
/* 0x0810 */ 77, 70, 95, 76, 0, 46,114,101,108, 85, 77, 70, 95, 65, 78, 68, /* 0x0810 */ 137,197,186, 0, 2, 0, 0,137,225,137,195,106, 3, 88,205,128,
/* 0x0820 */ 82, 79, 73, 68, 0, 46,114,101,108, 85, 77, 70, 95, 76, 73, 78, /* 0x0820 */ 133,192,124, 20,137,193,137,230,173,133,192,116, 11,131,248, 6,
/* 0x0830 */ 85, 88, 0, 46,114,101,108, 69, 76, 70, 77, 65, 73, 78, 88, 0, /* 0x0830 */ 173,116, 10,131,233, 8,117,240,184, 0, 16, 0, 0,247,216,129,
/* 0x0840 */ 46,114,101,108, 69, 76, 70, 77, 65, 73, 78, 90, 0, 0, 0, 0, /* 0x0840 */ 196, 0, 2, 0, 0, 80,137,235,106, 6, 88,205,128, 95, 90,232,
/* 0x0850 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x0850 */ 20, 0, 0, 0, 0, 46,115,121,109,116, 97, 98, 0, 46,115,116,
/* 0x0860 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x0860 */ 114,116, 97, 98, 0, 46,115,104,115,116,114,116, 97, 98, 0, 46,
/* 0x0870 */ 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0, /* 0x0870 */ 114,101,108, 72, 85, 77, 70, 95, 65, 0, 46,114,101,108, 72, 85,
/* 0x0880 */ 6, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 5, 0, 0, 0, /* 0x0880 */ 77, 70, 95, 76, 0, 46,114,101,108, 85, 77, 70, 95, 65, 78, 68,
/* 0x0890 */ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, /* 0x0890 */ 82, 79, 73, 68, 0, 46,114,101,108, 85, 77, 70, 95, 76, 73, 78,
/* 0x08a0 */ 27, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x08a0 */ 85, 88, 0, 46,114,101,108, 69, 76, 70, 77, 65, 73, 78, 88, 0,
/* 0x08b0 */ 128, 12, 0, 0, 8, 0, 0, 0, 14, 0, 0, 0, 1, 0, 0, 0, /* 0x08b0 */ 46,114,101,108, 69, 76, 70, 77, 65, 73, 78, 90, 0, 0, 0, 0,
/* 0x08c0 */ 4, 0, 0, 0, 8, 0, 0, 0, 42, 0, 0, 0, 1, 0, 0, 0, /* 0x08c0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
/* 0x08d0 */ 6, 0, 0, 0, 0, 0, 0, 0, 57, 0, 0, 0, 5, 0, 0, 0, /* 0x08d0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
/* 0x08e0 */ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, /* 0x08e0 */ 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0,
/* 0x08f0 */ 38, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x08f0 */ 6, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 5, 0, 0, 0,
/* 0x0900 */ 136, 12, 0, 0, 8, 0, 0, 0, 14, 0, 0, 0, 3, 0, 0, 0, /* 0x0900 */ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
/* 0x0910 */ 4, 0, 0, 0, 8, 0, 0, 0, 53, 0, 0, 0, 1, 0, 0, 0, /* 0x0910 */ 27, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
/* 0x0920 */ 6, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0,191, 4, 0, 0, /* 0x0920 */ 240, 12, 0, 0, 8, 0, 0, 0, 14, 0, 0, 0, 1, 0, 0, 0,
/* 0x0930 */ 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, /* 0x0930 */ 4, 0, 0, 0, 8, 0, 0, 0, 42, 0, 0, 0, 1, 0, 0, 0,
/* 0x0940 */ 49, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x0940 */ 6, 0, 0, 0, 0, 0, 0, 0, 57, 0, 0, 0, 5, 0, 0, 0,
/* 0x0950 */ 144, 12, 0, 0, 80, 0, 0, 0, 14, 0, 0, 0, 5, 0, 0, 0, /* 0x0950 */ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
/* 0x0960 */ 4, 0, 0, 0, 8, 0, 0, 0, 69, 0, 0, 0, 1, 0, 0, 0, /* 0x0960 */ 38, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
/* 0x0970 */ 6, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0,175, 0, 0, 0, /* 0x0970 */ 248, 12, 0, 0, 8, 0, 0, 0, 14, 0, 0, 0, 3, 0, 0, 0,
/* 0x0980 */ 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, /* 0x0980 */ 4, 0, 0, 0, 8, 0, 0, 0, 53, 0, 0, 0, 1, 0, 0, 0,
/* 0x0990 */ 65, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x0990 */ 6, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0,191, 4, 0, 0,
/* 0x09a0 */ 224, 12, 0, 0, 16, 0, 0, 0, 14, 0, 0, 0, 7, 0, 0, 0, /* 0x09a0 */ 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0,
/* 0x09b0 */ 4, 0, 0, 0, 8, 0, 0, 0, 83, 0, 0, 0, 1, 0, 0, 0, /* 0x09b0 */ 49, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
/* 0x09c0 */ 6, 0, 0, 0, 0, 0, 0, 0,176, 5, 0, 0, 64, 1, 0, 0, /* 0x09c0 */ 0, 13, 0, 0, 80, 0, 0, 0, 14, 0, 0, 0, 5, 0, 0, 0,
/* 0x09d0 */ 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, /* 0x09d0 */ 4, 0, 0, 0, 8, 0, 0, 0, 69, 0, 0, 0, 1, 0, 0, 0,
/* 0x09e0 */ 79, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x09e0 */ 6, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 31, 1, 0, 0,
/* 0x09f0 */ 240, 12, 0, 0, 8, 0, 0, 0, 14, 0, 0, 0, 9, 0, 0, 0, /* 0x09f0 */ 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0,
/* 0x0a00 */ 4, 0, 0, 0, 8, 0, 0, 0, 96, 0, 0, 0, 1, 0, 0, 0, /* 0x0a00 */ 65, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
/* 0x0a10 */ 0, 0, 0, 0, 0, 0, 0, 0,240, 6, 0, 0,244, 0, 0, 0, /* 0x0a10 */ 80, 13, 0, 0, 16, 0, 0, 0, 14, 0, 0, 0, 7, 0, 0, 0,
/* 0x0a20 */ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, /* 0x0a20 */ 4, 0, 0, 0, 8, 0, 0, 0, 83, 0, 0, 0, 1, 0, 0, 0,
/* 0x0a30 */ 92, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x0a30 */ 6, 0, 0, 0, 0, 0, 0, 0, 32, 6, 0, 0, 64, 1, 0, 0,
/* 0x0a40 */ 248, 12, 0, 0, 8, 0, 0, 0, 14, 0, 0, 0, 11, 0, 0, 0, /* 0x0a40 */ 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0,
/* 0x0a50 */ 4, 0, 0, 0, 8, 0, 0, 0, 17, 0, 0, 0, 3, 0, 0, 0, /* 0x0a50 */ 79, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
/* 0x0a60 */ 0, 0, 0, 0, 0, 0, 0, 0,228, 7, 0, 0,105, 0, 0, 0, /* 0x0a60 */ 96, 13, 0, 0, 8, 0, 0, 0, 14, 0, 0, 0, 9, 0, 0, 0,
/* 0x0a70 */ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, /* 0x0a70 */ 4, 0, 0, 0, 8, 0, 0, 0, 96, 0, 0, 0, 1, 0, 0, 0,
/* 0x0a80 */ 1, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x0a80 */ 0, 0, 0, 0, 0, 0, 0, 0, 96, 7, 0, 0,244, 0, 0, 0,
/* 0x0a90 */ 208, 10, 0, 0, 48, 1, 0, 0, 15, 0, 0, 0, 8, 0, 0, 0, /* 0x0a90 */ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
/* 0x0aa0 */ 4, 0, 0, 0, 16, 0, 0, 0, 9, 0, 0, 0, 3, 0, 0, 0, /* 0x0aa0 */ 92, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
/* 0x0ab0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0,128, 0, 0, 0, /* 0x0ab0 */ 104, 13, 0, 0, 8, 0, 0, 0, 14, 0, 0, 0, 11, 0, 0, 0,
/* 0x0ac0 */ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, /* 0x0ac0 */ 4, 0, 0, 0, 8, 0, 0, 0, 17, 0, 0, 0, 3, 0, 0, 0,
/* 0x0ad0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x0ad0 */ 0, 0, 0, 0, 0, 0, 0, 0, 84, 8, 0, 0,105, 0, 0, 0,
/* 0x0ae0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 9, 0, /* 0x0ae0 */ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
/* 0x0af0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 11, 0, /* 0x0af0 */ 1, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
/* 0x0b00 */ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, /* 0x0b00 */ 64, 11, 0, 0, 48, 1, 0, 0, 15, 0, 0, 0, 8, 0, 0, 0,
/* 0x0b10 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 1, 0, /* 0x0b10 */ 4, 0, 0, 0, 16, 0, 0, 0, 9, 0, 0, 0, 3, 0, 0, 0,
/* 0x0b20 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 3, 0, /* 0x0b20 */ 0, 0, 0, 0, 0, 0, 0, 0,112, 12, 0, 0,128, 0, 0, 0,
/* 0x0b30 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 5, 0, /* 0x0b30 */ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
/* 0x0b40 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 7, 0, /* 0x0b40 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
/* 0x0b50 */ 8, 0, 0, 0, 57, 1, 0, 0, 0, 0, 0, 0, 16, 0, 9, 0, /* 0x0b50 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 9, 0,
/* 0x0b60 */ 22, 0, 0, 0, 78, 0, 0, 0, 0, 0, 0, 0, 16, 0, 11, 0, /* 0x0b60 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 11, 0,
/* 0x0b70 */ 30, 0, 0, 0, 0, 0, 0, 0, 53, 2, 0, 0, 18, 0, 5, 0, /* 0x0b70 */ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0,
/* 0x0b80 */ 54, 0, 0, 0,102, 0, 0, 0, 0, 0, 0, 0, 16, 0, 11, 0, /* 0x0b80 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 1, 0,
/* 0x0b90 */ 59, 0, 0, 0, 0, 0, 0, 0,175, 0, 0, 0, 18, 0, 7, 0, /* 0x0b90 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 3, 0,
/* 0x0ba0 */ 81, 0, 0, 0, 23, 0, 0, 0, 0, 0, 0, 0, 16, 0, 11, 0, /* 0x0ba0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 5, 0,
/* 0x0bb0 */ 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 11, 0, /* 0x0bb0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 7, 0,
/* 0x0bc0 */ 102, 0, 0, 0, 60, 0, 0, 0, 0, 0, 0, 0, 16, 0, 11, 0, /* 0x0bc0 */ 8, 0, 0, 0, 57, 1, 0, 0, 0, 0, 0, 0, 16, 0, 9, 0,
/* 0x0bd0 */ 109, 0, 0, 0,100, 0, 0, 0, 0, 0, 0, 0, 16, 0, 11, 0, /* 0x0bd0 */ 22, 0, 0, 0, 78, 0, 0, 0, 0, 0, 0, 0, 16, 0, 11, 0,
/* 0x0be0 */ 117, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 16, 0, 11, 0, /* 0x0be0 */ 30, 0, 0, 0, 0, 0, 0, 0, 53, 2, 0, 0, 18, 0, 5, 0,
/* 0x0bf0 */ 122, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 16, 0, 11, 0, /* 0x0bf0 */ 54, 0, 0, 0,102, 0, 0, 0, 0, 0, 0, 0, 16, 0, 11, 0,
/* 0x0c00 */ 0, 95,115,116, 97,114,116, 0,103,101,116, 95,112, 97,103,101, /* 0x0c00 */ 59, 0, 0, 0, 0, 0, 0, 0, 31, 1, 0, 0, 18, 0, 7, 0,
/* 0x0c10 */ 95,109, 97,115,107, 0,109,101,109,112, 99,112,121, 0,117,112, /* 0x0c10 */ 81, 0, 0, 0, 23, 0, 0, 0, 0, 0, 0, 0, 16, 0, 11, 0,
/* 0x0c20 */ 120, 95,109,109, 97,112, 95, 97,110,100, 95,102,100, 95, 97,110, /* 0x0c20 */ 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 11, 0,
/* 0x0c30 */ 100,114,111,105,100, 0,109,109, 97,112, 0,117,112,120, 95,109, /* 0x0c30 */ 102, 0, 0, 0, 60, 0, 0, 0, 0, 0, 0, 0, 16, 0, 11, 0,
/* 0x0c40 */ 109, 97,112, 95, 97,110,100, 95,102,100, 95,108,105,110,117,120, /* 0x0c40 */ 109, 0, 0, 0,100, 0, 0, 0, 0, 0, 0, 0, 16, 0, 11, 0,
/* 0x0c50 */ 0,117,110, 97,109,101, 0,103,101,116, 95,117,112,120,102,110, /* 0x0c50 */ 117, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 16, 0, 11, 0,
/* 0x0c60 */ 95,112, 97,116,104, 0,109,101,109,115,101,116, 0,109,121, 95, /* 0x0c60 */ 122, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 16, 0, 11, 0,
/* 0x0c70 */ 98,107,112,116, 0,115,116, 97,116, 0,109,107,100,105,114, 0, /* 0x0c70 */ 0, 95,115,116, 97,114,116, 0,103,101,116, 95,112, 97,103,101,
/* 0x0c80 */ 1, 0, 0, 0, 2, 10, 0, 0, 1, 0, 0, 0, 2, 12, 0, 0, /* 0x0c80 */ 95,109, 97,115,107, 0,109,101,109,112, 99,112,121, 0,117,112,
/* 0x0c90 */ 124, 0, 0, 0, 2, 16, 0, 0,241, 0, 0, 0, 2, 14, 0, 0, /* 0x0c90 */ 120, 95,109,109, 97,112, 95, 97,110,100, 95,102,100, 95, 97,110,
/* 0x0ca0 */ 111, 1, 0, 0, 2, 8, 0, 0,224, 1, 0, 0, 2, 8, 0, 0, /* 0x0ca0 */ 100,114,111,105,100, 0,109,109, 97,112, 0,117,112,120, 95,109,
/* 0x0cb0 */ 18, 2, 0, 0, 2, 11, 0, 0, 73, 2, 0, 0, 2, 15, 0, 0, /* 0x0cb0 */ 109, 97,112, 95, 97,110,100, 95,102,100, 95,108,105,110,117,120,
/* 0x0cc0 */ 152, 2, 0, 0, 2, 16, 0, 0, 94, 3, 0, 0, 2, 16, 0, 0, /* 0x0cc0 */ 0,117,110, 97,109,101, 0,103,101,116, 95,117,112,120,102,110,
/* 0x0cd0 */ 146, 3, 0, 0, 2, 9, 0, 0,238, 3, 0, 0, 2, 9, 0, 0, /* 0x0cd0 */ 95,112, 97,116,104, 0,109,101,109,115,101,116, 0,109,121, 95,
/* 0x0ce0 */ 141, 0, 0, 0, 2, 11, 0, 0,148, 0, 0, 0, 2, 8, 0, 0, /* 0x0ce0 */ 98,107,112,116, 0,115,116, 97,116, 0,109,107,100,105,114, 0,
/* 0x0cf0 */ 2, 0, 0, 0, 2, 2, 0, 0,240, 0, 0, 0, 2, 1, 0, 0, /* 0x0cf0 */ 1, 0, 0, 0, 2, 10, 0, 0, 1, 0, 0, 0, 2, 12, 0, 0,
/* 0x0d00 */ 102,105,108,101, 32,102,111,114,109, 97,116, 32,101,108,102, 51, /* 0x0d00 */ 124, 0, 0, 0, 2, 16, 0, 0,241, 0, 0, 0, 2, 14, 0, 0,
/* 0x0d10 */ 50, 45,105, 51, 56, 54, 10, 10, 83,101, 99,116,105,111,110,115, /* 0x0d10 */ 111, 1, 0, 0, 2, 8, 0, 0,224, 1, 0, 0, 2, 8, 0, 0,
/* 0x0d20 */ 58, 10, 73,100,120, 32, 78, 97,109,101, 32, 32, 32, 32, 32, 32, /* 0x0d20 */ 18, 2, 0, 0, 2, 11, 0, 0, 73, 2, 0, 0, 2, 15, 0, 0,
/* 0x0d30 */ 32, 32, 32, 32, 83,105,122,101, 32, 32, 32, 32, 32, 32, 86, 77, /* 0x0d30 */ 152, 2, 0, 0, 2, 16, 0, 0, 94, 3, 0, 0, 2, 16, 0, 0,
/* 0x0d40 */ 65, 32, 32, 32, 32, 32, 32, 32, 76, 77, 65, 32, 32, 32, 32, 32, /* 0x0d40 */ 146, 3, 0, 0, 2, 9, 0, 0,238, 3, 0, 0, 2, 9, 0, 0,
/* 0x0d50 */ 32, 32, 70,105,108,101, 32,111,102,102, 32, 32, 65,108,103,110, /* 0x0d50 */ 253, 0, 0, 0, 2, 11, 0, 0, 4, 1, 0, 0, 2, 8, 0, 0,
/* 0x0d60 */ 32, 32, 70,108, 97,103,115, 10, 32, 32, 48, 32, 72, 85, 77, 70, /* 0x0d60 */ 2, 0, 0, 0, 2, 2, 0, 0,240, 0, 0, 0, 2, 1, 0, 0,
/* 0x0d70 */ 95, 65, 32, 32, 32, 32, 32, 32, 32, 32, 48, 53, 32, 32, 48, 32, /* 0x0d70 */ 102,105,108,101, 32,102,111,114,109, 97,116, 32,101,108,102, 51,
/* 0x0d80 */ 32, 48, 32, 32, 48, 51, 52, 32, 32, 50, 42, 42, 48, 32, 32, 67, /* 0x0d80 */ 50, 45,105, 51, 56, 54, 10, 10, 83,101, 99,116,105,111,110,115,
/* 0x0d90 */ 79, 78, 84, 69, 78, 84, 83, 10, 32, 32, 49, 32, 72, 85, 77, 70, /* 0x0d90 */ 58, 10, 73,100,120, 32, 78, 97,109,101, 32, 32, 32, 32, 32, 32,
/* 0x0da0 */ 95, 76, 32, 32, 32, 32, 32, 32, 32, 32, 48, 53, 32, 32, 48, 32, /* 0x0da0 */ 32, 32, 32, 32, 83,105,122,101, 32, 32, 32, 32, 32, 32, 86, 77,
/* 0x0db0 */ 32, 48, 32, 32, 48, 51, 57, 32, 32, 50, 42, 42, 48, 32, 32, 67, /* 0x0db0 */ 65, 32, 32, 32, 32, 32, 32, 32, 76, 77, 65, 32, 32, 32, 32, 32,
/* 0x0dc0 */ 79, 78, 84, 69, 78, 84, 83, 10, 32, 32, 50, 32, 85, 77, 70, 95, /* 0x0dc0 */ 32, 32, 70,105,108,101, 32,111,102,102, 32, 32, 65,108,103,110,
/* 0x0dd0 */ 65, 78, 68, 82, 79, 73, 68, 32, 32, 32, 48, 52, 98,102, 32, 32, /* 0x0dd0 */ 32, 32, 70,108, 97,103,115, 10, 32, 32, 48, 32, 72, 85, 77, 70,
/* 0x0de0 */ 48, 32, 32, 48, 32, 32, 48, 52, 48, 32, 32, 50, 42, 42, 50, 32, /* 0x0de0 */ 95, 65, 32, 32, 32, 32, 32, 32, 32, 32, 48, 53, 32, 32, 48, 32,
/* 0x0df0 */ 32, 67, 79, 78, 84, 69, 78, 84, 83, 10, 32, 32, 51, 32, 85, 77, /* 0x0df0 */ 32, 48, 32, 32, 48, 51, 52, 32, 32, 50, 42, 42, 48, 32, 32, 67,
/* 0x0e00 */ 70, 95, 76, 73, 78, 85, 88, 32, 32, 32, 32, 32, 48, 97,102, 32, /* 0x0e00 */ 79, 78, 84, 69, 78, 84, 83, 10, 32, 32, 49, 32, 72, 85, 77, 70,
/* 0x0e10 */ 32, 48, 32, 32, 48, 32, 32, 48, 53, 48, 48, 32, 32, 50, 42, 42, /* 0x0e10 */ 95, 76, 32, 32, 32, 32, 32, 32, 32, 32, 48, 53, 32, 32, 48, 32,
/* 0x0e20 */ 50, 32, 32, 67, 79, 78, 84, 69, 78, 84, 83, 10, 32, 32, 52, 32, /* 0x0e20 */ 32, 48, 32, 32, 48, 51, 57, 32, 32, 50, 42, 42, 48, 32, 32, 67,
/* 0x0e30 */ 69, 76, 70, 77, 65, 73, 78, 88, 32, 32, 32, 32, 32, 32, 48, 49, /* 0x0e30 */ 79, 78, 84, 69, 78, 84, 83, 10, 32, 32, 50, 32, 85, 77, 70, 95,
/* 0x0e40 */ 52, 48, 32, 32, 48, 32, 32, 48, 32, 32, 48, 53, 98, 48, 32, 32, /* 0x0e40 */ 65, 78, 68, 82, 79, 73, 68, 32, 32, 32, 48, 52, 98,102, 32, 32,
/* 0x0e50 */ 50, 42, 42, 50, 32, 32, 67, 79, 78, 84, 69, 78, 84, 83, 10, 32, /* 0x0e50 */ 48, 32, 32, 48, 32, 32, 48, 52, 48, 32, 32, 50, 42, 42, 50, 32,
/* 0x0e60 */ 32, 53, 32, 69, 76, 70, 77, 65, 73, 78, 90, 32, 32, 32, 32, 32, /* 0x0e60 */ 32, 67, 79, 78, 84, 69, 78, 84, 83, 10, 32, 32, 51, 32, 85, 77,
/* 0x0e70 */ 32, 48,102, 52, 32, 32, 48, 32, 32, 48, 32, 32, 48, 54,102, 48, /* 0x0e70 */ 70, 95, 76, 73, 78, 85, 88, 32, 32, 32, 32, 32, 48, 49, 49,102,
/* 0x0e80 */ 32, 32, 50, 42, 42, 48, 32, 32, 67, 79, 78, 84, 69, 78, 84, 83, /* 0x0e80 */ 32, 32, 48, 32, 32, 48, 32, 32, 48, 53, 48, 48, 32, 32, 50, 42,
/* 0x0e90 */ 10, 83, 89, 77, 66, 79, 76, 32, 84, 65, 66, 76, 69, 58, 10, 48, /* 0x0e90 */ 42, 50, 32, 32, 67, 79, 78, 84, 69, 78, 84, 83, 10, 32, 32, 52,
/* 0x0ea0 */ 48, 48, 48, 48, 48, 48, 48, 32,108, 32, 32, 32, 32,100, 32, 32, /* 0x0ea0 */ 32, 69, 76, 70, 77, 65, 73, 78, 88, 32, 32, 32, 32, 32, 32, 48,
/* 0x0eb0 */ 69, 76, 70, 77, 65, 73, 78, 88, 32, 48, 32, 69, 76, 70, 77, 65, /* 0x0eb0 */ 49, 52, 48, 32, 32, 48, 32, 32, 48, 32, 32, 48, 54, 50, 48, 32,
/* 0x0ec0 */ 73, 78, 88, 10, 48, 48, 48, 48, 48, 48, 48, 48, 32,108, 32, 32, /* 0x0ec0 */ 32, 50, 42, 42, 50, 32, 32, 67, 79, 78, 84, 69, 78, 84, 83, 10,
/* 0x0ed0 */ 32, 32,100, 32, 32, 69, 76, 70, 77, 65, 73, 78, 90, 32, 48, 32, /* 0x0ed0 */ 32, 32, 53, 32, 69, 76, 70, 77, 65, 73, 78, 90, 32, 32, 32, 32,
/* 0x0ee0 */ 69, 76, 70, 77, 65, 73, 78, 90, 10, 48, 48, 48, 48, 48, 48, 48, /* 0x0ee0 */ 32, 32, 48,102, 52, 32, 32, 48, 32, 32, 48, 32, 32, 48, 55, 54,
/* 0x0ef0 */ 48, 32,108, 32, 32, 32, 32, 32, 32, 32, 69, 76, 70, 77, 65, 73, /* 0x0ef0 */ 48, 32, 32, 50, 42, 42, 48, 32, 32, 67, 79, 78, 84, 69, 78, 84,
/* 0x0f00 */ 78, 88, 32, 48, 32, 95,115,116, 97,114,116, 10, 48, 48, 48, 48, /* 0x0f00 */ 83, 10, 83, 89, 77, 66, 79, 76, 32, 84, 65, 66, 76, 69, 58, 10,
/* 0x0f10 */ 48, 48, 48, 48, 32,108, 32, 32, 32, 32,100, 32, 32, 72, 85, 77, /* 0x0f10 */ 48, 48, 48, 48, 48, 48, 48, 48, 32,108, 32, 32, 32, 32,100, 32,
/* 0x0f20 */ 70, 95, 65, 32, 48, 32, 72, 85, 77, 70, 95, 65, 10, 48, 48, 48, /* 0x0f20 */ 32, 69, 76, 70, 77, 65, 73, 78, 88, 32, 48, 32, 69, 76, 70, 77,
/* 0x0f30 */ 48, 48, 48, 48, 48, 32,108, 32, 32, 32, 32,100, 32, 32, 72, 85, /* 0x0f30 */ 65, 73, 78, 88, 10, 48, 48, 48, 48, 48, 48, 48, 48, 32,108, 32,
/* 0x0f40 */ 77, 70, 95, 76, 32, 48, 32, 72, 85, 77, 70, 95, 76, 10, 48, 48, /* 0x0f40 */ 32, 32, 32,100, 32, 32, 69, 76, 70, 77, 65, 73, 78, 90, 32, 48,
/* 0x0f50 */ 48, 48, 48, 48, 48, 48, 32,108, 32, 32, 32, 32,100, 32, 32, 85, /* 0x0f50 */ 32, 69, 76, 70, 77, 65, 73, 78, 90, 10, 48, 48, 48, 48, 48, 48,
/* 0x0f60 */ 77, 70, 95, 65, 78, 68, 82, 79, 73, 68, 32, 48, 32, 85, 77, 70, /* 0x0f60 */ 48, 48, 32,108, 32, 32, 32, 32, 32, 32, 32, 69, 76, 70, 77, 65,
/* 0x0f70 */ 95, 65, 78, 68, 82, 79, 73, 68, 10, 48, 48, 48, 48, 48, 48, 48, /* 0x0f70 */ 73, 78, 88, 32, 48, 32, 95,115,116, 97,114,116, 10, 48, 48, 48,
/* 0x0f80 */ 48, 32,108, 32, 32, 32, 32,100, 32, 32, 85, 77, 70, 95, 76, 73, /* 0x0f80 */ 48, 48, 48, 48, 48, 32,108, 32, 32, 32, 32,100, 32, 32, 72, 85,
/* 0x0f90 */ 78, 85, 88, 32, 48, 32, 85, 77, 70, 95, 76, 73, 78, 85, 88, 10, /* 0x0f90 */ 77, 70, 95, 65, 32, 48, 32, 72, 85, 77, 70, 95, 65, 10, 48, 48,
/* 0x0fa0 */ 48, 48, 48, 48, 48, 49, 51, 57, 32,103, 32, 32, 32, 32, 32, 32, /* 0x0fa0 */ 48, 48, 48, 48, 48, 48, 32,108, 32, 32, 32, 32,100, 32, 32, 72,
/* 0x0fb0 */ 32, 69, 76, 70, 77, 65, 73, 78, 88, 32, 48, 32,103,101,116, 95, /* 0x0fb0 */ 85, 77, 70, 95, 76, 32, 48, 32, 72, 85, 77, 70, 95, 76, 10, 48,
/* 0x0fc0 */ 112, 97,103,101, 95,109, 97,115,107, 10, 48, 48, 48, 48, 48, 48, /* 0x0fc0 */ 48, 48, 48, 48, 48, 48, 48, 32,108, 32, 32, 32, 32,100, 32, 32,
/* 0x0fd0 */ 52,101, 32,103, 32, 32, 32, 32, 32, 32, 32, 69, 76, 70, 77, 65, /* 0x0fd0 */ 85, 77, 70, 95, 65, 78, 68, 82, 79, 73, 68, 32, 48, 32, 85, 77,
/* 0x0fe0 */ 73, 78, 90, 32, 48, 32,109,101,109,112, 99,112,121, 10, 48, 48, /* 0x0fe0 */ 70, 95, 65, 78, 68, 82, 79, 73, 68, 10, 48, 48, 48, 48, 48, 48,
/* 0x0ff0 */ 48, 48, 48, 48, 48, 48, 32,103, 32, 32, 32, 32, 32, 70, 32, 85, /* 0x0ff0 */ 48, 48, 32,108, 32, 32, 32, 32,100, 32, 32, 85, 77, 70, 95, 76,
/* 0x1000 */ 77, 70, 95, 65, 78, 68, 82, 79, 73, 68, 32, 48, 50, 51, 53, 32, /* 0x1000 */ 73, 78, 85, 88, 32, 48, 32, 85, 77, 70, 95, 76, 73, 78, 85, 88,
/* 0x1010 */ 117,112,120, 95,109,109, 97,112, 95, 97,110,100, 95,102,100, 95, /* 0x1010 */ 10, 48, 48, 48, 48, 48, 49, 51, 57, 32,103, 32, 32, 32, 32, 32,
/* 0x1020 */ 97,110,100,114,111,105,100, 10, 48, 48, 48, 48, 48, 48, 54, 54, /* 0x1020 */ 32, 32, 69, 76, 70, 77, 65, 73, 78, 88, 32, 48, 32,103,101,116,
/* 0x1030 */ 32,103, 32, 32, 32, 32, 32, 32, 32, 69, 76, 70, 77, 65, 73, 78, /* 0x1030 */ 95,112, 97,103,101, 95,109, 97,115,107, 10, 48, 48, 48, 48, 48,
/* 0x1040 */ 90, 32, 48, 32,109,109, 97,112, 10, 48, 48, 48, 48, 48, 48, 48, /* 0x1040 */ 48, 52,101, 32,103, 32, 32, 32, 32, 32, 32, 32, 69, 76, 70, 77,
/* 0x1050 */ 48, 32,103, 32, 32, 32, 32, 32, 70, 32, 85, 77, 70, 95, 76, 73, /* 0x1050 */ 65, 73, 78, 90, 32, 48, 32,109,101,109,112, 99,112,121, 10, 48,
/* 0x1060 */ 78, 85, 88, 32, 48, 97,102, 32,117,112,120, 95,109,109, 97,112, /* 0x1060 */ 48, 48, 48, 48, 48, 48, 48, 32,103, 32, 32, 32, 32, 32, 70, 32,
/* 0x1070 */ 95, 97,110,100, 95,102,100, 95,108,105,110,117,120, 10, 48, 48, /* 0x1070 */ 85, 77, 70, 95, 65, 78, 68, 82, 79, 73, 68, 32, 48, 50, 51, 53,
/* 0x1080 */ 48, 48, 48, 48, 49, 55, 32,103, 32, 32, 32, 32, 32, 32, 32, 69, /* 0x1080 */ 32,117,112,120, 95,109,109, 97,112, 95, 97,110,100, 95,102,100,
/* 0x1090 */ 76, 70, 77, 65, 73, 78, 90, 32, 48, 32,117,110, 97,109,101, 10, /* 0x1090 */ 95, 97,110,100,114,111,105,100, 10, 48, 48, 48, 48, 48, 48, 54,
/* 0x10a0 */ 48, 48, 48, 48, 48, 48, 48, 48, 32,103, 32, 32, 32, 32, 32, 32, /* 0x10a0 */ 54, 32,103, 32, 32, 32, 32, 32, 32, 32, 69, 76, 70, 77, 65, 73,
/* 0x10b0 */ 32, 69, 76, 70, 77, 65, 73, 78, 90, 32, 48, 32,103,101,116, 95, /* 0x10b0 */ 78, 90, 32, 48, 32,109,109, 97,112, 10, 48, 48, 48, 48, 48, 48,
/* 0x10c0 */ 117,112,120,102,110, 95,112, 97,116,104, 10, 48, 48, 48, 48, 48, /* 0x10c0 */ 48, 48, 32,103, 32, 32, 32, 32, 32, 70, 32, 85, 77, 70, 95, 76,
/* 0x10d0 */ 48, 51, 99, 32,103, 32, 32, 32, 32, 32, 32, 32, 69, 76, 70, 77, /* 0x10d0 */ 73, 78, 85, 88, 32, 48, 49, 49,102, 32,117,112,120, 95,109,109,
/* 0x10e0 */ 65, 73, 78, 90, 32, 48, 32,109,101,109,115,101,116, 10, 48, 48, /* 0x10e0 */ 97,112, 95, 97,110,100, 95,102,100, 95,108,105,110,117,120, 10,
/* 0x10f0 */ 48, 48, 48, 48, 54, 52, 32,103, 32, 32, 32, 32, 32, 32, 32, 69, /* 0x10f0 */ 48, 48, 48, 48, 48, 48, 49, 55, 32,103, 32, 32, 32, 32, 32, 32,
/* 0x1100 */ 76, 70, 77, 65, 73, 78, 90, 32, 48, 32,109,121, 95, 98,107,112, /* 0x1100 */ 32, 69, 76, 70, 77, 65, 73, 78, 90, 32, 48, 32,117,110, 97,109,
/* 0x1110 */ 116, 10, 48, 48, 48, 48, 48, 48, 48, 51, 32,103, 32, 32, 32, 32, /* 0x1110 */ 101, 10, 48, 48, 48, 48, 48, 48, 48, 48, 32,103, 32, 32, 32, 32,
/* 0x1120 */ 32, 32, 32, 69, 76, 70, 77, 65, 73, 78, 90, 32, 48, 32,115,116, /* 0x1120 */ 32, 32, 32, 69, 76, 70, 77, 65, 73, 78, 90, 32, 48, 32,103,101,
/* 0x1130 */ 97,116, 10, 48, 48, 48, 48, 48, 48, 50, 56, 32,103, 32, 32, 32, /* 0x1130 */ 116, 95,117,112,120,102,110, 95,112, 97,116,104, 10, 48, 48, 48,
/* 0x1140 */ 32, 32, 32, 32, 69, 76, 70, 77, 65, 73, 78, 90, 32, 48, 32,109, /* 0x1140 */ 48, 48, 48, 51, 99, 32,103, 32, 32, 32, 32, 32, 32, 32, 69, 76,
/* 0x1150 */ 107,100,105,114, 10, 10, 82, 69, 76, 79, 67, 65, 84, 73, 79, 78, /* 0x1150 */ 70, 77, 65, 73, 78, 90, 32, 48, 32,109,101,109,115,101,116, 10,
/* 0x1160 */ 32, 82, 69, 67, 79, 82, 68, 83, 32, 70, 79, 82, 32, 91, 72, 85, /* 0x1160 */ 48, 48, 48, 48, 48, 48, 54, 52, 32,103, 32, 32, 32, 32, 32, 32,
/* 0x1170 */ 77, 70, 95, 65, 93, 58, 10, 79, 70, 70, 83, 69, 84, 32, 32, 32, /* 0x1170 */ 32, 69, 76, 70, 77, 65, 73, 78, 90, 32, 48, 32,109,121, 95, 98,
/* 0x1180 */ 84, 89, 80, 69, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, /* 0x1180 */ 107,112,116, 10, 48, 48, 48, 48, 48, 48, 48, 51, 32,103, 32, 32,
/* 0x1190 */ 32, 32, 86, 65, 76, 85, 69, 10, 48, 48, 48, 48, 48, 48, 48, 49, /* 0x1190 */ 32, 32, 32, 32, 32, 69, 76, 70, 77, 65, 73, 78, 90, 32, 48, 32,
/* 0x11a0 */ 32, 82, 95, 51, 56, 54, 95, 80, 67, 51, 50, 32, 32, 32, 32, 32, /* 0x11a0 */ 115,116, 97,116, 10, 48, 48, 48, 48, 48, 48, 50, 56, 32,103, 32,
/* 0x11b0 */ 32, 32, 32,117,112,120, 95,109,109, 97,112, 95, 97,110,100, 95, /* 0x11b0 */ 32, 32, 32, 32, 32, 32, 69, 76, 70, 77, 65, 73, 78, 90, 32, 48,
/* 0x11c0 */ 102,100, 95, 97,110,100,114,111,105,100, 10, 10, 82, 69, 76, 79, /* 0x11c0 */ 32,109,107,100,105,114, 10, 10, 82, 69, 76, 79, 67, 65, 84, 73,
/* 0x11d0 */ 67, 65, 84, 73, 79, 78, 32, 82, 69, 67, 79, 82, 68, 83, 32, 70, /* 0x11d0 */ 79, 78, 32, 82, 69, 67, 79, 82, 68, 83, 32, 70, 79, 82, 32, 91,
/* 0x11e0 */ 79, 82, 32, 91, 72, 85, 77, 70, 95, 76, 93, 58, 10, 79, 70, 70, /* 0x11e0 */ 72, 85, 77, 70, 95, 65, 93, 58, 10, 79, 70, 70, 83, 69, 84, 32,
/* 0x11f0 */ 83, 69, 84, 32, 32, 32, 84, 89, 80, 69, 32, 32, 32, 32, 32, 32, /* 0x11f0 */ 32, 32, 84, 89, 80, 69, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
/* 0x1200 */ 32, 32, 32, 32, 32, 32, 32, 32, 86, 65, 76, 85, 69, 10, 48, 48, /* 0x1200 */ 32, 32, 32, 32, 86, 65, 76, 85, 69, 10, 48, 48, 48, 48, 48, 48,
/* 0x1210 */ 48, 48, 48, 48, 48, 49, 32, 82, 95, 51, 56, 54, 95, 80, 67, 51, /* 0x1210 */ 48, 49, 32, 82, 95, 51, 56, 54, 95, 80, 67, 51, 50, 32, 32, 32,
/* 0x1220 */ 50, 32, 32, 32, 32, 32, 32, 32, 32,117,112,120, 95,109,109, 97, /* 0x1220 */ 32, 32, 32, 32, 32,117,112,120, 95,109,109, 97,112, 95, 97,110,
/* 0x1230 */ 112, 95, 97,110,100, 95,102,100, 95,108,105,110,117,120, 10, 10, /* 0x1230 */ 100, 95,102,100, 95, 97,110,100,114,111,105,100, 10, 10, 82, 69,
/* 0x1240 */ 82, 69, 76, 79, 67, 65, 84, 73, 79, 78, 32, 82, 69, 67, 79, 82, /* 0x1240 */ 76, 79, 67, 65, 84, 73, 79, 78, 32, 82, 69, 67, 79, 82, 68, 83,
/* 0x1250 */ 68, 83, 32, 70, 79, 82, 32, 91, 85, 77, 70, 95, 65, 78, 68, 82, /* 0x1250 */ 32, 70, 79, 82, 32, 91, 72, 85, 77, 70, 95, 76, 93, 58, 10, 79,
/* 0x1260 */ 79, 73, 68, 93, 58, 10, 79, 70, 70, 83, 69, 84, 32, 32, 32, 84, /* 0x1260 */ 70, 70, 83, 69, 84, 32, 32, 32, 84, 89, 80, 69, 32, 32, 32, 32,
/* 0x1270 */ 89, 80, 69, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, /* 0x1270 */ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 86, 65, 76, 85, 69, 10,
/* 0x1280 */ 32, 86, 65, 76, 85, 69, 10, 48, 48, 48, 48, 48, 48, 55, 99, 32, /* 0x1280 */ 48, 48, 48, 48, 48, 48, 48, 49, 32, 82, 95, 51, 56, 54, 95, 80,
/* 0x1290 */ 82, 95, 51, 56, 54, 95, 80, 67, 51, 50, 32, 32, 32, 32, 32, 32, /* 0x1290 */ 67, 51, 50, 32, 32, 32, 32, 32, 32, 32, 32,117,112,120, 95,109,
/* 0x12a0 */ 32, 32,109,121, 95, 98,107,112,116, 10, 48, 48, 48, 48, 48, 48, /* 0x12a0 */ 109, 97,112, 95, 97,110,100, 95,102,100, 95,108,105,110,117,120,
/* 0x12b0 */ 102, 49, 32, 82, 95, 51, 56, 54, 95, 80, 67, 51, 50, 32, 32, 32, /* 0x12b0 */ 10, 10, 82, 69, 76, 79, 67, 65, 84, 73, 79, 78, 32, 82, 69, 67,
/* 0x12c0 */ 32, 32, 32, 32, 32,103,101,116, 95,117,112,120,102,110, 95,112, /* 0x12c0 */ 79, 82, 68, 83, 32, 70, 79, 82, 32, 91, 85, 77, 70, 95, 65, 78,
/* 0x12d0 */ 97,116,104, 10, 48, 48, 48, 48, 48, 49, 54,102, 32, 82, 95, 51, /* 0x12d0 */ 68, 82, 79, 73, 68, 93, 58, 10, 79, 70, 70, 83, 69, 84, 32, 32,
/* 0x12e0 */ 56, 54, 95, 80, 67, 51, 50, 32, 32, 32, 32, 32, 32, 32, 32,103, /* 0x12e0 */ 32, 84, 89, 80, 69, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
/* 0x12f0 */ 101,116, 95,112, 97,103,101, 95,109, 97,115,107, 10, 48, 48, 48, /* 0x12f0 */ 32, 32, 32, 86, 65, 76, 85, 69, 10, 48, 48, 48, 48, 48, 48, 55,
/* 0x1300 */ 48, 48, 49,101, 48, 32, 82, 95, 51, 56, 54, 95, 80, 67, 51, 50, /* 0x1300 */ 99, 32, 82, 95, 51, 56, 54, 95, 80, 67, 51, 50, 32, 32, 32, 32,
/* 0x1310 */ 32, 32, 32, 32, 32, 32, 32, 32,103,101,116, 95,112, 97,103,101, /* 0x1310 */ 32, 32, 32, 32,109,121, 95, 98,107,112,116, 10, 48, 48, 48, 48,
/* 0x1320 */ 95,109, 97,115,107, 10, 48, 48, 48, 48, 48, 50, 49, 50, 32, 82, /* 0x1320 */ 48, 48,102, 49, 32, 82, 95, 51, 56, 54, 95, 80, 67, 51, 50, 32,
/* 0x1330 */ 95, 51, 56, 54, 95, 80, 67, 51, 50, 32, 32, 32, 32, 32, 32, 32, /* 0x1330 */ 32, 32, 32, 32, 32, 32, 32,103,101,116, 95,117,112,120,102,110,
/* 0x1340 */ 32,109,109, 97,112, 10, 48, 48, 48, 48, 48, 50, 52, 57, 32, 82, /* 0x1340 */ 95,112, 97,116,104, 10, 48, 48, 48, 48, 48, 49, 54,102, 32, 82,
/* 0x1350 */ 95, 51, 56, 54, 95, 80, 67, 51, 50, 32, 32, 32, 32, 32, 32, 32, /* 0x1350 */ 95, 51, 56, 54, 95, 80, 67, 51, 50, 32, 32, 32, 32, 32, 32, 32,
/* 0x1360 */ 32,109,101,109,115,101,116, 10, 48, 48, 48, 48, 48, 50, 57, 56, /* 0x1360 */ 32,103,101,116, 95,112, 97,103,101, 95,109, 97,115,107, 10, 48,
/* 0x1370 */ 32, 82, 95, 51, 56, 54, 95, 80, 67, 51, 50, 32, 32, 32, 32, 32, /* 0x1370 */ 48, 48, 48, 48, 49,101, 48, 32, 82, 95, 51, 56, 54, 95, 80, 67,
/* 0x1380 */ 32, 32, 32,109,121, 95, 98,107,112,116, 10, 48, 48, 48, 48, 48, /* 0x1380 */ 51, 50, 32, 32, 32, 32, 32, 32, 32, 32,103,101,116, 95,112, 97,
/* 0x1390 */ 51, 53,101, 32, 82, 95, 51, 56, 54, 95, 80, 67, 51, 50, 32, 32, /* 0x1390 */ 103,101, 95,109, 97,115,107, 10, 48, 48, 48, 48, 48, 50, 49, 50,
/* 0x13a0 */ 32, 32, 32, 32, 32, 32,109,121, 95, 98,107,112,116, 10, 48, 48, /* 0x13a0 */ 32, 82, 95, 51, 56, 54, 95, 80, 67, 51, 50, 32, 32, 32, 32, 32,
/* 0x13b0 */ 48, 48, 48, 51, 57, 50, 32, 82, 95, 51, 56, 54, 95, 80, 67, 51, /* 0x13b0 */ 32, 32, 32,109,109, 97,112, 10, 48, 48, 48, 48, 48, 50, 52, 57,
/* 0x13c0 */ 50, 32, 32, 32, 32, 32, 32, 32, 32,109,101,109,112, 99,112,121, /* 0x13c0 */ 32, 82, 95, 51, 56, 54, 95, 80, 67, 51, 50, 32, 32, 32, 32, 32,
/* 0x13d0 */ 10, 48, 48, 48, 48, 48, 51,101,101, 32, 82, 95, 51, 56, 54, 95, /* 0x13d0 */ 32, 32, 32,109,101,109,115,101,116, 10, 48, 48, 48, 48, 48, 50,
/* 0x13e0 */ 80, 67, 51, 50, 32, 32, 32, 32, 32, 32, 32, 32,109,101,109,112, /* 0x13e0 */ 57, 56, 32, 82, 95, 51, 56, 54, 95, 80, 67, 51, 50, 32, 32, 32,
/* 0x13f0 */ 99,112,121, 10, 10, 82, 69, 76, 79, 67, 65, 84, 73, 79, 78, 32, /* 0x13f0 */ 32, 32, 32, 32, 32,109,121, 95, 98,107,112,116, 10, 48, 48, 48,
/* 0x1400 */ 82, 69, 67, 79, 82, 68, 83, 32, 70, 79, 82, 32, 91, 85, 77, 70, /* 0x1400 */ 48, 48, 51, 53,101, 32, 82, 95, 51, 56, 54, 95, 80, 67, 51, 50,
/* 0x1410 */ 95, 76, 73, 78, 85, 88, 93, 58, 10, 79, 70, 70, 83, 69, 84, 32, /* 0x1410 */ 32, 32, 32, 32, 32, 32, 32, 32,109,121, 95, 98,107,112,116, 10,
/* 0x1420 */ 32, 32, 84, 89, 80, 69, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, /* 0x1420 */ 48, 48, 48, 48, 48, 51, 57, 50, 32, 82, 95, 51, 56, 54, 95, 80,
/* 0x1430 */ 32, 32, 32, 32, 86, 65, 76, 85, 69, 10, 48, 48, 48, 48, 48, 48, /* 0x1430 */ 67, 51, 50, 32, 32, 32, 32, 32, 32, 32, 32,109,101,109,112, 99,
/* 0x1440 */ 56,100, 32, 82, 95, 51, 56, 54, 95, 80, 67, 51, 50, 32, 32, 32, /* 0x1440 */ 112,121, 10, 48, 48, 48, 48, 48, 51,101,101, 32, 82, 95, 51, 56,
/* 0x1450 */ 32, 32, 32, 32, 32,109,109, 97,112, 10, 48, 48, 48, 48, 48, 48, /* 0x1450 */ 54, 95, 80, 67, 51, 50, 32, 32, 32, 32, 32, 32, 32, 32,109,101,
/* 0x1460 */ 57, 52, 32, 82, 95, 51, 56, 54, 95, 80, 67, 51, 50, 32, 32, 32, /* 0x1460 */ 109,112, 99,112,121, 10, 10, 82, 69, 76, 79, 67, 65, 84, 73, 79,
/* 0x1470 */ 32, 32, 32, 32, 32,103,101,116, 95,112, 97,103,101, 95,109, 97, /* 0x1470 */ 78, 32, 82, 69, 67, 79, 82, 68, 83, 32, 70, 79, 82, 32, 91, 85,
/* 0x1480 */ 115,107, 10, 10, 82, 69, 76, 79, 67, 65, 84, 73, 79, 78, 32, 82, /* 0x1480 */ 77, 70, 95, 76, 73, 78, 85, 88, 93, 58, 10, 79, 70, 70, 83, 69,
/* 0x1490 */ 69, 67, 79, 82, 68, 83, 32, 70, 79, 82, 32, 91, 69, 76, 70, 77, /* 0x1490 */ 84, 32, 32, 32, 84, 89, 80, 69, 32, 32, 32, 32, 32, 32, 32, 32,
/* 0x14a0 */ 65, 73, 78, 88, 93, 58, 10, 79, 70, 70, 83, 69, 84, 32, 32, 32, /* 0x14a0 */ 32, 32, 32, 32, 32, 32, 86, 65, 76, 85, 69, 10, 48, 48, 48, 48,
/* 0x14b0 */ 84, 89, 80, 69, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, /* 0x14b0 */ 48, 48,102,100, 32, 82, 95, 51, 56, 54, 95, 80, 67, 51, 50, 32,
/* 0x14c0 */ 32, 32, 86, 65, 76, 85, 69, 10, 48, 48, 48, 48, 48, 48, 48, 50, /* 0x14c0 */ 32, 32, 32, 32, 32, 32, 32,109,109, 97,112, 10, 48, 48, 48, 48,
/* 0x14d0 */ 32, 82, 95, 51, 56, 54, 95, 80, 67, 51, 50, 32, 32, 32, 32, 32, /* 0x14d0 */ 48, 49, 48, 52, 32, 82, 95, 51, 56, 54, 95, 80, 67, 51, 50, 32,
/* 0x14e0 */ 32, 32, 32, 69, 76, 70, 77, 65, 73, 78, 90, 10, 10, 82, 69, 76, /* 0x14e0 */ 32, 32, 32, 32, 32, 32, 32,103,101,116, 95,112, 97,103,101, 95,
/* 0x14f0 */ 79, 67, 65, 84, 73, 79, 78, 32, 82, 69, 67, 79, 82, 68, 83, 32, /* 0x14f0 */ 109, 97,115,107, 10, 10, 82, 69, 76, 79, 67, 65, 84, 73, 79, 78,
/* 0x1500 */ 70, 79, 82, 32, 91, 69, 76, 70, 77, 65, 73, 78, 90, 93, 58, 10, /* 0x1500 */ 32, 82, 69, 67, 79, 82, 68, 83, 32, 70, 79, 82, 32, 91, 69, 76,
/* 0x1510 */ 79, 70, 70, 83, 69, 84, 32, 32, 32, 84, 89, 80, 69, 32, 32, 32, /* 0x1510 */ 70, 77, 65, 73, 78, 88, 93, 58, 10, 79, 70, 70, 83, 69, 84, 32,
/* 0x1520 */ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 86, 65, 76, 85, 69, /* 0x1520 */ 32, 32, 84, 89, 80, 69, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
/* 0x1530 */ 10, 48, 48, 48, 48, 48, 48,102, 48, 32, 82, 95, 51, 56, 54, 95, /* 0x1530 */ 32, 32, 32, 32, 86, 65, 76, 85, 69, 10, 48, 48, 48, 48, 48, 48,
/* 0x1540 */ 80, 67, 51, 50, 32, 32, 32, 32, 32, 32, 32, 32, 69, 76, 70, 77, /* 0x1540 */ 48, 50, 32, 82, 95, 51, 56, 54, 95, 80, 67, 51, 50, 32, 32, 32,
/* 0x1550 */ 65, 73, 78, 88, 10 /* 0x1550 */ 32, 32, 32, 32, 32, 69, 76, 70, 77, 65, 73, 78, 90, 10, 10, 82,
/* 0x1560 */ 69, 76, 79, 67, 65, 84, 73, 79, 78, 32, 82, 69, 67, 79, 82, 68,
/* 0x1570 */ 83, 32, 70, 79, 82, 32, 91, 69, 76, 70, 77, 65, 73, 78, 90, 93,
/* 0x1580 */ 58, 10, 79, 70, 70, 83, 69, 84, 32, 32, 32, 84, 89, 80, 69, 32,
/* 0x1590 */ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 86, 65, 76,
/* 0x15a0 */ 85, 69, 10, 48, 48, 48, 48, 48, 48,102, 48, 32, 82, 95, 51, 56,
/* 0x15b0 */ 54, 95, 80, 67, 51, 50, 32, 32, 32, 32, 32, 32, 32, 32, 69, 76,
/* 0x15c0 */ 70, 77, 65, 73, 78, 88, 10
}; };
+1091 -1084
View File
File diff suppressed because it is too large Load Diff
+92 -102
View File
@@ -1,5 +1,5 @@
/* mips.r3000-linux.elf-entry.h /* mips.r3000-linux.elf-entry.h
created from mips.r3000-linux.elf-entry.bin, 2056 (0x808) bytes created from mips.r3000-linux.elf-entry.bin, 1897 (0x769) bytes
This file is part of the UPX executable compressor. This file is part of the UPX executable compressor.
@@ -32,15 +32,15 @@
/* clang-format off */ /* clang-format off */
#define STUB_MIPS_R3000_LINUX_ELF_ENTRY_SIZE 2056 #define STUB_MIPS_R3000_LINUX_ELF_ENTRY_SIZE 1897
#define STUB_MIPS_R3000_LINUX_ELF_ENTRY_ADLER32 0xfd6d93a2 #define STUB_MIPS_R3000_LINUX_ELF_ENTRY_ADLER32 0x3a347ddd
#define STUB_MIPS_R3000_LINUX_ELF_ENTRY_CRC32 0x743aa3e3 #define STUB_MIPS_R3000_LINUX_ELF_ENTRY_CRC32 0xddfc99bb
unsigned char stub_mips_r3000_linux_elf_entry[2056] = { unsigned char stub_mips_r3000_linux_elf_entry[1897] = {
/* 0x0000 */ 127, 69, 76, 70, 1, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x0000 */ 127, 69, 76, 70, 1, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
/* 0x0010 */ 0, 1, 0, 8, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x0010 */ 0, 1, 0, 8, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
/* 0x0020 */ 0, 0, 3, 84, 0, 0, 0, 1, 0, 52, 0, 0, 0, 0, 0, 40, /* 0x0020 */ 0, 0, 3, 60, 0, 0, 0, 1, 0, 52, 0, 0, 0, 0, 0, 40,
/* 0x0030 */ 0, 8, 0, 5, 4, 17, 0, 77, 39,254, 0, 0, 39,189,255,252, /* 0x0030 */ 0, 8, 0, 5, 4, 17, 0, 71, 39,254, 0, 0, 39,189,255,252,
/* 0x0040 */ 175,191, 0, 0, 0,164, 40, 32,172,230, 0, 0, 60, 13,128, 0, /* 0x0040 */ 175,191, 0, 0, 0,164, 40, 32,172,230, 0, 0, 60, 13,128, 0,
/* 0x0050 */ 1,160, 72, 33, 36, 11, 0, 1, 4, 17, 0, 66, 36, 15, 0, 1, /* 0x0050 */ 1,160, 72, 33, 36, 11, 0, 1, 4, 17, 0, 66, 36, 15, 0, 1,
/* 0x0060 */ 17,192, 0, 5,144,142, 0, 0, 36,132, 0, 1, 36,198, 0, 1, /* 0x0060 */ 17,192, 0, 5,144,142, 0, 0, 36,132, 0, 1, 36,198, 0, 1,
@@ -63,11 +63,11 @@ unsigned char stub_mips_r3000_linux_elf_entry[2056] = {
/* 0x0170 */ 0, 9, 72, 64,140,227, 0, 0, 0,133,192, 35,143,191, 0, 0, /* 0x0170 */ 0, 9, 72, 64,140,227, 0, 0, 0,133,192, 35,143,191, 0, 0,
/* 0x0180 */ 175,184, 0, 0, 0, 96, 32, 33, 0,195, 40, 35,172,229, 0, 0, /* 0x0180 */ 175,184, 0, 0, 0, 96, 32, 33, 0,195, 40, 35,172,229, 0, 0,
/* 0x0190 */ 36, 6, 0, 3, 36, 2, 16, 51, 0, 0, 0, 12,143,162, 0, 0, /* 0x0190 */ 36, 6, 0, 3, 36, 2, 16, 51, 0, 0, 0, 12,143,162, 0, 0,
/* 0x01a0 */ 3,224, 0, 8, 39,189, 0, 4, 36, 4, 0, 2, 36, 2, 15,164, /* 0x01a0 */ 3,224, 0, 8, 39,189, 0, 4, 39,189,255,224,175,188, 0, 16,
/* 0x01b0 */ 0, 0, 0, 12, 36, 4, 0,127, 36, 2, 15,161, 0, 0, 0, 12, /* 0x01b0 */ 143,209,255,244, 39,213,255,244, 2,177,168, 34, 36, 5, 0, 16,
/* 0x01c0 */ 39,189,255,224,175,188, 0, 16,143,209,255,244, 39,213,255,244, /* 0x01c0 */ 4, 17, 0, 2, 3,224, 32, 33,117,112,120, 0, 36, 2, 17, 2,
/* 0x01d0 */ 2,177,168, 34, 4, 17, 0, 2, 3,224, 32, 33,117,112,120, 0, /* 0x01d0 */ 0, 0, 0, 12, 16,224, 0, 6, 0, 64,184, 33, 16,160, 0, 3,
/* 0x01e0 */ 0, 0, 40, 33, 36, 2, 17, 2, 0, 0, 0, 12, 0, 64,184, 33, /* 0x01e0 */ 36, 69,255,234, 16,160,255,246, 0, 0, 0, 0, 0, 0, 0, 13,
/* 0x01f0 */ 142,147, 0, 0, 3,160,240, 33,175,179, 0, 28, 36, 1,255,248, /* 0x01f0 */ 142,147, 0, 0, 3,160,240, 33,175,179, 0, 28, 36, 1,255,248,
/* 0x0200 */ 3,179,232, 35, 3,161,232, 36,142,144,255,252, 36, 1,255,252, /* 0x0200 */ 3,179,232, 35, 3,161,232, 36,142,144,255,252, 36, 1,255,252,
/* 0x0210 */ 2, 1,128, 36,130,136, 0, 8,175,211, 0, 24, 39,199, 0, 24, /* 0x0210 */ 2, 1,128, 36,130,136, 0, 8,175,211, 0, 24, 39,199, 0, 24,
@@ -75,95 +75,85 @@ unsigned char stub_mips_r3000_linux_elf_entry[2056] = {
/* 0x0230 */ 175,188, 0, 0,147,161, 0, 0,143,163, 0, 36, 16, 32, 0, 3, /* 0x0230 */ 175,188, 0, 0,147,161, 0, 0,143,163, 0, 36, 16, 32, 0, 3,
/* 0x0240 */ 143,161, 0, 28,175,163, 0, 24,175,161, 0, 16, 2, 96, 48, 33, /* 0x0240 */ 143,161, 0, 28,175,163, 0, 24,175,161, 0, 16, 2, 96, 48, 33,
/* 0x0250 */ 3,160, 40, 33, 2,224, 32, 33, 36, 2, 15,164, 0, 0, 0, 12, /* 0x0250 */ 3,160, 40, 33, 2,224, 32, 33, 36, 2, 15,164, 0, 0, 0, 12,
/* 0x0260 */ 3,192,232, 33, 39,189,255,232,175,160, 0, 20,175,183, 0, 16, /* 0x0260 */ 20,224,255,226, 3,192,232, 33, 39,189,255,232,175,160, 0, 20,
/* 0x0270 */ 36, 7, 0, 1, 36, 6, 0, 5,142,133, 0, 0, 0, 0, 32, 33, /* 0x0270 */ 175,183, 0, 16, 36, 7, 0, 1, 36, 6, 0, 5,142,133, 0, 0,
/* 0x0280 */ 36, 2, 15,250, 0, 0, 0, 12, 39,189, 0, 24,175,162, 0, 24, /* 0x0280 */ 0, 0, 32, 33, 36, 2, 15,250, 0, 0, 0, 12, 20,224,255,215,
/* 0x0290 */ 36, 95, 0, 8, 2,224, 32, 33, 36, 2, 15,166, 0, 0, 0, 12, /* 0x0290 */ 39,189, 0, 24,175,162, 0, 24, 36, 95, 0, 8, 2,224, 32, 33,
/* 0x02a0 */ 3,224, 0, 8, 2,176,128, 33, 36, 2, 17, 2, 0, 0, 0, 12, /* 0x02a0 */ 36, 2, 15,166, 0, 0, 0, 12, 3,224, 0, 8, 2,176,128, 33,
/* 0x02b0 */ 3,224, 0, 8, 0, 0, 0, 0, 36, 2, 15,253, 0, 0, 0, 12, /* 0x02b0 */ 140,131, 0, 0, 36,132, 0, 4, 20, 96,255,253, 0,128,176, 33,
/* 0x02c0 */ 3,224, 0, 8, 0, 0, 0, 0,140,131, 0, 0, 36,132, 0, 4, /* 0x02c0 */ 3,224, 0, 8, 36, 8, 0, 6, 4, 17,255,249, 39,164, 0, 4,
/* 0x02d0 */ 20, 96,255,253, 0,128,176, 33, 3,224, 0, 8, 36, 8, 0, 6, /* 0x02d0 */ 4, 17,255,247, 2,192, 32, 33,140,131, 0, 0, 36,132, 0, 8,
/* 0x02e0 */ 4, 17,255,249, 39,164, 0, 4, 4, 17,255,247, 2,192, 32, 33, /* 0x02e0 */ 16,104, 0, 3,140,130,255,252, 20, 96,255,251, 36, 2, 16, 0,
/* 0x02f0 */ 140,131, 0, 0, 36,132, 0, 8, 16,104, 0, 3,140,130,255,252, /* 0x02f0 */ 0, 0, 0, 0, 0, 2,224, 34, 4, 17,255,171, 39,244, 0, 4,
/* 0x0300 */ 20, 96,255,251, 36, 2, 16, 0, 0, 0, 0, 0, 0, 2,224, 34, /* 0x0300 */ 0, 0, 0, 0, 0, 46,115,121,109,116, 97, 98, 0, 46,115,116,
/* 0x0310 */ 4, 17,255,171, 39,244, 0, 4, 0, 0, 0, 0, 0, 46,115,121, /* 0x0310 */ 114,116, 97, 98, 0, 46,115,104,115,116,114,116, 97, 98, 0, 46,
/* 0x0320 */ 109,116, 97, 98, 0, 46,115,116,114,116, 97, 98, 0, 46,115,104, /* 0x0320 */ 114,101,108, 69, 76, 70, 77, 65, 73, 78, 88, 0, 46,114,101,108,
/* 0x0330 */ 115,116,114,116, 97, 98, 0, 46,114,101,108, 69, 76, 70, 77, 65, /* 0x0330 */ 69, 76, 70, 77, 65, 73, 78, 90, 0, 0, 0, 0, 0, 0, 0, 0,
/* 0x0340 */ 73, 78, 88, 0, 46,114,101,108, 69, 76, 70, 77, 65, 73, 78, 90, /* 0x0340 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
/* 0x0350 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x0350 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
/* 0x0360 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x0360 */ 0, 0, 0, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0, 6,
/* 0x0370 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, /* 0x0370 */ 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 1,116, 0, 0, 0, 0,
/* 0x0380 */ 0, 0, 0, 1, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 52, /* 0x0380 */ 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 27,
/* 0x0390 */ 0, 0, 1,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, /* 0x0390 */ 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,240,
/* 0x03a0 */ 0, 0, 0, 0, 0, 0, 0, 27, 0, 0, 0, 9, 0, 0, 0, 0, /* 0x03a0 */ 0, 0, 0, 8, 0, 0, 0, 6, 0, 0, 0, 1, 0, 0, 0, 4,
/* 0x03b0 */ 0, 0, 0, 0, 0, 0, 5, 64, 0, 0, 0, 8, 0, 0, 0, 6, /* 0x03b0 */ 0, 0, 0, 8, 0, 0, 0, 44, 0, 0, 0, 1, 0, 0, 0, 6,
/* 0x03c0 */ 0, 0, 0, 1, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 44, /* 0x03c0 */ 0, 0, 0, 0, 0, 0, 1,168, 0, 0, 1, 92, 0, 0, 0, 0,
/* 0x03d0 */ 0, 0, 0, 1, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 1,168, /* 0x03d0 */ 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 40,
/* 0x03e0 */ 0, 0, 1,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, /* 0x03e0 */ 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,248,
/* 0x03f0 */ 0, 0, 0, 0, 0, 0, 0, 40, 0, 0, 0, 9, 0, 0, 0, 0, /* 0x03f0 */ 0, 0, 0, 16, 0, 0, 0, 6, 0, 0, 0, 3, 0, 0, 0, 4,
/* 0x0400 */ 0, 0, 0, 0, 0, 0, 5, 72, 0, 0, 0, 16, 0, 0, 0, 6, /* 0x0400 */ 0, 0, 0, 8, 0, 0, 0, 17, 0, 0, 0, 3, 0, 0, 0, 0,
/* 0x0410 */ 0, 0, 0, 3, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 17, /* 0x0410 */ 0, 0, 0, 0, 0, 0, 3, 4, 0, 0, 0, 53, 0, 0, 0, 0,
/* 0x0420 */ 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 28, /* 0x0420 */ 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1,
/* 0x0430 */ 0, 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, /* 0x0430 */ 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,124,
/* 0x0440 */ 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 0, /* 0x0440 */ 0, 0, 0, 80, 0, 0, 0, 7, 0, 0, 0, 3, 0, 0, 0, 4,
/* 0x0450 */ 0, 0, 0, 0, 0, 0, 4,148, 0, 0, 0,112, 0, 0, 0, 7, /* 0x0450 */ 0, 0, 0, 16, 0, 0, 0, 9, 0, 0, 0, 3, 0, 0, 0, 0,
/* 0x0460 */ 0, 0, 0, 3, 0, 0, 0, 4, 0, 0, 0, 16, 0, 0, 0, 9, /* 0x0460 */ 0, 0, 0, 0, 0, 0, 4,204, 0, 0, 0, 34, 0, 0, 0, 0,
/* 0x0470 */ 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 4, /* 0x0470 */ 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
/* 0x0480 */ 0, 0, 0, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, /* 0x0480 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
/* 0x0490 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x0490 */ 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 0, 0, 0, 10,
/* 0x04a0 */ 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x04a0 */ 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 3, 0, 0, 0, 19,
/* 0x04b0 */ 3, 0, 0, 1, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x04b0 */ 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 1, 0, 0, 0, 26,
/* 0x04c0 */ 3, 0, 0, 3, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x04c0 */ 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 69, 76, 70,
/* 0x04d0 */ 17, 0, 0, 1, 0, 0, 0, 26, 0, 0, 1, 0, 0, 0, 0, 0, /* 0x04d0 */ 77, 65, 73, 78, 88, 0, 69, 76, 70, 77, 65, 73, 78, 90, 0, 95,
/* 0x04e0 */ 17, 0, 0, 3, 0, 0, 0, 39, 0, 0, 1, 16, 0, 0, 0, 0, /* 0x04e0 */ 115,116, 97,114,116, 0, 79, 95, 66, 73, 78, 70, 79, 0, 0, 0,
/* 0x04f0 */ 17, 0, 0, 3, 0, 0, 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x04f0 */ 0, 0, 0, 0, 0, 0, 2, 10, 0, 0, 0,128, 0, 0, 1, 10,
/* 0x0500 */ 16, 0, 0, 0, 0, 69, 76, 70, 77, 65, 73, 78, 88, 0, 69, 76, /* 0x0500 */ 0, 0, 1, 88, 0, 0, 4, 2,102,105,108,101, 32,102,111,114,
/* 0x0510 */ 70, 77, 65, 73, 78, 90, 0, 95,115,116, 97,114,116, 0,109,101, /* 0x0510 */ 109, 97,116, 32,101,108,102, 51, 50, 45, 98,105,103,109,105,112,
/* 0x0520 */ 109,102,100, 95, 99,114,101, 97,116,101, 0,102,116,114,117,110, /* 0x0520 */ 115, 10, 10, 83,101, 99,116,105,111,110,115, 58, 10, 73,100,120,
/* 0x0530 */ 99, 97,116,101, 0, 79, 95, 66, 73, 78, 70, 79, 0, 0, 0, 0, /* 0x0530 */ 32, 78, 97,109,101, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 83,
/* 0x0540 */ 0, 0, 0, 0, 0, 0, 2, 10, 0, 0, 0,128, 0, 0, 1, 10, /* 0x0540 */ 105,122,101, 32, 32, 32, 32, 32, 32, 86, 77, 65, 32, 32, 32, 32,
/* 0x0550 */ 0, 0, 1,112, 0, 0, 6, 2,102,105,108,101, 32,102,111,114, /* 0x0550 */ 32, 32, 32, 76, 77, 65, 32, 32, 32, 32, 32, 32, 32, 70,105,108,
/* 0x0560 */ 109, 97,116, 32,101,108,102, 51, 50, 45, 98,105,103,109,105,112, /* 0x0560 */ 101, 32,111,102,102, 32, 32, 65,108,103,110, 32, 32, 70,108, 97,
/* 0x0570 */ 115, 10, 10, 83,101, 99,116,105,111,110,115, 58, 10, 73,100,120, /* 0x0570 */ 103,115, 10, 32, 32, 48, 32, 69, 76, 70, 77, 65, 73, 78, 88, 32,
/* 0x0580 */ 32, 78, 97,109,101, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 83, /* 0x0580 */ 32, 32, 32, 32, 32, 48, 49, 55, 52, 32, 32, 48, 32, 32, 48, 32,
/* 0x0590 */ 105,122,101, 32, 32, 32, 32, 32, 32, 86, 77, 65, 32, 32, 32, 32, /* 0x0590 */ 32, 48, 51, 52, 32, 32, 50, 42, 42, 48, 32, 32, 67, 79, 78, 84,
/* 0x05a0 */ 32, 32, 32, 76, 77, 65, 32, 32, 32, 32, 32, 32, 32, 70,105,108, /* 0x05a0 */ 69, 78, 84, 83, 10, 32, 32, 49, 32, 69, 76, 70, 77, 65, 73, 78,
/* 0x05b0 */ 101, 32,111,102,102, 32, 32, 65,108,103,110, 32, 32, 70,108, 97, /* 0x05b0 */ 90, 32, 32, 32, 32, 32, 32, 48, 49, 53, 99, 32, 32, 48, 32, 32,
/* 0x05c0 */ 103,115, 10, 32, 32, 48, 32, 69, 76, 70, 77, 65, 73, 78, 88, 32, /* 0x05c0 */ 48, 32, 32, 48, 49, 97, 56, 32, 32, 50, 42, 42, 50, 32, 32, 67,
/* 0x05d0 */ 32, 32, 32, 32, 32, 48, 49, 55, 52, 32, 32, 48, 32, 32, 48, 32, /* 0x05d0 */ 79, 78, 84, 69, 78, 84, 83, 10, 83, 89, 77, 66, 79, 76, 32, 84,
/* 0x05e0 */ 32, 48, 51, 52, 32, 32, 50, 42, 42, 48, 32, 32, 67, 79, 78, 84, /* 0x05e0 */ 65, 66, 76, 69, 58, 10, 48, 48, 48, 48, 48, 48, 48, 48, 32,108,
/* 0x05f0 */ 69, 78, 84, 83, 10, 32, 32, 49, 32, 69, 76, 70, 77, 65, 73, 78, /* 0x05f0 */ 32, 32, 32, 32,100, 32, 32, 69, 76, 70, 77, 65, 73, 78, 88, 32,
/* 0x0600 */ 90, 32, 32, 32, 32, 32, 32, 48, 49, 55, 52, 32, 32, 48, 32, 32, /* 0x0600 */ 48, 32, 69, 76, 70, 77, 65, 73, 78, 88, 10, 48, 48, 48, 48, 48,
/* 0x0610 */ 48, 32, 32, 48, 49, 97, 56, 32, 32, 50, 42, 42, 50, 32, 32, 67, /* 0x0610 */ 48, 48, 48, 32,108, 32, 32, 32, 32,100, 32, 32, 69, 76, 70, 77,
/* 0x0620 */ 79, 78, 84, 69, 78, 84, 83, 10, 83, 89, 77, 66, 79, 76, 32, 84, /* 0x0620 */ 65, 73, 78, 90, 32, 48, 32, 69, 76, 70, 77, 65, 73, 78, 90, 10,
/* 0x0630 */ 65, 66, 76, 69, 58, 10, 48, 48, 48, 48, 48, 48, 48, 48, 32,108, /* 0x0630 */ 48, 48, 48, 48, 48, 48, 48, 48, 32,103, 32, 32, 32, 32, 32, 79,
/* 0x0640 */ 32, 32, 32, 32,100, 32, 32, 69, 76, 70, 77, 65, 73, 78, 88, 32, /* 0x0640 */ 32, 69, 76, 70, 77, 65, 73, 78, 88, 32, 48, 32, 95,115,116, 97,
/* 0x0650 */ 48, 32, 69, 76, 70, 77, 65, 73, 78, 88, 10, 48, 48, 48, 48, 48, /* 0x0650 */ 114,116, 10, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 32, 32, 32,
/* 0x0660 */ 48, 48, 48, 32,108, 32, 32, 32, 32,100, 32, 32, 69, 76, 70, 77, /* 0x0660 */ 32, 32, 32, 32, 42, 85, 78, 68, 42, 32, 48, 32, 79, 95, 66, 73,
/* 0x0670 */ 65, 73, 78, 90, 32, 48, 32, 69, 76, 70, 77, 65, 73, 78, 90, 10, /* 0x0670 */ 78, 70, 79, 10, 10, 82, 69, 76, 79, 67, 65, 84, 73, 79, 78, 32,
/* 0x0680 */ 48, 48, 48, 48, 48, 48, 48, 48, 32,103, 32, 32, 32, 32, 32, 79, /* 0x0680 */ 82, 69, 67, 79, 82, 68, 83, 32, 70, 79, 82, 32, 91, 69, 76, 70,
/* 0x0690 */ 32, 69, 76, 70, 77, 65, 73, 78, 88, 32, 48, 32, 95,115,116, 97, /* 0x0690 */ 77, 65, 73, 78, 88, 93, 58, 10, 79, 70, 70, 83, 69, 84, 32, 32,
/* 0x06a0 */ 114,116, 10, 48, 48, 48, 48, 48, 49, 48, 48, 32,103, 32, 32, 32, /* 0x06a0 */ 32, 84, 89, 80, 69, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
/* 0x06b0 */ 32, 32, 79, 32, 69, 76, 70, 77, 65, 73, 78, 90, 32, 48, 32,109, /* 0x06b0 */ 32, 32, 32, 86, 65, 76, 85, 69, 10, 48, 48, 48, 48, 48, 48, 48,
/* 0x06c0 */ 101,109,102,100, 95, 99,114,101, 97,116,101, 10, 48, 48, 48, 48, /* 0x06c0 */ 48, 32, 82, 95, 77, 73, 80, 83, 95, 80, 67, 49, 54, 32, 32, 32,
/* 0x06d0 */ 48, 49, 49, 48, 32,103, 32, 32, 32, 32, 32, 79, 32, 69, 76, 70, /* 0x06d0 */ 32, 32, 32, 32, 69, 76, 70, 77, 65, 73, 78, 90, 10, 10, 82, 69,
/* 0x06e0 */ 77, 65, 73, 78, 90, 32, 48, 32,102,116,114,117,110, 99, 97,116, /* 0x06e0 */ 76, 79, 67, 65, 84, 73, 79, 78, 32, 82, 69, 67, 79, 82, 68, 83,
/* 0x06f0 */ 101, 10, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 32, 32, 32, 32, /* 0x06f0 */ 32, 70, 79, 82, 32, 91, 69, 76, 70, 77, 65, 73, 78, 90, 93, 58,
/* 0x0700 */ 32, 32, 32, 42, 85, 78, 68, 42, 32, 48, 32, 79, 95, 66, 73, 78, /* 0x0700 */ 10, 79, 70, 70, 83, 69, 84, 32, 32, 32, 84, 89, 80, 69, 32, 32,
/* 0x0710 */ 70, 79, 10, 10, 82, 69, 76, 79, 67, 65, 84, 73, 79, 78, 32, 82, /* 0x0710 */ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 86, 65, 76, 85,
/* 0x0720 */ 69, 67, 79, 82, 68, 83, 32, 70, 79, 82, 32, 91, 69, 76, 70, 77, /* 0x0720 */ 69, 10, 48, 48, 48, 48, 48, 48, 56, 48, 32, 82, 95, 77, 73, 80,
/* 0x0730 */ 65, 73, 78, 88, 93, 58, 10, 79, 70, 70, 83, 69, 84, 32, 32, 32, /* 0x0730 */ 83, 95, 80, 67, 49, 54, 32, 32, 32, 32, 32, 32, 32, 69, 76, 70,
/* 0x0740 */ 84, 89, 80, 69, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, /* 0x0740 */ 77, 65, 73, 78, 88, 10, 48, 48, 48, 48, 48, 49, 53, 56, 32, 82,
/* 0x0750 */ 32, 32, 86, 65, 76, 85, 69, 10, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x0750 */ 95, 77, 73, 80, 83, 95, 51, 50, 32, 32, 32, 32, 32, 32, 32, 32,
/* 0x0760 */ 32, 82, 95, 77, 73, 80, 83, 95, 80, 67, 49, 54, 32, 32, 32, 32, /* 0x0760 */ 32, 79, 95, 66, 73, 78, 70, 79, 10
/* 0x0770 */ 32, 32, 32, 69, 76, 70, 77, 65, 73, 78, 90, 10, 10, 82, 69, 76,
/* 0x0780 */ 79, 67, 65, 84, 73, 79, 78, 32, 82, 69, 67, 79, 82, 68, 83, 32,
/* 0x0790 */ 70, 79, 82, 32, 91, 69, 76, 70, 77, 65, 73, 78, 90, 93, 58, 10,
/* 0x07a0 */ 79, 70, 70, 83, 69, 84, 32, 32, 32, 84, 89, 80, 69, 32, 32, 32,
/* 0x07b0 */ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 86, 65, 76, 85, 69,
/* 0x07c0 */ 10, 48, 48, 48, 48, 48, 48, 56, 48, 32, 82, 95, 77, 73, 80, 83,
/* 0x07d0 */ 95, 80, 67, 49, 54, 32, 32, 32, 32, 32, 32, 32, 69, 76, 70, 77,
/* 0x07e0 */ 65, 73, 78, 88, 10, 48, 48, 48, 48, 48, 49, 55, 48, 32, 82, 95,
/* 0x07f0 */ 77, 73, 80, 83, 95, 51, 50, 32, 32, 32, 32, 32, 32, 32, 32, 32,
/* 0x0800 */ 79, 95, 66, 73, 78, 70, 79, 10
}; };
+1183 -1170
View File
File diff suppressed because it is too large Load Diff
+93 -103
View File
@@ -1,5 +1,5 @@
/* mipsel.r3000-linux.elf-entry.h /* mipsel.r3000-linux.elf-entry.h
created from mipsel.r3000-linux.elf-entry.bin, 2019 (0x7e3) bytes created from mipsel.r3000-linux.elf-entry.bin, 1860 (0x744) bytes
This file is part of the UPX executable compressor. This file is part of the UPX executable compressor.
@@ -32,15 +32,15 @@
/* clang-format off */ /* clang-format off */
#define STUB_MIPSEL_R3000_LINUX_ELF_ENTRY_SIZE 2019 #define STUB_MIPSEL_R3000_LINUX_ELF_ENTRY_SIZE 1860
#define STUB_MIPSEL_R3000_LINUX_ELF_ENTRY_ADLER32 0xfb988e20 #define STUB_MIPSEL_R3000_LINUX_ELF_ENTRY_ADLER32 0x26f5775c
#define STUB_MIPSEL_R3000_LINUX_ELF_ENTRY_CRC32 0xe437900d #define STUB_MIPSEL_R3000_LINUX_ELF_ENTRY_CRC32 0x15b536db
unsigned char stub_mipsel_r3000_linux_elf_entry[2019] = { unsigned char stub_mipsel_r3000_linux_elf_entry[1860] = {
/* 0x0000 */ 127, 69, 76, 70, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x0000 */ 127, 69, 76, 70, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
/* 0x0010 */ 1, 0, 8, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x0010 */ 1, 0, 8, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
/* 0x0020 */ 44, 3, 0, 0, 1, 0, 0, 0, 52, 0, 0, 0, 0, 0, 40, 0, /* 0x0020 */ 20, 3, 0, 0, 1, 0, 0, 0, 52, 0, 0, 0, 0, 0, 40, 0,
/* 0x0030 */ 8, 0, 5, 0, 77, 0, 17, 4, 0, 0,254, 39,252,255,189, 39, /* 0x0030 */ 8, 0, 5, 0, 71, 0, 17, 4, 0, 0,254, 39,252,255,189, 39,
/* 0x0040 */ 0, 0,191,175, 32, 40,164, 0, 0, 0,230,172, 0,128, 13, 60, /* 0x0040 */ 0, 0,191,175, 32, 40,164, 0, 0, 0,230,172, 0,128, 13, 60,
/* 0x0050 */ 33, 72,160, 1, 1, 0, 11, 36, 56, 0, 17, 4, 1, 0, 15, 36, /* 0x0050 */ 33, 72,160, 1, 1, 0, 11, 36, 56, 0, 17, 4, 1, 0, 15, 36,
/* 0x0060 */ 5, 0,192, 17, 0, 0,142,144, 1, 0,132, 36, 1, 0,198, 36, /* 0x0060 */ 5, 0,192, 17, 0, 0,142,144, 1, 0,132, 36, 1, 0,198, 36,
@@ -61,107 +61,97 @@ unsigned char stub_mipsel_r3000_linux_elf_entry[2019] = {
/* 0x0150 */ 35,192,133, 0, 0, 0,191,143, 0, 0,184,175, 33, 32, 96, 0, /* 0x0150 */ 35,192,133, 0, 0, 0,191,143, 0, 0,184,175, 33, 32, 96, 0,
/* 0x0160 */ 35, 40,195, 0, 0, 0,229,172, 3, 0, 6, 36, 51, 16, 2, 36, /* 0x0160 */ 35, 40,195, 0, 0, 0,229,172, 3, 0, 6, 36, 51, 16, 2, 36,
/* 0x0170 */ 12, 0, 0, 0, 0, 0,162,143, 8, 0,224, 3, 4, 0,189, 39, /* 0x0170 */ 12, 0, 0, 0, 0, 0,162,143, 8, 0,224, 3, 4, 0,189, 39,
/* 0x0180 */ 2, 0, 4, 36,164, 15, 2, 36, 12, 0, 0, 0,127, 0, 4, 36, /* 0x0180 */ 224,255,189, 39, 16, 0,188,175,244,255,209,143,244,255,213, 39,
/* 0x0190 */ 161, 15, 2, 36, 12, 0, 0, 0,224,255,189, 39, 16, 0,188,175, /* 0x0190 */ 34,168,177, 2, 16, 0, 5, 36, 2, 0, 17, 4, 33, 32,224, 3,
/* 0x01a0 */ 244,255,209,143,244,255,213, 39, 34,168,177, 2, 2, 0, 17, 4, /* 0x01a0 */ 117,112,120, 0, 2, 17, 2, 36, 12, 0, 0, 0, 6, 0,224, 16,
/* 0x01b0 */ 33, 32,224, 3,117,112,120, 0, 33, 40, 0, 0, 2, 17, 2, 36, /* 0x01b0 */ 33,184, 64, 0, 3, 0,160, 16,234,255, 69, 36,246,255,160, 16,
/* 0x01c0 */ 12, 0, 0, 0, 33,184, 64, 0, 0, 0,147,142, 33,240,160, 3, /* 0x01c0 */ 0, 0, 0, 0, 13, 0, 0, 0, 0, 0,147,142, 33,240,160, 3,
/* 0x01d0 */ 28, 0,179,175,248,255, 1, 36, 35,232,179, 3, 36,232,161, 3, /* 0x01d0 */ 28, 0,179,175,248,255, 1, 36, 35,232,179, 3, 36,232,161, 3,
/* 0x01e0 */ 252,255,144,142,252,255, 1, 36, 36,128, 1, 2, 8, 0,136,130, /* 0x01e0 */ 252,255,144,142,252,255, 1, 36, 36,128, 1, 2, 8, 0,136,130,
/* 0x01f0 */ 24, 0,211,175, 24, 0,199, 39, 33, 48,160, 3, 4, 0,133,142, /* 0x01f0 */ 24, 0,211,175, 24, 0,199, 39, 33, 48,160, 3, 4, 0,133,142,
/* 0x0200 */ 1, 0, 17, 4, 12, 0,132, 38, 0, 0,188,175, 0, 0,161,147, /* 0x0200 */ 1, 0, 17, 4, 12, 0,132, 38, 0, 0,188,175, 0, 0,161,147,
/* 0x0210 */ 36, 0,163,143, 3, 0, 32, 16, 28, 0,161,143, 24, 0,163,175, /* 0x0210 */ 36, 0,163,143, 3, 0, 32, 16, 28, 0,161,143, 24, 0,163,175,
/* 0x0220 */ 16, 0,161,175, 33, 48, 96, 2, 33, 40,160, 3, 33, 32,224, 2, /* 0x0220 */ 16, 0,161,175, 33, 48, 96, 2, 33, 40,160, 3, 33, 32,224, 2,
/* 0x0230 */ 164, 15, 2, 36, 12, 0, 0, 0, 33,232,192, 3,232,255,189, 39, /* 0x0230 */ 164, 15, 2, 36, 12, 0, 0, 0,226,255,224, 20, 33,232,192, 3,
/* 0x0240 */ 20, 0,160,175, 16, 0,183,175, 1, 0, 7, 36, 5, 0, 6, 36, /* 0x0240 */ 232,255,189, 39, 20, 0,160,175, 16, 0,183,175, 1, 0, 7, 36,
/* 0x0250 */ 0, 0,133,142, 33, 32, 0, 0,250, 15, 2, 36, 12, 0, 0, 0, /* 0x0250 */ 5, 0, 6, 36, 0, 0,133,142, 33, 32, 0, 0,250, 15, 2, 36,
/* 0x0260 */ 24, 0,189, 39, 24, 0,162,175, 8, 0, 95, 36, 33, 32,224, 2, /* 0x0260 */ 12, 0, 0, 0,215,255,224, 20, 24, 0,189, 39, 24, 0,162,175,
/* 0x0270 */ 166, 15, 2, 36, 12, 0, 0, 0, 8, 0,224, 3, 33,128,176, 2, /* 0x0270 */ 8, 0, 95, 36, 33, 32,224, 2,166, 15, 2, 36, 12, 0, 0, 0,
/* 0x0280 */ 2, 17, 2, 36, 12, 0, 0, 0, 8, 0,224, 3, 0, 0, 0, 0, /* 0x0280 */ 8, 0,224, 3, 33,128,176, 2, 0, 0,131,140, 4, 0,132, 36,
/* 0x0290 */ 253, 15, 2, 36, 12, 0, 0, 0, 8, 0,224, 3, 0, 0, 0, 0, /* 0x0290 */ 253,255, 96, 20, 33,176,128, 0, 8, 0,224, 3, 6, 0, 8, 36,
/* 0x02a0 */ 0, 0,131,140, 4, 0,132, 36,253,255, 96, 20, 33,176,128, 0, /* 0x02a0 */ 249,255, 17, 4, 4, 0,164, 39,247,255, 17, 4, 33, 32,192, 2,
/* 0x02b0 */ 8, 0,224, 3, 6, 0, 8, 36,249,255, 17, 4, 4, 0,164, 39, /* 0x02b0 */ 0, 0,131,140, 8, 0,132, 36, 3, 0,104, 16,252,255,130,140,
/* 0x02c0 */ 247,255, 17, 4, 33, 32,192, 2, 0, 0,131,140, 8, 0,132, 36, /* 0x02c0 */ 251,255, 96, 20, 0, 16, 2, 36, 0, 0, 0, 0, 34,224, 2, 0,
/* 0x02d0 */ 3, 0,104, 16,252,255,130,140,251,255, 96, 20, 0, 16, 2, 36, /* 0x02d0 */ 171,255, 17, 4, 4, 0,244, 39, 0, 0, 0, 0, 0, 46,115,121,
/* 0x02e0 */ 0, 0, 0, 0, 34,224, 2, 0,171,255, 17, 4, 4, 0,244, 39, /* 0x02e0 */ 109,116, 97, 98, 0, 46,115,116,114,116, 97, 98, 0, 46,115,104,
/* 0x02f0 */ 0, 0, 0, 0, 0, 46,115,121,109,116, 97, 98, 0, 46,115,116, /* 0x02f0 */ 115,116,114,116, 97, 98, 0, 46,114,101,108, 69, 76, 70, 77, 65,
/* 0x0300 */ 114,116, 97, 98, 0, 46,115,104,115,116,114,116, 97, 98, 0, 46, /* 0x0300 */ 73, 78, 88, 0, 46,114,101,108, 69, 76, 70, 77, 65, 73, 78, 90,
/* 0x0310 */ 114,101,108, 69, 76, 70, 77, 65, 73, 78, 88, 0, 46,114,101,108, /* 0x0310 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
/* 0x0320 */ 69, 76, 70, 77, 65, 73, 78, 90, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x0320 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
/* 0x0330 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x0330 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 0, 0,
/* 0x0340 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x0340 */ 1, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0,
/* 0x0350 */ 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0, 6, 0, 0, 0, /* 0x0350 */ 76, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,
/* 0x0360 */ 0, 0, 0, 0, 52, 0, 0, 0, 76, 1, 0, 0, 0, 0, 0, 0, /* 0x0360 */ 0, 0, 0, 0, 27, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0,
/* 0x0370 */ 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 27, 0, 0, 0, /* 0x0370 */ 0, 0, 0, 0,200, 4, 0, 0, 8, 0, 0, 0, 6, 0, 0, 0,
/* 0x0380 */ 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 5, 0, 0, /* 0x0380 */ 1, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 44, 0, 0, 0,
/* 0x0390 */ 8, 0, 0, 0, 6, 0, 0, 0, 1, 0, 0, 0, 4, 0, 0, 0, /* 0x0390 */ 1, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0,128, 1, 0, 0,
/* 0x03a0 */ 8, 0, 0, 0, 44, 0, 0, 0, 1, 0, 0, 0, 6, 0, 0, 0, /* 0x03a0 */ 92, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0,
/* 0x03b0 */ 0, 0, 0, 0,128, 1, 0, 0,116, 1, 0, 0, 0, 0, 0, 0, /* 0x03b0 */ 0, 0, 0, 0, 40, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0,
/* 0x03c0 */ 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 40, 0, 0, 0, /* 0x03c0 */ 0, 0, 0, 0,208, 4, 0, 0, 16, 0, 0, 0, 6, 0, 0, 0,
/* 0x03d0 */ 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 5, 0, 0, /* 0x03d0 */ 3, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 17, 0, 0, 0,
/* 0x03e0 */ 16, 0, 0, 0, 6, 0, 0, 0, 3, 0, 0, 0, 4, 0, 0, 0, /* 0x03e0 */ 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,220, 2, 0, 0,
/* 0x03f0 */ 8, 0, 0, 0, 17, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, /* 0x03f0 */ 53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,
/* 0x0400 */ 0, 0, 0, 0,244, 2, 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, /* 0x0400 */ 0, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0,
/* 0x0410 */ 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, /* 0x0410 */ 0, 0, 0, 0, 84, 4, 0, 0, 80, 0, 0, 0, 7, 0, 0, 0,
/* 0x0420 */ 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,108, 4, 0, 0, /* 0x0420 */ 3, 0, 0, 0, 4, 0, 0, 0, 16, 0, 0, 0, 9, 0, 0, 0,
/* 0x0430 */ 112, 0, 0, 0, 7, 0, 0, 0, 3, 0, 0, 0, 4, 0, 0, 0, /* 0x0430 */ 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,164, 4, 0, 0,
/* 0x0440 */ 16, 0, 0, 0, 9, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, /* 0x0440 */ 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,
/* 0x0450 */ 0, 0, 0, 0,220, 4, 0, 0, 57, 0, 0, 0, 0, 0, 0, 0, /* 0x0450 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
/* 0x0460 */ 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x0460 */ 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
/* 0x0470 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, /* 0x0470 */ 3, 0, 1, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
/* 0x0480 */ 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 1, 0, 10, 0, 0, 0, /* 0x0480 */ 3, 0, 3, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
/* 0x0490 */ 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 3, 0, 19, 0, 0, 0, /* 0x0490 */ 17, 0, 1, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
/* 0x04a0 */ 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 1, 0, 26, 0, 0, 0, /* 0x04a0 */ 16, 0, 0, 0, 0, 69, 76, 70, 77, 65, 73, 78, 88, 0, 69, 76,
/* 0x04b0 */ 0, 1, 0, 0, 0, 0, 0, 0, 17, 0, 3, 0, 39, 0, 0, 0, /* 0x04b0 */ 70, 77, 65, 73, 78, 90, 0, 95,115,116, 97,114,116, 0, 79, 95,
/* 0x04c0 */ 16, 1, 0, 0, 0, 0, 0, 0, 17, 0, 3, 0, 49, 0, 0, 0, /* 0x04c0 */ 66, 73, 78, 70, 79, 0, 0, 0, 0, 0, 0, 0, 10, 2, 0, 0,
/* 0x04d0 */ 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 69, 76, 70, /* 0x04d0 */ 128, 0, 0, 0, 10, 1, 0, 0, 88, 1, 0, 0, 2, 4, 0, 0,
/* 0x04e0 */ 77, 65, 73, 78, 88, 0, 69, 76, 70, 77, 65, 73, 78, 90, 0, 95, /* 0x04e0 */ 102,105,108,101, 32,102,111,114,109, 97,116, 32,101,108,102, 51,
/* 0x04f0 */ 115,116, 97,114,116, 0,109,101,109,102,100, 95, 99,114,101, 97, /* 0x04f0 */ 50, 45,108,105,116,116,108,101,109,105,112,115, 10, 10, 83,101,
/* 0x0500 */ 116,101, 0,102,116,114,117,110, 99, 97,116,101, 0, 79, 95, 66, /* 0x0500 */ 99,116,105,111,110,115, 58, 10, 73,100,120, 32, 78, 97,109,101,
/* 0x0510 */ 73, 78, 70, 79, 0, 0, 0, 0, 0, 0, 0, 0, 10, 2, 0, 0, /* 0x0510 */ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 83,105,122,101, 32, 32,
/* 0x0520 */ 128, 0, 0, 0, 10, 1, 0, 0,112, 1, 0, 0, 2, 6, 0, 0, /* 0x0520 */ 32, 32, 32, 32, 86, 77, 65, 32, 32, 32, 32, 32, 32, 32, 76, 77,
/* 0x0530 */ 102,105,108,101, 32,102,111,114,109, 97,116, 32,101,108,102, 51, /* 0x0530 */ 65, 32, 32, 32, 32, 32, 32, 32, 70,105,108,101, 32,111,102,102,
/* 0x0540 */ 50, 45,108,105,116,116,108,101,109,105,112,115, 10, 10, 83,101, /* 0x0540 */ 32, 32, 65,108,103,110, 32, 32, 70,108, 97,103,115, 10, 32, 32,
/* 0x0550 */ 99,116,105,111,110,115, 58, 10, 73,100,120, 32, 78, 97,109,101, /* 0x0550 */ 48, 32, 69, 76, 70, 77, 65, 73, 78, 88, 32, 32, 32, 32, 32, 32,
/* 0x0560 */ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 83,105,122,101, 32, 32, /* 0x0560 */ 48, 49, 52, 99, 32, 32, 48, 32, 32, 48, 32, 32, 48, 51, 52, 32,
/* 0x0570 */ 32, 32, 32, 32, 86, 77, 65, 32, 32, 32, 32, 32, 32, 32, 76, 77, /* 0x0570 */ 32, 50, 42, 42, 48, 32, 32, 67, 79, 78, 84, 69, 78, 84, 83, 10,
/* 0x0580 */ 65, 32, 32, 32, 32, 32, 32, 32, 70,105,108,101, 32,111,102,102, /* 0x0580 */ 32, 32, 49, 32, 69, 76, 70, 77, 65, 73, 78, 90, 32, 32, 32, 32,
/* 0x0590 */ 32, 32, 65,108,103,110, 32, 32, 70,108, 97,103,115, 10, 32, 32, /* 0x0590 */ 32, 32, 48, 49, 53, 99, 32, 32, 48, 32, 32, 48, 32, 32, 48, 49,
/* 0x05a0 */ 48, 32, 69, 76, 70, 77, 65, 73, 78, 88, 32, 32, 32, 32, 32, 32, /* 0x05a0 */ 56, 48, 32, 32, 50, 42, 42, 50, 32, 32, 67, 79, 78, 84, 69, 78,
/* 0x05b0 */ 48, 49, 52, 99, 32, 32, 48, 32, 32, 48, 32, 32, 48, 51, 52, 32, /* 0x05b0 */ 84, 83, 10, 83, 89, 77, 66, 79, 76, 32, 84, 65, 66, 76, 69, 58,
/* 0x05c0 */ 32, 50, 42, 42, 48, 32, 32, 67, 79, 78, 84, 69, 78, 84, 83, 10, /* 0x05c0 */ 10, 48, 48, 48, 48, 48, 48, 48, 48, 32,108, 32, 32, 32, 32,100,
/* 0x05d0 */ 32, 32, 49, 32, 69, 76, 70, 77, 65, 73, 78, 90, 32, 32, 32, 32, /* 0x05d0 */ 32, 32, 69, 76, 70, 77, 65, 73, 78, 88, 32, 48, 32, 69, 76, 70,
/* 0x05e0 */ 32, 32, 48, 49, 55, 52, 32, 32, 48, 32, 32, 48, 32, 32, 48, 49, /* 0x05e0 */ 77, 65, 73, 78, 88, 10, 48, 48, 48, 48, 48, 48, 48, 48, 32,108,
/* 0x05f0 */ 56, 48, 32, 32, 50, 42, 42, 50, 32, 32, 67, 79, 78, 84, 69, 78, /* 0x05f0 */ 32, 32, 32, 32,100, 32, 32, 69, 76, 70, 77, 65, 73, 78, 90, 32,
/* 0x0600 */ 84, 83, 10, 83, 89, 77, 66, 79, 76, 32, 84, 65, 66, 76, 69, 58, /* 0x0600 */ 48, 32, 69, 76, 70, 77, 65, 73, 78, 90, 10, 48, 48, 48, 48, 48,
/* 0x0610 */ 10, 48, 48, 48, 48, 48, 48, 48, 48, 32,108, 32, 32, 32, 32,100, /* 0x0610 */ 48, 48, 48, 32,103, 32, 32, 32, 32, 32, 79, 32, 69, 76, 70, 77,
/* 0x0620 */ 32, 32, 69, 76, 70, 77, 65, 73, 78, 88, 32, 48, 32, 69, 76, 70, /* 0x0620 */ 65, 73, 78, 88, 32, 48, 32, 95,115,116, 97,114,116, 10, 48, 48,
/* 0x0630 */ 77, 65, 73, 78, 88, 10, 48, 48, 48, 48, 48, 48, 48, 48, 32,108, /* 0x0630 */ 48, 48, 48, 48, 48, 48, 32, 32, 32, 32, 32, 32, 32, 32, 32, 42,
/* 0x0640 */ 32, 32, 32, 32,100, 32, 32, 69, 76, 70, 77, 65, 73, 78, 90, 32, /* 0x0640 */ 85, 78, 68, 42, 32, 48, 32, 79, 95, 66, 73, 78, 70, 79, 10, 10,
/* 0x0650 */ 48, 32, 69, 76, 70, 77, 65, 73, 78, 90, 10, 48, 48, 48, 48, 48, /* 0x0650 */ 82, 69, 76, 79, 67, 65, 84, 73, 79, 78, 32, 82, 69, 67, 79, 82,
/* 0x0660 */ 48, 48, 48, 32,103, 32, 32, 32, 32, 32, 79, 32, 69, 76, 70, 77, /* 0x0660 */ 68, 83, 32, 70, 79, 82, 32, 91, 69, 76, 70, 77, 65, 73, 78, 88,
/* 0x0670 */ 65, 73, 78, 88, 32, 48, 32, 95,115,116, 97,114,116, 10, 48, 48, /* 0x0670 */ 93, 58, 10, 79, 70, 70, 83, 69, 84, 32, 32, 32, 84, 89, 80, 69,
/* 0x0680 */ 48, 48, 48, 49, 48, 48, 32,103, 32, 32, 32, 32, 32, 79, 32, 69, /* 0x0680 */ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 86, 65,
/* 0x0690 */ 76, 70, 77, 65, 73, 78, 90, 32, 48, 32,109,101,109,102,100, 95, /* 0x0690 */ 76, 85, 69, 10, 48, 48, 48, 48, 48, 48, 48, 48, 32, 82, 95, 77,
/* 0x06a0 */ 99,114,101, 97,116,101, 10, 48, 48, 48, 48, 48, 49, 49, 48, 32, /* 0x06a0 */ 73, 80, 83, 95, 80, 67, 49, 54, 32, 32, 32, 32, 32, 32, 32, 69,
/* 0x06b0 */ 103, 32, 32, 32, 32, 32, 79, 32, 69, 76, 70, 77, 65, 73, 78, 90, /* 0x06b0 */ 76, 70, 77, 65, 73, 78, 90, 10, 10, 82, 69, 76, 79, 67, 65, 84,
/* 0x06c0 */ 32, 48, 32,102,116,114,117,110, 99, 97,116,101, 10, 48, 48, 48, /* 0x06c0 */ 73, 79, 78, 32, 82, 69, 67, 79, 82, 68, 83, 32, 70, 79, 82, 32,
/* 0x06d0 */ 48, 48, 48, 48, 48, 32, 32, 32, 32, 32, 32, 32, 32, 32, 42, 85, /* 0x06d0 */ 91, 69, 76, 70, 77, 65, 73, 78, 90, 93, 58, 10, 79, 70, 70, 83,
/* 0x06e0 */ 78, 68, 42, 32, 48, 32, 79, 95, 66, 73, 78, 70, 79, 10, 10, 82, /* 0x06e0 */ 69, 84, 32, 32, 32, 84, 89, 80, 69, 32, 32, 32, 32, 32, 32, 32,
/* 0x06f0 */ 69, 76, 79, 67, 65, 84, 73, 79, 78, 32, 82, 69, 67, 79, 82, 68, /* 0x06f0 */ 32, 32, 32, 32, 32, 32, 32, 86, 65, 76, 85, 69, 10, 48, 48, 48,
/* 0x0700 */ 83, 32, 70, 79, 82, 32, 91, 69, 76, 70, 77, 65, 73, 78, 88, 93, /* 0x0700 */ 48, 48, 48, 56, 48, 32, 82, 95, 77, 73, 80, 83, 95, 80, 67, 49,
/* 0x0710 */ 58, 10, 79, 70, 70, 83, 69, 84, 32, 32, 32, 84, 89, 80, 69, 32, /* 0x0710 */ 54, 32, 32, 32, 32, 32, 32, 32, 69, 76, 70, 77, 65, 73, 78, 88,
/* 0x0720 */ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 86, 65, 76, /* 0x0720 */ 10, 48, 48, 48, 48, 48, 49, 53, 56, 32, 82, 95, 77, 73, 80, 83,
/* 0x0730 */ 85, 69, 10, 48, 48, 48, 48, 48, 48, 48, 48, 32, 82, 95, 77, 73, /* 0x0730 */ 95, 51, 50, 32, 32, 32, 32, 32, 32, 32, 32, 32, 79, 95, 66, 73,
/* 0x0740 */ 80, 83, 95, 80, 67, 49, 54, 32, 32, 32, 32, 32, 32, 32, 69, 76, /* 0x0740 */ 78, 70, 79, 10
/* 0x0750 */ 70, 77, 65, 73, 78, 90, 10, 10, 82, 69, 76, 79, 67, 65, 84, 73,
/* 0x0760 */ 79, 78, 32, 82, 69, 67, 79, 82, 68, 83, 32, 70, 79, 82, 32, 91,
/* 0x0770 */ 69, 76, 70, 77, 65, 73, 78, 90, 93, 58, 10, 79, 70, 70, 83, 69,
/* 0x0780 */ 84, 32, 32, 32, 84, 89, 80, 69, 32, 32, 32, 32, 32, 32, 32, 32,
/* 0x0790 */ 32, 32, 32, 32, 32, 32, 86, 65, 76, 85, 69, 10, 48, 48, 48, 48,
/* 0x07a0 */ 48, 48, 56, 48, 32, 82, 95, 77, 73, 80, 83, 95, 80, 67, 49, 54,
/* 0x07b0 */ 32, 32, 32, 32, 32, 32, 32, 69, 76, 70, 77, 65, 73, 78, 88, 10,
/* 0x07c0 */ 48, 48, 48, 48, 48, 49, 55, 48, 32, 82, 95, 77, 73, 80, 83, 95,
/* 0x07d0 */ 51, 50, 32, 32, 32, 32, 32, 32, 32, 32, 32, 79, 95, 66, 73, 78,
/* 0x07e0 */ 70, 79, 10
}; };
+1175 -1162
View File
File diff suppressed because it is too large Load Diff
+1258 -1238
View File
File diff suppressed because it is too large Load Diff
+1289 -1275
View File
File diff suppressed because it is too large Load Diff
+1292 -1279
View File
File diff suppressed because it is too large Load Diff
+39 -36
View File
@@ -1,4 +1,4 @@
#! /usr/bin/env python2 #! /usr/bin/env python3
## vim:set ts=4 sw=4 et: -*- coding: utf-8 -*- ## vim:set ts=4 sw=4 et: -*- coding: utf-8 -*-
# #
# bin2h.py -- # bin2h.py --
@@ -45,7 +45,7 @@ class opts:
# ************************************************************************/ # ************************************************************************/
def w_header_c(w, ifile, ofile, n): def w_header_c(w, ifile, ofile, n):
w("/* %s\n created from %s, %d (0x%x) bytes\n" % (os.path.basename(ofile), os.path.basename(ifile), n, n)) w(("/* %s\n created from %s, %d (0x%x) bytes\n" % (os.path.basename(ofile), os.path.basename(ifile), n, n)).encode())
w("""\n\ w("""\n\
This file is part of the UPX executable compressor. This file is part of the UPX executable compressor.
@@ -74,7 +74,7 @@ def w_header_c(w, ifile, ofile, n):
John F. Reiser John F. Reiser
<jreiser@users.sourceforge.net> <jreiser@users.sourceforge.net>
*/\n\n""") */\n\n""".encode())
# /*********************************************************************** # /***********************************************************************
@@ -87,11 +87,11 @@ class DataWriter:
self.pos = None self.pos = None
def w_bol(self, pos): def w_bol(self, pos):
self.w("/* 0x%04x */ " % (pos)) self.w(("/* 0x%04x */ " % (pos)).encode())
self.pos = pos self.pos = pos
def w_eol(self, fill=""): def w_eol(self, fill=""):
if self.pos is not None: if self.pos is not None:
self.w(fill.rstrip() + "\n") self.w((fill.rstrip() + "\n").encode())
class DataWriter_c(DataWriter): class DataWriter_c(DataWriter):
@@ -101,8 +101,8 @@ class DataWriter_c(DataWriter):
if i & 15 == 0: if i & 15 == 0:
self.w_eol() self.w_eol()
self.w_bol(i) self.w_bol(i)
w("%3d" % ord(data[i])) w(("%3d" % data[i]).encode())
if i != n - 1: w(",") if i != n - 1: w(",".encode())
self.w_eol() self.w_eol()
@@ -113,10 +113,10 @@ class DataWriter_gas(DataWriter):
if i & 15 == 0: if i & 15 == 0:
self.w_eol() self.w_eol()
self.w_bol(i) self.w_bol(i)
w(".byte ") w(".byte ".encode())
else: else:
w(",") w(",".encode())
w("%3d" % ord(data[i])) w(("%3d" % data[i]).encode())
self.w_eol() self.w_eol()
@@ -128,12 +128,12 @@ class _DataWriter_gas_u32(DataWriter):
if i & 15 == 0: if i & 15 == 0:
self.w_eol() self.w_eol()
self.w_bol(i) self.w_bol(i)
w(".int ") w(".int ".encode())
else: else:
w(",") w(",".encode())
v = struct.unpack(self.DECODE, data[i:i+4]) v = struct.unpack(self.DECODE, data[i:i+4])
assert len(v) == 1, v assert len(v) == 1, v
w("0x%08x" % (v[0] & 0xffffffffL)) w(("0x%08x" % (v[0] & 0xffffffff)).encode())
self.w_eol() self.w_eol()
class DataWriter_gas_be32(_DataWriter_gas_u32): class DataWriter_gas_be32(_DataWriter_gas_u32):
@@ -148,7 +148,7 @@ class DataWriter_nasm(DataWriter):
def w_eol(self, fill=""): def w_eol(self, fill=""):
if self.pos is not None: if self.pos is not None:
self.w(fill) self.w(fill)
self.w(" ; 0x%04x\n" % (self.pos)) self.w((" ; 0x%04x\n" % (self.pos)).encode())
def w_data(self, data): def w_data(self, data):
w, n = self.w, len(data) w, n = self.w, len(data)
@@ -156,10 +156,10 @@ class DataWriter_nasm(DataWriter):
if i & 15 == 0: if i & 15 == 0:
self.w_eol() self.w_eol()
self.w_bol(i) self.w_bol(i)
w("db ") w("db ".encode())
else: else:
w(",") w(",".encode())
w("%3d" % ord(data[i])) w(("%3d" % ord(data[i])).encode())
nn = ((n + 15) & ~15) - n nn = ((n + 15) & ~15) - n
self.w_eol(" " * 4 * nn) self.w_eol(" " * 4 * nn)
@@ -169,21 +169,21 @@ class DataWriter_nasm(DataWriter):
# ************************************************************************/ # ************************************************************************/
def w_checksum_c(w, s, data): def w_checksum_c(w, s, data):
w("#define %s_SIZE %d\n" % (s, len(data))) w(("#define %s_SIZE %d\n" % (s, len(data))).encode())
w("#define %s_ADLER32 0x%08x\n" % (s, 0xffffffffL & zlib.adler32(data))) w(("#define %s_ADLER32 0x%08x\n" % (s, 0xffffffff & zlib.adler32(data))).encode())
w("#define %s_CRC32 0x%08x\n" % (s, 0xffffffffL & zlib.crc32(data))) w(("#define %s_CRC32 0x%08x\n" % (s, 0xffffffff & zlib.crc32(data))).encode())
w("\n") w("\n".encode())
def write_stub(w, odata, method_index, methods): def write_stub(w, odata, method_index, methods):
method = methods[method_index] method = methods[method_index]
if len(methods) > 1: if len(methods) > 1:
if method_index == 0: if method_index == 0:
w("#if (%s == %d)\n\n" % (opts.mname, method)) w(("#if (%s == %d)\n\n" % (opts.mname, method)).encode())
elif method_index < len(methods) - 1: elif method_index < len(methods) - 1:
w("\n#elif (%s == %d)\n\n" % (opts.mname, method)) w(("\n#elif (%s == %d)\n\n" % (opts.mname, method)).encode())
else: else:
w("\n#else\n\n") w("\n#else\n\n".encode())
if opts.ident: if opts.ident:
if opts.mode == "c": if opts.mode == "c":
@@ -193,8 +193,8 @@ def write_stub(w, odata, method_index, methods):
#w("#if defined(__ELF__)\n") #w("#if defined(__ELF__)\n")
#w('__attribute__((__section__("upx_stubs")))\n') #w('__attribute__((__section__("upx_stubs")))\n')
#w("#endif\n") #w("#endif\n")
w("ATTRIBUTE_FOR_STUB(%s)\n" % (opts.ident)) w(("ATTRIBUTE_FOR_STUB(%s)\n" % (opts.ident)).encode())
w("unsigned char %s[%d] = {\n" % (opts.ident, len(odata))) w(("unsigned char %s[%d] = {\n" % (opts.ident, len(odata))).encode())
if opts.mode == "c": if opts.mode == "c":
DataWriter_c(w).w_data(odata) DataWriter_c(w).w_data(odata)
elif opts.mode == "gas": elif opts.mode == "gas":
@@ -209,11 +209,11 @@ def write_stub(w, odata, method_index, methods):
assert 0, ("invalid mode", opts.mode) assert 0, ("invalid mode", opts.mode)
if opts.ident: if opts.ident:
if opts.mode == "c": if opts.mode == "c":
w("};\n") w("};\n".encode())
if len(methods) > 1: if len(methods) > 1:
if method_index == len(methods) - 1: if method_index == len(methods) - 1:
w("\n#endif\n") w("\n#endif\n".encode())
# /*********************************************************************** # /***********************************************************************
@@ -293,10 +293,10 @@ def main(argv):
# check file size # check file size
st = os.stat(ifile) st = os.stat(ifile)
if 1 and st.st_size <= 0: if 1 and st.st_size <= 0:
print >> sys.stderr, "%s: ERROR: empty file" % (ifile) sys.stderr.write("%s: ERROR: empty file\n" % (ifile))
sys.exit(1) sys.exit(1)
if 1 and st.st_size > 128*1024: if 1 and st.st_size > 128*1024:
print >> sys.stderr, "%s: ERROR: file is too big (%d bytes)" % (ifile, st.st_size) sys.stderr.write("%s: ERROR: file is too big (%d bytes)\n" % (ifile, st.st_size))
sys.exit(1) sys.exit(1)
# read ifile # read ifile
@@ -321,19 +321,22 @@ def main(argv):
# compress stubs # compress stubs
# (process in reverse order so that incompressible do not get sorted first) # (process in reverse order so that incompressible do not get sorted first)
mdata, mdata_odata = [], {} mdata, mdata_odata = [], {}
assert len(opts.methods) >= 1 ### FIXME assert len(opts.methods) >= 1
r_methods = opts.methods[:] ### r_methods = opts.methods[:]
r_methods.reverse() ### r_methods.reverse()
r_methods = [];
for m in opts.methods:
r_methods.insert(0, m)
for method in r_methods: for method in r_methods:
method, odata = compress_stub(method, idata) method, odata = compress_stub(method, idata)
if mdata_odata.has_key(method): if method in mdata_odata:
assert mdata_odata[method] == odata assert mdata_odata[method] == odata
else: else:
mdata_odata[method] = odata mdata_odata[method] = odata
mdata.append(method) mdata.append(method)
assert len(mdata) >= 1 assert len(mdata) >= 1
mdata.reverse() mdata.reverse()
##print opts.methods, [(i, len(mdata_odata[i])) for i in mdata] ##print (opts.methods, [(i, len(mdata_odata[i])) for i in mdata])
# write ofile # write ofile
if opts.dry_run: if opts.dry_run:
@@ -349,7 +352,7 @@ def main(argv):
if opts.mode == "c": if opts.mode == "c":
if opts.verbose >= 0: if opts.verbose >= 0:
w_header_c(w, ifile, ofile, len(idata)) w_header_c(w, ifile, ofile, len(idata))
w("/* clang" + "-format" + " off */\n\n") w(("/* clang" + "-format" + " off */\n\n").encode())
for i in range(len(mdata)): for i in range(len(mdata)):
write_stub(w, mdata_odata[mdata[i]], i, mdata) write_stub(w, mdata_odata[mdata[i]], i, mdata)
if ofp: if ofp:
+8 -8
View File
@@ -1,4 +1,4 @@
#! /usr/bin/env python2 #! /usr/bin/env python3
## vim:set ts=4 sw=4 et: -*- coding: utf-8 -*- ## vim:set ts=4 sw=4 et: -*- coding: utf-8 -*-
# #
# brandelf.py -- # brandelf.py --
@@ -54,32 +54,32 @@ def do_file(fn):
def write(s): def write(s):
if not opts.dry_run: if not opts.dry_run:
fp.write(s) fp.write(s.encode())
def brand_arm(s): def brand_arm(s):
if e_ident[4:7] != s: if e_ident[4:7] != s.encode():
raise Exception("%s is not %s" % (fn, opts.bfdname)) raise Exception("%s is not %s" % (fn, opts.bfdname))
write("\x61") # ELFOSABI_ARM write("\x61") # ELFOSABI_ARM
def brand_freebsd(s): def brand_freebsd(s):
if e_ident[4:7] != s: if e_ident[4:7] != s.encode():
raise Exception("%s is not %s" % (fn, opts.bfdname)) raise Exception("%s is not %s" % (fn, opts.bfdname))
write("\x09") write("\x09")
def brand_linux(s): def brand_linux(s):
if e_ident[4:7] != s: if e_ident[4:7] != s.encode():
raise Exception("%s is not %s" % (fn, opts.bfdname)) raise Exception("%s is not %s" % (fn, opts.bfdname))
##write("\x00Linux\x00\x00\x00") ##write("\x00Linux\x00\x00\x00")
write("\x00" * 9) write("\x00" * 9)
def brand_netbsd(s): def brand_netbsd(s):
if e_ident[4:7] != s: if e_ident[4:7] != s.encode():
raise Exception("%s is not %s" % (fn, opts.bfdname)) raise Exception("%s is not %s" % (fn, opts.bfdname))
write("\x02") write("\x02")
def brand_openbsd(s): def brand_openbsd(s):
if e_ident[4:7] != s: if e_ident[4:7] != s.encode():
raise Exception("%s is not %s" % (fn, opts.bfdname)) raise Exception("%s is not %s" % (fn, opts.bfdname))
write("\x0c") write("\x0c")
if opts.bfdname[:3] == "elf": if opts.bfdname[:3] == "elf":
if e_ident[:4] != "\x7f\x45\x4c\x46": if e_ident[:4] != "\x7f\x45\x4c\x46".encode():
raise Exception("%s is not %s" % (fn, "ELF")) raise Exception("%s is not %s" % (fn, "ELF"))
fp.seek(7, 0) fp.seek(7, 0)
if opts.bfdname == "elf32-bigarm" and opts.elfosabi == "arm": if opts.bfdname == "elf32-bigarm" and opts.elfosabi == "arm":
+8 -8
View File
@@ -1,4 +1,4 @@
#! /usr/bin/env python2 #! /usr/bin/env python3
## vim:set ts=4 sw=4 et: -*- coding: utf-8 -*- ## vim:set ts=4 sw=4 et: -*- coding: utf-8 -*-
# #
# gpp_inc.py -- Generic PreProcessor: include # gpp_inc.py -- Generic PreProcessor: include
@@ -83,7 +83,7 @@ def parse_comment(state, l, comment):
def handle_inc_c(state, l, ofp): def handle_inc_c(state, l, ofp):
m = re.search(r"^\s*\#\s*include\s+([\"\<])(.+?)([\"\>])(.*)$", l) m = re.search(r"^\s*\#\s*include\s+([\"\<])(.+?)([\"\>])(.*)$", l.decode())
if not m: if not m:
return l return l
q1, inc, q2, comment = m.groups() q1, inc, q2, comment = m.groups()
@@ -93,7 +93,7 @@ def handle_inc_c(state, l, ofp):
elif q1 == '"' and q2 == '"': elif q1 == '"' and q2 == '"':
dirs = [state[1]] + opts.includes dirs = [state[1]] + opts.includes
else: else:
raise Exception("syntax error: include line " + l) raise Exception("syntax error: include line " + l.decode())
for dir in dirs: for dir in dirs:
fn = os.path.join(dir, inc) fn = os.path.join(dir, inc)
if os.path.isfile(fn): if os.path.isfile(fn):
@@ -130,13 +130,13 @@ def handle_file(ifn, ofp, parent_state=None):
ifp = open(ifn, "rb") ifp = open(ifn, "rb")
for l in ifp.readlines(): for l in ifp.readlines():
state[2] += 1 # line counter state[2] += 1 # line counter
l = l.rstrip("\n") l = l.rstrip("\n".encode())
if opts.mode == "c": if opts.mode == "c":
l = handle_inc_c(state, l, ofp) l = handle_inc_c(state, l, ofp)
elif opts.mode == "nasm": elif opts.mode == "nasm":
l = handle_inc_nasm(state, l, ofp) l = handle_inc_nasm(state, l, ofp)
if l is not None: if l is not None:
ofp.write(l + "\n") ofp.write(l + "\n".encode())
def main(argv): def main(argv):
@@ -179,12 +179,12 @@ def main(argv):
os.unlink(fn) os.unlink(fn)
if files_mmd: if files_mmd:
fp = open(fn, "wb") fp = open(fn, "wb")
fp.write("%s : \\\n" % opts.target_mmd) fp.write(("%s : \\\n" % opts.target_mmd).encode())
for i, f in enumerate(files_mmd): for i, f in enumerate(files_mmd):
if i < len(files_mmd) - 1: if i < len(files_mmd) - 1:
fp.write(" %s \\\n" % f) fp.write((" %s \\\n" % f).encode())
else: else:
fp.write(" %s\n" % f) fp.write((" %s\n" % f).encode())
fp.close() fp.close()
+13 -13
View File
@@ -1,4 +1,4 @@
#! /usr/bin/env python2 #! /usr/bin/env python3
## vim:set ts=4 sw=4 et: -*- coding: utf-8 -*- ## vim:set ts=4 sw=4 et: -*- coding: utf-8 -*-
# #
# xstrip.py -- truncate ELF objects created by multiarch-objcopy-2.17 # xstrip.py -- truncate ELF objects created by multiarch-objcopy-2.17
@@ -46,7 +46,7 @@ def strip_with_dump(dump_fn, eh, idata):
new_len = 0 new_len = 0
lines = open(dump_fn, "rb").readlines() lines = open(dump_fn, "rb").readlines()
for l in lines: for l in lines:
l = re.sub(r"\s+", " ", l.strip()) l = re.sub(r"\s+", " ", l.strip().decode())
f = l.split(" ") f = l.split(" ")
if len(f) >= 8: if len(f) >= 8:
if f[7].startswith("CONTENTS"): if f[7].startswith("CONTENTS"):
@@ -54,9 +54,9 @@ def strip_with_dump(dump_fn, eh, idata):
sh_size = int("0x" + f[2], 16) sh_size = int("0x" + f[2], 16)
if sh_offset + sh_size > new_len: if sh_offset + sh_size > new_len:
new_len = sh_offset + sh_size new_len = sh_offset + sh_size
##print sh_offset, sh_size, f ##print (sh_offset, sh_size, f)
if new_len > len(eh): if new_len > len(eh):
##print dump_fn, new_len ##print (dump_fn, new_len)
return eh, idata[:new_len-len(eh)] return eh, idata[:new_len-len(eh)]
return eh, idata return eh, idata
@@ -67,7 +67,7 @@ def strip_with_dump(dump_fn, eh, idata):
def check_dump(dump_fn): def check_dump(dump_fn):
lines = open(dump_fn, "rb").readlines() lines = open(dump_fn, "rb").readlines()
lines = map(lambda l: re.sub(r"\s+", " ", l.strip()).strip(), lines) lines = map(lambda l: re.sub(r"\s+", " ", l.strip().decode()).strip(), lines)
lines = filter(None, lines) lines = filter(None, lines)
d = "\n".join(lines) d = "\n".join(lines)
psections = d.find("Sections:\n") psections = d.find("Sections:\n")
@@ -88,10 +88,10 @@ def check_dump(dump_fn):
assert int(f[0], 10) == len(sections) assert int(f[0], 10) == len(sections)
e = f[1], int(f[2], 16), int(f[5], 16), int(f[6][3:], 10), len(sections) e = f[1], int(f[2], 16), int(f[5], 16), int(f[6][3:], 10), len(sections)
sections.append(e) sections.append(e)
assert not section_names.has_key(e[0]), e assert not e[0] in section_names, e
assert not e[0].endswith(":"), ("bad section name", e) assert not e[0].endswith(":"), ("bad section name", e)
section_names[e[0]] = e section_names[e[0]] = e
##print sections ##print (sections)
# preprocessSymbols # preprocessSymbols
symbols = [] symbols = []
section = None section = None
@@ -140,25 +140,25 @@ def do_file(fn):
fp = open(fn, "r+b") fp = open(fn, "r+b")
fp.seek(0, 0) fp.seek(0, 0)
idata = fp.read() idata = fp.read()
if idata[:4] != "\x7f\x45\x4c\x46": if idata[:4] != "\x7f\x45\x4c\x46".encode():
raise Exception("%s is not %s" % (fn, "ELF")) raise Exception("%s is not %s" % (fn, "ELF"))
if idata[4:7] == "\x01\x01\x01": if idata[4:7] == "\x01\x01\x01".encode():
# ELF32 LE # ELF32 LE
eh, idata = idata[:52], idata[52:] eh, idata = idata[:52], idata[52:]
e_shnum, e_shstrndx = struct.unpack("<HH", eh[48:52]) e_shnum, e_shstrndx = struct.unpack("<HH", eh[48:52])
assert e_shstrndx + 3 == e_shnum assert e_shstrndx + 3 == e_shnum
##eh = eh[:48] + struct.pack("<HH", e_shnum - 3, e_shstrndx) ##eh = eh[:48] + struct.pack("<HH", e_shnum - 3, e_shstrndx)
elif idata[4:7] == "\x01\x02\x01": elif idata[4:7] == "\x01\x02\x01".encode():
# ELF32 BE # ELF32 BE
eh, idata = idata[:52], idata[52:] eh, idata = idata[:52], idata[52:]
e_shnum, e_shstrndx = struct.unpack(">HH", eh[48:52]) e_shnum, e_shstrndx = struct.unpack(">HH", eh[48:52])
assert e_shstrndx + 3 == e_shnum assert e_shstrndx + 3 == e_shnum
elif idata[4:7] == "\x02\x01\x01": elif idata[4:7] == "\x02\x01\x01".encode():
# ELF64 LE # ELF64 LE
eh, idata = idata[:64], idata[64:] eh, idata = idata[:64], idata[64:]
e_shnum, e_shstrndx = struct.unpack("<HH", eh[60:64]) e_shnum, e_shstrndx = struct.unpack("<HH", eh[60:64])
assert e_shstrndx + 3 == e_shnum assert e_shstrndx + 3 == e_shnum
elif idata[4:7] == "\x02\x02\x01": elif idata[4:7] == "\x02\x02\x01".encode():
# ELF64 BE # ELF64 BE
eh, idata = idata[:64], idata[64:] eh, idata = idata[:64], idata[64:]
e_shnum, e_shstrndx = struct.unpack(">HH", eh[60:64]) e_shnum, e_shstrndx = struct.unpack(">HH", eh[60:64])
@@ -167,7 +167,7 @@ def do_file(fn):
raise Exception("%s is not %s" % (fn, "ELF")) raise Exception("%s is not %s" % (fn, "ELF"))
odata = None odata = None
pos = idata.find("\0.symtab\0.strtab\0.shstrtab\0") pos = idata.find("\0.symtab\0.strtab\0.shstrtab\0".encode())
if opts.with_dump: if opts.with_dump:
eh, odata = strip_with_dump(opts.with_dump, eh, idata) eh, odata = strip_with_dump(opts.with_dump, eh, idata)
# Other compilers can intermix the contents of .rela sections # Other compilers can intermix the contents of .rela sections
+212 -1
View File
@@ -94,7 +94,212 @@ _start: .globl _start
push %rsp; pop %rdi // argv push %rsp; pop %rdi // argv
push %rcx // argc push %rcx // argc
push %rdx // param for atexit() push %rdx // param for atexit()
lea cancel_dummy(%rip),%r15
section ELFSIGSEGV
// install SIGSEGV handler for debugging
SIGSEGV= 11
SA_SIGINFO= 4 // /usr/include/bits/sigaction.h
SA_RESTORER= 0x04000000
__NR_rt_sigaction= 13 // /usr/include/asm/unistd_64.h
push %rdi // save reg
sub %edx,%edx // arg3= 0 ==> do not save old sigaction
push %rdx // .sa_mask: 64 bits (8 bytes) of flags for signals
lea __restore_rt(%rip),%rax; push %rax // .sa_restorer
push $SA_RESTORER | SA_SIGINFO // .sa_flags
lea sigsegv_sigaction(%rip),%rax; push %rax // .sa_sigaction
lea cancel_sigsegv(%rip),%r15
push %rsp; pop %rsi // arg2= &new struct sigaction
push $SIGSEGV; pop %rdi // arg1= signum
push $8; pop %r10 // sys4= sizeof(__sigset_t) ==> 64 bits
push $__NR_rt_sigaction; pop %rax; syscall
add $(3 + 1) * NBPW,%rsp // toss struct sigaction
pop %rdi // restore reg
#if 0 //{ TEST ONLY
movl $0x18181818,%r8d
movl $0x19191919,%r9d
movl $0x1a1a1a1a,%r10d
movl $0x1b1b1b1b,%r11d
movl $0x1c1c1c1c,%r12d
movl $0x1d1d1d1d,%r13d
movl $0x1e1e1e1e,%r14d
movl $0x1f1f1f1f,%r15d
movl $0xaaaaaaaa,%eax
movl $0xbbbbbbbb,%ebx
movl $0xcccccccc,%ecx
movl $0xdddddddd,%edx
movl $0x55555555,%ebp
movl $0x66666666,%esi
movl $0x77777777,%edi
movl (%rdx),%edx // force SIGSEGV
#endif // TEST_ONLY}
jmp end_sigsegv
__NR_rt_sigreturn= 15
__restore_rt:
endbr64
mov $__NR_rt_sigreturn,%eax
syscall
sigsegv_sigaction:
endbr64
push %rdx // save &ucontext_t
// print /proc/self/maps of child (same as parent: the beauty of fork())
mov $end_announce_sigaction - announce_sigaction,%edx // arg3 len
lea announce_sigaction(%rip),%rsi // arg2 buf
push $2; pop %rdi // arg1 fd_stderr
push $__NR_write; pop %rax; syscall // ignore error on write()
xor %esi,%esi // arg2 O_RDONLY
lea proc_self_maps(%rip),%arg1
push $__NR_open; pop %rax; syscall
mov %rax,%r12 // fd_maps
BUFLEN= 4096
mov $BUFLEN,%ebx; sub %rbx,%rsp // allocate buffer
loop_maps:
mov %ebx,%edx // arg3 buflen
push %rsp; pop %rsi // arg2 buffer
mov %r12,%rdi // arg1 fd_maps
xor %eax,%eax; syscall // __NR_read
test %eax,%eax; jle done_maps // ignore error on read()
mov %eax,%edx // arg3 buflen
push %rsp; pop %rsi // arg2 buf
push $2; pop %rdi // arg1 fd_stderr
push $__NR_write; pop %rax; syscall // ignore error on write()
jmp loop_maps
done_maps:
mov %r12,%rdi //arg1 fd_maps
add %rbx,%rsp // discard buffer
push $__NR_close; pop %rax; syscall
// end printing of /proc/self/maps
pop %rdx // restore &ucontext_t
__NR_fork= 57
push $__NR_fork; pop %rax; call sys_check
test %eax,%eax; je child
parent:
jmp parent // spin; paused by gdb
proc_self_cmdline:
.asciz "/proc/self/cmdline"
announce_sigaction:
.asciz "\n\nSIGSEGV address space:\n"
end_announce_sigaction:
proc_self_maps:
.asciz "/proc/self/maps"
minus_q:
.asciz "-q"
path_gdb:
.asciz "/usr/bin/gdb"
commands_gdb:
.ascii "set prompt\n" // null string prompt
.ascii "info inferiors\n"
// ucontext_t, mcontext_t, gregset_t, gret_t, REG_xxx: <sys/ucontext.h>
// stack_t <bits/types/stack_t.h>
.ascii "print \"r8 - r15\"\n"
.ascii "x/8xg $rdx + 5*8\n"
.ascii "print \"rdi, rsi, rbp, rbx\"\n"
.ascii "x/4xg\n"
.ascii "print \"rdx, rax, rcx, rsp\"\n"
.ascii "x/4xg\n"
.ascii "print \"rip, efl\"\n"
.ascii "x/2xg\n"
.ascii "set $pc = *(long *)($rdx + 168)\n"
.ascii "print \"faulting instr\"\n"
.ascii "x/i $pc\n"
.ascii "print \"fault context\"\n"
.ascii "x/16i $pc - 0x20\n"
.ascii "print \"user stack\"\n"
.ascii "x/64xg *(long *)($rdx + 5*8 + 15*8)\n"
.ascii "kill\n"
.ascii "quit 1"
.byte 0
commands_gdb_end:
child:
PATH_MAX= 4096
sub $PATH_MAX,%rsp
lea proc_self_cmdline(%rip),%arg1
O_RDONLY= 0
push $O_RDONLY; pop %arg2
push $__NR_open; pop %rax; call sys_check
push %rax; pop %arg1 // fd
push %rsp; pop %arg2 // buffer
push $PATH_MAX; pop %arg3
__NR_read= 0
push $__NR_read; pop %rax; call sys_check
push $__NR_close; pop %rax; call sys_check
__NR_getppid= 110
push $__NR_getppid; pop %rax; syscall
push %rax; pop %rsi
xor %eax,%eax; push %rax; push %rax // decimal(pid) fits in 16 bytes
push %rsp; pop %rdi; call unsimal
// argv
push %rsp; pop %rsi // fence post: &pid.unsimal
push $0 // argv[4]
push %rsi // arg3 pid
add $16,%rsi; push %rsi // arg2 exename
lea minus_q(%rip),%rax; push %rax // arg1 "-q"
add $(path_gdb - minus_q),%rax; push %rax // arg[0] "/usr/bin/gdb"
#if 1 //{ pipe input to gdb
xor %edi,%edi; push $__NR_close; pop %rax; syscall
push %rax; push %rsp; pop %rdi // &fd_pipe[2]; 4 bytes each
__NR_pipe= 22
push $__NR_pipe; pop %rax; call sys_check
pop %rdi; shr $32,%rdi // arg1 write side of pipe
push $commands_gdb_end - commands_gdb; pop %arg3
lea commands_gdb(%rip),%arg2
__NR_write= 1
push $__NR_write; pop %rax; call sys_check
push $__NR_close; pop %rax; syscall
#endif //}
push $0; pop %arg3 // _environ BUG
push %rsp; pop %arg2 // argv
movq (%arg2),%arg1 // "/usr/bin/gdb"
__NR_execve= 59
push $__NR_execve; pop %rax; call sys_check
hlt
unsimal: // (dst, value)
push $10; pop %rcx // radix
mov %esi,%eax // value
call 0f
movb $0,(%rdi) // terminator
ret
0:
xor %edx,%edx; div %ecx; push %rdx // eax= quo(%edx:%eax / %ecx); edx= rem
// 'div' undefines all flags!
test %eax,%eax; je 1f; call 0b
1:
pop %rax; add $'0',%eax
stosb
ret
// Uninstall SIGSEGV handler
cancel_sigsegv:
endbr64
push $8; pop %sys4 // sys_arg4 minimal byte count
xor %edx,%edx // no old
xor %esi,%esi // no new
push $SIGSEGV; pop %rdi
push $__NR_rt_sigaction; pop %eax; syscall
ret
end_sigsegv:
section ELFMAINX2
#define old_sp %rbp #define old_sp %rbp
F_FRAME= 7*NBPW F_FRAME= 7*NBPW
F_ENTR= 6*NBPW; F_PMASK= F_ENTR F_ENTR= 6*NBPW; F_PMASK= F_ENTR
@@ -105,8 +310,9 @@ F_ELFA= 2*NBPW
F_LENX= 1*NBPW F_LENX= 1*NBPW
F_ADRX= 0*NBPW F_ADRX= 0*NBPW
D_FOLD= 1*NBPW // .data space at start of unfold D_FOLD= 2*NBPW // .data space at start of unfold
D_PMASK= 0*NBPW D_PMASK= 0*NBPW
D_XSIGSEGV= 1*NBPW
// find auxv // find auxv
xor %eax,%eax // 0 xor %eax,%eax // 0
@@ -264,6 +470,7 @@ eof_n2b:
// Write de-compressed 'fold' to file // Write de-compressed 'fold' to file
mov F_PMASK(old_sp),%rax; mov %rax,/*D_PMASK*/(%rsp) // propagate PAGE_MASK mov F_PMASK(old_sp),%rax; mov %rax,/*D_PMASK*/(%rsp) // propagate PAGE_MASK
mov %r15,D_XSIGSEGV(%rsp) // propagate cancel_sigsegv
mov F_LENU(old_sp),%arg3 // LENU mov F_LENU(old_sp),%arg3 // LENU
sub $INSURANCE,%arg3 // memcheck limit sub $INSURANCE,%arg3 // memcheck limit
push %rsp; pop %arg2 // buffer push %rsp; pop %arg2 // buffer
@@ -295,6 +502,10 @@ eof_n2b:
add $D_FOLD,%rax // beyond .data add $D_FOLD,%rax // beyond .data
jmp *%rax // goto unfolded stub jmp *%rax // goto unfolded stub
cancel_dummy:
endbr64
ret
sys_check: sys_check:
push %rax // save __NR_ for debug push %rax // save __NR_ for debug
syscall syscall
+14 -5
View File
@@ -81,6 +81,7 @@ is_ptinterp= (1<<0)
.balign 8 .balign 8
PAGE_MASK: .quad -1<<12 // default PAGE_MASK: .quad -1<<12 // default
cancel_sigsegv: .quad 0 // subroutine that cancels sigaction(SIGSEGV,)
// IN: [ADRX,+LENX): compressed data; [ADRU,+LENU): expanded fold (w/ upx_main2) // IN: [ADRX,+LENX): compressed data; [ADRU,+LENU): expanded fold (w/ upx_main2)
// %rsp= %rbp= &F_ADRX; %r13= O_BINFO | is_ptinterp | unmap_all_pages // %rsp= %rbp= &F_ADRX; %r13= O_BINFO | is_ptinterp | unmap_all_pages
@@ -174,9 +175,12 @@ no_env_pse:
*/ */
// rsp/ {OVERHEAD},ADRU,LENU,rdx,%entry, argc,argv,0,envp,0,auxv,0,strings // rsp/ {OVERHEAD},ADRU,LENU,rdx,%entry, argc,argv,0,envp,0,auxv,0,strings
addq $OVERHEAD,%rsp # Elf64_Ehdr temporary space addq $OVERHEAD,%rsp # Elf64_Ehdr temporary space
mov %ebp,%ebx # fd #define r_fd ebx
mov %ebp,%r_fd
movq %rax,3*NBPW(%rsp) # entry movq %rax,3*NBPW(%rsp) # entry
call *cancel_sigsegv(%rip)
sz_Ehdr= 8*NBPW sz_Ehdr= 8*NBPW
e_type= 16 e_type= 16
ET_EXEC= 2 ET_EXEC= 2
@@ -190,22 +194,27 @@ p_memsz= 5*NBPW
movq %r13,%arg1; call munmap # discard C_TEXT compressed data movq %r13,%arg1; call munmap # discard C_TEXT compressed data
// Map 1 page of /proc/self/exe so that the symlink does not disappear. // Map 1 page of /proc/self/exe so that the symlink does not disappear.
test %ebx,%ebx; js no_pse_map test %r_fd,%r_fd; js no_pse_map
subq %arg6,%arg6 # 0 offset subq %arg6,%arg6 # 0 offset
mov %ebx,%arg5l # fd mov %r_fd,%arg5l # fd
push $MAP_PRIVATE; pop %arg4 push $MAP_PRIVATE; pop %arg4
push $PROT_READ; pop %arg3 push $PROT_READ; pop %arg3
mov $1<<12,%arg2l mov $1<<12,%arg2l
subl %arg1l,%arg1l # 0 subl %arg1l,%arg1l # 0
call mmap call mmap
mov %ebx,%edi # fd mov %r_fd,%edi # fd
call close call close
.macro NOTRACK
.byte 0x3e
.endm
no_pse_map: no_pse_map:
pop %arg1 # ADRU: unfolded upx_main2 etc. pop %arg1 # ADRU: unfolded upx_main2 etc.
pop %arg2 # LENU pop %arg2 # LENU
push $__NR_munmap; pop %rax push $__NR_munmap; pop %rax
/*notrack*/ jmp *(%r14) # goto: syscall; pop %rdx; ret NOTRACK; jmp *(%r14) # goto: syscall; pop %rdx; ret
get_page_mask: .globl get_page_mask get_page_mask: .globl get_page_mask
mov PAGE_MASK(%rip),%rax mov PAGE_MASK(%rip),%rax
+6 -10
View File
@@ -502,18 +502,14 @@ do_xmap(
ElfW(Addr) reloc = 0; ElfW(Addr) reloc = 0;
if (xi) { // compressed main program: if (xi) { // compressed main program:
// C_BASE space reservation, C_TEXT compressed data and stub // C_BASE space reservation, C_TEXT compressed data and stub
ElfW(Addr) ehdr0 = *p_reloc; // the 'hi' copy! ElfW(Addr) ehdr0 = *p_reloc;
ElfW(Phdr) *phdr0 = (ElfW(Phdr) *)(1+ (ElfW(Ehdr) *)ehdr0); // cheats .e_phoff ElfW(Phdr) *phdr0 = (ElfW(Phdr) *)(1+ (ElfW(Ehdr) *)ehdr0); // cheats .e_phoff
// Clear the 'lo' space reservation for use by PT_LOADs v_brk = ehdr0 + phdr0->p_vaddr + phdr0->p_memsz;
ehdr0 -= phdr0[1].p_vaddr; // the 'lo' copy if (ET_DYN == ehdr->e_type) {
if (ET_EXEC == ehdr->e_type) { reloc = ehdr0 - phdr0[1].p_vaddr;
ehdr0 = phdr0[0].p_vaddr;
} }
else { // paranoia: prevent "hangover" from VMA for C_BASE
reloc = ehdr0; munmap((void *)(reloc + phdr0->p_vaddr), phdr0->p_memsz);
}
v_brk = phdr0->p_memsz + ehdr0;
munmap((void *)ehdr0, phdr0->p_memsz);
} }
else { // PT_INTERP else { // PT_INTERP
DPRINTF("INTERP\\n", 0); DPRINTF("INTERP\\n", 0);
+18 -3
View File
@@ -102,7 +102,7 @@ memcpy: .globl memcpy // void *memcpy(void *dst, void const *src, size_t n)
/* 64-bit mode only! */ /* 64-bit mode only! */
__NR_read= 0 __NR_read= 0
__NR_write= 1 __NR_write= 1
//__NR_open= 2 __NR_open= 2
__NR_openat= 257 __NR_openat= 257
FD_CWD= -100 FD_CWD= -100
__NR_close= 3 __NR_close= 3
@@ -190,8 +190,6 @@ exit: .globl exit
push $ __NR_exit; 5: jmp 5f push $ __NR_exit; 5: jmp 5f
ftruncate: .globl ftruncate ftruncate: .globl ftruncate
push $__NR_ftruncate; 5: jmp 5f push $__NR_ftruncate; 5: jmp 5f
memfd_create: .globl memfd_create
push $__NR_memfd_create; 5: jmp 5f
close: .globl close close: .globl close
push $ __NR_close; 5: jmp 5f push $ __NR_close; 5: jmp 5f
openat: .globl openat openat: .globl openat
@@ -202,4 +200,21 @@ write: .globl write
read: .globl read read: .globl read
push $ __NR_read; 5: jmp sysgo push $ __NR_read; 5: jmp sysgo
memfd_create: .globl memfd_create
0:
movl $__NR_memfd_create,%eax; syscall
test %eax,%eax; js 1f; ret // success
1:
test %arg2l,%arg2l; jz no_memfd // memfd_create failed twice
xor %arg2l,%arg2l; jmp 0b // try again without MFD_EXEC
no_memfd: // so try /dev/shm
O_RDWR= 2
O_DIRECTORY= 0200000 // 0x010000
O_TMPFILE= 020000000 // 0x400000
call 0f; .int 0700, O_RDWR|O_DIRECTORY|O_TMPFILE; .asciz "/dev/shm"; 0: pop %rsi
lodsl; xchg %eax,%arg3l
lodsl; push %rsi; xchg %eax,%arg2l
pop %arg1
push $__NR_open; jmp sysgo
// section SO_MAIN inserted here // section SO_MAIN inserted here
+2 -2
View File
@@ -198,7 +198,7 @@ ifneq ($(wildcard $(WATCOM)/binl/wcl),)
# step 3: clean asm # step 3: clean asm
lzma_d_c%.S : tmp/lzma_d_c%.i cleanasm.py $(MAKEFILE_LIST) lzma_d_c%.S : tmp/lzma_d_c%.i cleanasm.py $(MAKEFILE_LIST)
$(PYTHON) cleanasm.py --label-prefix=$(LABEL_PREFIX) $< $@ $(PYTHON2) cleanasm.py --label-prefix=$(LABEL_PREFIX) $< $@
# step 2: compile, strip and disasm # step 2: compile, strip and disasm
tmp/lzma_d_c%.i : tmp/lzma_d_c%.S $(MAKEFILE_LIST) tmp/lzma_d_c%.i : tmp/lzma_d_c%.S $(MAKEFILE_LIST)
@@ -233,7 +233,7 @@ ifneq ($(wildcard $(WATCOM)/binl/wcl),)
$(call tc,wdis) tmp/$T_wc.obj | $(RTRIM) > tmp/$T_wc.obj.disasm $(call tc,wdis) tmp/$T_wc.obj | $(RTRIM) > tmp/$T_wc.obj.disasm
endif endif
# convert # convert
$(PYTHON) wdis2gas.py tmp/$T_wc.obj.disasm $@ $(PYTHON2) wdis2gas.py tmp/$T_wc.obj.disasm $@
.PRECIOUS: tmp/lzma_d_c%.i tmp/lzma_d_c%.S .PRECIOUS: tmp/lzma_d_c%.i tmp/lzma_d_c%.S
+256 -27
View File
@@ -66,6 +66,8 @@ MAP_ANONYMOUS= 0x20
MAP_FIXED= 0x10 MAP_FIXED= 0x10
MAP_PRIVATE= 0x02 MAP_PRIVATE= 0x02
FD_CWD= -1 // AT_CWD= -100
FD_stdin= 0
FD_stderr= 2 FD_stderr= 2
O_RDONLY= 0 O_RDONLY= 0
@@ -81,13 +83,15 @@ PAGE_SIZE = ( 1<<PAGE_SHIFT)
__NR_SYSCALL_BASE = 0 __NR_SYSCALL_BASE = 0
__NR_exit= 1 + __NR_SYSCALL_BASE
__NR_open= 5 + __NR_SYSCALL_BASE
__NR_close= 6 + __NR_SYSCALL_BASE __NR_close= 6 + __NR_SYSCALL_BASE
__NR_execve= 11 + __NR_SYSCALL_BASE
__NR_exit= 1 + __NR_SYSCALL_BASE
__NR_fdatasync=148 + __NR_SYSCALL_BASE __NR_fdatasync=148 + __NR_SYSCALL_BASE
__NR_fork= 2 + __NR_SYSCALL_BASE
__NR_fsync= 118 + __NR_SYSCALL_BASE __NR_fsync= 118 + __NR_SYSCALL_BASE
__NR_ftruncate=93 + __NR_SYSCALL_BASE __NR_ftruncate=93 + __NR_SYSCALL_BASE
__NR_getpid= 20 + __NR_SYSCALL_BASE __NR_getpid= 20 + __NR_SYSCALL_BASE
__NR_getppid= 64 + __NR_SYSCALL_BASE
__NR_lseek= 19 + __NR_SYSCALL_BASE __NR_lseek= 19 + __NR_SYSCALL_BASE
__NR_memfd_create= 385 + __NR_SYSCALL_BASE __NR_memfd_create= 385 + __NR_SYSCALL_BASE
__NR_mkdir= 39 + __NR_SYSCALL_BASE __NR_mkdir= 39 + __NR_SYSCALL_BASE
@@ -95,12 +99,16 @@ __NR_mmap2= 192 + __NR_SYSCALL_BASE
__NR_mprotect=125 + __NR_SYSCALL_BASE __NR_mprotect=125 + __NR_SYSCALL_BASE
__NR_msync= 144 + __NR_SYSCALL_BASE // 0x90 __NR_msync= 144 + __NR_SYSCALL_BASE // 0x90
__NR_open= 5 + __NR_SYSCALL_BASE __NR_open= 5 + __NR_SYSCALL_BASE
__NR_openat= 322 + __NR_SYSCALL_BASE
__NR_pipe= 42 + __NR_SYSCALL_BASE
__NR_read= 3 + __NR_SYSCALL_BASE __NR_read= 3 + __NR_SYSCALL_BASE
__NR_sigaction=67 + __NR_SYSCALL_BASE
__NR_stat= 106 + __NR_SYSCALL_BASE __NR_stat= 106 + __NR_SYSCALL_BASE
__NR_uname= 122 + __NR_SYSCALL_BASE __NR_uname= 122 + __NR_SYSCALL_BASE
__NR_unlink= 10 + __NR_SYSCALL_BASE __NR_unlink= 10 + __NR_SYSCALL_BASE
__NR_write= 4 + __NR_SYSCALL_BASE __NR_write= 4 + __NR_SYSCALL_BASE
__ARM_NR_BASE= 0xf0000 + __NR_SYSCALL_BASE __ARM_NR_BASE= 0xf0000 + __NR_SYSCALL_BASE
__ARM_NR_cacheflush= 2 + __ARM_NR_BASE __ARM_NR_cacheflush= 2 + __ARM_NR_BASE
@@ -118,21 +126,24 @@ __ARM_NR_cacheflush= 2 + __ARM_NR_BASE
section ELFMAINX section ELFMAINX
F_ADRX= 0*NBPW F_ADRX= 0*NBPW
F_obinfo= F_ADRX // unmap_all_pages in lo bits
F_LENX= 1*NBPW F_LENX= 1*NBPW
F_ELFA= 2*NBPW F_ELFA= 2*NBPW
F_ADRU= 3*NBPW F_SEGV= 3*NBPW
F_LENU= 4*NBPW F_ADRU= 4*NBPW
F_R0= 5*NBPW F_LENU= 5*NBPW
F_R1= 6*NBPW F_R0= 6*NBPW
F_ENTR= 7*NBPW F_R1= 7*NBPW
F_QFLG= F_ENTR F_ENTR= 8*NBPW
F_SIZE= 8*NBPW F_qflg= F_ENTR // QNX mmap flags
F_SIZE= 9*NBPW
// (read-only) .data space at start of unfolded code // (read-only) .data space at start of unfolded code
D_PMASK= 0*NBPW D_PMASK= 0*NBPW
D_FNAME= 1*NBPW D_QFLG= 1*NBPW
D_QFLG= 2*NBPW D_FNAME= 2*NBPW
D_FOLD= 3*NBPW // start of code D_XSEGV= 3*NBPW
D_FOLD= 4*NBPW // start of code
r_pack2 .req r9 r_pack2 .req r9
r_pmask .req r8 r_pmask .req r8
@@ -142,9 +153,58 @@ sz_pack2= . - NBPW
mflg: mflg:
.word MFLG // MAP_{PRIVATE|ANONYMOUS} // QNX vs linux .word MFLG // MAP_{PRIVATE|ANONYMOUS} // QNX vs linux
_start: .globl _start _start: .globl _start
//// nop; bkpt // DEBUG //// nop; bkpt // DEBUG
stmdb sp!,{r0,r1,lr} // ABI crt0 -static may have data here ldr r_pack2,sz_pack2
sub sp,sp,#-3*NBPW + F_SIZE // F_R0,F_R1 separately ldr r2,mflg
adr r3,sz_pack2
sub r3,r3,r_pack2 @ elfaddr= &Elf_Ehdr of this program
call 0f; cancel_dummy: ret; 0:
stmdb sp!,{r0,r1,r2} // F_R0,F_R1,%F_ENTR(F_QFLG)
sub sp,sp,#2*NBPW // space for F_ADRU, F_LENU
stmdb sp!,{r0,r1,r3,lr} // %F_ADRX,%F_LENX,F_ELFA,F_SEGV
section ELFSIGSEGV
// install SIGSEGV handler for debugging
SIGSEGV= 11
SA_SIGINFO= 4 // /usr/include/bits/sigaction.h
SA_RESTORER= 0x04000000
sa_sigaction = 0 * NBPW
sa_flags = 1 * NBPW
sa_mask = 3 * NBPW // location of mask
sa_restorer = 4 * NBPW
sa_frame = 5 * NBPW
call adr_sigaction; mov r0,lr // .sa_sigaction
mov r1,#SA_SIGINFO // .sa_flags
mov r2,#0 // .sa_mask
mov r3,#0
mov r4,#0 // .sa_restorer
stmdb sp!,{r0,r1,r2,r3,r4}
mov arg4,#8 // 8 bytes ==> 64 bits
mov arg3,#0 // do not save old_sigaction
mov arg2,sp // &new_sigaction
mov arg1,#SIGSEGV
do_sys7t __NR_sigaction
add sp,sp,#sa_frame
call 0f
cancel_sigsegv:
mov r3,#8 // space for 8 bytes of signal flags
mov r2,#0 // no old
mov r1,#0 // no new
mov r0,#SIGSEGV
do_sys7t __NR_sigaction
ret
0:
str lr,[sp,#F_SEGV]
#if 0 //{ TEST ONLY
mov r0,#0xc0;mov r1,#0xc1;mov r2,#0xc2;mov r3,#0xc3;mov r4,#0xc4;mov r5,#0xc5;mov r6,#0xc6;mov r7,#0xc7
mov r8,#0xc8;mov r9,#0xc9;mov r10,#0xca;mov r11,#0xcb;mov r12,#0xcc
ldr r0,[r0] // cause SIGSEGV
#endif //}
section ELFMAINX2
add arg1,sp,#NBPW + F_SIZE // avoid feint of 0==argc add arg1,sp,#NBPW + F_SIZE // avoid feint of 0==argc
call zfind // out: r0= &envp call zfind // out: r0= &envp
call zfind call zfind
@@ -159,14 +219,6 @@ _start: .globl _start
mvn r2,r2; add r2,r2,#1 // neg mvn r2,r2; add r2,r2,#1 // neg
mov r_pmask,r2 mov r_pmask,r2
ldr r1,sz_pack2
adr r0,sz_pack2
sub r0,r0,r1 @ elfaddr= &Elf_Ehdr of this program
str r0,[sp,#F_ELFA]
mov r_pack2,r1 @ save sz_pack2
ldr r0,mflg
str r0,[sp,#F_QFLG]
call get_data // cpr0 can be too far away call get_data // cpr0 can be too far away
old_sp .req r11 old_sp .req r11
@@ -216,10 +268,11 @@ mfd .req old_sp
mov mfd,r0 mov mfd,r0
//}{ r0 free, r1 busy //}{ r0 free, r1 busy
add r4,r_unc,# 2*NBPW + D_FOLD add r4,r_unc,# 2*NBPW + D_FOLD
ldr r5,[sp,#F_SEGV]
and r4,r4, #-2*NBPW // align displacement and r4,r4, #-2*NBPW // align displacement
ldr r3,[sp,#F_QFLG] ldr r3,[sp,#F_qflg]
mov r2,r_pmask mov r2,r_pmask
stmia r1,{r2,r3,r4} // D_PMASK, D_QFLG, D_FNAME stmia r1,{r2,r3,r4,r5} // F_ADRU: D_PMASK, D_QFLG, D_FNAME, D_SEGV
.unreq r_pmask .unreq r_pmask
// De-compress folded stage of stub // De-compress folded stage of stub
@@ -237,6 +290,13 @@ mfd .req old_sp
call f_expand call f_expand
add sp,sp,#2*NBPW @ P_02, P_01 remove 5th param add sp,sp,#2*NBPW @ P_02, P_01 remove 5th param
// faster than clearcache + msync; also avoids msync() bug
ldr arg3,[sp,#F_LENU]
ldr arg2,[sp,#F_ADRU]
mov arg1,mfd
do_sys7t __NR_write
mov r5,#0 mov r5,#0
mov r4,mfd mov r4,mfd
mov r3,#MAP_PRIVATE|MAP_FIXED mov r3,#MAP_PRIVATE|MAP_FIXED
@@ -254,13 +314,182 @@ mfd .req old_sp
add r4,r0,r1 @ ADRX= &b_info | unmap_all_pages add r4,r0,r1 @ ADRX= &b_info | unmap_all_pages
bic r1,r1,#unmap_all_pages bic r1,r1,#unmap_all_pages
sub r5,r_pack2,r1 @ LENX= sz_pack2 - O_BINFO sub r5,r_pack2,r1 @ LENX= sz_pack2 - O_BINFO
stmia sp,{r4,r5} // F_ADRX, F_LENX stmia sp,{r4,r5} // sp: F_ADRX, F_LENX; (sp no change)
#if DEBUG /*{*/ #if DEBUG /*{*/
stmdb sp!,{TRACE_REGS}; mov r0,#3; bl trace stmdb sp!,{TRACE_REGS}; mov r0,#3; bl trace
#endif /*}*/ #endif /*}*/
ldr r12,[sp,#F_ADRU] ldr r12,[sp,#F_ADRU]
add pc,r12,#D_FOLD // goto unfolded code add pc,r12,#D_FOLD // goto unfolded code
proc_self_cmdline:
.asciz "/proc/self/cmdline"
.balign 4
#define r_fd r6
PATH_MAX= 4096
child:
#if 1 //{ pipe input to gdb
mov arg1,#FD_stdin; do_sys7t __NR_close
mov arg2,#0; mov arg1,#0; stmdb sp!,{arg1,arg2} // space for result of pipe()
mov arg1,sp
do_sys7t __NR_pipe // read side will be 0 (FD_stdin)
ldmia sp!,{r0,r_fd} // write side of pipe
mov arg3,#commands_gdb_end - commands_gdb // len
adr arg2,commands_gdb
mov arg1,r_fd
do_sys7t __NR_write
mov arg1,r_fd; do_sys7t __NR_close
#endif //}
sub sp,sp,#PATH_MAX
mov arg3,#O_RDONLY
adr arg2,proc_self_cmdline
mov arg1,#FD_CWD
do_sys7t2 __NR_openat; mov r_fd,r0 // fd
mov arg2,sp // buffer
mov arg3,#PATH_MAX
do_sys7t __NR_read
mov arg1,r_fd; do_sys7t __NR_close
do_sys7t __NR_getppid
sub sp,sp,#16 // decimal(pid) fits in 16 bytes
mov arg2,arg1; mov arg1,sp; call unsimal
mov arg5,#0 // terminator
mov arg4,sp // &"pid" (result of unsimal)
add arg3,sp,#16 // cmdline argv[0] [skip "pid"]
adr arg2,minus_q
adr arg1,path_gdb
stmdb sp!,{arg1,arg2,arg3,arg4,arg5} // argv
mov arg3,#0 // _envviron BUG
mov arg2,sp // &argv
do_sys7t __NR_execve
0:
b 0b
minus_q:
.asciz "-q"
path_gdb:
.asciz "/usr/bin/gdb"
commands_gdb:
.ascii "set prompt\n" // null string prompt
.ascii "info inferiors\n"
.ascii "print \"r0-r7\"\n"
.ascii "x/8xw $sp + 0x28\n"
.ascii "print \"r8-r15\"\n"
.ascii "x/8xw\n"
.ascii "set $pc = *(int *)($sp + 0x64)\n"
.ascii "print \"faulting instr\"\n"
.ascii "x/i $pc\n"
.ascii "print \"fault context\"\n"
.ascii "x/15i $pc - 7*4\n"
//.ascii "print \"intercept stack\"\n"
//.ascii "x/76xw $sp\n"
.ascii "set $sp = *(long *)($sp + 0x5c)\n"
.ascii "print \"user stack\"\n"
.ascii "x/64xw $sp\n"
.ascii "kill\n"
.ascii "quit 1"
.byte 0
commands_gdb_end:
.balign 4
// ucontext_t, mcontext_t, gregset_t, gret_t, REG_xxx: <sys/ucontext.h>
// stack_t <bits/types/stack_t.h>
__restore_rt:
nop
proc_self_maps:
.asciz "/proc/self/maps"
announce_sigaction:
.ascii "\n\nSIGSEGV address space:\n"
end_announce_sigaction:
.balign 4
adr_sigaction:
mov r12,lr; mov lr,pc; mov pc,r12 // blx lr
sigsegv_sigaction:
stmdb sp!,{arg2,arg3} // save siginfo *, ucontext *
// print /proc/self/maps of child (same as parent: the beauty of fork())
mov arg3,#end_announce_sigaction - announce_sigaction // arg3 len
adr arg2,announce_sigaction // buf
mov arg1,#FD_stderr
do_sys7t __NR_write
mov arg3,#O_RDONLY // flags
adr arg2,proc_self_maps // path
mov arg1,#FD_CWD
do_sys7t2 __NR_openat; mov r_fd,r0 // fd_maps
BUFLEN= 4096
sub sp,sp,#BUFLEN
loop_maps:
mov arg3,#BUFLEN // buflen
mov arg2,sp // buffer
mov arg1,r_fd // fd_maps
do_sys7t __NR_read
cmp r0,#0; beq done_maps
mov arg3,r0 // buflen
mov arg2,sp // buf
mov arg1,#FD_stderr
do_sys7t __NR_write
b loop_maps
done_maps:
add sp,sp,#BUFLEN // discard buffer
mov arg1,r_fd; do_sys7t __NR_close
// end printing of /proc/self/maps
mov arg1,#0; mov arg2,#0 // paranoia
do_sys7t __NR_fork
cmp r0,#0; beq child // fork()
parent:
NR_exit= 1
b parent // spin; paused by gdb
unsimal: // (dst, value)
mov r2,#0
stmdb sp!,{r2,lr}; call 0f
ldmia sp!,{r2,lr}
strb r2,[r0] // terminator
ret
0:
mov ip,r1 // extra copy used at end
mov r2,#0 // hi
mov r3,r1 // copy lo
adds r1,r1,r1,lsl #3 // 9*lo
adc r2,r2,r2,lsl #3 // 9*hi + C
add r2,r2,r3,lsr #(32 - 3) // bits shifted from lo to hi
mov r3,r1 // copy lo
adds r1,r1,r1,lsl #4
adc r2,r2,r2,lsl #4
add r2,r2,r3,lsr #(32 - 4) // * 0x99
mov r3,r1 // copy lo
adds r1,r1,r1,lsl #8
adc r2,r2,r2,lsl #8
add r2,r2,r3,lsr #(32 - 8) // * 0x9999
mov r3,r1 // copy lo
adds r1,r1,r1,lsl #16
adc r2,r2,r2,lsl #16
add r2,r2,r3,lsr #(32 - 16) // * 0x99999999
subs r1,r1,ip,lsl #(32 - 1) // - * 0x80000000
sbc r2,r2,ip,lsr #1 // * 0x19999999
adds r1,r1,ip
adcs r1,r2,#0 // * 0x0.1999999a; r1 = quo(ip, 10); set flags
add r2,r1,r1,lsl #2 // r2 = quo * 5
sub r2,ip,r2,lsl #1 // rem = ip - 10 * quo
stmdb sp!,{r2,lr} // save rem and retaddr
beq 1f; call 0b // stop if 0==quo; else recurse for next remainder
1:
ldmia sp!,{r1,lr}; add r1,r1,#'0'; strb r1,[r0],#1
ret
zfind: zfind:
ldr r1,[r0],#NBPW ldr r1,[r0],#NBPW
cmp r1,#0; bne zfind cmp r1,#0; bne zfind
@@ -315,7 +544,7 @@ L610: @ each word
mov r0,#'\n'; strb r0,[r2],#1 mov r0,#'\n'; strb r0,[r2],#1
sub r2,r2,sp @ count sub r2,r2,sp @ count
mov r1,sp @ buf mov r1,sp @ buf
mov r0,#2 @ FD_STDERR mov r0,#FD_stderr
#if defined(ARMEL_EABI4) /*{*/ #if defined(ARMEL_EABI4) /*{*/
mov r7,#__NR_write mov r7,#__NR_write
swi 0 swi 0
+37 -22
View File
@@ -66,11 +66,6 @@ PATH_MAX= 4096
#define call bl #define call bl
#include "MAX_ELF_HDR.S" #include "MAX_ELF_HDR.S"
ZERO= . - 3*NBPW
page_mask= . - 3*NBPW; .globl page_mask
qflg_data = . - 2*NBPW // QNX vs Linux: MAP_PRIVATE | MAP_ANONYMOUS
upxfn_path= . - 1*NBPW // displacement from "zero"
arg1 .req r0 arg1 .req r0
arg2 .req r1 arg2 .req r1
arg3 .req r2 arg3 .req r2
@@ -78,6 +73,12 @@ arg4 .req r3
arg5 .req r4 arg5 .req r4
arg6 .req r5 arg6 .req r5
ZERO= . - 4*NBPW // 4 words initialized prior to unfolded code
page_mask= . - 4*NBPW
qflg_data = . - 3*NBPW // QNX vs Linux: MAP_PRIVATE | MAP_ANONYMOUS
upxfn_path= . - 2*NBPW // displacement from ZERO
cancel_sigsegv= . - 1*NBPW
fold_begin: // enter here fold_begin: // enter here
b L05 // put page_mask and qflg_data within short-displacement of uses b L05 // put page_mask and qflg_data within short-displacement of uses
@@ -107,6 +108,13 @@ Psync: .globl Psync
bic r12,arg1,r12 // lo frag bic r12,arg1,r12 // lo frag
sub arg1,arg1,r12 // page align lo end sub arg1,arg1,r12 // page align lo end
add arg2,arg2,r12 add arg2,arg2,r12
stmdb sp!,{r0,r1,r2} // lo, len, ??
add r1,r1,r0 // hi
mov r2,#0 // might be CSSELR_DCACHE from linux/arch/arm/include/asm/cachetype.h
do_sys2 __ARM_NR_cacheflush
ldmia sp!,{r0,r1,r2}
do_sys __NR_msync; ret do_sys __NR_msync; ret
mmap_privanon: .globl mmap_privanon mmap_privanon: .globl mmap_privanon
@@ -134,20 +142,21 @@ mmap_do: // sp: saved r4,r5,lr
proc_self_exe: .asciz "/proc/self/exe"; .balign 4 proc_self_exe: .asciz "/proc/self/exe"; .balign 4
// In: sp/ F_ADRX,F_LENX,F_ELFA,F_ADRU,F_LENU,F_R0,F_R1,%F_ENTR,F_argc // In: sp/ F_ADRX,F_LENX,F_ELFA,f_SEGV,F_ADRU,F_LENU,F_R0,F_R1,%F_ENTR,F_argc
// [ADRX, +LENX) = extent of compressed program // [ADRX, +LENX) = extent of compressed program
// [ADRU, +LENU) = params to munmap unfolded stub // [ADRU, +LENU) = params to munmap unfolded stub
F_ADRX= 0*NBPW F_ADRX= 0*NBPW
F_obinfo= F_ADRX // unmap_all_pages in lo bits F_obinfo= F_ADRX // unmap_all_pages in lo bits
F_LENX= 1*NBPW F_LENX= 1*NBPW
F_ELFA= 2*NBPW F_ELFA= 2*NBPW
F_ADRU= 3*NBPW F_SEGV= 3*NBPW
F_LENU= 4*NBPW F_ADRU= 4*NBPW
F_R0= 5*NBPW F_LENU= 5*NBPW
F_R1= 6*NBPW F_R0= 6*NBPW
F_ENTR= 7*NBPW F_R1= 7*NBPW
F_qflg = F_ENTR // QNX mmap flags F_ENTR= 8*NBPW
F_ARGC= 8*NBPW F_qflg= F_ENTR // QNX mmap flags
F_argc= 9*NBPW
is_ptinterp= (1<<0) is_ptinterp= (1<<0)
unmap_all_pages= (1<<1) unmap_all_pages= (1<<1)
@@ -155,17 +164,17 @@ unmap_all_pages= (1<<1)
/* In: /* In:
r4= ADRX | unmap_all_pages r4= ADRX | unmap_all_pages
r5= LENX r5= LENX
sp/ ADRX|uap,LENX,ELFA,ADRU,LENU,r0,r1,%entry, argc,argv,0,envp,0,auxv sp/ ADRX|uap,LENX,ELFA,r0,r1,%entry,SEGV,ADRU,LENU, argc,argv,0,envp,0,auxv
(ADRX,LENX) = extent of compressed program (ADRX,LENX) = extent of compressed program
(ADRU,LENU) = params to munmap unfolded stub (ADRU,LENU) = params to munmap unfolded stub
*/ */
L05: L05:
ldmia sp!,{r4,r5,r6,r7,r8,r9,r10,r11,r12} // F_ADRX .. F_ARGC ldmia sp!,{r3,r4,r5,r6,r7,r8,r9,r10,r11,r12} // F_ADRX .. F_ARGC
mov r1,sp @ src mov r1,sp @ src
tst r4,#unmap_all_pages; bne 0f; sub sp,sp,#PATH_MAX; 0: tst r3,#unmap_all_pages; bne 0f; sub sp,sp,#PATH_MAX; 0:
mov r0,sp @ dst mov r0,sp @ dst
stmdb sp!,{r4,r5,r6,r7,r8,r9,r10,r11,r12} stmdb sp!,{r3,r4,r5,r6,r7,r8,r9,r10,r11,r12}
0: // copy argv down 0: // copy argv down
ldr r3,[r1],#NBPW; cmp r3,#0 ldr r3,[r1],#NBPW; cmp r3,#0
@@ -199,7 +208,7 @@ r_pse .req r8
sub arg3,arg3,#1 @ room for null terminator sub arg3,arg3,#1 @ room for null terminator
do_sys7t __NR_readlink // ENOENT is OK do_sys7t __NR_readlink // ENOENT is OK
cmn r0,#1<<12 cmn r0,#1<<12
movcs r1,arg1 @ FIXME? "/proc/self/exe" adrcs r1,proc_self_exe
movcs r0,#14 @ strlen("/proc/self/exe") movcs r0,#14 @ strlen("/proc/self/exe")
link_ok: link_ok:
add r2,r1,r0 @ end add r2,r1,r0 @ end
@@ -248,6 +257,9 @@ r_elfa .req r9
add sp,sp,#MAX_ELF_HDR_32 + OVERHEAD @ un-alloca add sp,sp,#MAX_ELF_HDR_32 + OVERHEAD @ un-alloca
str r0,[sp,#F_ENTR] @ entry address str r0,[sp,#F_ENTR] @ entry address
adr lr,0f; ldr pc,[sp,#F_SEGV] // cancel_sigsegv
0:
// Map 1 page of /proc/self/exe so that it does not disappear // Map 1 page of /proc/self/exe so that it does not disappear
ldr r0,[sp,#F_obinfo]; tst r0,#unmap_all_pages; bne no_map_pse ldr r0,[sp,#F_obinfo]; tst r0,#unmap_all_pages; bne no_map_pse
mov arg6,#0 @ SEEK_SET offset mov arg6,#0 @ SEEK_SET offset
@@ -283,7 +295,7 @@ sweep:
add sp,sp,#(1<<18) @ pop stack add sp,sp,#(1<<18) @ pop stack
#endif //} #endif //}
add sp,sp,#3*NBPW // toss F_ADRX,F_LENX,F_ELFA add sp,sp,#4*NBPW // toss F_ADRX,F_LENX,F_ELFA,F_SEGV
ldmia sp!,{arg1,arg2} @ F_ADRU,F_LENU ldmia sp!,{arg1,arg2} @ F_ADRU,F_LENU
stmdb sp!,{r_auxe} stmdb sp!,{r_auxe}
mov r3,#0 @ clear registers: paranoia mov r3,#0 @ clear registers: paranoia
@@ -308,6 +320,9 @@ sweep:
#endif /*}*/ #endif /*}*/
ldmia sp!,{r12} // r_auxe ldmia sp!,{r12} // r_auxe
ldr pc,[r12,#NBPW -2*NBPW] @ hatch: Elf32_auxv_t[AT_NULL@.a_type].a_val ldr pc,[r12,#NBPW -2*NBPW] @ hatch: Elf32_auxv_t[AT_NULL@.a_type].a_val
// hatch:
// svc 0 // In: r7= __NR_munmap; arg1= F_ADRU; arg2= F_LENU
// pop {r0,r1,pc} // F_R0, F_R1, F_ENTR
f_unfilter: @ (char *ptr, uint len, uint cto, uint fid) f_unfilter: @ (char *ptr, uint len, uint cto, uint fid)
ptr .req r0 ptr .req r0
+10
View File
@@ -30,6 +30,9 @@
#define ARM_OLDABI 1 #define ARM_OLDABI 1
#include "arch/arm/v4a/macros.S" #include "arch/arm/v4a/macros.S"
#include "MAX_ELF_HDR.S" #include "MAX_ELF_HDR.S"
__NR_SYSCALL_BASE = 0
__ARM_NR_BASE= 0xf0000 + __NR_SYSCALL_BASE
__ARM_NR_cacheflush = 2 + __ARM_NR_BASE
NBPW= 4 NBPW= 4
sz_Elf32_Ehdr = 13*4 sz_Elf32_Ehdr = 13*4
@@ -139,6 +142,13 @@ Psync: .globl Psync
bic r12,arg1,r12 bic r12,arg1,r12
sub arg1,arg1,r12 sub arg1,arg1,r12
add arg2,arg2,r12 add arg2,arg2,r12
stmdb sp!,{r0,r1,r2} // lo, len, ??
add r1,r1,r0 // hi
mov r2,#0 // might be CSSELR_DCACHE from linux/arch/arm/include/asm/cachetype.h
do_sys2 __ARM_NR_cacheflush
ldmia sp!,{r0,r1,r2}
b msync b msync
L05: L05:
+216 -9
View File
@@ -76,12 +76,18 @@ PAGE_SIZE = -(~0<<PAGE_SHIFT)
// /usr/include/asm-generic/unistd.h // /usr/include/asm-generic/unistd.h
__NR_close = 0x39 // 57 __NR_close = 0x39 // 57
__NR_execve = 0xdd // 221
__NR_exit = 0x5d // 93 __NR_exit = 0x5d // 93
__NR_fork = 0xdc // 220
__NR_getppid = 0xad // 173
__NR_memfd_create= 0x117 // 279 __NR_memfd_create= 0x117 // 279
__NR_mmap = 0xde // 222 __NR_mmap = 0xde // 222
__NR_mprotect = 0xe2 // 226 __NR_mprotect = 0xe2 // 226
__NR_munmap = 0xd7 // 215 __NR_munmap = 0xd7 // 215
__NR_openat = 0x38 // 56 __NR_openat = 0x38 // 56
__NR_pipe2 = 0x3b // 59
__NR_read = 0x3f // 63
__NR_sigaction = 0x86 // 134
AT_FDCWD= -100 AT_FDCWD= -100
__NR_write = 0x40 // 64 __NR_write = 0x40 // 64
@@ -134,6 +140,13 @@ wszuf .req w21
xszuf .req x21 xszuf .req x21
xFOLD .req x20 xFOLD .req x20
wPrivAnon .req w19 wPrivAnon .req w19
cancel_SEGV .req x18
D_PMASK= 0*NBPW
D_XSIGSEGV= 1*NBPW
D_GETPM= 2*NBPW
D_PRIVANON= 2*NBPW + 2*4
D_FOLD= 2*NBPW + 3*4 // .data space at start of unfold
// http://infocenter.arm.com/help/topic/com.arm.doc.ihi0055b/IHI0055B_aapcs64.pdf // http://infocenter.arm.com/help/topic/com.arm.doc.ihi0055b/IHI0055B_aapcs64.pdf
// x18 is CLOBBERED: "The platform register" // x18 is CLOBBERED: "The platform register"
@@ -154,7 +167,198 @@ _start: .globl _start
#endif /*}*/ #endif /*}*/
stp x0,x1,[sp,#-2*NBPW]! // ABI: -static crt0 might pass data in x0,x1 stp x0,x1,[sp,#-2*NBPW]! // ABI: -static crt0 might pass data in x0,x1
ldr wPrivAnon,mflg ldr wPrivAnon,mflg
adr cancel_SEGV,cancel_dummy
section ELFSIGSEGV
// install SIGSEGV handler for debugging hardware and de-compressor
SIGSEGV= 11
SA_SIGINFO= 4 // /usr/include/bits/sigaction.h
SA_RESTORER= 0x04000000
sa_sigaction = 0 * NBPW
sa_flags = 1 * NBPW
sa_mask = 3 * NBPW // location of mask
sa_restorer = 4 * NBPW
sa_frame = 8 * NBPW
adr x0,sigsegv_sigaction // handler
mov x1,#SA_SIGINFO // flag bits
stp x0,x1,[sp,-sa_frame]! // .sa_sigaction, .sa_flags
str xzr,[sp,sa_mask] // .sa_mask
str xzr,[sp,sa_restorer]
mov x3,#8 // 8 bytes ==> 64 bits
mov x2,xzr // do not save old_sigaction
mov x1,sp // &new_sigaction
mov w0,#SIGSEGV
do_sys __NR_sigaction
add sp,sp,sa_frame
adr cancel_SEGV,cancel_sigsegv
b L300
#if 0 //{ TEST ONLY
mov x0,#0xc0;mov x1,#0xc1;mov x2,#0xc2;mov x3,#0xc3;mov x4,#0xc4;mov x5,#0xc5;mov x6,#0xc6;mov x7,#0xc7
mov x8,#0xc8;mov x9,#0xc9;mov x10,#0xca;mov x11,#0xcb;mov x12,#0xcc;mov x13,#0xcd;mov x14,#0xce;mov x15,#0xcf
mov x16,#0xd0;mov x17,#0xd1;mov x18,#0xd2;mov x19,#0xd3;mov x20,#0xd4;mov x21,#0xd5;mov x22,#0xd6;mov x23,#0xd7
mov x24,#0xd8;mov x25,#0xd9;mov x26,#0xda;mov x27,#0xdb;mov x28,#0xdc;mov x29,#0xdd;mov x30,#0xde
ldr x0,[x0] // cause SIGSEGV
#endif //}
proc_self_cmdline:
.asciz "/proc/self/cmdline"
announce_sigaction:
.asciz "\n\nSIGSEGV address space:\n"
end_announce_sigaction:
proc_self_maps:
.asciz "/proc/self/maps"
minus_q:
.asciz "-q"
path_gdb:
.asciz "/usr/bin/gdb"
commands_gdb:
.ascii "set prompt\n" // null string prompt
.ascii "info inferiors\n"
.ascii "print \"x0-x7\"\n"
.ascii "x/8xg $sp + 0x138\n"
.ascii "print \"x8-x15\"\n"
.ascii "x/8xg\n"
.ascii "print \"x16-x23\"\n"
.ascii "x/8xg\n"
.ascii "print \"x24-x30\"\n"
.ascii "x/7xg\n"
.ascii "set $pc = *(long *)($sp + 0x238)\n"
.ascii "print \"faulting instr\"\n"
.ascii "x/i $pc\n"
.ascii "print \"fault context\"\n"
.ascii "x/15i $pc - 7*4\n"
//.ascii "print \"intercept stack\"\n"
//.ascii "x/76xg $sp\n"
.ascii "set $sp = *(long *)($sp + 0x230)\n"
.ascii "print \"user stack\"\n"
.ascii "x/64xg $sp\n"
.ascii "kill\n"
.ascii "quit 1"
.byte 0
commands_gdb_end:
.balign 4
#define r_fd w19
PATH_MAX= 4096
child:
#if 1 //{ pipe input to gdb
mov arg1w,#0; do_sys __NR_close // fd_stdin
stp xzr,xzr,[sp,-2 * NBPW]! // &fd_pipe[2]; 4 bytes each; but stack align
mov arg2w,#0
mov arg1,sp
do_sys __NR_pipe2 // read size will be 0 (fd_stdin)
add x16,sp,#4
ldr r_fd,[x16] // write side of pipe
add sp,sp,#2*NBPW
mov w2,#commands_gdb_end - commands_gdb // arg3 len
adr x1,commands_gdb // arg2
mov w0,r_fd // arg1 fd
do_sys __NR_write
mov w0,r_fd; do_sys __NR_close
#endif //}
sub sp,sp,#PATH_MAX
mov arg3w,#O_RDONLY
adr arg2,proc_self_cmdline
mov arg1,#-1 // fake FD_CWD
do_sys __NR_openat; mov r_fd,w0
mov arg2,sp // buffer
mov arg3w,#PATH_MAX
do_sys __NR_read
mov arg1w,r_fd; do_sys __NR_close
do_sys __NR_getppid
stp xzr,xzr,[sp,-2 * NBPW]! // decimal(pid) fits in 16 bytes
mov w1,w0; mov x0,sp; call unsimal
mov arg4,sp // &"pid" (result of unsimal)
add arg3,sp,#2 * NBPW // cmdline argv[0] [skip "pid"]
adr arg2,minus_q
adr arg1,path_gdb // arg1 path
stp arg1,arg2,[sp,-6 *NBPW]! // path_gdb, "-q"
stp arg3,arg4,[sp,2 *NBPW] // argv[0], "pid"
str xzr,[sp,4 * NBPW] // NULL
mov arg3,#0 // _envviron BUG
mov arg2,sp // &argv
do_sys __NR_execve
0:
b 0b
// ucontext_t, mcontext_t, gregset_t, gret_t, REG_xxx: <sys/ucontext.h>
// stack_t <bits/types/stack_t.h>
__restore_rt:
nop
sigsegv_sigaction:
stp x1,x2,[sp,-2 * NBPW] // save siginfo *, ucontext *
// print /proc/self/maps of child (same as parent: the beauty of fork())
mov x2,#end_announce_sigaction - announce_sigaction // arg3 len
adr x1,announce_sigaction // arg2 buf
mov w0,#2 // arg1 fd_stderr
do_sys __NR_write
mov w2,#O_RDONLY // arg3 flags
adr x1,proc_self_maps // arg2 path
mov w0,#-1 // fake FD_CWD
do_sys __NR_openat
mov r_fd,w0 // fd_maps
BUFLEN= 4096
sub sp,sp,#BUFLEN
loop_maps:
mov x2,#BUFLEN // arg3 buflen
mov x1,sp // arg2 buffer
mov w0,r_fd // arg1 fd_maps
do_sys __NR_read
cbz w0,done_maps
mov x2,x0 // arg3 buflen
mov x1,sp // arg2 buf
mov w0,#2 // fd_stderr
do_sys __NR_write
b loop_maps
done_maps:
add sp,sp,#BUFLEN // discard buffer
mov x0,x16; do_sys __NR_close
// end printing of /proc/self/maps
mov arg1,#0; mov arg2,#0 // paranoia
do_sys __NR_fork; cbz x0,child
parent:
b parent // spin; paused by gdb
unsimal: // (dst, value)
stp lr,xzr,[sp,-2 * NBPW]!; call 0f
ldp lr,x1,[sp],#2 * NBPW
strb w1,[x0] // terminator
ret
0:
mov w2,#0xcccd
movk w2, 0xcccc, lsl 16 // 0xcccccccd ==> 4/5 as 32-bit fraction
umull x2,w1,w2
//add x2,x2,#0x1000 // BUG? unsimal(p, 730)
lsr x3,x2,35 // quo(value, 10)
add w2,w3,w3,lsl 2 // 5 * quo
sub w1,w1,w2,lsl 1 // rem = (val - (10 * quo))
stp lr,x1,[sp,-2 * NBPW]!
cbz x3,1f; mov w1,w3; call 0b
1:
ldp lr,x1,[sp],#2 * NBPW; add w1,w1,#'0'; strb w1,[x0],#1
ret
cancel_sigsegv:
mov x3,#8 // 8 bytes ==> 64 bits
mov x2,xzr // no old
mov x1,xzr // no new
mov w0,#SIGSEGV
do_sys __NR_sigaction
ret
L300:
section ELFMAINX2
add x0,sp,#(1+ 2)*NBPW add x0,sp,#(1+ 2)*NBPW
call zfind // avoid feint of 0==argc; out: x0= &envp call zfind // avoid feint of 0==argc; out: x0= &envp
call zfind; mov xauxv,x0 // &Elf64_auxv call zfind; mov xauxv,x0 // &Elf64_auxv
@@ -175,8 +379,11 @@ F_LENU= 3 * NBPW
neg xPMASK,x2 // save for folded code neg xPMASK,x2 // save for folded code
str xPMASK,[sp,#F_PMASK] str xPMASK,[sp,#F_PMASK]
adr xelfa,sz_pack2
ldr w0,[xelfa] // sz_pack2 causes unknown R_AARCH64_LD_PREL_LO19
str x0,[sp,#F_SZPK2]
sub xelfa,xelfa,w0,uxtw
call main call main
L00:
mov xFOLD,lr mov xFOLD,lr
mov w1,#MFD_EXEC // flags mov w1,#MFD_EXEC // flags
@@ -188,7 +395,7 @@ L00:
mov w1,wzr; b 0b // try again without MFD_EXEC mov w1,wzr; b 0b // try again without MFD_EXEC
no_memfd: // so try /dev/shm no_memfd: // so try /dev/shm
O_RDWR= 2 O_RDWR= 2
O_DIRECTORY= 0200000 // 0x010000 O_DIRECTORY= 040000 // 0x04000
O_TMPFILE= 020000000 // 0x400000 O_TMPFILE= 020000000 // 0x400000
call 0f; .int 0700, O_RDWR|O_DIRECTORY|O_TMPFILE; .asciz "/dev/shm" call 0f; .int 0700, O_RDWR|O_DIRECTORY|O_TMPFILE; .asciz "/dev/shm"
.balign 4; 0: .balign 4; 0:
@@ -231,7 +438,8 @@ wmeth .req w4
.unreq xmeth .unreq xmeth
.unreq wmeth .unreq wmeth
str xPMASK,[sp] // propagate PAGE_MASK str xPMASK,[sp] // propagate PAGE_MASK D_PMASK
str cancel_SEGV,[sp, #D_XSIGSEGV]
// Write de-compressed stub // Write de-compressed stub
ldr w2,[xFOLD,#sz_unc + LBINFO - LxFOLD] // .sz_unc of fold ldr w2,[xFOLD,#sz_unc + LBINFO - LxFOLD] // .sz_unc of fold
@@ -255,13 +463,16 @@ wmeth .req w4
// Use the unfolded stub // Use the unfolded stub
ldr wLENC,[sp,#F_SZPK2] ldr wLENC,[sp,#F_SZPK2]
ldr w1,[xFOLD, #LOBINFO - LxFOLD] // O_BINFO ldr w1,[xFOLD, #LOBINFO - LxFOLD] // O_BINFO
add lr,xADRU,#3*4 + NBPW // jmp to fold_begin add lr,xADRU,#D_FOLD // jmp to fold_begin
sub wLENC,wLENC,w1 sub wLENC,wLENC,w1
str xLENC,[sp,#F_SZPK2] str xLENC,[sp,#F_SZPK2]
bic w1,w1,#unmap_all_pages bic w1,w1,#unmap_all_pages
add xADRC,xelfa,x1 // &b_info of compressed input data add xADRC,xelfa,x1 // &b_info of compressed input data
jr lr // goto unfolded stub jr lr // goto unfolded stub
cancel_dummy:
ret
zfind: zfind:
ldr x1,[x0],#NBPW; cbnz x1,zfind ldr x1,[x0],#NBPW; cbnz x1,zfind
ret ret
@@ -383,12 +594,8 @@ strupx:
.asciz "upx" .asciz "upx"
.balign 4 .balign 4
main: main: // In: w0= sz_pack2
lr .req x30 lr .req x30
add xelfa,lr,#sz_pack2 - L00 // &sz_pack2
ldr w0,[xelfa]
sub xelfa,xelfa,w0,uxtw
str x0,[sp,#F_SZPK2]
callr lr callr lr
LxFOLD: LxFOLD:
LOBINFO: LOBINFO:
+48 -7
View File
@@ -84,16 +84,16 @@ PATH_MAX= 4096
#define OVERHEAD 2048 #define OVERHEAD 2048
#include "MAX_ELF_HDR.S" #include "MAX_ELF_HDR.S"
PAGE_MASK: .quad ~0<<12 // default PAGE_MASK: .quad ~0<<12 // default D_PMASK
get_page_mask: .globl get_page_mask cancel_sigsegv: .quad 0 // D_XSIGSEGV
get_page_mask: .globl get_page_mask // D_GETPM
ldr x0,PAGE_MASK ldr x0,PAGE_MASK
ret ret
bits_privanon: // known offset (2*NBPW + 2*4) D_PRIVANON
bits_privanon: // known offset (NBPW + 2*4)
.int MAP_PRIVATE | MAP_ANONYMOUS // Linux default; else QNX .int MAP_PRIVATE | MAP_ANONYMOUS // Linux default; else QNX
fold_begin: // known offset (NBPW + 3*4) fold_begin: // known offset D_FOLD = (2*NBPW + 3*4)
//// bkpt // DEBUG
b L10 b L10
// In: sp/ PMASK,LENC,ADRU,LENU, x0,x1, argc,argv,... // In: sp/ PMASK,LENC,ADRU,LENU, x0,x1, argc,argv,...
@@ -128,6 +128,44 @@ Psync: .globl Psync
bic x8,x0,x8 bic x8,x0,x8
sub x0,x0,x8 sub x0,x0,x8
add x1,x1,x8 add x1,x1,x8
// Sync contents of data cache into RAM.
// Linux should do this implicitly, but apparently not.
CTR_IDC_SHIFT= 28
CTR_DIC_SHIFT= 29
mov x3,x0 // lo
add x4,x0,x1 // hi
sync_cache_range: // (void *lo= x3, void *const hi= x4)
mrs x6,ctr_el0
tbnz w6,#CTR_IDC_SHIFT,dc_not_dirty
ubfx x5,x6,#16,#4 // -2+ log2(dline_size)
mov x8,#-4; lsl x8,x8,x5 // sz_dline mask
and x5,x8,x3 // round down to dc line
// cmp x5,x4; b.hs dc_done
dc_loop:
dc cvau,x5 // sync dline
sub x5,x5,x8 // next dline
cmp x5,x4; b.lo dc_loop
//dc_done:
dc_not_dirty:
dsb ish // why here if dc not dirty?
tbnz w6,#CTR_DIC_SHIFT,ic_not_dirty
and x6,x6,#0xf // -2+ log2(iline_size)
mov x8,#-4; lsl x8,x8,x6 // sz_iline mask
and x3,x8,x3 // round down to ic line
// cmp x3,x4; b.hs ic_done
ic_loop:
ic ivau,x3 // sync iline
sub x3,x3,x8 // next iline
cmp x3,x4; b.lo ic_loop
//ic_done:
dsb ish
ic_not_dirty:
isb
// fall into msync
msync: .globl msync msync: .globl msync
do_sys __NR_msync; ret do_sys __NR_msync; ret
@@ -233,6 +271,9 @@ no_env_pse:
add sp,sp,#MAX_ELF_HDR_64 + OVERHEAD // un-alloca add sp,sp,#MAX_ELF_HDR_64 + OVERHEAD // un-alloca
mov xfexp,x0 // entry address mov xfexp,x0 // entry address
ldr x0,cancel_sigsegv
blr x0 // callr
// Discard pages of compressed input data (includes [ADRC,+LENC) ) // Discard pages of compressed input data (includes [ADRC,+LENC) )
ldr x1,[xelfa,#p_memsz+sz_Phdr+sz_Ehdr] // Phdr[C_TEXT= 1].p_memsz ldr x1,[xelfa,#p_memsz+sz_Phdr+sz_Ehdr] // Phdr[C_TEXT= 1].p_memsz
mov x0,xelfa // hi &Elf64_Ehdr mov x0,xelfa // hi &Elf64_Ehdr
@@ -509,7 +550,7 @@ brk: do_sys __NR_brk; ret
munmap: do_sys __NR_munmap; ret munmap: do_sys __NR_munmap; ret
O_RDWR= 2 O_RDWR= 2
O_DIRECTORY= 0200000 // 0x010000 O_DIRECTORY= 040000 // 0x04000
O_TMPFILE= 020000000 // 0x400000 O_TMPFILE= 020000000 // 0x400000
ufdc_bits: .int O_RDWR|O_DIRECTORY|O_TMPFILE ufdc_bits: .int O_RDWR|O_DIRECTORY|O_TMPFILE
+36 -5
View File
@@ -91,6 +91,42 @@ Psync: .globl Psync
bic x8,x0,x8 bic x8,x0,x8
sub x0,x0,x8 sub x0,x0,x8
add x1,x1,x8 add x1,x1,x8
// Sync contents of data cache into RAM.
// Linux should do this implicitly, but apparently not.
CTR_IDC_SHIFT= 28
CTR_DIC_SHIFT= 29
mov x3,x0 // lo
add x4,x0,x1 // hi
sync_cache_range: // (void *lo= x3, void *const hi= x4)
mrs x6,ctr_el0
tbnz w6,#CTR_IDC_SHIFT,dc_not_dirty
ubfx x5,x6,#16,#4 // -2+ log2(dline_size)
mov x8,#-4; lsl x8,x8,x5 // sz_dline mask
and x5,x8,x3 // round down to dc line
// cmp x5,x4; b.hs dc_done
dc_loop:
dc cvau,x5 // sync dline
sub x5,x5,x8 // next dline
cmp x5,x4; b.lo dc_loop
//dc_done:
dc_not_dirty:
dsb ish // why here if dc not dirty?
tbnz w6,#CTR_DIC_SHIFT,ic_not_dirty
and x6,x6,#0xf // -2+ log2(iline_size)
mov x8,#-4; lsl x8,x8,x6 // sz_iline mask
and x3,x8,x3 // round down to ic line
// cmp x3,x4; b.hs ic_done
ic_loop:
ic ivau,x3 // sync iline
sub x3,x3,x8 // next iline
cmp x3,x4; b.lo ic_loop
//ic_done:
dsb ish
ic_not_dirty:
isb
// fall into msync
do_sys __NR_msync; ret do_sys __NR_msync; ret
fold: // enter here (x0= &so_info; x1= &{argc,argv,envp,lr} fold: // enter here (x0= &so_info; x1= &{argc,argv,envp,lr}
@@ -206,11 +242,6 @@ brk:
readlink: readlink:
do_sys __NR_readlink; ret do_sys __NR_readlink; ret
.globl __sync_cache_range
__sync_cache_range: // (void *lo, void *hi)
#include "arm64-sync-cache-range.S"
ret
get_sys_munmap: .globl get_sys_munmap // r0= system call instruction get_sys_munmap: .globl get_sys_munmap // r0= system call instruction
#if defined(ARMEL_DARWIN) /*{*/ #if defined(ARMEL_DARWIN) /*{*/
ldr w0,4*1 + munmap ldr w0,4*1 + munmap
+1 -1
View File
@@ -201,7 +201,7 @@ AT_PAGESZ= 6 // /usr/include/elf.h
pop %edx // MATCH_33 restore &getbit pop %edx // MATCH_33 restore &getbit
mov %eax,%ecx mov %eax,%ecx
shr $12,%eax; shl $12,%eax; mov %eax,F_ADRU(old_sp) shr $12,%eax; shl $12,%eax; mov %eax,F_ADRU(old_sp)
sub %eax,%ecx; sub $1,%ecx; mov %ecx,F_MFD (old_sp) sub %eax,%ecx; dec %ecx; mov %ecx,F_MFD (old_sp)
#undef r_unc #undef r_unc
#undef u_len #undef u_len
+5 -1
View File
@@ -285,8 +285,12 @@ L60:
push eax push eax
push eax // 32 bytes of zeroes now on stack, ready for 'popa' push eax // 32 bytes of zeroes now on stack, ready for 'popa'
.macro NOTRACK
.byte 0x3e
.endm
mov al, __NR_munmap // eax was 0 from L60 mov al, __NR_munmap // eax was 0 from L60
/*notrack*/ jmp [edi] // unmap ourselves via escape hatch, then goto entry // valgrind-3.24.0 has bug with NOTRACK on i386
/*NOTRACK;*/ jmp [edi] // unmap ourselves via escape hatch, then goto entry
section SYSCALLS section SYSCALLS
// Sometimes linux enforces page-aligned address // Sometimes linux enforces page-aligned address

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