Compare commits
254 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 730c6ce6c5 | |||
| 5ed1d5b2b3 | |||
| 23c70ec447 | |||
| e29e73a4e4 | |||
| 27289a7589 | |||
| e509bb87e9 | |||
| 5cec09966e | |||
| b5789fb321 | |||
| a1b0fd987f | |||
| a468b92e3a | |||
| ddf0b50c6d | |||
| 3af2b21869 | |||
| c4bfebeceb | |||
| d23484b9db | |||
| 071579b5b6 | |||
| ff9d577e46 | |||
| a25c20ee0b | |||
| ff75a462a4 | |||
| e0b6ff1924 | |||
| 1c5fae74e0 | |||
| 6f650ca16f | |||
| c2da21ba4e | |||
| 903ca50391 | |||
| 70f1ab8cb7 | |||
| 6998449715 | |||
| fb0f6c6a00 | |||
| dbde75028c | |||
| 90d86ea59e | |||
| 64891286ba | |||
| e52a3ceb48 | |||
| 8cce9cf641 | |||
| 896dff9619 | |||
| 84a0347df1 | |||
| fc5e44f391 | |||
| 8bf49aa4f2 | |||
| b8079bb6eb | |||
| 5dcad7a387 | |||
| 83e5f74b3d | |||
| 3d402134f5 | |||
| b8b64a3e0f | |||
| c0bf7bf9ab | |||
| 0144f81c28 | |||
| 78f4959521 | |||
| eff1ef2d70 | |||
| 782b07c752 | |||
| bd67677389 | |||
| 8c9e04daaf | |||
| bddc05e787 | |||
| a49d023bd0 | |||
| 7b06ba0b78 | |||
| 344b73dab0 | |||
| 0870514194 | |||
| 0a61ffea3a | |||
| fbc650791d | |||
| 4b41aa1226 | |||
| 3fd68d3ec6 | |||
| d41ceb0d31 | |||
| aee970e80b | |||
| ef8a24ba53 | |||
| 2edf91d315 | |||
| 9fe377b288 | |||
| 996ca8d17d | |||
| b356595eb5 | |||
| e4668e5328 | |||
| a846e483be | |||
| f6e3df69eb | |||
| 1a6c1f0589 | |||
| e3e5d8a3a5 | |||
| 505f6b7373 | |||
| 7d907d9d65 | |||
| d00ba4b465 | |||
| d4deb2a100 | |||
| 5999b0a959 | |||
| e2f1e6697a | |||
| baee96347d | |||
| f60d8f6d18 | |||
| d3300e9564 | |||
| 877390a2ba | |||
| 5afe2af365 | |||
| 5028d559c5 | |||
| deda4f1bae | |||
| 927a9d10a7 | |||
| ad96cee14c | |||
| f95bb4953f | |||
| 8c594de432 | |||
| 330ac2443c | |||
| ebe6272ac7 | |||
| 982e732b74 | |||
| 27de5f42bb | |||
| 37dff58289 | |||
| fc9d90c231 | |||
| 68b31d31c3 | |||
| f7f08be312 | |||
| d14901548a | |||
| 6ebdf92d40 | |||
| abced6720b | |||
| f4604db164 | |||
| 8327c390cf | |||
| bd251c0dbd | |||
| d04209d30f | |||
| 8782778eb3 | |||
| c8515ae862 | |||
| a2fa417af9 | |||
| 93f420939e | |||
| 88cd02d750 | |||
| a35e50c02a | |||
| 566c1eebd2 | |||
| 65c3195b39 | |||
| 76b0b4ce9c | |||
| 02b9ac9764 | |||
| 17b94cdfe5 | |||
| 83166e21a5 | |||
| b4ea89f9d6 | |||
| 00706f0ccc | |||
| 3798dde3aa | |||
| 5bf2258505 | |||
| 33b9c68677 | |||
| 58d9b00a0a | |||
| 7ef018fed0 | |||
| 3d9fc7ab53 | |||
| 3d6b2e4617 | |||
| 886e325cbf | |||
| 60bdffee84 | |||
| a9dc43f7fb | |||
| 0cc0e51d5d | |||
| 14d75b222f | |||
| b10d2b7365 | |||
| 8aa3679323 | |||
| 3403b87cb7 | |||
| d55fdf2205 | |||
| 7cb3f40dab | |||
| 65c362efce | |||
| 8065eebca3 | |||
| 7f062c7ca5 | |||
| 0adad4a053 | |||
| cb39e6e0b8 | |||
| 94eebc3ee5 | |||
| 5d5f4d1765 | |||
| ed0665407a | |||
| 3869a67180 | |||
| 7e75491e88 | |||
| ca33d66816 | |||
| 055e3db80a | |||
| 620ddf1228 | |||
| d71fe3eda0 | |||
| bff5049a98 | |||
| 536b2c2475 | |||
| 7a3033c150 | |||
| 05db054fb9 | |||
| 8aa445e2fc | |||
| 3658136b82 | |||
| 64419ca4f4 | |||
| 913cddec61 | |||
| 25e6a31004 | |||
| 3d58035b41 | |||
| b94a150685 | |||
| 22717c15af | |||
| cb07fc2abc | |||
| ea2a190bd1 | |||
| e6f3c1b3da | |||
| 22f732aa4e | |||
| 5e531d7cca | |||
| 0deae5f0b8 | |||
| 9ff4187fb3 | |||
| 6a1e70bf40 | |||
| d097218a45 | |||
| cc87a2c867 | |||
| b26ba9c4d3 | |||
| 88c94d1cc0 | |||
| 6cda0b6016 | |||
| 66dc1d90d8 | |||
| f7cab0cf71 | |||
| 83e2df4c46 | |||
| 31216ed1b2 | |||
| e9930bb2bc | |||
| c8a0540fd2 | |||
| a9b7a0cb27 | |||
| c0ff491972 | |||
| 146c105961 | |||
| 35fca2062e | |||
| 2c4e5c7a47 | |||
| e561da33bd | |||
| 5f6bdb0a8f | |||
| 6276a4a7c4 | |||
| 4fa50b96ad | |||
| 5aef158ff0 | |||
| 4054ac192a | |||
| febe8e4d9e | |||
| c924c32d54 | |||
| 743eb5cc26 | |||
| f4585cdf77 | |||
| c36977f0b1 | |||
| 44e4bd0b54 | |||
| 1427b8137a | |||
| a9cb354225 | |||
| b4db17ab3c | |||
| ba969fb9f2 | |||
| 87ac252c8d | |||
| ada9081ea2 | |||
| d6a29e582f | |||
| 03c4184067 | |||
| 0a82280f20 | |||
| a7fa2f87c5 | |||
| 3a11a5a82e | |||
| 08a38af553 | |||
| 043a54cf3e | |||
| 16c8f6d160 | |||
| 285472bc78 | |||
| a77adcd4c7 | |||
| cebd4392f2 | |||
| 64a3de5a7a | |||
| 261609f706 | |||
| 17cf73001c | |||
| ad566d793a | |||
| b499ed3d20 | |||
| de8de9c0f0 | |||
| 3b36dce5c2 | |||
| dcd8dfd5fc | |||
| 78f3b6297c | |||
| a49fe3b04a | |||
| f23cc7daa3 | |||
| cafd9d7ace | |||
| 1b6c120864 | |||
| 99afc50ebf | |||
| 3286f7c5ba | |||
| 72ccca9faf | |||
| 3c294d9721 | |||
| 1aff5f5bb7 | |||
| 937ae4c5e0 | |||
| 056865f59a | |||
| c58246b43c | |||
| 3495d1affd | |||
| b0ce072370 | |||
| 9f4d18baac | |||
| f65c8f8c6f | |||
| e0633b89bb | |||
| c3341ce4dc | |||
| 43f9b90c92 | |||
| 6ee45dcdcd | |||
| 344246725b | |||
| 57763ca1e2 | |||
| 40b7e24fcc | |||
| 9e0f16a629 | |||
| 33f4f3a5a1 | |||
| 07a3b75b3e | |||
| bdea2539d1 | |||
| ed3d7b0c45 | |||
| cba44c45fc | |||
| 07b533f95b | |||
| 7b0a79dec5 | |||
| befd01aa96 | |||
| 1cc263624d | |||
| 4daa2c1cde | |||
| 7081c57571 |
@@ -23,7 +23,6 @@ Checks: >
|
|||||||
clang-analyzer-*,
|
clang-analyzer-*,
|
||||||
-clang-analyzer-optin.performance.Padding,
|
-clang-analyzer-optin.performance.Padding,
|
||||||
-clang-analyzer-security.insecureAPI.DeprecatedOrUnsafeBufferHandling,
|
-clang-analyzer-security.insecureAPI.DeprecatedOrUnsafeBufferHandling,
|
||||||
-clang-analyzer-security.insecureAPI.rand,
|
|
||||||
-clang-analyzer-security.insecureAPI.strcpy,
|
-clang-analyzer-security.insecureAPI.strcpy,
|
||||||
clang-diagnostic-*,
|
clang-diagnostic-*,
|
||||||
performance-*,
|
performance-*,
|
||||||
|
|||||||
+162
-76
@@ -13,28 +13,31 @@ env:
|
|||||||
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_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
|
||||||
# 2024-04-20
|
ZSTD_CLEVEL: 9
|
||||||
ZIG_DIST_VERSION: 0.12.0
|
# 2025-03-05
|
||||||
|
ZIG_DIST_VERSION: 0.14.0
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
job-rebuild-and-verify-stubs:
|
job-rebuild-and-verify-stubs:
|
||||||
name: Rebuild stubs
|
name: Rebuild stubs
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
container: ubuntu:24.04 # glibc-2.39
|
container: ubuntu:24.04 # provides glibc-2.39
|
||||||
#container: debian:12-slim # also works; glibc-2.36
|
#container: debian:12-slim # also works; provides glibc-2.36
|
||||||
#container: debian:testing-slim # also works
|
#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 xz-utils libc6:i386 zlib1g:i386
|
apt-get install -y --no-install-recommends bash ca-certificates curl git libmpc3 make perl-base tar time xz-utils libc6:i386 zlib1g:i386
|
||||||
# install python2-minimal packages from Debian-11
|
# install python2-minimal packages from Debian-11
|
||||||
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
|
curl -sS -L -O https://ftp.debian.org/debian/pool/main/p/python2.7/libpython2.7-minimal_2.7.18-8+deb11u1_amd64.deb
|
||||||
@@ -53,6 +56,7 @@ jobs:
|
|||||||
git config --global --add safe.directory '*' # needed when running in a container
|
git config --global --add safe.directory '*' # needed when running in a container
|
||||||
git clone --branch "$GITHUB_REF_NAME" --depth 1 "$GITHUB_SERVER_URL/$GITHUB_REPOSITORY" .
|
git clone --branch "$GITHUB_REF_NAME" --depth 1 "$GITHUB_SERVER_URL/$GITHUB_REPOSITORY" .
|
||||||
git submodule update --init -- vendor/lzma-sdk
|
git submodule update --init -- vendor/lzma-sdk
|
||||||
|
git fsck --strict --no-progress
|
||||||
- name: Rebuild and verify stubs
|
- name: Rebuild and verify stubs
|
||||||
run: |
|
run: |
|
||||||
export PATH="$(readlink -en ../deps/bin-upx-20221212):$PATH"
|
export PATH="$(readlink -en ../deps/bin-upx-20221212):$PATH"
|
||||||
@@ -63,7 +67,7 @@ jobs:
|
|||||||
- run: bash ./misc/scripts/check_whitespace_git.sh
|
- run: bash ./misc/scripts/check_whitespace_git.sh
|
||||||
- name: Check source code formatting
|
- name: Check source code formatting
|
||||||
run: |
|
run: |
|
||||||
export UPX_CLANG_FORMAT="$PWD/../deps/bin-upx-20221212/clang-format-15.0.6"
|
export UPX_CLANG_FORMAT="$(readlink -en ../deps/bin-upx-20221212/clang-format-15.0.6)"
|
||||||
make -C src clang-format
|
make -C src clang-format
|
||||||
if ! git diff --quiet; then git diff; exit 1; fi
|
if ! git diff --quiet; then git diff; exit 1; fi
|
||||||
- name: Rebuild docs
|
- name: Rebuild docs
|
||||||
@@ -74,15 +78,17 @@ jobs:
|
|||||||
job-linux-cmake: # uses cmake + make
|
job-linux-cmake: # uses cmake + make
|
||||||
if: true
|
if: true
|
||||||
needs: [ job-rebuild-and-verify-stubs ]
|
needs: [ job-rebuild-and-verify-stubs ]
|
||||||
name: ${{ format('{0}', matrix.os) }}
|
|
||||||
runs-on: ${{ matrix.os }}
|
|
||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
include:
|
include:
|
||||||
|
# { os: ubuntu-20.04, use_extra: true }
|
||||||
- { os: ubuntu-22.04, use_extra: true, use_wine: true }
|
- { os: ubuntu-22.04, use_extra: true, use_wine: true }
|
||||||
- { os: ubuntu-20.04, use_extra: true }
|
- { os: ubuntu-24.04, use_extra: true, use_wine: true }
|
||||||
|
name: ${{ format('{0}', 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: |
|
||||||
@@ -106,6 +112,12 @@ jobs:
|
|||||||
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
|
||||||
|
- run: set -x; clang --version; clang++ --version
|
||||||
|
- run: set -x; gcc --version; g++ --version
|
||||||
|
- run: clang -E -x c -dM /dev/null # list predefined macros for C
|
||||||
|
- run: clang++ -E -x c++ -dM /dev/null # list predefined macros for C++
|
||||||
|
- run: gcc -E -x c -dM /dev/null # list predefined macros for C
|
||||||
|
- run: g++ -E -x c++ -dM /dev/null # list predefined macros for C++
|
||||||
- run: make build/extra/gcc/all
|
- run: make build/extra/gcc/all
|
||||||
- run: make build/extra/clang/all
|
- run: make build/extra/clang/all
|
||||||
- run: make build/extra/gcc-m32/all
|
- run: make build/extra/gcc-m32/all
|
||||||
@@ -120,8 +132,19 @@ jobs:
|
|||||||
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')
|
||||||
mkdir -p "tmp/artifact/$N"
|
mkdir -p "tmp/artifact/$N"
|
||||||
|
dirs="gcc/debug gcc/release clang/debug clang/release"
|
||||||
|
if test "${{ matrix.use_extra }}" = "true"; then
|
||||||
|
dirs="$dirs gcc-m32/debug gcc-m32/release gcc-mx32/debug gcc-mx32/release"
|
||||||
|
dirs="$dirs cross-windows-mingw32/debug cross-windows-mingw32/release"
|
||||||
|
dirs="$dirs cross-windows-mingw64/debug cross-windows-mingw64/release"
|
||||||
|
fi
|
||||||
|
for d in $dirs; do DESTDIR="$PWD/tmp/artifact/$N/InstallWithCMake/InstallWithDestdir/$d" cmake --install build/extra/$d; done
|
||||||
|
for d in $dirs; do DESTDIR="$PWD/tmp/artifact/$N/InstallWithCMake/InstallWithDestdirAndStrip/$d" cmake --install build/extra/$d --strip; done
|
||||||
|
for d in $dirs; do cmake --install build/extra/$d --prefix "$PWD/tmp/artifact/$N/InstallWithCMake/InstallWithPrefix/$d"; done
|
||||||
|
for d in $dirs; do cmake --install build/extra/$d --prefix "$PWD/tmp/artifact/$N/InstallWithCMake/InstallWithPrefixAndStrip/$d" --strip; done
|
||||||
(cd build && shopt -s nullglob && cp -ai --parents */upx{,.exe} */*/*/upx{,.exe} "../tmp/artifact/$N")
|
(cd build && shopt -s nullglob && cp -ai --parents */upx{,.exe} */*/*/upx{,.exe} "../tmp/artifact/$N")
|
||||||
(cd tmp/artifact && tar --sort=name -czf "$N.tar.gz" "$N" && rm -rf "./$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
|
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@v4
|
||||||
@@ -156,13 +179,13 @@ 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
|
||||||
fi
|
fi
|
||||||
- name: Run file system test suite
|
- name: Run file system tests
|
||||||
run: |
|
run: |
|
||||||
jobs="gcc/debug gcc/release clang/debug clang/release"
|
jobs="gcc/debug gcc/release clang/debug clang/release"
|
||||||
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/test_symlinks.sh' ::: $jobs
|
parallel -kv --lb 'cd build/extra/{} && bash ../../../../misc/testsuite/test_symlinks.sh' ::: $jobs
|
||||||
- name: Run file system test suite with Valgrind
|
- name: Run file system tests with Valgrind
|
||||||
if: false # note: valgrind is SLOW
|
if: false # note: valgrind is SLOW
|
||||||
run: |
|
run: |
|
||||||
if command -v valgrind >/dev/null; then
|
if command -v valgrind >/dev/null; then
|
||||||
@@ -184,22 +207,19 @@ jobs:
|
|||||||
job-macos-cmake: # uses cmake + make
|
job-macos-cmake: # uses cmake + make
|
||||||
if: true
|
if: true
|
||||||
needs: [ job-rebuild-and-verify-stubs ]
|
needs: [ job-rebuild-and-verify-stubs ]
|
||||||
name: ${{ format('{0} {1}{2}', matrix.os, matrix.xcode_version && 'xcode-' || '', matrix.xcode_version) }}
|
|
||||||
runs-on: ${{ matrix.os }}
|
|
||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
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: macos does not have "env -C"; only with brew coreutils
|
# NOTE: macos does not have "env -C"; only with brew coreutils
|
||||||
# NOTE: macos-11 does not have "readlink -f"; only on macos >= 12 or with brew coreutils
|
- { os: macos-13, gcc: gcc-12, gxx: g++-12, testsuite: true }
|
||||||
- { os: macos-11, gcc: gcc-10, gxx: g++-10, testsuite: true }
|
- { os: macos-14, gcc: gcc-13, gxx: g++-13, testsuite: true }
|
||||||
- { os: macos-12, gcc: gcc-11, gxx: g++-11, testsuite: true }
|
- { os: macos-15, gcc: gcc-14, gxx: g++-14, testsuite: true }
|
||||||
- { os: macos-13, testsuite: true } # use default Xcode-15; NOTE: gcc-12 on macos-13 does not work with Xcode-15
|
name: ${{ format('{0} {1}{2}', matrix.os, matrix.xcode_version && 'xcode-' || '', matrix.xcode_version) }}
|
||||||
- { os: macos-13, gcc: gcc-12, gxx: g++-12, testsuite: true, xcode_version: 14.3.1 }
|
runs-on: ${{ matrix.os }}
|
||||||
# { os: macos-14, gcc: gcc-13, gxx: g++-13, testsuite: true } # gcc-13: INTERNAL ERROR in ld64
|
|
||||||
# { os: macos-14, gcc: gcc-13, gxx: g++-13, testsuite: true, xcode_version: 14.3.1 } # gcc-13: MISSING HEADER FILES
|
|
||||||
- { os: macos-14, gcc: gcc-12, gxx: g++-12, testsuite: true } # => use gcc-12 for now
|
|
||||||
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 }}' }
|
||||||
@@ -209,24 +229,34 @@ 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"
|
packages="ninja 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
|
||||||
# only run "brew update" if needed
|
# only run "brew update" if needed
|
||||||
if ! brew install $packages; then brew update && brew install $packages; fi
|
if ! brew install $packages; then echo "===== brew update" && brew update && brew install $packages; fi
|
||||||
fi
|
fi
|
||||||
mkdir -p ~/.parallel && : > ~/.parallel/$(echo 6305-4721 | tr 0-7 leticlwi)
|
mkdir -p ~/.parallel && : > ~/.parallel/$(echo 6305-4721 | tr 0-7 leticlwi)
|
||||||
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) echo "UPX_CONFIG_DISABLE_RUN_PACKED_TEST=ON" >> $GITHUB_ENV ;;
|
macos-1[345]) echo "UPX_CONFIG_DISABLE_RUN_PACKED_TEST=ON" >> $GITHUB_ENV ;;
|
||||||
esac
|
esac
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
with: { submodules: true }
|
with: { submodules: true }
|
||||||
- name: Check out test suite
|
- name: Check out test suite
|
||||||
if: ${{ matrix.testsuite }}
|
if: ${{ matrix.testsuite }}
|
||||||
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
|
||||||
|
- run: set -x; xcode-select -p || true; xcodebuild -version || true
|
||||||
|
- run: set -x; clang --version; clang++ --version
|
||||||
|
- run: clang -E -x c -dM /dev/null # list predefined macros for C
|
||||||
|
- run: clang++ -E -x c++ -dM /dev/null # list predefined macros for C++
|
||||||
|
- run: set -x; ${{ matrix.gcc }} --version; ${{ matrix.gxx }} --version
|
||||||
|
if: ${{ matrix.gcc }}
|
||||||
|
- run: ${{ matrix.gcc }} -E -x c -dM /dev/null # list predefined macros for C
|
||||||
|
if: ${{ matrix.gcc }}
|
||||||
|
- run: ${{ matrix.gxx }} -E -x c++ -dM /dev/null # list predefined macros for C++
|
||||||
|
if: ${{ matrix.gcc }}
|
||||||
- run: make build/extra/clang/all
|
- run: make build/extra/clang/all
|
||||||
- name: Build extra/gcc/all
|
- name: Build extra/gcc/all
|
||||||
if: ${{ matrix.gcc }}
|
if: ${{ matrix.gcc }}
|
||||||
@@ -240,8 +270,16 @@ jobs:
|
|||||||
X="${{ matrix.xcode_version }}"; test -n "$X" && X="-xcode-$X"
|
X="${{ matrix.xcode_version }}"; test -n "$X" && X="-xcode-$X"
|
||||||
N=$(echo "upx-${GITHUB_REF_NAME}-${GITHUB_SHA:0:7}-${{ matrix.os }}$X" | sed 's/[^0-9a-zA-Z_.-]/-/g')
|
N=$(echo "upx-${GITHUB_REF_NAME}-${GITHUB_SHA:0:7}-${{ matrix.os }}$X" | sed 's/[^0-9a-zA-Z_.-]/-/g')
|
||||||
mkdir -p "tmp/artifact/$N"
|
mkdir -p "tmp/artifact/$N"
|
||||||
|
dirs="clang/debug clang/release"
|
||||||
|
test -n "${{ matrix.gcc }}" && dirs="$dirs gcc/debug gcc/release"
|
||||||
|
for d in $dirs; do DESTDIR="$PWD/tmp/artifact/$N/InstallWithCMake/InstallWithDestdir/$d" cmake --install build/extra/$d; done
|
||||||
|
for d in $dirs; do DESTDIR="$PWD/tmp/artifact/$N/InstallWithCMake/InstallWithDestdirAndStrip/$d" cmake --install build/extra/$d --strip; done
|
||||||
|
for d in $dirs; do cmake --install build/extra/$d --prefix "$PWD/tmp/artifact/$N/InstallWithCMake/InstallWithPrefix/$d"; done
|
||||||
|
for d in $dirs; do cmake --install build/extra/$d --prefix "$PWD/tmp/artifact/$N/InstallWithCMake/InstallWithPrefixAndStrip/$d" --strip; done
|
||||||
(cd build && rsync -R -a */*/*/upx "../tmp/artifact/$N/")
|
(cd build && rsync -R -a */*/*/upx "../tmp/artifact/$N/")
|
||||||
(cd tmp/artifact && gtar --sort=name -czf "$N.tar.gz" "$N" && rm -rf "./$N")
|
hardlink="$HOMEBREW_PREFIX/opt/util-linux/bin/hardlink"
|
||||||
|
if test -f "$hardlink"; then (cd "tmp/artifact/$N" && "$hardlink" .) fi
|
||||||
|
(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@v4
|
||||||
@@ -264,7 +302,7 @@ jobs:
|
|||||||
test -n "${{ matrix.gcc }}" && jobs="$jobs gcc/debug gcc/release"
|
test -n "${{ matrix.gcc }}" && jobs="$jobs gcc/debug gcc/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
|
||||||
- name: Run file system test suite
|
- name: Run file system tests
|
||||||
if: ${{ matrix.testsuite }} # for coreutils readlink
|
if: ${{ matrix.testsuite }} # for coreutils readlink
|
||||||
run: |
|
run: |
|
||||||
export PATH="$HOMEBREW_PREFIX/opt/coreutils/libexec/gnubin:$PATH"
|
export PATH="$HOMEBREW_PREFIX/opt/coreutils/libexec/gnubin:$PATH"
|
||||||
@@ -286,14 +324,14 @@ jobs:
|
|||||||
job-windows-cmake: # uses cmake + msbuild
|
job-windows-cmake: # uses cmake + msbuild
|
||||||
if: true
|
if: true
|
||||||
needs: [ job-rebuild-and-verify-stubs ]
|
needs: [ job-rebuild-and-verify-stubs ]
|
||||||
name: ${{ format('{0}', matrix.name) }}
|
|
||||||
runs-on: ${{ matrix.os }}
|
|
||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
include:
|
include:
|
||||||
- { name: windows-2019-amd64, os: windows-2019, vsversion: 2019, vsarch: amd64 }
|
- { name: windows-2019-amd64, os: windows-2019, vsversion: 2019, vsarch: amd64 }
|
||||||
- { name: windows-2022-amd64, os: windows-2022, vsversion: 2022, vsarch: amd64 }
|
- { name: windows-2022-amd64, os: windows-2022, vsversion: 2022, vsarch: amd64 }
|
||||||
|
name: ${{ format('{0}', matrix.name) }}
|
||||||
|
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@v4
|
||||||
@@ -309,7 +347,16 @@ jobs:
|
|||||||
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')
|
||||||
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/release" cmake --install build/release --config Release
|
||||||
|
DESTDIR="$PWD/tmp/artifact/$N/InstallWithCMake/InstallWithDestdirAndStrip/debug" cmake --install build/debug --config Debug --strip
|
||||||
|
DESTDIR="$PWD/tmp/artifact/$N/InstallWithCMake/InstallWithDestdirAndStrip/release" cmake --install build/release --config Release --strip
|
||||||
|
cmake --install build/debug --config Debug --prefix "$PWD/tmp/artifact/$N/InstallWithCMake/InstallWithPrefix/debug"
|
||||||
|
cmake --install build/release --config Release --prefix "$PWD/tmp/artifact/$N/InstallWithCMake/InstallWithPrefix/release"
|
||||||
|
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
|
||||||
(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")
|
||||||
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@v4
|
||||||
@@ -329,11 +376,6 @@ jobs:
|
|||||||
job-windows-toolchains: # build "by hand" using cmd.exe
|
job-windows-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 ]
|
||||||
name: ${{ format('windows {0}', matrix.name) }}
|
|
||||||
runs-on: ${{ matrix.os }}
|
|
||||||
env:
|
|
||||||
C: ${{ matrix.name }}
|
|
||||||
B: release
|
|
||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
@@ -346,6 +388,11 @@ jobs:
|
|||||||
# { name: arm64x-win64-vs2022, os: windows-2022, vsversion: 2022, vsarch: amd64_arm64, cl_machine_flags: -arm64EC, link_machine_flags: '/machine:arm64x' }
|
# { name: arm64x-win64-vs2022, os: windows-2022, vsversion: 2022, vsarch: amd64_arm64, cl_machine_flags: -arm64EC, link_machine_flags: '/machine:arm64x' }
|
||||||
- { name: i386-win32-vs2019, os: windows-2019, vsversion: 2019, vsarch: amd64_x86 }
|
- { 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: i386-win32-vs2022, os: windows-2022, vsversion: 2022, vsarch: amd64_x86 }
|
||||||
|
name: ${{ format('windows {0}', matrix.name) }}
|
||||||
|
runs-on: ${{ matrix.os }}
|
||||||
|
env:
|
||||||
|
C: ${{ matrix.name }}
|
||||||
|
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@v4
|
||||||
@@ -381,7 +428,8 @@ jobs:
|
|||||||
%RUN_LIB% -out:ucl.lib *.obj
|
%RUN_LIB% -out:ucl.lib *.obj
|
||||||
@REM ===== build zlib =====
|
@REM ===== build zlib =====
|
||||||
cd %BDIR%\zlib
|
cd %BDIR%\zlib
|
||||||
%RUN_CL% -J -O2 -W3 -WX %DEFS% -DHAVE_VSNPRINTF -c %H%\vendor\zlib\*.c
|
set s=%H%\vendor\zlib
|
||||||
|
%RUN_CL% -J -O2 -W3 -WX %DEFS% -I%s% -DHAVE_VSNPRINTF -c %H%\vendor\zlib\*.c
|
||||||
%RUN_LIB% -out:zlib.lib *.obj
|
%RUN_LIB% -out:zlib.lib *.obj
|
||||||
@REM ===== build zstd =====
|
@REM ===== build zstd =====
|
||||||
cd %BDIR%\zstd
|
cd %BDIR%\zstd
|
||||||
@@ -404,6 +452,7 @@ jobs:
|
|||||||
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-${{ 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")
|
||||||
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@v4
|
||||||
@@ -432,60 +481,59 @@ jobs:
|
|||||||
job-linux-zigcc: # uses cmake + make
|
job-linux-zigcc: # uses cmake + make
|
||||||
if: github.repository_owner == 'upx'
|
if: github.repository_owner == 'upx'
|
||||||
needs: [ job-rebuild-and-verify-stubs ]
|
needs: [ job-rebuild-and-verify-stubs ]
|
||||||
name: ${{ format('zigcc {0} {1}', matrix.zig_target, matrix.zig_pic) }}
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
container: alpine:3.19
|
|
||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
include:
|
include:
|
||||||
# only build a few 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-linux-musl, qemu: qemu-aarch64, zig_pic: -fPIE }
|
|
||||||
# { zig_target: aarch64-macos-none }
|
|
||||||
- { zig_target: aarch64-macos.11.0-none }
|
- { zig_target: aarch64-macos.11.0-none }
|
||||||
# { zig_target: aarch64-macos.12.0-none }
|
|
||||||
# { zig_target: aarch64-macos.13.0-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: arm-linux-musleabihf, qemu: qemu-arm, zig_pic: -fPIE }
|
- { 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 }
|
||||||
# mips and mipsel: bad hard-float code generation(??); or QEMU bug; or UPX bug; see https://github.com/upx/upx/issues/788
|
- { zig_target: mips-linux-musleabi, zig_flags: -msoft-float, qemu: qemu-mips }
|
||||||
- { zig_target: mips-linux-musl, zig_flags: -msoft-float, qemu: qemu-mips }
|
- { zig_target: mips-linux-musleabihf, qemu: qemu-mips }
|
||||||
- { zig_target: mipsel-linux-musl, zig_flags: -msoft-float, qemu: qemu-mipsel }
|
- { zig_target: mipsel-linux-musleabi, zig_flags: -msoft-float, qemu: qemu-mipsel }
|
||||||
- { zig_target: powerpc-linux-musl, qemu: qemu-ppc }
|
- { zig_target: mipsel-linux-musleabihf, qemu: qemu-mipsel }
|
||||||
# powerpc64: obscure problem with C++ exceptions in UPX doctest checks; use -fPIC to work-around
|
# { zig_target: mips-linux-musleabi-mips32r2, zig_flags: -march=mips32r2, qemu: qemu-mips }
|
||||||
- { zig_target: powerpc64-linux-musl, zig_flags: -fPIC, qemu: qemu-ppc64 }
|
# { 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: powerpc64-linux-musl, qemu: qemu-ppc64 }
|
||||||
- { zig_target: powerpc64le-linux-musl, qemu: qemu-ppc64le }
|
- { zig_target: powerpc64le-linux-musl, qemu: qemu-ppc64le }
|
||||||
- { 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-linux-musl, qemu: qemu-x86_64, zig_pic: -fPIE }
|
|
||||||
# { zig_target: x86_64-macos-none }
|
|
||||||
- { zig_target: x86_64-macos.11.0-none }
|
- { zig_target: x86_64-macos.11.0-none }
|
||||||
# { zig_target: x86_64-macos.12.0-none }
|
|
||||||
# { zig_target: x86_64-macos.13.0-none }
|
|
||||||
- { zig_target: x86_64-windows-gnu }
|
- { zig_target: x86_64-windows-gnu }
|
||||||
|
name: ${{ format('zigcc {0} {1}', matrix.zig_target, matrix.zig_pic) }}
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
container: 'alpine:3.21'
|
||||||
|
#container: ${{ contains(matrix.qemu, 'qemu-ppc64') && 'alpine:3.19' || 'alpine:3.21' }}
|
||||||
|
#container: ${{ (matrix.qemu == 'qemu-ppc64') && 'alpine:edge' || 'alpine:3.21' }}
|
||||||
env:
|
env:
|
||||||
# zig is currently missing winpthreads; see https://github.com/ziglang/zig/issues/10989
|
UPX_CONFIG_HAVE_WORKING_BUILD_RPATH: ''
|
||||||
UPX_CONFIG_EXPECT_THREADS: ${{ contains(matrix.zig_target, '-windows-') && 'OFF' || 'ON' }}
|
|
||||||
# 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
|
||||||
ZIG_FLAGS: ${{ matrix.zig_flags }}
|
ZIG_FLAGS: ${{ matrix.zig_flags }}
|
||||||
ZIG_PIC: ${{ matrix.zig_pic }}
|
ZIG_PIC: ${{ matrix.zig_pic }}
|
||||||
ZIG_TARGET: ${{ matrix.zig_target }}
|
ZIG_TARGET: ${{ matrix.zig_target }}
|
||||||
steps:
|
steps:
|
||||||
|
- run: uname -a; pwd; id; umask
|
||||||
- name: Install Alpine Linux container packages
|
- name: Install Alpine Linux container packages
|
||||||
if: ${{ job.container }}
|
if: ${{ job.container }}
|
||||||
shell: sh
|
shell: sh
|
||||||
run: |
|
run: |
|
||||||
apk update && apk upgrade && apk add bash cmake curl file git make parallel tar xz
|
apk update && apk upgrade && apk add bash cmake curl file git make parallel patch tar util-linux xz zstd
|
||||||
mkdir -p ~/.parallel && : > ~/.parallel/$(echo 6305-4721 | tr 0-7 leticlwi)
|
|
||||||
# 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)
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
with: { submodules: true }
|
with: { submodules: true }
|
||||||
- name: ${{ format('Install Zig {0}', env.ZIG_DIST_VERSION) }}
|
- name: ${{ format('Install Zig {0}', env.ZIG_DIST_VERSION) }}
|
||||||
@@ -493,32 +541,62 @@ jobs:
|
|||||||
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 }}" == x86_64-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
|
||||||
|
fi
|
||||||
|
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
|
||||||
# update ZIG_TARGET (i386 => x86)
|
|
||||||
ZIG_TARGET=${ZIG_TARGET/i386-/x86-}
|
|
||||||
echo "ZIG_TARGET=$ZIG_TARGET" >> $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_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
|
#curl -sS -L -O https://ziglang.org/builds/${ZIG_DIST_NAME}.tar.xz
|
||||||
|
curl -sS -L -O https://ziglang.org/download/0.14.0/${ZIG_DIST_NAME}.tar.xz
|
||||||
ls -l ${ZIG_DIST_NAME}.tar.xz
|
ls -l ${ZIG_DIST_NAME}.tar.xz
|
||||||
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)
|
||||||
echo -e '#!/bin/sh\nexec zig ar "$@"' > zig-ar
|
log=
|
||||||
echo -e '#!/bin/sh\nexec zig cc -target $ZIG_TARGET $ZIG_PIC $ZIG_FLAGS $ZIG_CPPFLAGS $ZIG_CFLAGS "$@"' > zig-cc
|
log='set -x\n'
|
||||||
echo -e '#!/bin/sh\nexec zig c++ -target $ZIG_TARGET $ZIG_PIC $ZIG_FLAGS $ZIG_CPPFLAGS $ZIG_CXXFLAGS "$@"' > zig-cxx
|
echo -e '#!/bin/sh\n'$log'exec zig ar "$@"' > zig-ar
|
||||||
echo -e '#!/bin/sh\nexec zig ranlib "$@"' > zig-ranlib
|
echo -e '#!/bin/sh\n'$log'exec zig cc -target $ZIG_TARGET $ZIG_PIC $ZIG_FLAGS $ZIG_CPPFLAGS $ZIG_CFLAGS "$@"' > zig-cc
|
||||||
|
echo -e '#!/bin/sh\n'$log'exec zig c++ -target $ZIG_TARGET $ZIG_PIC $ZIG_FLAGS $ZIG_CPPFLAGS $ZIG_CXXFLAGS "$@"' > zig-cxx
|
||||||
|
echo -e '#!/bin/sh\n'$log'exec zig ranlib "$@"' > zig-ranlib
|
||||||
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
|
||||||
|
[[ $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
|
||||||
|
# update ZIG_FLAGS
|
||||||
|
# -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
|
||||||
|
if test "X$ZIG_PIC" = "X-fPIE"; then true;
|
||||||
|
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
|
||||||
|
fi
|
||||||
|
if [[ $ZIG_TARGET == *-linux-gnu.2.3.* ]]; then true;
|
||||||
|
# glibc-2.3.3: undefined symbols in Debug build: __snprintf_chk __vsnprintf_chk
|
||||||
|
# glibc-2.3.4: ld.lld: error: undefined symbol: openat64
|
||||||
|
ZIG_FLAGS="$ZIG_FLAGS -fno-sanitize=all"
|
||||||
|
echo "UPX_CONFIG_DISABLE_SANITIZE=ON" >> $GITHUB_ENV
|
||||||
|
fi
|
||||||
|
echo "ZIG_FLAGS=$ZIG_FLAGS" >> $GITHUB_ENV
|
||||||
|
- 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-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 \
|
||||||
@@ -534,8 +612,16 @@ jobs:
|
|||||||
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"
|
||||||
|
if [[ "${{ matrix.zig_target }}" == *-linux* ]]; then
|
||||||
|
dirs="${ZIG_TARGET}${ZIG_PIC}/debug ${ZIG_TARGET}${ZIG_PIC}/release"
|
||||||
|
for d in $dirs; do DESTDIR="$PWD/tmp/artifact/$N/InstallWithCMake/InstallWithDestdir/$d" cmake --install build/zig/$d; done
|
||||||
|
for d in $dirs; do DESTDIR="$PWD/tmp/artifact/$N/InstallWithCMake/InstallWithDestdirAndStrip/$d" cmake --install build/zig/$d --strip; done
|
||||||
|
for d in $dirs; do cmake --install build/zig/$d --prefix "$PWD/tmp/artifact/$N/InstallWithCMake/InstallWithPrefix/$d"; done
|
||||||
|
for d in $dirs; do cmake --install build/zig/$d --prefix "$PWD/tmp/artifact/$N/InstallWithCMake/InstallWithPrefixAndStrip/$d" --strip; done
|
||||||
|
fi
|
||||||
(cd build && shopt -s nullglob && cp -ai --parents */upx{,.exe} */*/*/upx{,.exe} "../tmp/artifact/$N")
|
(cd build && shopt -s nullglob && cp -ai --parents */upx{,.exe} */*/*/upx{,.exe} "../tmp/artifact/$N")
|
||||||
(cd tmp/artifact && tar --sort=name -czf "$N.tar.gz" "$N" && rm -rf "./$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
|
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@v4
|
||||||
@@ -546,14 +632,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"
|
||||||
@@ -570,7 +656,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: 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') }}
|
||||||
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
|
||||||
@@ -580,8 +666,8 @@ jobs:
|
|||||||
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 '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 test suite
|
- 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
|
||||||
|
|||||||
+19
-14
@@ -1,5 +1,9 @@
|
|||||||
|
/.cache*
|
||||||
/.hg*
|
/.hg*
|
||||||
/.vscode*
|
/.vscode*
|
||||||
|
/CMakeCache*
|
||||||
|
/CMakeFiles*
|
||||||
|
/CTest*
|
||||||
/Makevars[.-]global*
|
/Makevars[.-]global*
|
||||||
/Testing*
|
/Testing*
|
||||||
/build*
|
/build*
|
||||||
@@ -9,6 +13,7 @@
|
|||||||
GNUmakefile*
|
GNUmakefile*
|
||||||
MMakefile*
|
MMakefile*
|
||||||
Makevars[.-]local*
|
Makevars[.-]local*
|
||||||
|
compile_commands*.json
|
||||||
compile_flags*.txt
|
compile_flags*.txt
|
||||||
Tmp*
|
Tmp*
|
||||||
tmp*
|
tmp*
|
||||||
@@ -37,19 +42,19 @@ tmp*
|
|||||||
*.zip
|
*.zip
|
||||||
*.zst
|
*.zst
|
||||||
|
|
||||||
doc/*.man
|
/doc/*.man
|
||||||
doc/*.ps
|
/doc/*.ps
|
||||||
doc/*.tex
|
/doc/*.tex
|
||||||
|
|
||||||
src/stub/**/.*-stamp
|
/src/stub/**/.*-stamp
|
||||||
src/stub/tmp*/*.bin
|
/src/stub/src/**/tmp*/*
|
||||||
src/stub/tmp*/*.bin.bindump
|
/src/stub/tmp*/*.bin
|
||||||
src/stub/tmp*/*.bin.disasm
|
/src/stub/tmp*/*.bin.bindump
|
||||||
src/stub/tmp*/*.o.disasm
|
/src/stub/tmp*/*.bin.disasm
|
||||||
src/stub/tmp*/mips.r3000-*.[is]
|
/src/stub/tmp*/*.o.disasm
|
||||||
src/stub/tmp*/mipsel.r3000-*.[is]
|
/src/stub/tmp*/mips.r3000-*.[is]
|
||||||
src/stub/src/**/tmp*/*
|
/src/stub/tmp*/mipsel.r3000-*.[is]
|
||||||
|
|
||||||
src/stub/tools/sstrip/amd64-linux-sstrip
|
/src/stub/tools/sstrip/amd64-linux-sstrip
|
||||||
src/stub/tools/sstrip/i386-linux-sstrip
|
/src/stub/tools/sstrip/i386-linux-sstrip
|
||||||
src/stub/tools/sstrip/sstrip
|
/src/stub/tools/sstrip/sstrip
|
||||||
|
|||||||
+42
-27
@@ -21,12 +21,15 @@
|
|||||||
file(REMOVE "${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/.upx_cmake_config_done.txt")
|
file(REMOVE "${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/.upx_cmake_config_done.txt")
|
||||||
if(DEFINED UPX_CONFIG_CMAKE_MINIMUM_REQUIRED_VERSION)
|
if(DEFINED UPX_CONFIG_CMAKE_MINIMUM_REQUIRED_VERSION)
|
||||||
cmake_minimum_required(VERSION "${UPX_CONFIG_CMAKE_MINIMUM_REQUIRED_VERSION}" FATAL_ERROR)
|
cmake_minimum_required(VERSION "${UPX_CONFIG_CMAKE_MINIMUM_REQUIRED_VERSION}" FATAL_ERROR)
|
||||||
|
elseif(NOT ${CMAKE_VERSION} VERSION_LESS "3.10")
|
||||||
|
cmake_minimum_required(VERSION "3.10" FATAL_ERROR)
|
||||||
else()
|
else()
|
||||||
cmake_minimum_required(VERSION "3.8" FATAL_ERROR) # CMake >= 3.8 is needed for CXX_STANDARD 17
|
cmake_minimum_required(VERSION "3.8" FATAL_ERROR) # CMake >= 3.8 is needed for CXX_STANDARD 17
|
||||||
endif()
|
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)
|
||||||
|
|
||||||
#***********************************************************************
|
#***********************************************************************
|
||||||
# options
|
# options
|
||||||
@@ -43,7 +46,7 @@ if(NOT USE_STRICT_DEFAULTS)
|
|||||||
option(UPX_CONFIG_DISABLE_WSTRICT "Do not compile with strict compiler warnings." ON)
|
option(UPX_CONFIG_DISABLE_WSTRICT "Do not compile with strict compiler warnings." ON)
|
||||||
else()
|
else()
|
||||||
# strict config defaults for Git developer builds
|
# strict config defaults for Git developer builds
|
||||||
message(STATUS "===== UPX info: strict config defaults enabled")
|
message(STATUS "===== UPX NOTE: strict developer config defaults enabled =====")
|
||||||
option(UPX_CONFIG_DISABLE_GITREV "Do not compile with Git version info." OFF)
|
option(UPX_CONFIG_DISABLE_GITREV "Do not compile with Git version info." OFF)
|
||||||
option(UPX_CONFIG_DISABLE_SANITIZE "Do not compile with sanitize options." OFF)
|
option(UPX_CONFIG_DISABLE_SANITIZE "Do not compile with sanitize options." OFF)
|
||||||
option(UPX_CONFIG_DISABLE_WERROR "Do not compile with -Werror option." OFF)
|
option(UPX_CONFIG_DISABLE_WERROR "Do not compile with -Werror option." OFF)
|
||||||
@@ -59,15 +62,13 @@ option(UPX_CONFIG_DISABLE_EXHAUSTIVE_TESTS "Do not run exhaustive tests"
|
|||||||
# init
|
# init
|
||||||
#***********************************************************************
|
#***********************************************************************
|
||||||
|
|
||||||
set(UPX_VERSION_STRING "4.2.4") # this should match src/version.h
|
set(UPX_VERSION_STRING "5.0.1") # 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.
|
||||||
if(IS_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/.git")
|
upx_disallow_in_source_build()
|
||||||
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)
|
||||||
@@ -79,13 +80,13 @@ upx_cache_bool_vars(ON
|
|||||||
CMAKE_C_STANDARD_REQUIRED CMAKE_CXX_STANDARD_REQUIRED
|
CMAKE_C_STANDARD_REQUIRED CMAKE_CXX_STANDARD_REQUIRED
|
||||||
CMAKE_EXPORT_COMPILE_COMMANDS CMAKE_REQUIRED_QUIET
|
CMAKE_EXPORT_COMPILE_COMMANDS CMAKE_REQUIRED_QUIET
|
||||||
)
|
)
|
||||||
# internal UPX settings
|
# internal UPX settings that default to OFF; useful for CI jobs
|
||||||
upx_cache_bool_vars(OFF
|
upx_cache_bool_vars(OFF
|
||||||
UPX_CONFIG_CMAKE_DISABLE_TEST UPX_CONFIG_CMAKE_DISABLE_INSTALL
|
UPX_CONFIG_CMAKE_DISABLE_TEST UPX_CONFIG_CMAKE_DISABLE_INSTALL
|
||||||
UPX_CONFIG_CMAKE_DISABLE_PRINT_INFO UPX_CONFIG_CMAKE_DISABLE_PLATFORM_CHECK
|
UPX_CONFIG_CMAKE_DISABLE_PRINT_INFO UPX_CONFIG_CMAKE_DISABLE_PLATFORM_CHECK
|
||||||
UPX_CONFIG_DISABLE_C_STANDARD UPX_CONFIG_DISABLE_CXX_STANDARD
|
UPX_CONFIG_DISABLE_C_STANDARD UPX_CONFIG_DISABLE_CXX_STANDARD
|
||||||
UPX_CONFIG_DISABLE_RUN_UNPACKED_TEST UPX_CONFIG_DISABLE_RUN_PACKED_TEST
|
UPX_CONFIG_DISABLE_RUN_UNPACKED_TEST UPX_CONFIG_DISABLE_RUN_PACKED_TEST
|
||||||
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)
|
upx_print_env_var(CC CXX)
|
||||||
@@ -136,15 +137,14 @@ endif()
|
|||||||
upx_set_default_build_type(Release) # default is CMAKE_BUILD_TYPE=Release
|
upx_set_default_build_type(Release) # default is CMAKE_BUILD_TYPE=Release
|
||||||
project(upx VERSION "${UPX_VERSION_STRING}" LANGUAGES C CXX)
|
project(upx VERSION "${UPX_VERSION_STRING}" LANGUAGES C CXX)
|
||||||
upx_apply_build_type()
|
upx_apply_build_type()
|
||||||
|
upx_set_global_vars()
|
||||||
|
upx_check_working_build_rpath(UPX_CONFIG_HAVE_WORKING_BUILD_RPATH)
|
||||||
|
|
||||||
# set MSVC_FRONTEND, GNU_FRONTEND and MINGW
|
if(DEFINED UPX_CONFIG_CMAKE_EXECUTABLE_SUFFIX)
|
||||||
if(NOT DEFINED MSVC_FRONTEND AND (MSVC OR CMAKE_C_COMPILER_FRONTEND_VARIANT MATCHES "^MSVC"))
|
set(CMAKE_EXECUTABLE_SUFFIX "${UPX_CONFIG_CMAKE_EXECUTABLE_SUFFIX}")
|
||||||
set(MSVC_FRONTEND 1)
|
|
||||||
elseif (NOT DEFINED GNU_FRONTEND AND (CMAKE_C_COMPILER_FRONTEND_VARIANT MATCHES "^GNU" OR CMAKE_C_COMPILER_ID MATCHES "(Clang|GNU)"))
|
|
||||||
set(GNU_FRONTEND 1)
|
|
||||||
endif()
|
endif()
|
||||||
if(NOT DEFINED MINGW AND CMAKE_C_PLATFORM_ID MATCHES "^MinGW")
|
if(NOT UPX_CONFIG_CMAKE_DISABLE_INSTALL AND CMAKE_INSTALL_PREFIX)
|
||||||
set(MINGW 1)
|
include(GNUInstallDirs)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
#***********************************************************************
|
#***********************************************************************
|
||||||
@@ -156,9 +156,20 @@ include(CheckFunctionExists)
|
|||||||
include(CheckIncludeFile)
|
include(CheckIncludeFile)
|
||||||
include(CheckStructHasMember)
|
include(CheckStructHasMember)
|
||||||
include(CheckSymbolExists)
|
include(CheckSymbolExists)
|
||||||
|
include(CheckTypeSize)
|
||||||
|
|
||||||
upx_cmake_include_hook(3_common_compilation_flags)
|
upx_cmake_include_hook(3_common_compilation_flags)
|
||||||
|
|
||||||
|
# assert sane type sizes
|
||||||
|
check_type_size("size_t" C_SIZEOF_SIZE_T LANGUAGE C)
|
||||||
|
check_type_size("size_t" CXX_SIZEOF_SIZE_T LANGUAGE CXX)
|
||||||
|
if(NOT "${C_SIZEOF_SIZE_T}" MATCHES "^(4|8|16)$")
|
||||||
|
message(FATAL_ERROR "ERROR: unexpected C_SIZEOF_SIZE_T '${C_SIZEOF_SIZE_T}'")
|
||||||
|
endif()
|
||||||
|
if(NOT ",${C_SIZEOF_SIZE_T}," STREQUAL ",${CXX_SIZEOF_SIZE_T},")
|
||||||
|
message(FATAL_ERROR "FATAL ERROR: '${C_SIZEOF_SIZE_T}' '${CXX_SIZEOF_SIZE_T}' mismatch")
|
||||||
|
endif()
|
||||||
|
|
||||||
if(NOT DEFINED HAVE_UNISTD_H)
|
if(NOT DEFINED HAVE_UNISTD_H)
|
||||||
check_include_file("unistd.h" HAVE_UNISTD_H)
|
check_include_file("unistd.h" HAVE_UNISTD_H)
|
||||||
endif()
|
endif()
|
||||||
@@ -215,6 +226,8 @@ if(MSVC_FRONTEND OR WIN32 OR MINGW OR CYGWIN)
|
|||||||
add_definitions(-D_CRT_NONSTDC_NO_WARNINGS)
|
add_definitions(-D_CRT_NONSTDC_NO_WARNINGS)
|
||||||
add_definitions(-D_CRT_SECURE_NO_DEPRECATE)
|
add_definitions(-D_CRT_SECURE_NO_DEPRECATE)
|
||||||
add_definitions(-D_CRT_SECURE_NO_WARNINGS)
|
add_definitions(-D_CRT_SECURE_NO_WARNINGS)
|
||||||
|
add_definitions(-D_SCL_SECURE_NO_DEPRECATE)
|
||||||
|
add_definitions(-D_SCL_SECURE_NO_WARNINGS)
|
||||||
add_definitions(-DWIN32_LEAN_AND_MEAN)
|
add_definitions(-DWIN32_LEAN_AND_MEAN)
|
||||||
add_definitions(-D__USE_MINGW_ANSI_STDIO)
|
add_definitions(-D__USE_MINGW_ANSI_STDIO)
|
||||||
endif()
|
endif()
|
||||||
@@ -248,9 +261,9 @@ endif()
|
|||||||
#***********************************************************************
|
#***********************************************************************
|
||||||
|
|
||||||
# internal settings; these may change in a future versions
|
# internal settings; these may change in a future versions
|
||||||
set(UPX_CONFIG_DISABLE_THREADS ON) # multithreading is currently not used; maybe in UPX version 5
|
set(UPX_CONFIG_DISABLE_THREADS ON) # multithreading is currently not used; maybe in UPX version 6
|
||||||
set(UPX_CONFIG_DISABLE_BZIP2 ON) # bzip2 is currently not used; we might need it to decompress linux kernels
|
set(UPX_CONFIG_DISABLE_BZIP2 ON) # bzip2 is currently not used; we might need it to decompress linux kernels
|
||||||
set(UPX_CONFIG_DISABLE_ZSTD ON) # zstd is currently not used; maybe in UPX version 5
|
set(UPX_CONFIG_DISABLE_ZSTD ON) # zstd is currently not used; maybe in UPX version 6
|
||||||
|
|
||||||
upx_cmake_include_hook(4_targets)
|
upx_cmake_include_hook(4_targets)
|
||||||
|
|
||||||
@@ -272,7 +285,9 @@ if(Threads_FOUND)
|
|||||||
endif()
|
endif()
|
||||||
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
|
||||||
#message(STATUS "Threads FAILED ${f}: ${output}") # debug output from try_compile
|
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
|
||||||
|
endif()
|
||||||
set(Threads_FOUND OFF)
|
set(Threads_FOUND OFF)
|
||||||
break()
|
break()
|
||||||
endif()
|
endif()
|
||||||
@@ -354,6 +369,7 @@ endif()
|
|||||||
upx_add_target_extra_compile_options(${t} UPX_CONFIG_EXTRA_COMPILE_OPTIONS_UCL)
|
upx_add_target_extra_compile_options(${t} UPX_CONFIG_EXTRA_COMPILE_OPTIONS_UCL)
|
||||||
|
|
||||||
set(t upx_vendor_zlib)
|
set(t upx_vendor_zlib)
|
||||||
|
target_include_directories(${t} PRIVATE vendor/zlib)
|
||||||
upx_compile_target_debug_with_O2(${t})
|
upx_compile_target_debug_with_O2(${t})
|
||||||
upx_sanitize_target(${t})
|
upx_sanitize_target(${t})
|
||||||
target_compile_definitions(${t} PRIVATE HAVE_VSNPRINTF=1)
|
target_compile_definitions(${t} PRIVATE HAVE_VSNPRINTF=1)
|
||||||
@@ -433,6 +449,8 @@ upx_cmake_include_hook(6_test)
|
|||||||
|
|
||||||
if(NOT UPX_CONFIG_CMAKE_DISABLE_TEST)
|
if(NOT UPX_CONFIG_CMAKE_DISABLE_TEST)
|
||||||
|
|
||||||
|
add_custom_command(TARGET upx POST_BUILD COMMAND "${CMAKE_COMMAND}" -E make_directory "${CMAKE_CURRENT_BINARY_DIR}/XTesting/$<CONFIG>")
|
||||||
|
|
||||||
include(CTest)
|
include(CTest)
|
||||||
if(NOT CMAKE_CROSSCOMPILING OR CMAKE_CROSSCOMPILING_EMULATOR)
|
if(NOT CMAKE_CROSSCOMPILING OR CMAKE_CROSSCOMPILING_EMULATOR)
|
||||||
upx_add_test(upx-version upx --version)
|
upx_add_test(upx-version upx --version)
|
||||||
@@ -469,17 +487,14 @@ if(NOT CMAKE_INSTALL_PREFIX)
|
|||||||
#message(FATAL_ERROR "ERROR: CMAKE_INSTALL_PREFIX is not defined")
|
#message(FATAL_ERROR "ERROR: CMAKE_INSTALL_PREFIX is not defined")
|
||||||
message(WARNING "WARNING: CMAKE_INSTALL_PREFIX is not defined")
|
message(WARNING "WARNING: CMAKE_INSTALL_PREFIX is not defined")
|
||||||
endif()
|
endif()
|
||||||
if(CMAKE_INSTALL_PREFIX)
|
|
||||||
include(GNUInstallDirs)
|
|
||||||
endif()
|
|
||||||
# install files
|
# install files
|
||||||
if(CMAKE_INSTALL_PREFIX AND DEFINED CMAKE_INSTALL_FULL_BINDIR)
|
if(CMAKE_INSTALL_PREFIX AND DEFINED CMAKE_INSTALL_BINDIR)
|
||||||
install(TARGETS upx DESTINATION "${CMAKE_INSTALL_FULL_BINDIR}")
|
install(TARGETS upx DESTINATION "${CMAKE_INSTALL_BINDIR}")
|
||||||
install(FILES
|
install(FILES
|
||||||
COPYING LICENSE NEWS README doc/THANKS.txt doc/upx-doc.html doc/upx-doc.txt
|
COPYING LICENSE NEWS README doc/THANKS.txt doc/upx-doc.html doc/upx-doc.txt
|
||||||
DESTINATION "${CMAKE_INSTALL_FULL_DOCDIR}"
|
DESTINATION "${CMAKE_INSTALL_DOCDIR}"
|
||||||
)
|
)
|
||||||
install(FILES doc/upx.1 DESTINATION "${CMAKE_INSTALL_FULL_MANDIR}/man1")
|
install(FILES doc/upx.1 DESTINATION "${CMAKE_INSTALL_MANDIR}/man1")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
endif() # UPX_CONFIG_CMAKE_DISABLE_INSTALL
|
endif() # UPX_CONFIG_CMAKE_DISABLE_INSTALL
|
||||||
@@ -493,7 +508,9 @@ upx_cmake_include_hook(8_summary)
|
|||||||
|
|
||||||
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)
|
||||||
if(NOT UPX_CONFIG_CMAKE_DISABLE_PRINT_INFO)
|
if(NOT UPX_CONFIG_CMAKE_DISABLE_PRINT_INFO)
|
||||||
|
# print detailed info
|
||||||
include("${CMAKE_CURRENT_SOURCE_DIR}/misc/cmake/print_info.cmake")
|
include("${CMAKE_CURRENT_SOURCE_DIR}/misc/cmake/print_info.cmake")
|
||||||
|
upx_print_info()
|
||||||
endif()
|
endif()
|
||||||
upx_print_var(CMAKE_INSTALL_PREFIX CMAKE_CONFIGURATION_TYPES CMAKE_TRY_COMPILE_CONFIGURATION CMAKE_BUILD_TYPE)
|
upx_print_var(CMAKE_INSTALL_PREFIX CMAKE_CONFIGURATION_TYPES CMAKE_TRY_COMPILE_CONFIGURATION CMAKE_BUILD_TYPE)
|
||||||
if(Threads_FOUND)
|
if(Threads_FOUND)
|
||||||
@@ -509,9 +526,7 @@ endif()
|
|||||||
|
|
||||||
# extra sanity checks to detect incompatible C vs CXX settings
|
# extra sanity checks to detect incompatible C vs CXX settings
|
||||||
if(NOT UPX_CONFIG_CMAKE_DISABLE_PLATFORM_CHECK)
|
if(NOT UPX_CONFIG_CMAKE_DISABLE_PLATFORM_CHECK)
|
||||||
upx_platform_check_mismatch(CMAKE_C_PLATFORM_ID CMAKE_CXX_PLATFORM_ID)
|
upx_platform_check_c_cxx_mismatch()
|
||||||
upx_platform_check_mismatch(CMAKE_C_COMPILER_ABI CMAKE_CXX_COMPILER_ABI)
|
|
||||||
upx_platform_check_mismatch(CMAKE_C_COMPILER_FRONTEND_VARIANT CMAKE_CXX_COMPILER_FRONTEND_VARIANT)
|
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
upx_cmake_include_hook(9_finish)
|
upx_cmake_include_hook(9_finish)
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
# mkdir -p build/release
|
# mkdir -p build/release
|
||||||
# cd build/release
|
# cd build/release
|
||||||
# cmake ../.. # run config
|
# cmake ../.. # run config
|
||||||
# make -j # and run build
|
# make -j4 # and run build
|
||||||
|
|
||||||
CMAKE = cmake
|
CMAKE = cmake
|
||||||
UPX_CMAKE_BUILD_FLAGS += --parallel
|
UPX_CMAKE_BUILD_FLAGS += --parallel
|
||||||
@@ -29,7 +29,7 @@ endif
|
|||||||
run_cmake_config = $(CMAKE) -S . -B $1 $(UPX_CMAKE_CONFIG_FLAGS) -DCMAKE_BUILD_TYPE=$2
|
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
|
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/.upx_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)
|
||||||
|
|
||||||
build/debug: PHONY
|
build/debug: PHONY
|
||||||
@@ -77,11 +77,12 @@ test: $$(patsubst %+test,%,$$(.DEFAULT_GOAL))+test PHONY
|
|||||||
#
|
#
|
||||||
|
|
||||||
# extra pre-defined build configurations and some utility; optional
|
# extra pre-defined build configurations and some utility; optional
|
||||||
include ./misc/make/Makefile-extra.mk
|
-include ./Makevars-local.mk
|
||||||
|
-include ./misc/make/Makefile-extra.mk
|
||||||
|
|
||||||
# developer convenience
|
# developer convenience
|
||||||
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.
|
||||||
ifneq ($(wildcard ./misc/scripts/.),)
|
ifneq ($(and $(wildcard ./misc/scripts/.),$(wildcard ./doc/upx.pod)),)
|
||||||
check-whitespace clang-format run-testsuite run-testsuite-all run-testsuite-debug run-testsuite-release: src/Makefile PHONY
|
check-whitespace clang-format run-testsuite run-testsuite-all run-testsuite-debug run-testsuite-release: src/Makefile PHONY
|
||||||
$(MAKE) -C src $@
|
$(MAKE) -C src $@
|
||||||
endif
|
endif
|
||||||
|
|||||||
@@ -2,6 +2,18 @@
|
|||||||
User visible changes for UPX
|
User visible changes for UPX
|
||||||
==================================================================
|
==================================================================
|
||||||
|
|
||||||
|
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):
|
||||||
|
* ELF: use of memfd_create supports Enforcing mode of SELinux
|
||||||
|
* ELF: two-step de-compression enables future per-PT_LOAD work
|
||||||
|
* ELF: --unmap-all-pages completely avoids /proc/self/exe
|
||||||
|
* ELF: PT_MIPS_ABIFLAGS is now forwarded into the compressed output;
|
||||||
|
qemu-mips can choose the right floating-point emulation
|
||||||
|
* ELF: many minor internal changes fix nits revealed by fuzzing
|
||||||
|
* bug fixes - see https://github.com/upx/upx/milestone/18
|
||||||
|
|
||||||
Changes in 4.2.4 (09 May 2024):
|
Changes in 4.2.4 (09 May 2024):
|
||||||
* bug fixes - see https://github.com/upx/upx/milestone/17
|
* bug fixes - see https://github.com/upx/upx/milestone/17
|
||||||
|
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
|
|
||||||
|
|
||||||
The Ultimate Packer for eXecutables
|
The Ultimate Packer for eXecutables
|
||||||
Copyright (c) 1996-2024 Markus Oberhumer, Laszlo Molnar & John Reiser
|
Copyright (c) 1996-2025 Markus Oberhumer, Laszlo Molnar & John Reiser
|
||||||
https://upx.github.io
|
https://upx.github.io
|
||||||
|
|
||||||
|
|
||||||
@@ -85,9 +85,9 @@ THE FUTURE
|
|||||||
COPYRIGHT
|
COPYRIGHT
|
||||||
=========
|
=========
|
||||||
|
|
||||||
Copyright (C) 1996-2024 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2025 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2024 Laszlo Molnar
|
Copyright (C) 1996-2025 Laszlo Molnar
|
||||||
Copyright (C) 2000-2024 John F. Reiser
|
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
|
||||||
|
|||||||
+1
-1
@@ -8,7 +8,7 @@
|
|||||||
|
|
||||||
|
|
||||||
The Ultimate Packer for eXecutables
|
The Ultimate Packer for eXecutables
|
||||||
Copyright (c) 1996-2024 Markus Oberhumer, Laszlo Molnar & John Reiser
|
Copyright (c) 1996-2025 Markus Oberhumer, Laszlo Molnar & John Reiser
|
||||||
https://upx.github.io
|
https://upx.github.io
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -8,7 +8,7 @@
|
|||||||
|
|
||||||
|
|
||||||
The Ultimate Packer for eXecutables
|
The Ultimate Packer for eXecutables
|
||||||
Copyright (c) 1996-2024 Markus Oberhumer, Laszlo Molnar & John Reiser
|
Copyright (c) 1996-2025 Markus Oberhumer, Laszlo Molnar & John Reiser
|
||||||
https://upx.github.io
|
https://upx.github.io
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -1,5 +1,5 @@
|
|||||||
Decompressing ELF Directly to Memory on Linux/x86
|
Decompressing ELF Directly to Memory on Linux/x86
|
||||||
Copyright (C) 2000-2024 John F. Reiser jreiser@BitWagon.com
|
Copyright (C) 2000-2025 John F. Reiser jreiser@BitWagon.com
|
||||||
|
|
||||||
References:
|
References:
|
||||||
<elf.h> definitions for the ELF file format
|
<elf.h> definitions for the ELF file format
|
||||||
|
|||||||
Generated
+4
-4
@@ -22,7 +22,7 @@
|
|||||||
<h1 id="ABSTRACT">ABSTRACT</h1>
|
<h1 id="ABSTRACT">ABSTRACT</h1>
|
||||||
|
|
||||||
<pre><code> The Ultimate Packer for eXecutables
|
<pre><code> The Ultimate Packer for eXecutables
|
||||||
Copyright (c) 1996-2024 Markus Oberhumer, Laszlo Molnar & John Reiser
|
Copyright (c) 1996-2025 Markus Oberhumer, Laszlo Molnar & John Reiser
|
||||||
https://upx.github.io</code></pre>
|
https://upx.github.io</code></pre>
|
||||||
|
|
||||||
<p><b>UPX</b> is a portable, extendable, high-performance executable packer for several different executable formats. It achieves an excellent compression ratio and offers <i>*very*</i> fast decompression. Your executables suffer no memory overhead or other drawbacks for most of the formats supported, because of in-place decompression.</p>
|
<p><b>UPX</b> is a portable, extendable, high-performance executable packer for several different executable formats. It achieves an excellent compression ratio and offers <i>*very*</i> fast decompression. Your executables suffer no memory overhead or other drawbacks for most of the formats supported, because of in-place decompression.</p>
|
||||||
@@ -783,11 +783,11 @@ John F. Reiser <jreiser@BitWagon.com></code></pre>
|
|||||||
|
|
||||||
<h1 id="COPYRIGHT">COPYRIGHT</h1>
|
<h1 id="COPYRIGHT">COPYRIGHT</h1>
|
||||||
|
|
||||||
<p>Copyright (C) 1996-2024 Markus Franz Xaver Johannes Oberhumer</p>
|
<p>Copyright (C) 1996-2025 Markus Franz Xaver Johannes Oberhumer</p>
|
||||||
|
|
||||||
<p>Copyright (C) 1996-2024 Laszlo Molnar</p>
|
<p>Copyright (C) 1996-2025 Laszlo Molnar</p>
|
||||||
|
|
||||||
<p>Copyright (C) 2000-2024 John F. Reiser</p>
|
<p>Copyright (C) 2000-2025 John F. Reiser</p>
|
||||||
|
|
||||||
<p><b>UPX</b> is distributed with full source code under the terms of the GNU General Public License v2+; either under the pure GPLv2+ (see the file COPYING), or (at your option) under the GPLv+2 with special exceptions and restrictions granting the free usage for all binaries including commercial programs (see the file LICENSE).</p>
|
<p><b>UPX</b> is distributed with full source code under the terms of the GNU General Public License v2+; either under the pure GPLv2+ (see the file COPYING), or (at your option) under the GPLv+2 with special exceptions and restrictions granting the free usage for all binaries including commercial programs (see the file LICENSE).</p>
|
||||||
|
|
||||||
|
|||||||
Generated
+4
-4
@@ -6,7 +6,7 @@ SYNOPSIS
|
|||||||
|
|
||||||
ABSTRACT
|
ABSTRACT
|
||||||
The Ultimate Packer for eXecutables
|
The Ultimate Packer for eXecutables
|
||||||
Copyright (c) 1996-2024 Markus Oberhumer, Laszlo Molnar & John Reiser
|
Copyright (c) 1996-2025 Markus Oberhumer, Laszlo Molnar & John Reiser
|
||||||
https://upx.github.io
|
https://upx.github.io
|
||||||
|
|
||||||
UPX is a portable, extendable, high-performance executable packer for
|
UPX is a portable, extendable, high-performance executable packer for
|
||||||
@@ -816,11 +816,11 @@ AUTHORS
|
|||||||
John F. Reiser <jreiser@BitWagon.com>
|
John F. Reiser <jreiser@BitWagon.com>
|
||||||
|
|
||||||
COPYRIGHT
|
COPYRIGHT
|
||||||
Copyright (C) 1996-2024 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2025 Markus Franz Xaver Johannes Oberhumer
|
||||||
|
|
||||||
Copyright (C) 1996-2024 Laszlo Molnar
|
Copyright (C) 1996-2025 Laszlo Molnar
|
||||||
|
|
||||||
Copyright (C) 2000-2024 John F. Reiser
|
Copyright (C) 2000-2025 John F. Reiser
|
||||||
|
|
||||||
UPX is distributed with full source code under the terms of the GNU
|
UPX is distributed with full source code under the terms of the GNU
|
||||||
General Public License v2+; either under the pure GPLv2+ (see the file
|
General Public License v2+; either under the pure GPLv2+ (see the file
|
||||||
|
|||||||
@@ -55,7 +55,7 @@
|
|||||||
.\" ========================================================================
|
.\" ========================================================================
|
||||||
.\"
|
.\"
|
||||||
.IX Title "UPX 1"
|
.IX Title "UPX 1"
|
||||||
.TH UPX 1 2024-05-09 "upx 4.2.4" " "
|
.TH UPX 1 2025-05-06 "upx 5.0.1" " "
|
||||||
.\" 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
|
||||||
@@ -69,7 +69,7 @@ upx \- compress or expand executable files
|
|||||||
.IX Header "ABSTRACT"
|
.IX Header "ABSTRACT"
|
||||||
.Vb 3
|
.Vb 3
|
||||||
\& The Ultimate Packer for eXecutables
|
\& The Ultimate Packer for eXecutables
|
||||||
\& Copyright (c) 1996\-2024 Markus Oberhumer, Laszlo Molnar & John Reiser
|
\& Copyright (c) 1996\-2025 Markus Oberhumer, Laszlo Molnar & John Reiser
|
||||||
\& https://upx.github.io
|
\& https://upx.github.io
|
||||||
.Ve
|
.Ve
|
||||||
.PP
|
.PP
|
||||||
@@ -939,11 +939,11 @@ Please report all bugs immediately to the authors.
|
|||||||
.Ve
|
.Ve
|
||||||
.SH COPYRIGHT
|
.SH COPYRIGHT
|
||||||
.IX Header "COPYRIGHT"
|
.IX Header "COPYRIGHT"
|
||||||
Copyright (C) 1996\-2024 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996\-2025 Markus Franz Xaver Johannes Oberhumer
|
||||||
.PP
|
.PP
|
||||||
Copyright (C) 1996\-2024 Laszlo Molnar
|
Copyright (C) 1996\-2025 Laszlo Molnar
|
||||||
.PP
|
.PP
|
||||||
Copyright (C) 2000\-2024 John F. Reiser
|
Copyright (C) 2000\-2025 John F. Reiser
|
||||||
.PP
|
.PP
|
||||||
\&\fBUPX\fR is distributed with full source code under the terms of the
|
\&\fBUPX\fR 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
|
||||||
|
|||||||
+4
-4
@@ -13,7 +13,7 @@ B<upx> S<[ I<command> ]> S<[ I<options> ]> I<filename>...
|
|||||||
=head1 ABSTRACT
|
=head1 ABSTRACT
|
||||||
|
|
||||||
The Ultimate Packer for eXecutables
|
The Ultimate Packer for eXecutables
|
||||||
Copyright (c) 1996-2024 Markus Oberhumer, Laszlo Molnar & John Reiser
|
Copyright (c) 1996-2025 Markus Oberhumer, Laszlo Molnar & John Reiser
|
||||||
https://upx.github.io
|
https://upx.github.io
|
||||||
|
|
||||||
|
|
||||||
@@ -930,11 +930,11 @@ Please report all bugs immediately to the authors.
|
|||||||
|
|
||||||
=head1 COPYRIGHT
|
=head1 COPYRIGHT
|
||||||
|
|
||||||
Copyright (C) 1996-2024 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2025 Markus Franz Xaver Johannes Oberhumer
|
||||||
|
|
||||||
Copyright (C) 1996-2024 Laszlo Molnar
|
Copyright (C) 1996-2025 Laszlo Molnar
|
||||||
|
|
||||||
Copyright (C) 2000-2024 John F. Reiser
|
Copyright (C) 2000-2025 John F. Reiser
|
||||||
|
|
||||||
B<UPX> is distributed with full source code under the terms of the
|
B<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
|
||||||
|
|||||||
+87
-14
@@ -35,16 +35,35 @@ macro(upx_disallow_in_source_build)
|
|||||||
endif()
|
endif()
|
||||||
endmacro()
|
endmacro()
|
||||||
|
|
||||||
# set the default build type; must be called before project() cmake init
|
# ternary conditional operator
|
||||||
|
macro(upx_ternary result_var_name condition true_value false_value)
|
||||||
|
if(${condition})
|
||||||
|
set(${result_var_name} "${true_value}")
|
||||||
|
else()
|
||||||
|
set(${result_var_name} "${false_value}")
|
||||||
|
endif()
|
||||||
|
endmacro()
|
||||||
|
|
||||||
|
# set the default build type; must be called BEFORE project() cmake init
|
||||||
macro(upx_set_default_build_type type)
|
macro(upx_set_default_build_type type)
|
||||||
set(upx_global_default_build_type "${type}")
|
set(upx_global_default_build_type "${type}")
|
||||||
get_property(upx_global_is_multi_config GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG)
|
get_property(upx_global_is_multi_config GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG)
|
||||||
if(NOT upx_global_is_multi_config AND NOT CMAKE_BUILD_TYPE)
|
if(NOT upx_global_is_multi_config AND NOT CMAKE_BUILD_TYPE)
|
||||||
set(CMAKE_BUILD_TYPE "${upx_global_default_build_type}" CACHE STRING "Choose the type of build." FORCE)
|
set(CMAKE_BUILD_TYPE "${upx_global_default_build_type}" CACHE STRING "Choose the type of build." FORCE)
|
||||||
endif()
|
endif()
|
||||||
|
# also enable some global settings by default
|
||||||
|
if(NOT DEFINED CMAKE_C_STANDARD_REQUIRED)
|
||||||
|
set(CMAKE_C_STANDARD_REQUIRED ON)
|
||||||
|
endif()
|
||||||
|
if(NOT DEFINED CMAKE_CXX_STANDARD_REQUIRED)
|
||||||
|
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
||||||
|
endif()
|
||||||
|
if(NOT DEFINED CMAKE_EXPORT_COMPILE_COMMANDS)
|
||||||
|
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
|
||||||
|
endif()
|
||||||
endmacro()
|
endmacro()
|
||||||
|
|
||||||
# set the default multi-config build type; must be called after project() cmake init
|
# set the default multi-config build type; must be called AFTER project() cmake init
|
||||||
macro(upx_apply_build_type)
|
macro(upx_apply_build_type)
|
||||||
if(upx_global_is_multi_config)
|
if(upx_global_is_multi_config)
|
||||||
set(c "${CMAKE_CONFIGURATION_TYPES}")
|
set(c "${CMAKE_CONFIGURATION_TYPES}")
|
||||||
@@ -65,12 +84,34 @@ macro(upx_apply_build_type)
|
|||||||
endif()
|
endif()
|
||||||
endmacro()
|
endmacro()
|
||||||
|
|
||||||
# ternary conditional operator
|
# set MINGW, MSVC_FRONTEND, GNU_FRONTEND and MSVC_SIMULATE
|
||||||
macro(upx_ternary result_var_name condition true_value false_value)
|
macro(upx_set_global_vars)
|
||||||
if(${condition})
|
if(NOT DEFINED MINGW AND CMAKE_C_PLATFORM_ID MATCHES "^MinGW")
|
||||||
set(${result_var_name} "${true_value}")
|
set(MINGW 1)
|
||||||
|
endif()
|
||||||
|
if(NOT DEFINED MSVC_FRONTEND AND (MSVC OR CMAKE_C_COMPILER_FRONTEND_VARIANT MATCHES "^MSVC"))
|
||||||
|
set(MSVC_FRONTEND 1)
|
||||||
|
elseif(NOT DEFINED GNU_FRONTEND AND (CMAKE_C_COMPILER_FRONTEND_VARIANT MATCHES "^GNU" OR CMAKE_C_COMPILER_ID MATCHES "(Clang|GNU|LLVM)"))
|
||||||
|
set(GNU_FRONTEND 1)
|
||||||
|
endif()
|
||||||
|
if(NOT DEFINED MSVC_SIMULATE AND (CMAKE_C_SIMULATE_ID MATCHES "^MSVC"))
|
||||||
|
set(MSVC_SIMULATE 1)
|
||||||
|
endif()
|
||||||
|
endmacro()
|
||||||
|
|
||||||
|
# useful for CI jobs: check for working BUILD_RPATH
|
||||||
|
macro(upx_check_working_build_rpath var_name)
|
||||||
|
if(WIN32 OR MINGW OR CYGWIN)
|
||||||
|
# always works; DLLs reside next to the executables
|
||||||
|
set(${var_name} ON)
|
||||||
|
upx_cache_bool_vars(ON ${var_name})
|
||||||
|
elseif(CMAKE_BUILD_WITH_INSTALL_RPATH OR CMAKE_SKIP_RPATH OR CMAKE_SKIP_BUILD_RPATH)
|
||||||
|
# cannot work; BUILD_RPATH is disabled by global CMake settings
|
||||||
|
set(${var_name} OFF)
|
||||||
|
upx_cache_bool_vars(OFF ${var_name})
|
||||||
else()
|
else()
|
||||||
set(${result_var_name} "${false_value}")
|
# we do not know if/how the BUILD_RPATH is set; be cautious by default
|
||||||
|
upx_cache_bool_vars(OFF ${var_name})
|
||||||
endif()
|
endif()
|
||||||
endmacro()
|
endmacro()
|
||||||
|
|
||||||
@@ -97,6 +138,14 @@ function(upx_make_bool_var result_var_name var_name default_value)
|
|||||||
set(${result_var_name} "${result}" PARENT_SCOPE) # return value
|
set(${result_var_name} "${result}" PARENT_SCOPE) # return value
|
||||||
endfunction()
|
endfunction()
|
||||||
|
|
||||||
|
function(upx_maybe_unused_var) # ARGV
|
||||||
|
foreach(var_name ${ARGV})
|
||||||
|
if(DEFINED ${var_name})
|
||||||
|
set(dummy "${${var_name}}")
|
||||||
|
endif()
|
||||||
|
endforeach()
|
||||||
|
endfunction()
|
||||||
|
|
||||||
function(upx_print_var) # ARGV
|
function(upx_print_var) # ARGV
|
||||||
foreach(var_name ${ARGV})
|
foreach(var_name ${ARGV})
|
||||||
if(DEFINED ${var_name})
|
if(DEFINED ${var_name})
|
||||||
@@ -233,6 +282,14 @@ function(upx_platform_check_mismatch var_name_1 var_name_2)
|
|||||||
endif()
|
endif()
|
||||||
endfunction()
|
endfunction()
|
||||||
|
|
||||||
|
# check for incompatible C vs CXX settings
|
||||||
|
function(upx_platform_check_c_cxx_mismatch)
|
||||||
|
upx_platform_check_mismatch(CMAKE_C_PLATFORM_ID CMAKE_CXX_PLATFORM_ID)
|
||||||
|
upx_platform_check_mismatch(CMAKE_C_SIMULATE_ID CMAKE_CXX_SIMULATE_ID)
|
||||||
|
upx_platform_check_mismatch(CMAKE_C_COMPILER_ABI CMAKE_CXX_COMPILER_ABI)
|
||||||
|
upx_platform_check_mismatch(CMAKE_C_COMPILER_FRONTEND_VARIANT CMAKE_CXX_COMPILER_FRONTEND_VARIANT)
|
||||||
|
endfunction()
|
||||||
|
|
||||||
#***********************************************************************
|
#***********************************************************************
|
||||||
# compilation flags
|
# compilation flags
|
||||||
#***********************************************************************
|
#***********************************************************************
|
||||||
@@ -331,6 +388,14 @@ endfunction()
|
|||||||
|
|
||||||
# sanitize a target; note that this may require special run-time support libs from your toolchain
|
# sanitize a target; note that this may require special run-time support libs from your toolchain
|
||||||
function(upx_sanitize_target) # ARGV
|
function(upx_sanitize_target) # ARGV
|
||||||
|
if(NOT DEFINED UPX_CONFIG_SANITIZE_FLAGS_DEBUG)
|
||||||
|
# default sanitizer for Debug builds
|
||||||
|
set(UPX_CONFIG_SANITIZE_FLAGS_DEBUG -fsanitize=undefined -fsanitize-undefined-trap-on-error -fstack-protector-all)
|
||||||
|
endif()
|
||||||
|
if(NOT DEFINED UPX_CONFIG_SANITIZE_FLAGS_RELEASE)
|
||||||
|
# default sanitizer for Release builds
|
||||||
|
set(UPX_CONFIG_SANITIZE_FLAGS_RELEASE -fstack-protector)
|
||||||
|
endif()
|
||||||
foreach(t ${ARGV})
|
foreach(t ${ARGV})
|
||||||
if(UPX_CONFIG_DISABLE_SANITIZE)
|
if(UPX_CONFIG_DISABLE_SANITIZE)
|
||||||
# no-op
|
# no-op
|
||||||
@@ -348,12 +413,19 @@ function(upx_sanitize_target) # ARGV
|
|||||||
# unsupported compiler; unreliable/broken sanitize implementation before gcc-8 (May 2018)
|
# unsupported compiler; unreliable/broken sanitize implementation before gcc-8 (May 2018)
|
||||||
message(WARNING "WARNING: ignoring SANITIZE for target '${t}'")
|
message(WARNING "WARNING: ignoring SANITIZE for target '${t}'")
|
||||||
else()
|
else()
|
||||||
# default sanitizer for Debug builds
|
target_compile_options(${t} PRIVATE $<$<CONFIG:Debug>:${UPX_CONFIG_SANITIZE_FLAGS_DEBUG}>)
|
||||||
target_compile_options(${t} PRIVATE $<$<CONFIG:Debug>:-fsanitize=undefined -fsanitize-undefined-trap-on-error -fstack-protector-all>)
|
target_compile_options(${t} PRIVATE $<$<CONFIG:MinSizeRel>:${UPX_CONFIG_SANITIZE_FLAGS_RELEASE}>)
|
||||||
# default sanitizer for Release builds
|
target_compile_options(${t} PRIVATE $<$<CONFIG:Release>:${UPX_CONFIG_SANITIZE_FLAGS_RELEASE}>)
|
||||||
target_compile_options(${t} PRIVATE $<$<CONFIG:MinSizeRel>:-fstack-protector>)
|
target_compile_options(${t} PRIVATE $<$<CONFIG:RelWithDebInfo>:${UPX_CONFIG_SANITIZE_FLAGS_RELEASE}>)
|
||||||
target_compile_options(${t} PRIVATE $<$<CONFIG:Release>:-fstack-protector>)
|
get_target_property(target_type ${t} TYPE)
|
||||||
target_compile_options(${t} PRIVATE $<$<CONFIG:RelWithDebInfo>:-fstack-protector>)
|
if(NOT ",${target_type}," STREQUAL ",STATIC_LIBRARY,")
|
||||||
|
if(${CMAKE_VERSION} VERSION_GREATER "3.12.99")
|
||||||
|
target_link_options(${t} PRIVATE $<$<CONFIG:Debug>:${UPX_CONFIG_SANITIZE_FLAGS_DEBUG}>)
|
||||||
|
target_link_options(${t} PRIVATE $<$<CONFIG:MinSizeRel>:${UPX_CONFIG_SANITIZE_FLAGS_RELEASE}>)
|
||||||
|
target_link_options(${t} PRIVATE $<$<CONFIG:Release>:${UPX_CONFIG_SANITIZE_FLAGS_RELEASE}>)
|
||||||
|
target_link_options(${t} PRIVATE $<$<CONFIG:RelWithDebInfo>:${UPX_CONFIG_SANITIZE_FLAGS_RELEASE}>)
|
||||||
|
endif() # CMAKE_VERSION
|
||||||
|
endif() # target_type
|
||||||
endif()
|
endif()
|
||||||
endforeach()
|
endforeach()
|
||||||
endfunction()
|
endfunction()
|
||||||
@@ -365,7 +437,8 @@ endfunction()
|
|||||||
function(upx_add_test) # ARGV
|
function(upx_add_test) # ARGV
|
||||||
set(name "${ARGV0}")
|
set(name "${ARGV0}")
|
||||||
list(REMOVE_AT ARGV 0)
|
list(REMOVE_AT ARGV 0)
|
||||||
add_test(NAME "${name}" COMMAND ${ARGV})
|
set(wd "${CMAKE_CURRENT_BINARY_DIR}/XTesting/$<CONFIG>")
|
||||||
|
add_test(NAME "${name}" WORKING_DIRECTORY "${wd}" COMMAND ${ARGV})
|
||||||
endfunction()
|
endfunction()
|
||||||
|
|
||||||
function(upx_test_depends) # ARGV
|
function(upx_test_depends) # ARGV
|
||||||
|
|||||||
+34
-20
@@ -8,41 +8,55 @@
|
|||||||
# print some info about the build configuration
|
# print some info about the build configuration
|
||||||
#***********************************************************************
|
#***********************************************************************
|
||||||
|
|
||||||
# generator
|
function(upx_print_info)
|
||||||
upx_print_var(CMAKE_GENERATOR_TOOLSET CMAKE_GENERATOR_PLATFORM)
|
get_property(PROPERTY_GENERATOR_IS_MULTI_CONFIG GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG)
|
||||||
|
get_property(PROPERTY_TARGET_SUPPORTS_SHARED_LIBS GLOBAL PROPERTY TARGET_SUPPORTS_SHARED_LIBS)
|
||||||
|
|
||||||
# directories
|
# generator
|
||||||
if(NOT ",${CMAKE_BINARY_DIR}," STREQUAL ",${CMAKE_CURRENT_BINARY_DIR}," OR NOT ",${CMAKE_SOURCE_DIR}," STREQUAL ",${CMAKE_CURRENT_SOURCE_DIR},")
|
upx_print_var(CMAKE_GENERATOR_TOOLSET CMAKE_GENERATOR_PLATFORM)
|
||||||
|
upx_print_var(PROPERTY_GENERATOR_IS_MULTI_CONFIG)
|
||||||
|
|
||||||
|
# directories
|
||||||
|
if(NOT ",${CMAKE_BINARY_DIR}," STREQUAL ",${CMAKE_CURRENT_BINARY_DIR}," OR NOT ",${CMAKE_SOURCE_DIR}," STREQUAL ",${CMAKE_CURRENT_SOURCE_DIR},")
|
||||||
upx_print_var(CMAKE_BINARY_DIR CMAKE_SOURCE_DIR CMAKE_CURRENT_BINARY_DIR CMAKE_CURRENT_SOURCE_DIR)
|
upx_print_var(CMAKE_BINARY_DIR CMAKE_SOURCE_DIR CMAKE_CURRENT_BINARY_DIR CMAKE_CURRENT_SOURCE_DIR)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# system
|
# system
|
||||||
upx_print_var(CMAKE_HOST_SYSTEM_NAME CMAKE_HOST_SYSTEM_VERSION CMAKE_HOST_SYSTEM_PROCESSOR)
|
upx_print_var(CMAKE_HOST_SYSTEM_NAME CMAKE_HOST_SYSTEM_VERSION CMAKE_HOST_SYSTEM_PROCESSOR)
|
||||||
upx_print_var(CMAKE_SYSTEM_NAME CMAKE_SYSTEM_VERSION CMAKE_SYSTEM_PROCESSOR)
|
upx_print_var(CMAKE_SYSTEM_NAME CMAKE_SYSTEM_VERSION CMAKE_SYSTEM_PROCESSOR)
|
||||||
upx_print_var(CMAKE_ANDROID_NDK CMAKE_ANDROID_NDK_VERSION CMAKE_ANDROID_STANDALONE_TOOLCHAIN)
|
upx_print_var(CMAKE_ANDROID_NDK CMAKE_ANDROID_NDK_VERSION CMAKE_ANDROID_STANDALONE_TOOLCHAIN)
|
||||||
upx_print_var(CMAKE_APPLE_SILICON_PROCESSOR CMAKE_OSX_DEPLOYMENT_TARGET CMAKE_OSX_SYSROOT)
|
upx_print_var(CMAKE_APPLE_SILICON_PROCESSOR CMAKE_OSX_DEPLOYMENT_TARGET CMAKE_OSX_SYSROOT)
|
||||||
upx_print_Var(CMAKE_CROSSCOMPILING CMAKE_CROSSCOMPILING_EMULATOR)
|
upx_print_var(CMAKE_VS_PLATFORM_TOOLSET CMAKE_VS_PLATFORM_TOOLSET_HOST_ARCHITECTURE CMAKE_VS_PLATFORM_TOOLSET_VERSION)
|
||||||
|
upx_print_var(CMAKE_CROSSCOMPILING CMAKE_CROSSCOMPILING_EMULATOR)
|
||||||
|
upx_print_var(CMAKE_SIZEOF_VOID_P)
|
||||||
|
|
||||||
# binutils
|
# binutils
|
||||||
upx_print_var(CMAKE_AR CMAKE_RANLIB)
|
upx_print_var(CMAKE_EXECUTABLE_FORMAT CMAKE_EXECUTABLE_SUFFIX UPX_CONFIG_CMAKE_EXECUTABLE_SUFFIX)
|
||||||
|
upx_print_var(CMAKE_AR CMAKE_RANLIB)
|
||||||
|
|
||||||
# compilers
|
# compilers
|
||||||
foreach(lang IN ITEMS ASM C CXX)
|
foreach(lang IN ITEMS ASM C CXX)
|
||||||
upx_print_var(CMAKE_${lang}_COMPILER_LAUNCHER)
|
upx_print_var(CMAKE_${lang}_COMPILER_LAUNCHER)
|
||||||
upx_print_var(CMAKE_${lang}_COMPILER)
|
upx_print_var(CMAKE_${lang}_COMPILER)
|
||||||
|
upx_print_var(CMAKE_${lang}_COMPILER_ARG1)
|
||||||
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}_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)
|
||||||
upx_print_var(CMAKE_${lang}_COMPILER_TARGET)
|
upx_print_var(CMAKE_${lang}_COMPILER_TARGET)
|
||||||
endforeach()
|
endforeach()
|
||||||
|
|
||||||
# misc
|
# misc
|
||||||
upx_print_var(CMAKE_INTERPROCEDURAL_OPTIMIZATION CMAKE_POSITION_INDEPENDENT_CODE)
|
upx_print_var(CMAKE_BUILD_WITH_INSTALL_RPATH CMAKE_SKIP_RPATH CMAKE_SKIP_BUILD_RPATH CMAKE_SKIP_INSTALL_RPATH)
|
||||||
|
upx_print_var(CMAKE_INTERPROCEDURAL_OPTIMIZATION CMAKE_POSITION_INDEPENDENT_CODE)
|
||||||
|
upx_print_var(PROPERTY_TARGET_SUPPORTS_SHARED_LIBS)
|
||||||
|
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_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()
|
||||||
|
|
||||||
# vim:set ft=cmake ts=4 sw=4 tw=0 et:
|
# vim:set ft=cmake ts=4 sw=4 tw=0 et:
|
||||||
|
|||||||
@@ -137,7 +137,7 @@ if(NOT UPX_CONFIG_DISABLE_EXHAUSTIVE_TESTS)
|
|||||||
endif()
|
endif()
|
||||||
endforeach()
|
endforeach()
|
||||||
endforeach()
|
endforeach()
|
||||||
endif () # UPX_CONFIG_DISABLE_EXHAUSTIVE_TESTS
|
endif() # UPX_CONFIG_DISABLE_EXHAUSTIVE_TESTS
|
||||||
|
|
||||||
# clean up
|
# clean up
|
||||||
set(emu "")
|
set(emu "")
|
||||||
|
|||||||
+54
-16
@@ -20,7 +20,7 @@ override ne = $(if $(subst x$1,,x$2)$(subst x$2,,x$1),1,)
|
|||||||
override tolower = $(subst A,a,$(subst B,b,$(subst C,c,$(subst D,d,$(subst E,e,$(subst F,f,$(subst G,g,$(subst H,h,$(subst I,i,$(subst J,j,$(subst K,k,$(subst L,l,$(subst M,m,$(subst N,n,$(subst O,o,$(subst P,p,$(subst Q,q,$(subst R,r,$(subst S,s,$(subst T,t,$(subst U,u,$(subst V,v,$(subst W,w,$(subst X,x,$(subst Y,y,$(subst Z,z,$1))))))))))))))))))))))))))
|
override tolower = $(subst A,a,$(subst B,b,$(subst C,c,$(subst D,d,$(subst E,e,$(subst F,f,$(subst G,g,$(subst H,h,$(subst I,i,$(subst J,j,$(subst K,k,$(subst L,l,$(subst M,m,$(subst N,n,$(subst O,o,$(subst P,p,$(subst Q,q,$(subst R,r,$(subst S,s,$(subst T,t,$(subst U,u,$(subst V,v,$(subst W,w,$(subst X,x,$(subst Y,y,$(subst Z,z,$1))))))))))))))))))))))))))
|
||||||
override toupper = $(subst a,A,$(subst b,B,$(subst c,C,$(subst d,D,$(subst e,E,$(subst f,F,$(subst g,G,$(subst h,H,$(subst i,I,$(subst j,J,$(subst k,K,$(subst l,L,$(subst m,M,$(subst n,N,$(subst o,O,$(subst p,P,$(subst q,Q,$(subst r,R,$(subst s,S,$(subst t,T,$(subst u,U,$(subst v,V,$(subst w,W,$(subst x,X,$(subst y,Y,$(subst z,Z,$1))))))))))))))))))))))))))
|
override toupper = $(subst a,A,$(subst b,B,$(subst c,C,$(subst d,D,$(subst e,E,$(subst f,F,$(subst g,G,$(subst h,H,$(subst i,I,$(subst j,J,$(subst k,K,$(subst l,L,$(subst m,M,$(subst n,N,$(subst o,O,$(subst p,P,$(subst q,Q,$(subst r,R,$(subst s,S,$(subst t,T,$(subst u,U,$(subst v,V,$(subst w,W,$(subst x,X,$(subst y,Y,$(subst z,Z,$1))))))))))))))))))))))))))
|
||||||
|
|
||||||
# canonicalize case of CMAKE_BUILD_TYPE to "Debug" and "Release"
|
# canonicalize the case of CMAKE_BUILD_TYPE to "Debug" and "Release"
|
||||||
override cm_build_type = $(if $(call eq,$1,),$(error EMPTY-build-type),$(if $(call eq,$(call tolower,$1),debug),Debug,$(if $(call eq,$(call tolower,$1),release),Release,$(if $(call eq,$(call tolower,$1),none),None,$1))))
|
override cm_build_type = $(if $(call eq,$1,),$(error EMPTY-build-type),$(if $(call eq,$(call tolower,$1),debug),Debug,$(if $(call eq,$(call tolower,$1),release),Release,$(if $(call eq,$(call tolower,$1),none),None,$1))))
|
||||||
|
|
||||||
#***********************************************************************
|
#***********************************************************************
|
||||||
@@ -59,39 +59,56 @@ build/extra/clang-m64/release: PHONY; $(call run_config_and_build,$@,Release)
|
|||||||
build/extra/clang-m64/%: export CC = clang -m64
|
build/extra/clang-m64/%: export CC = clang -m64
|
||||||
build/extra/clang-m64/%: export CXX = clang++ -m64
|
build/extra/clang-m64/%: export CXX = clang++ -m64
|
||||||
|
|
||||||
|
# force building with clang/clang++ -flto=auto
|
||||||
|
build/extra/clang-lto-auto/debug: PHONY; $(call run_config_and_build,$@,Debug)
|
||||||
|
build/extra/clang-lto-auto/release: PHONY; $(call run_config_and_build,$@,Release)
|
||||||
|
build/extra/clang-lto-auto/%: export CC = clang -flto=auto
|
||||||
|
build/extra/clang-lto-auto/%: export CXX = clang++ -flto=auto
|
||||||
|
|
||||||
# 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)
|
||||||
build/extra/clang-static/%: export CC = clang -static
|
build/extra/clang-static/%: export CC = clang -static
|
||||||
build/extra/clang-static/%: export CXX = clang++ -static
|
build/extra/clang-static/%: export CXX = clang++ -static
|
||||||
|
build/extra/clang-static/%: export UPX_CONFIG_DISABLE_SHARED_LIBS = ON
|
||||||
|
|
||||||
# force building with clang/clang++ -static-pie
|
# force building with clang/clang++ -static-pie
|
||||||
build/extra/clang-static-pie/debug: PHONY; $(call run_config_and_build,$@,Debug)
|
build/extra/clang-static-pie/debug: PHONY; $(call run_config_and_build,$@,Debug)
|
||||||
build/extra/clang-static-pie/release: PHONY; $(call run_config_and_build,$@,Release)
|
build/extra/clang-static-pie/release: PHONY; $(call run_config_and_build,$@,Release)
|
||||||
build/extra/clang-static-pie/%: export CC = clang -static-pie -fPIE -Wno-unused-command-line-argument
|
build/extra/clang-static-pie/%: export CC = clang -static-pie -fPIE -Wno-unused-command-line-argument
|
||||||
build/extra/clang-static-pie/%: export CXX = clang++ -static-pie -fPIE -Wno-unused-command-line-argument
|
build/extra/clang-static-pie/%: export CXX = clang++ -static-pie -fPIE -Wno-unused-command-line-argument
|
||||||
|
build/extra/clang-static-pie/%: export UPX_CONFIG_DISABLE_SHARED_LIBS = ON
|
||||||
|
|
||||||
# force building with clang/clang++ -static -flto
|
# force building with clang/clang++ -static -flto
|
||||||
build/extra/clang-static-lto/debug: PHONY; $(call run_config_and_build,$@,Debug)
|
build/extra/clang-static-lto/debug: PHONY; $(call run_config_and_build,$@,Debug)
|
||||||
build/extra/clang-static-lto/release: PHONY; $(call run_config_and_build,$@,Release)
|
build/extra/clang-static-lto/release: PHONY; $(call run_config_and_build,$@,Release)
|
||||||
build/extra/clang-static-lto/%: export CC = clang -static -flto
|
build/extra/clang-static-lto/%: export CC = clang -static -flto
|
||||||
build/extra/clang-static-lto/%: export CXX = clang++ -static -flto
|
build/extra/clang-static-lto/%: export CXX = clang++ -static -flto
|
||||||
|
build/extra/clang-static-lto/%: export UPX_CONFIG_DISABLE_SHARED_LIBS = ON
|
||||||
|
|
||||||
# force building with clang/clang++ C17/C++20
|
# force building with clang/clang++ C++20 (and C17)
|
||||||
build/extra/clang-std-cxx20/debug: PHONY; $(call run_config_and_build,$@,Debug)
|
build/extra/clang-std-cxx20/debug: PHONY; $(call run_config_and_build,$@,Debug)
|
||||||
build/extra/clang-std-cxx20/release: PHONY; $(call run_config_and_build,$@,Release)
|
build/extra/clang-std-cxx20/release: PHONY; $(call run_config_and_build,$@,Release)
|
||||||
build/extra/clang-std-cxx20/%: export CC = clang -std=gnu17
|
build/extra/clang-std-cxx20/%: export CC = clang -std=gnu17
|
||||||
build/extra/clang-std-cxx20/%: export CXX = clang++ -std=gnu++20
|
build/extra/clang-std-cxx20/%: export CXX = clang++ -std=gnu++20
|
||||||
build/extra/clang-std-cxx20/%: export UPX_CONFIG_DISABLE_C_STANDARD=ON
|
build/extra/clang-std-cxx20/%: export UPX_CONFIG_DISABLE_C_STANDARD = ON
|
||||||
build/extra/clang-std-cxx20/%: export UPX_CONFIG_DISABLE_CXX_STANDARD=ON
|
build/extra/clang-std-cxx20/%: export UPX_CONFIG_DISABLE_CXX_STANDARD = ON
|
||||||
|
|
||||||
# force building with clang/clang++ C23/C++23
|
# force building with clang/clang++ C++23 (and C23)
|
||||||
build/extra/clang-std-cxx23/debug: PHONY; $(call run_config_and_build,$@,Debug)
|
build/extra/clang-std-cxx23/debug: PHONY; $(call run_config_and_build,$@,Debug)
|
||||||
build/extra/clang-std-cxx23/release: PHONY; $(call run_config_and_build,$@,Release)
|
build/extra/clang-std-cxx23/release: PHONY; $(call run_config_and_build,$@,Release)
|
||||||
build/extra/clang-std-cxx23/%: export CC = clang -std=gnu2x
|
build/extra/clang-std-cxx23/%: export CC = clang -std=gnu2x -Wno-constant-logical-operand
|
||||||
build/extra/clang-std-cxx23/%: export CXX = clang++ -std=gnu++2b
|
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)
|
||||||
@@ -117,39 +134,56 @@ build/extra/gcc-m64/release: PHONY; $(call run_config_and_build,$@,Release)
|
|||||||
build/extra/gcc-m64/%: export CC = gcc -m64
|
build/extra/gcc-m64/%: export CC = gcc -m64
|
||||||
build/extra/gcc-m64/%: export CXX = g++ -m64
|
build/extra/gcc-m64/%: export CXX = g++ -m64
|
||||||
|
|
||||||
|
# force building with gcc/g++ -flto=auto
|
||||||
|
build/extra/gcc-lto-auto/debug: PHONY; $(call run_config_and_build,$@,Debug)
|
||||||
|
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 CXX = g++ -flto=auto
|
||||||
|
|
||||||
# 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)
|
||||||
build/extra/gcc-static/%: export CC = gcc -static
|
build/extra/gcc-static/%: export CC = gcc -static
|
||||||
build/extra/gcc-static/%: export CXX = g++ -static
|
build/extra/gcc-static/%: export CXX = g++ -static
|
||||||
|
build/extra/gcc-static/%: export UPX_CONFIG_DISABLE_SHARED_LIBS = ON
|
||||||
|
|
||||||
# force building with gcc/g++ -static-pie
|
# force building with gcc/g++ -static-pie
|
||||||
build/extra/gcc-static-pie/debug: PHONY; $(call run_config_and_build,$@,Debug)
|
build/extra/gcc-static-pie/debug: PHONY; $(call run_config_and_build,$@,Debug)
|
||||||
build/extra/gcc-static-pie/release: PHONY; $(call run_config_and_build,$@,Release)
|
build/extra/gcc-static-pie/release: PHONY; $(call run_config_and_build,$@,Release)
|
||||||
build/extra/gcc-static-pie/%: export CC = gcc -static-pie -fPIE
|
build/extra/gcc-static-pie/%: export CC = gcc -static-pie -fPIE
|
||||||
build/extra/gcc-static-pie/%: export CXX = g++ -static-pie -fPIE
|
build/extra/gcc-static-pie/%: export CXX = g++ -static-pie -fPIE
|
||||||
|
build/extra/gcc-static-pie/%: export UPX_CONFIG_DISABLE_SHARED_LIBS = ON
|
||||||
|
|
||||||
# force building with gcc/g++ -static -flto
|
# force building with gcc/g++ -static -flto
|
||||||
build/extra/gcc-static-lto/debug: PHONY; $(call run_config_and_build,$@,Debug)
|
build/extra/gcc-static-lto/debug: PHONY; $(call run_config_and_build,$@,Debug)
|
||||||
build/extra/gcc-static-lto/release: PHONY; $(call run_config_and_build,$@,Release)
|
build/extra/gcc-static-lto/release: PHONY; $(call run_config_and_build,$@,Release)
|
||||||
build/extra/gcc-static-lto/%: export CC = gcc -static -flto
|
build/extra/gcc-static-lto/%: export CC = gcc -static -flto
|
||||||
build/extra/gcc-static-lto/%: export CXX = g++ -static -flto
|
build/extra/gcc-static-lto/%: export CXX = g++ -static -flto
|
||||||
|
build/extra/gcc-static-lto/%: export UPX_CONFIG_DISABLE_SHARED_LIBS = ON
|
||||||
|
|
||||||
# force building with gcc/g++ C17/C++20
|
# force building with gcc/g++ C++20 (and C17)
|
||||||
build/extra/gcc-std-cxx20/debug: PHONY; $(call run_config_and_build,$@,Debug)
|
build/extra/gcc-std-cxx20/debug: PHONY; $(call run_config_and_build,$@,Debug)
|
||||||
build/extra/gcc-std-cxx20/release: PHONY; $(call run_config_and_build,$@,Release)
|
build/extra/gcc-std-cxx20/release: PHONY; $(call run_config_and_build,$@,Release)
|
||||||
build/extra/gcc-std-cxx20/%: export CC = gcc -std=gnu17
|
build/extra/gcc-std-cxx20/%: export CC = gcc -std=gnu17
|
||||||
build/extra/gcc-std-cxx20/%: export CXX = g++ -std=gnu++20
|
build/extra/gcc-std-cxx20/%: export CXX = g++ -std=gnu++20
|
||||||
build/extra/gcc-std-cxx20/%: export UPX_CONFIG_DISABLE_C_STANDARD=ON
|
build/extra/gcc-std-cxx20/%: export UPX_CONFIG_DISABLE_C_STANDARD = ON
|
||||||
build/extra/gcc-std-cxx20/%: export UPX_CONFIG_DISABLE_CXX_STANDARD=ON
|
build/extra/gcc-std-cxx20/%: export UPX_CONFIG_DISABLE_CXX_STANDARD = ON
|
||||||
|
|
||||||
# force building with gcc/g++ C23/C++23
|
# force building with gcc/g++ C++23 (and C23)
|
||||||
build/extra/gcc-std-cxx23/debug: PHONY; $(call run_config_and_build,$@,Debug)
|
build/extra/gcc-std-cxx23/debug: PHONY; $(call run_config_and_build,$@,Debug)
|
||||||
build/extra/gcc-std-cxx23/release: PHONY; $(call run_config_and_build,$@,Release)
|
build/extra/gcc-std-cxx23/release: PHONY; $(call run_config_and_build,$@,Release)
|
||||||
build/extra/gcc-std-cxx23/%: export CC = gcc -std=gnu2x
|
build/extra/gcc-std-cxx23/%: export CC = gcc -std=gnu2x
|
||||||
build/extra/gcc-std-cxx23/%: export CXX = g++ -std=gnu++2b
|
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)
|
||||||
|
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/%: export CC = gcc -std=gnu23
|
||||||
|
build/extra/gcc-std-cxx26/%: export CXX = g++ -std=gnu++26
|
||||||
|
build/extra/gcc-std-cxx26/%: export UPX_CONFIG_DISABLE_C_STANDARD = ON
|
||||||
|
build/extra/gcc-std-cxx26/%: export UPX_CONFIG_DISABLE_CXX_STANDARD = ON
|
||||||
|
|
||||||
# cross compiler: Linux glibc aarch64-linux-gnu (arm64)
|
# cross compiler: Linux glibc aarch64-linux-gnu (arm64)
|
||||||
build/extra/cross-linux-gnu-aarch64/debug: PHONY; $(call run_config_and_build,$@,Debug)
|
build/extra/cross-linux-gnu-aarch64/debug: PHONY; $(call run_config_and_build,$@,Debug)
|
||||||
@@ -256,12 +290,12 @@ build/$(UPX_XTARGET)/release: PHONY; $(call run_config_and_build,$@,Release)
|
|||||||
build/$(UPX_XTARGET)/%: export CC := $(CC)
|
build/$(UPX_XTARGET)/%: export CC := $(CC)
|
||||||
build/$(UPX_XTARGET)/%: export CXX := $(CXX)
|
build/$(UPX_XTARGET)/%: export CXX := $(CXX)
|
||||||
# shortcuts
|
# shortcuts
|
||||||
xtarget/all: xtarget/debug xtarget/release PHONY
|
|
||||||
xtarget/debug: build/$(UPX_XTARGET)/debug PHONY
|
xtarget/debug: build/$(UPX_XTARGET)/debug PHONY
|
||||||
xtarget/release: build/$(UPX_XTARGET)/release PHONY
|
xtarget/release: build/$(UPX_XTARGET)/release PHONY
|
||||||
xtarget/all+test: xtarget/debug+test xtarget/release+test PHONY
|
xtarget/all: xtarget/debug xtarget/release PHONY
|
||||||
xtarget/debug+test: build/$(UPX_XTARGET)/debug+test PHONY
|
xtarget/debug+test: build/$(UPX_XTARGET)/debug+test PHONY
|
||||||
xtarget/release+test: build/$(UPX_XTARGET)/release+test PHONY
|
xtarget/release+test: build/$(UPX_XTARGET)/release+test PHONY
|
||||||
|
xtarget/all+test: xtarget/debug+test xtarget/release+test PHONY
|
||||||
# set new default
|
# set new default
|
||||||
.DEFAULT_GOAL := build/$(UPX_XTARGET)/release
|
.DEFAULT_GOAL := build/$(UPX_XTARGET)/release
|
||||||
|
|
||||||
@@ -276,6 +310,10 @@ endif
|
|||||||
# it easy to set other variables like CMAKE_AR or CMAKE_RANLIB
|
# it easy to set other variables like CMAKE_AR or CMAKE_RANLIB
|
||||||
#***********************************************************************
|
#***********************************************************************
|
||||||
|
|
||||||
|
UPX_CMAKE_CONFIG_FLAGS += $(UPX_CMAKE_CONFIG_FLAGS_GENERATOR)
|
||||||
|
UPX_CMAKE_CONFIG_FLAGS += $(UPX_CMAKE_CONFIG_FLAGS_TOOLSET)
|
||||||
|
UPX_CMAKE_CONFIG_FLAGS += $(UPX_CMAKE_CONFIG_FLAGS_PLATFORM)
|
||||||
|
|
||||||
$(call check_undefined,__add_cmake_config)
|
$(call check_undefined,__add_cmake_config)
|
||||||
# promote an environment or Make variable to a CMake cache entry:
|
# promote an environment or Make variable to a CMake cache entry:
|
||||||
__add_cmake_config = $(and $($1),-D$1="$($1)")
|
__add_cmake_config = $(and $($1),-D$1="$($1)")
|
||||||
|
|||||||
@@ -0,0 +1,29 @@
|
|||||||
|
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,11 @@ 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
|
||||||
|
// 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
|
||||||
|
|
||||||
@@ -14,12 +14,14 @@ RUN dpkg --add-architecture 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 bfs bubblewrap busybox bzip2 bzip3 cabextract ccache chrpath cmake cpio dash diffstat \
|
7zip bat bfs btop bubblewrap busybox bzip2 bzip3 cabextract ccache chrpath cmake cpio \
|
||||||
elfutils execstack fd-find file fish fzf g++ gawk gdb gojq ht htop hyperfine jq ksh \
|
dash diffstat direnv elfutils execstack eza fd-find file fish fzf \
|
||||||
libzstd-dev lsb-release lz4 lzip lzop minify mksh moreutils musl neovim ninja-build \
|
g++ gawk gdb gojq ht htop hyperfine jq ksh \
|
||||||
|
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-toml python3-yaml python3-zstd \
|
python3 python3-pyasn1 python3-pycryptodome python3-pycurl python3-tomli python3-tomli-w \
|
||||||
re2c ripgrep rsync screen strace universal-ctags unzip valgrind yash yq \
|
python3-yaml python3-zstd \
|
||||||
|
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 \
|
||||||
@@ -59,9 +61,9 @@ 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 \
|
||||||
&& wget -q 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" \
|
&& 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" \
|
||||||
&& for v in $xzversions; do wget -q 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 \
|
||||||
&& rm -r ./upx-*.tar.* ./upx-*linux \
|
&& rm -r ./upx-*.tar.* ./upx-*linux \
|
||||||
@@ -79,15 +81,17 @@ RUN useradd upx -U --uid 2000 --shell /bin/bash -m \
|
|||||||
# symlink upx-stubtools
|
# symlink upx-stubtools
|
||||||
&& ln -s /usr/local/bin/bin-upx-20221212 .local/bin/bin-upx \
|
&& ln -s /usr/local/bin/bin-upx-20221212 .local/bin/bin-upx \
|
||||||
# some convenience settings according to upx developer preferences
|
# some convenience settings according to upx developer preferences
|
||||||
|
&& echo "alias path='echo PATH=\"\$PATH\"'" >> .bashrc \
|
||||||
&& echo "alias md=mkdir" >> .bashrc \
|
&& echo "alias md=mkdir" >> .bashrc \
|
||||||
&& echo "alias rd=rmdir" >> .bashrc \
|
&& echo "alias rd=rmdir" >> .bashrc \
|
||||||
&& echo 'mdd() { mkdir "$1" && cd "$1"; }' >> .bashrc \
|
&& echo 'mdd() { mkdir "$1" && cd "$1"; }' >> .bashrc \
|
||||||
&& echo 'm() { make "$@"; }' >> .bashrc \
|
&& echo 'm() { make "$@"; }' >> .bashrc \
|
||||||
|
&& echo 'mm() { make -j8 "$@"; }' >> .bashrc \
|
||||||
&& echo 'tn() { time nice "$@"; }' >> .bashrc \
|
&& echo 'tn() { time nice "$@"; }' >> .bashrc \
|
||||||
&& echo 'tnm() { time nice make "$@"; }' >> .bashrc \
|
&& echo 'tnm() { time nice make "$@"; }' >> .bashrc \
|
||||||
&& echo 'tnmm() { time nice make -j "$@"; }' >> .bashrc \
|
&& echo 'tnmm() { time nice make -j8 "$@"; }' >> .bashrc \
|
||||||
&& echo 'source /usr/share/bash-completion/completions/make' >> .bashrc \
|
&& echo 'source /usr/share/bash-completion/completions/make' >> .bashrc \
|
||||||
&& echo 'complete -F _make m tnm tnmm' >> .bashrc \
|
&& echo 'complete -F _make m mm tnm tnmm' >> .bashrc \
|
||||||
&& echo 'eval "$(zoxide init bash)"' >> .bashrc \
|
&& echo 'eval "$(zoxide init bash)"' >> .bashrc \
|
||||||
&& echo "alias zz=zi\nalias y=z\nalias yy=zi" >> .bashrc \
|
&& echo "alias zz=zi\nalias y=z\nalias yy=zi" >> .bashrc \
|
||||||
&& echo "alias cd..='cd ..'" >> .bashrc \
|
&& echo "alias cd..='cd ..'" >> .bashrc \
|
||||||
|
|||||||
Generated
+294
-268
@@ -4,19 +4,21 @@ Desired=Unknown/Install/Remove/Purge/Hold
|
|||||||
ii 7zip 23.01+dfsg-11 amd64 7-Zip file archiver with a high compression ratio
|
ii 7zip 23.01+dfsg-11 amd64 7-Zip file archiver with a high compression ratio
|
||||||
ii apt 2.7.14build2 amd64 commandline package manager
|
ii apt 2.7.14build2 amd64 commandline package manager
|
||||||
ii aria2 1.37.0+debian-1build3 amd64 High speed download utility
|
ii aria2 1.37.0+debian-1build3 amd64 High speed download utility
|
||||||
ii base-files 13ubuntu10 amd64 Debian base system miscellaneous files
|
ii base-files 13ubuntu10.2 amd64 Debian base system miscellaneous files
|
||||||
ii base-passwd 3.6.3build1 amd64 Debian base system master password and group files
|
ii base-passwd 3.6.3build1 amd64 Debian base system master password and group files
|
||||||
ii bash 5.2.21-2ubuntu4 amd64 GNU Bourne Again SHell
|
ii bash 5.2.21-2ubuntu4 amd64 GNU Bourne Again SHell
|
||||||
ii bash-completion 1:2.11-8 all programmable completion for the bash shell
|
ii bash-completion 1:2.11-8 all programmable completion for the bash shell
|
||||||
|
ii bat 0.24.0-1build1 amd64 cat(1) clone with syntax highlighting and git integration
|
||||||
ii bfs 3.1.2-1build1 amd64 Breadth-first version of find(1)
|
ii bfs 3.1.2-1build1 amd64 Breadth-first version of find(1)
|
||||||
ii binutils 2.42-4ubuntu2 amd64 GNU assembler, linker and binary utilities
|
ii binutils 2.42-4ubuntu2.4 amd64 GNU assembler, linker and binary utilities
|
||||||
ii binutils-common:amd64 2.42-4ubuntu2 amd64 Common files for the GNU assembler, linker and binary utilities
|
ii binutils-common:amd64 2.42-4ubuntu2.4 amd64 Common files for the GNU assembler, linker and binary utilities
|
||||||
ii binutils-x86-64-linux-gnu 2.42-4ubuntu2 amd64 GNU binary utilities, for x86-64-linux-gnu target
|
ii binutils-x86-64-linux-gnu 2.42-4ubuntu2.4 amd64 GNU binary utilities, for x86-64-linux-gnu target
|
||||||
ii bsdextrautils 2.39.3-9ubuntu6 amd64 extra utilities from 4.4BSD-Lite
|
ii bsdextrautils 2.39.3-9ubuntu6.2 amd64 extra utilities from 4.4BSD-Lite
|
||||||
ii bsdutils 1:2.39.3-9ubuntu6 amd64 basic utilities from 4.4BSD-Lite
|
ii bsdutils 1:2.39.3-9ubuntu6.2 amd64 basic utilities from 4.4BSD-Lite
|
||||||
ii bubblewrap 0.9.0-1build1 amd64 utility for unprivileged chroot and namespace manipulation
|
ii btop 1.3.0-1 amd64 Modern and colorful command line resource monitor that shows usage and stats
|
||||||
ii busybox 1:1.36.1-6ubuntu3 amd64 Tiny utilities for small and embedded systems
|
ii bubblewrap 0.9.0-1ubuntu0.1 amd64 utility for unprivileged chroot and namespace manipulation
|
||||||
ii bzip2 1.0.8-5.1 amd64 high-quality block-sorting file compressor - utilities
|
ii busybox 1:1.36.1-6ubuntu3.1 amd64 Tiny utilities for small and embedded systems
|
||||||
|
ii bzip2 1.0.8-5.1build0.1 amd64 high-quality block-sorting file compressor - utilities
|
||||||
ii bzip3 1.4.0-1 amd64 better, faster and stronger spiritual successor to bzip2 - utilities
|
ii bzip3 1.4.0-1 amd64 better, faster and stronger spiritual successor to bzip2 - utilities
|
||||||
ii ca-certificates 20240203 all Common CA certificates
|
ii ca-certificates 20240203 all Common CA certificates
|
||||||
ii cabextract 1.11-2 amd64 Microsoft Cabinet file unpacker
|
ii cabextract 1.11-2 amd64 Microsoft Cabinet file unpacker
|
||||||
@@ -27,45 +29,47 @@ ii cmake-data 3.28.3-1build7 all
|
|||||||
ii coreutils 9.4-3ubuntu6 amd64 GNU core utilities
|
ii coreutils 9.4-3ubuntu6 amd64 GNU core utilities
|
||||||
ii cpio 2.15+dfsg-1ubuntu2 amd64 GNU cpio -- a program to manage archives of files
|
ii cpio 2.15+dfsg-1ubuntu2 amd64 GNU cpio -- a program to manage archives of files
|
||||||
ii cpp 4:13.2.0-7ubuntu1 amd64 GNU C preprocessor (cpp)
|
ii cpp 4:13.2.0-7ubuntu1 amd64 GNU C preprocessor (cpp)
|
||||||
ii cpp-13 13.2.0-23ubuntu4 amd64 GNU C preprocessor
|
ii cpp-13 13.3.0-6ubuntu2~24.04 amd64 GNU C preprocessor
|
||||||
ii cpp-13-x86-64-linux-gnu 13.2.0-23ubuntu4 amd64 GNU C preprocessor for x86_64-linux-gnu
|
ii cpp-13-x86-64-linux-gnu 13.3.0-6ubuntu2~24.04 amd64 GNU C preprocessor for x86_64-linux-gnu
|
||||||
ii cpp-x86-64-linux-gnu 4:13.2.0-7ubuntu1 amd64 GNU C preprocessor (cpp) for the amd64 architecture
|
ii cpp-x86-64-linux-gnu 4:13.2.0-7ubuntu1 amd64 GNU C preprocessor (cpp) for the amd64 architecture
|
||||||
ii curl 8.5.0-2ubuntu10.1 amd64 command line tool for transferring data with URL syntax
|
ii curl 8.5.0-2ubuntu10.6 amd64 command line tool for transferring data with URL syntax
|
||||||
ii dash 0.5.12-6ubuntu5 amd64 POSIX-compliant shell
|
ii dash 0.5.12-6ubuntu5 amd64 POSIX-compliant shell
|
||||||
ii debconf 1.5.86ubuntu1 all Debian configuration management system
|
ii debconf 1.5.86ubuntu1 all Debian configuration management system
|
||||||
ii debianutils 5.17build1 amd64 Miscellaneous utilities specific to Debian
|
ii debianutils 5.17build1 amd64 Miscellaneous utilities specific to Debian
|
||||||
ii diffstat 1.66-1build1 amd64 produces graph of changes introduced by a diff file
|
ii diffstat 1.66-1build1 amd64 produces graph of changes introduced by a diff file
|
||||||
ii diffutils 1:3.10-1build1 amd64 File comparison utilities
|
ii diffutils 1:3.10-1build1 amd64 File comparison utilities
|
||||||
ii dpkg 1.22.6ubuntu6 amd64 Debian package management system
|
ii direnv 2.32.1-2ubuntu0.24.04.2 amd64 Utility to set directory specific environment variables
|
||||||
ii e2fsprogs 1.47.0-2.4~exp1ubuntu4 amd64 ext2/ext3/ext4 file system utilities
|
ii dpkg 1.22.6ubuntu6.1 amd64 Debian package management system
|
||||||
ii elfutils 0.190-1.1build4 amd64 collection of utilities to handle ELF objects
|
ii e2fsprogs 1.47.0-2.4~exp1ubuntu4.1 amd64 ext2/ext3/ext4 file system utilities
|
||||||
|
ii elfutils 0.190-1.1build4.1 amd64 collection of utilities to handle ELF objects
|
||||||
ii execstack 0.0.20131005-1.1ubuntu1 amd64 ELF GNU_STACK program header editing utility
|
ii execstack 0.0.20131005-1.1ubuntu1 amd64 ELF GNU_STACK program header editing utility
|
||||||
|
ii eza 0.18.2-1 amd64 Modern replacement for ls
|
||||||
ii fd-find 9.0.0-1 amd64 Simple, fast and user-friendly alternative to find
|
ii fd-find 9.0.0-1 amd64 Simple, fast and user-friendly alternative to find
|
||||||
ii file 1:5.45-3build1 amd64 Recognize the type of data in a file using "magic" numbers
|
ii file 1:5.45-3build1 amd64 Recognize the type of data in a file using "magic" numbers
|
||||||
ii findutils 4.9.0-5build1 amd64 utilities for finding files--find, xargs
|
ii findutils 4.9.0-5build1 amd64 utilities for finding files--find, xargs
|
||||||
ii fish 3.7.0-1 amd64 friendly interactive shell
|
ii fish 3.7.0-1 amd64 friendly interactive shell
|
||||||
ii fish-common 3.7.0-1 all friendly interactive shell (architecture-independent files)
|
ii fish-common 3.7.0-1 all friendly interactive shell (architecture-independent files)
|
||||||
ii fzf 0.44.1-1 amd64 general-purpose command-line fuzzy finder
|
ii fzf 0.44.1-1ubuntu0.2 amd64 general-purpose command-line fuzzy finder
|
||||||
ii g++ 4:13.2.0-7ubuntu1 amd64 GNU C++ compiler
|
ii g++ 4:13.2.0-7ubuntu1 amd64 GNU C++ compiler
|
||||||
ii g++-13 13.2.0-23ubuntu4 amd64 GNU C++ compiler
|
ii g++-13 13.3.0-6ubuntu2~24.04 amd64 GNU C++ compiler
|
||||||
ii g++-13-multilib 13.2.0-23ubuntu4 amd64 GNU C++ compiler (multilib support)
|
ii g++-13-multilib 13.3.0-6ubuntu2~24.04 amd64 GNU C++ compiler (multilib support)
|
||||||
ii g++-13-x86-64-linux-gnu 13.2.0-23ubuntu4 amd64 GNU C++ compiler for x86_64-linux-gnu architecture
|
ii g++-13-x86-64-linux-gnu 13.3.0-6ubuntu2~24.04 amd64 GNU C++ compiler for x86_64-linux-gnu architecture
|
||||||
ii g++-multilib 4:13.2.0-7ubuntu1 amd64 GNU C++ compiler (multilib files)
|
ii g++-multilib 4:13.2.0-7ubuntu1 amd64 GNU C++ compiler (multilib files)
|
||||||
ii g++-x86-64-linux-gnu 4:13.2.0-7ubuntu1 amd64 GNU C++ compiler for the amd64 architecture
|
ii g++-x86-64-linux-gnu 4:13.2.0-7ubuntu1 amd64 GNU C++ compiler for the amd64 architecture
|
||||||
ii gawk 1:5.2.1-2build3 amd64 GNU awk, a pattern scanning and processing language
|
ii gawk 1:5.2.1-2build3 amd64 GNU awk, a pattern scanning and processing language
|
||||||
ii gcc 4:13.2.0-7ubuntu1 amd64 GNU C compiler
|
ii gcc 4:13.2.0-7ubuntu1 amd64 GNU C compiler
|
||||||
ii gcc-13 13.2.0-23ubuntu4 amd64 GNU C compiler
|
ii gcc-13 13.3.0-6ubuntu2~24.04 amd64 GNU C compiler
|
||||||
ii gcc-13-base:amd64 13.2.0-23ubuntu4 amd64 GCC, the GNU Compiler Collection (base package)
|
ii gcc-13-base:amd64 13.3.0-6ubuntu2~24.04 amd64 GCC, the GNU Compiler Collection (base package)
|
||||||
ii gcc-13-multilib 13.2.0-23ubuntu4 amd64 GNU C compiler (multilib support)
|
ii gcc-13-multilib 13.3.0-6ubuntu2~24.04 amd64 GNU C compiler (multilib support)
|
||||||
ii gcc-13-x86-64-linux-gnu 13.2.0-23ubuntu4 amd64 GNU C compiler for the x86_64-linux-gnu architecture
|
ii gcc-13-x86-64-linux-gnu 13.3.0-6ubuntu2~24.04 amd64 GNU C compiler for the x86_64-linux-gnu architecture
|
||||||
ii gcc-14-base:amd64 14-20240412-0ubuntu1 amd64 GCC, the GNU Compiler Collection (base package)
|
ii gcc-14-base:amd64 14.2.0-4ubuntu2~24.04 amd64 GCC, the GNU Compiler Collection (base package)
|
||||||
ii gcc-14-base:i386 14-20240412-0ubuntu1 i386 GCC, the GNU Compiler Collection (base package)
|
ii gcc-14-base:i386 14.2.0-4ubuntu2~24.04 i386 GCC, the GNU Compiler Collection (base package)
|
||||||
ii gcc-multilib 4:13.2.0-7ubuntu1 amd64 GNU C compiler (multilib files)
|
ii gcc-multilib 4:13.2.0-7ubuntu1 amd64 GNU C compiler (multilib files)
|
||||||
ii gcc-x86-64-linux-gnu 4:13.2.0-7ubuntu1 amd64 GNU C compiler for the amd64 architecture
|
ii gcc-x86-64-linux-gnu 4:13.2.0-7ubuntu1 amd64 GNU C compiler for the amd64 architecture
|
||||||
ii gdb 15.0.50.20240403-0ubuntu1 amd64 GNU Debugger
|
ii gdb 15.0.50.20240403-0ubuntu1 amd64 GNU Debugger
|
||||||
ii git 1:2.43.0-1ubuntu7 amd64 fast, scalable, distributed revision control system
|
ii git 1:2.43.0-1ubuntu7.2 amd64 fast, scalable, distributed revision control system
|
||||||
ii git-man 1:2.43.0-1ubuntu7 all fast, scalable, distributed revision control system (manual pages)
|
ii git-man 1:2.43.0-1ubuntu7.2 all fast, scalable, distributed revision control system (manual pages)
|
||||||
ii gojq 0.12.13-1 amd64 pure Go implementation of jq (program)
|
ii gojq 0.12.13-1ubuntu0.24.04.2 amd64 pure Go implementation of jq (program)
|
||||||
ii gpgv 2.4.4-2ubuntu17 amd64 GNU privacy guard - signature verification tool
|
ii gpgv 2.4.4-2ubuntu17 amd64 GNU privacy guard - signature verification tool
|
||||||
ii grep 3.11-4build1 amd64 GNU grep, egrep and fgrep
|
ii grep 3.11-4build1 amd64 GNU grep, egrep and fgrep
|
||||||
ii groff-base 1.23.0-3build2 amd64 GNU troff text-formatting system (base system components)
|
ii groff-base 1.23.0-3build2 amd64 GNU troff text-formatting system (base system components)
|
||||||
@@ -79,206 +83,211 @@ ii jq 1.7.1-3build1 amd64
|
|||||||
ii ksh 20240113 all transitional package
|
ii ksh 20240113 all transitional package
|
||||||
ii ksh93u+m 1.0.8-1 amd64 AT&T KornShell
|
ii ksh93u+m 1.0.8-1 amd64 AT&T KornShell
|
||||||
ii less 590-2ubuntu2.1 amd64 pager program similar to more
|
ii less 590-2ubuntu2.1 amd64 pager program similar to more
|
||||||
ii lib32asan8 14-20240412-0ubuntu1 amd64 AddressSanitizer -- a fast memory error detector (32bit)
|
ii lftp 4.9.2-2ubuntu1 amd64 Sophisticated command-line FTP/HTTP/BitTorrent client programs
|
||||||
ii lib32atomic1 14-20240412-0ubuntu1 amd64 support library providing __atomic built-in functions (32bit)
|
ii lib32asan8 14.2.0-4ubuntu2~24.04 amd64 AddressSanitizer -- a fast memory error detector (32bit)
|
||||||
ii lib32gcc-13-dev 13.2.0-23ubuntu4 amd64 GCC support library (32 bit development files)
|
ii lib32atomic1 14.2.0-4ubuntu2~24.04 amd64 support library providing __atomic built-in functions (32bit)
|
||||||
ii lib32gcc-s1 14-20240412-0ubuntu1 amd64 GCC support library (32 bit Version)
|
ii lib32gcc-13-dev 13.3.0-6ubuntu2~24.04 amd64 GCC support library (32 bit development files)
|
||||||
ii lib32gomp1 14-20240412-0ubuntu1 amd64 GCC OpenMP (GOMP) support library (32bit)
|
ii lib32gcc-s1 14.2.0-4ubuntu2~24.04 amd64 GCC support library (32 bit Version)
|
||||||
ii lib32itm1 14-20240412-0ubuntu1 amd64 GNU Transactional Memory Library (32bit)
|
ii lib32gomp1 14.2.0-4ubuntu2~24.04 amd64 GCC OpenMP (GOMP) support library (32bit)
|
||||||
ii lib32quadmath0 14-20240412-0ubuntu1 amd64 GCC Quad-Precision Math Library (32bit)
|
ii lib32itm1 14.2.0-4ubuntu2~24.04 amd64 GNU Transactional Memory Library (32bit)
|
||||||
ii lib32stdc++-13-dev 13.2.0-23ubuntu4 amd64 GNU Standard C++ Library v3 (development files)
|
ii lib32quadmath0 14.2.0-4ubuntu2~24.04 amd64 GCC Quad-Precision Math Library (32bit)
|
||||||
ii lib32stdc++6 14-20240412-0ubuntu1 amd64 GNU Standard C++ Library v3 (32 bit Version)
|
ii lib32stdc++-13-dev 13.3.0-6ubuntu2~24.04 amd64 GNU Standard C++ Library v3 (development files)
|
||||||
ii lib32ubsan1 14-20240412-0ubuntu1 amd64 UBSan -- undefined behaviour sanitizer (32bit)
|
ii lib32stdc++6 14.2.0-4ubuntu2~24.04 amd64 GNU Standard C++ Library v3 (32 bit Version)
|
||||||
ii libacl1:amd64 2.3.2-1build1 amd64 access control list - shared library
|
ii lib32ubsan1 14.2.0-4ubuntu2~24.04 amd64 UBSan -- undefined behaviour sanitizer (32bit)
|
||||||
|
ii libacl1:amd64 2.3.2-1build1.1 amd64 access control list - shared library
|
||||||
ii libapt-pkg6.0t64:amd64 2.7.14build2 amd64 package management runtime library
|
ii libapt-pkg6.0t64:amd64 2.7.14build2 amd64 package management runtime library
|
||||||
ii libarchive13t64:amd64 3.7.2-2 amd64 Multi-format archive and compression library (shared library)
|
ii libarchive13t64:amd64 3.7.2-2ubuntu0.3 amd64 Multi-format archive and compression library (shared library)
|
||||||
ii libaria2-0:amd64 1.37.0+debian-1build3 amd64 C++ library interface to aria2
|
ii libaria2-0:amd64 1.37.0+debian-1build3 amd64 C++ library interface to aria2
|
||||||
ii libasan8:amd64 14-20240412-0ubuntu1 amd64 AddressSanitizer -- a fast memory error detector
|
ii libasan8:amd64 14.2.0-4ubuntu2~24.04 amd64 AddressSanitizer -- a fast memory error detector
|
||||||
ii libasm1t64:amd64 0.190-1.1build4 amd64 library with a programmable assembler interface
|
ii libasm1t64:amd64 0.190-1.1build4.1 amd64 library with a programmable assembler interface
|
||||||
ii libassuan0:amd64 2.5.6-1build1 amd64 IPC library for the GnuPG components
|
ii libassuan0:amd64 2.5.6-1build1 amd64 IPC library for the GnuPG components
|
||||||
ii libatomic1:amd64 14-20240412-0ubuntu1 amd64 support library providing __atomic built-in functions
|
ii libatomic1:amd64 14.2.0-4ubuntu2~24.04 amd64 support library providing __atomic built-in functions
|
||||||
ii libattr1:amd64 1:2.5.2-1build1 amd64 extended attribute handling - shared library
|
ii libattr1:amd64 1:2.5.2-1build1.1 amd64 extended attribute handling - shared library
|
||||||
ii libaudit-common 1:3.1.2-2.1build1 all Dynamic library for security auditing - common files
|
ii libaudit-common 1:3.1.2-2.1build1.1 all Dynamic library for security auditing - common files
|
||||||
ii libaudit1:amd64 1:3.1.2-2.1build1 amd64 Dynamic library for security auditing
|
ii libaudit1:amd64 1:3.1.2-2.1build1.1 amd64 Dynamic library for security auditing
|
||||||
ii libbabeltrace1:amd64 1.5.11-3build3 amd64 Babeltrace conversion libraries
|
ii libbabeltrace1:amd64 1.5.11-3build3 amd64 Babeltrace conversion libraries
|
||||||
ii libbinutils:amd64 2.42-4ubuntu2 amd64 GNU binary utilities (private shared library)
|
ii libbinutils:amd64 2.42-4ubuntu2.4 amd64 GNU binary utilities (private shared library)
|
||||||
ii libblkid1:amd64 2.39.3-9ubuntu6 amd64 block device ID library
|
ii libblkid1:amd64 2.39.3-9ubuntu6.2 amd64 block device ID library
|
||||||
ii libbrotli1:amd64 1.1.0-2build2 amd64 library implementing brotli encoder and decoder (shared libraries)
|
ii libbrotli1:amd64 1.1.0-2build2 amd64 library implementing brotli encoder and decoder (shared libraries)
|
||||||
ii libbsd0:amd64 0.12.1-1build1 amd64 utility functions from BSD systems - shared library
|
ii libbsd0:amd64 0.12.1-1build1.1 amd64 utility functions from BSD systems - shared library
|
||||||
ii libbz2-1.0:amd64 1.0.8-5.1 amd64 high-quality block-sorting file compressor library - runtime
|
ii libbz2-1.0:amd64 1.0.8-5.1build0.1 amd64 high-quality block-sorting file compressor library - runtime
|
||||||
ii libbzip3-0:amd64 1.4.0-1 amd64 better, faster and stronger spiritual successor to bzip2 - runtime
|
ii libbzip3-0:amd64 1.4.0-1 amd64 better, faster and stronger spiritual successor to bzip2 - runtime
|
||||||
ii libc-bin 2.39-0ubuntu8.1 amd64 GNU C Library: Binaries
|
ii libc-bin 2.39-0ubuntu8.4 amd64 GNU C Library: Binaries
|
||||||
ii libc-dev-bin 2.39-0ubuntu8.1 amd64 GNU C Library: Development binaries
|
ii libc-dev-bin 2.39-0ubuntu8.4 amd64 GNU C Library: Development binaries
|
||||||
ii libc6-dbg:amd64 2.39-0ubuntu8.1 amd64 GNU C Library: detached debugging symbols
|
ii libc6-dbg:amd64 2.39-0ubuntu8.4 amd64 GNU C Library: detached debugging symbols
|
||||||
ii libc6-dev-i386 2.39-0ubuntu8.1 amd64 GNU C Library: 32-bit development libraries for AMD64
|
ii libc6-dev-i386 2.39-0ubuntu8.4 amd64 GNU C Library: 32-bit development libraries for AMD64
|
||||||
ii libc6-dev-x32 2.39-0ubuntu8.1 amd64 GNU C Library: X32 ABI Development Libraries for AMD64
|
ii libc6-dev-x32 2.39-0ubuntu8.4 amd64 GNU C Library: X32 ABI Development Libraries for AMD64
|
||||||
ii libc6-dev:amd64 2.39-0ubuntu8.1 amd64 GNU C Library: Development Libraries and Header Files
|
ii libc6-dev:amd64 2.39-0ubuntu8.4 amd64 GNU C Library: Development Libraries and Header Files
|
||||||
ii libc6-i386 2.39-0ubuntu8.1 amd64 GNU C Library: 32-bit shared libraries for AMD64
|
ii libc6-i386 2.39-0ubuntu8.4 amd64 GNU C Library: 32-bit shared libraries for AMD64
|
||||||
ii libc6-x32 2.39-0ubuntu8.1 amd64 GNU C Library: X32 ABI Shared libraries for AMD64
|
ii libc6-x32 2.39-0ubuntu8.4 amd64 GNU C Library: X32 ABI Shared libraries for AMD64
|
||||||
ii libc6:amd64 2.39-0ubuntu8.1 amd64 GNU C Library: Shared libraries
|
ii libc6:amd64 2.39-0ubuntu8.4 amd64 GNU C Library: Shared libraries
|
||||||
ii libc6:i386 2.39-0ubuntu8.1 i386 GNU C Library: Shared libraries
|
ii libc6:i386 2.39-0ubuntu8.4 i386 GNU C Library: Shared libraries
|
||||||
ii libcap-ng0:amd64 0.8.4-2build2 amd64 alternate POSIX capabilities library
|
ii libcap-ng0:amd64 0.8.4-2build2 amd64 alternate POSIX capabilities library
|
||||||
ii libcap2:amd64 1:2.66-5ubuntu2 amd64 POSIX 1003.1e capabilities (library)
|
ii libcap2:amd64 1:2.66-5ubuntu2.2 amd64 POSIX 1003.1e capabilities (library)
|
||||||
ii libcares2:amd64 1.27.0-1.0ubuntu1 amd64 asynchronous name resolver
|
ii libcares2:amd64 1.27.0-1.0ubuntu1 amd64 asynchronous name resolver
|
||||||
ii libcc1-0:amd64 14-20240412-0ubuntu1 amd64 GCC cc1 plugin for GDB
|
ii libcc1-0:amd64 14.2.0-4ubuntu2~24.04 amd64 GCC cc1 plugin for GDB
|
||||||
ii libcom-err2:amd64 1.47.0-2.4~exp1ubuntu4 amd64 common error description library
|
ii libcom-err2:amd64 1.47.0-2.4~exp1ubuntu4.1 amd64 common error description library
|
||||||
ii libcrypt-dev:amd64 1:4.4.36-4build1 amd64 libcrypt development files
|
ii libcrypt-dev:amd64 1:4.4.36-4build1 amd64 libcrypt development files
|
||||||
ii libcrypt1:amd64 1:4.4.36-4build1 amd64 libcrypt shared library
|
ii libcrypt1:amd64 1:4.4.36-4build1 amd64 libcrypt shared library
|
||||||
ii libctf-nobfd0:amd64 2.42-4ubuntu2 amd64 Compact C Type Format library (runtime, no BFD dependency)
|
ii libctf-nobfd0:amd64 2.42-4ubuntu2.4 amd64 Compact C Type Format library (runtime, no BFD dependency)
|
||||||
ii libctf0:amd64 2.42-4ubuntu2 amd64 Compact C Type Format library (runtime, BFD dependency)
|
ii libctf0:amd64 2.42-4ubuntu2.4 amd64 Compact C Type Format library (runtime, BFD dependency)
|
||||||
ii libcurl3t64-gnutls:amd64 8.5.0-2ubuntu10.1 amd64 easy-to-use client-side URL transfer library (GnuTLS flavour)
|
ii libcurl3t64-gnutls:amd64 8.5.0-2ubuntu10.6 amd64 easy-to-use client-side URL transfer library (GnuTLS flavour)
|
||||||
ii libcurl4t64:amd64 8.5.0-2ubuntu10.1 amd64 easy-to-use client-side URL transfer library (OpenSSL flavour)
|
ii libcurl4t64:amd64 8.5.0-2ubuntu10.6 amd64 easy-to-use client-side URL transfer library (OpenSSL flavour)
|
||||||
ii libdb5.3t64:amd64 5.3.28+dfsg2-7 amd64 Berkeley v5.3 Database Libraries [runtime]
|
ii libdb5.3t64:amd64 5.3.28+dfsg2-7 amd64 Berkeley v5.3 Database Libraries [runtime]
|
||||||
ii libdebconfclient0:amd64 0.271ubuntu3 amd64 Debian Configuration Management System (C-implementation library)
|
ii libdebconfclient0:amd64 0.271ubuntu3 amd64 Debian Configuration Management System (C-implementation library)
|
||||||
ii libdebuginfod-common 0.190-1.1build4 all configuration to enable the Debian debug info server
|
ii libdebuginfod-common 0.190-1.1build4.1 all configuration to enable the Debian debug info server
|
||||||
ii libdebuginfod1t64:amd64 0.190-1.1build4 amd64 library to interact with debuginfod (development files)
|
ii libdebuginfod1t64:amd64 0.190-1.1build4.1 amd64 library to interact with debuginfod (development files)
|
||||||
ii libdw1t64:amd64 0.190-1.1build4 amd64 library that provides access to the DWARF debug information
|
ii libdw1t64:amd64 0.190-1.1build4.1 amd64 library that provides access to the DWARF debug information
|
||||||
ii libelf1t64:amd64 0.190-1.1build4 amd64 library to read and write ELF files
|
ii libelf1t64:amd64 0.190-1.1build4.1 amd64 library to read and write ELF files
|
||||||
ii liberror-perl 0.17029-2 all Perl module for error/exception handling in an OO-ish way
|
ii liberror-perl 0.17029-2 all Perl module for error/exception handling in an OO-ish way
|
||||||
ii libexpat1:amd64 2.6.1-2build1 amd64 XML parsing C library - runtime library
|
ii libexpat1:amd64 2.6.1-2ubuntu0.2 amd64 XML parsing C library - runtime library
|
||||||
ii libext2fs2t64:amd64 1.47.0-2.4~exp1ubuntu4 amd64 ext2/ext3/ext4 file system libraries
|
ii libext2fs2t64:amd64 1.47.0-2.4~exp1ubuntu4.1 amd64 ext2/ext3/ext4 file system libraries
|
||||||
ii libffi8:amd64 3.4.6-1build1 amd64 Foreign Function Interface library runtime
|
ii libffi8:amd64 3.4.6-1build1 amd64 Foreign Function Interface library runtime
|
||||||
ii libgcc-13-dev:amd64 13.2.0-23ubuntu4 amd64 GCC support library (development files)
|
ii libgcc-13-dev:amd64 13.3.0-6ubuntu2~24.04 amd64 GCC support library (development files)
|
||||||
ii libgcc-s1:amd64 14-20240412-0ubuntu1 amd64 GCC support library
|
ii libgcc-s1:amd64 14.2.0-4ubuntu2~24.04 amd64 GCC support library
|
||||||
ii libgcc-s1:i386 14-20240412-0ubuntu1 i386 GCC support library
|
ii libgcc-s1:i386 14.2.0-4ubuntu2~24.04 i386 GCC support library
|
||||||
ii libgcrypt20:amd64 1.10.3-2build1 amd64 LGPL Crypto library - runtime library
|
ii libgcrypt20:amd64 1.10.3-2build1 amd64 LGPL Crypto library - runtime library
|
||||||
ii libgdbm-compat4t64:amd64 1.23-5.1build1 amd64 GNU dbm database routines (legacy support runtime version)
|
ii libgdbm-compat4t64:amd64 1.23-5.1build1 amd64 GNU dbm database routines (legacy support runtime version)
|
||||||
ii libgdbm6t64:amd64 1.23-5.1build1 amd64 GNU dbm database routines (runtime version)
|
ii libgdbm6t64:amd64 1.23-5.1build1 amd64 GNU dbm database routines (runtime version)
|
||||||
ii libglib2.0-0t64:amd64 2.80.0-6ubuntu1 amd64 GLib library of C routines
|
ii libgit2-1.7:amd64 1.7.2+ds-1ubuntu3 amd64 low-level Git library
|
||||||
ii libgmp10:amd64 2:6.3.0+dfsg-2ubuntu6 amd64 Multiprecision arithmetic library
|
ii libglib2.0-0t64:amd64 2.80.0-6ubuntu3.2 amd64 GLib library of C routines
|
||||||
ii libgnutls30t64:amd64 3.8.3-1.1ubuntu3.1 amd64 GNU TLS library - main runtime library
|
ii libgmp10:amd64 2:6.3.0+dfsg-2ubuntu6.1 amd64 Multiprecision arithmetic library
|
||||||
ii libgomp1:amd64 14-20240412-0ubuntu1 amd64 GCC OpenMP (GOMP) support library
|
ii libgnutls30t64:amd64 3.8.3-1.1ubuntu3.3 amd64 GNU TLS library - main runtime library
|
||||||
ii libgpg-error0:amd64 1.47-3build2 amd64 GnuPG development runtime library
|
ii libgomp1:amd64 14.2.0-4ubuntu2~24.04 amd64 GCC OpenMP (GOMP) support library
|
||||||
ii libgprofng0:amd64 2.42-4ubuntu2 amd64 GNU Next Generation profiler (runtime library)
|
ii libgpg-error0:amd64 1.47-3build2.1 amd64 GnuPG development runtime library
|
||||||
ii libgssapi-krb5-2:amd64 1.20.1-6ubuntu2 amd64 MIT Kerberos runtime libraries - krb5 GSS-API Mechanism
|
ii libgprofng0:amd64 2.42-4ubuntu2.4 amd64 GNU Next Generation profiler (runtime library)
|
||||||
|
ii libgssapi-krb5-2:amd64 1.20.1-6ubuntu2.5 amd64 MIT Kerberos runtime libraries - krb5 GSS-API Mechanism
|
||||||
ii libhiredis1.1.0:amd64 1.2.0-6ubuntu3 amd64 minimalistic C client library for Redis
|
ii libhiredis1.1.0:amd64 1.2.0-6ubuntu3 amd64 minimalistic C client library for Redis
|
||||||
ii libhogweed6t64:amd64 3.9.1-2.2build1 amd64 low level cryptographic library (public-key cryptos)
|
ii libhogweed6t64:amd64 3.9.1-2.2build1.1 amd64 low level cryptographic library (public-key cryptos)
|
||||||
ii libhwasan0:amd64 14-20240412-0ubuntu1 amd64 AddressSanitizer -- a fast memory error detector
|
ii libhttp-parser2.9:amd64 2.9.4-6build1 amd64 parser for HTTP messages written in C
|
||||||
ii libicu74:amd64 74.2-1ubuntu3 amd64 International Components for Unicode
|
ii libhwasan0:amd64 14.2.0-4ubuntu2~24.04 amd64 AddressSanitizer -- a fast memory error detector
|
||||||
ii libidn2-0:amd64 2.3.7-2build1 amd64 Internationalized domain names (IDNA2008/TR46) library
|
ii libicu74:amd64 74.2-1ubuntu3.1 amd64 International Components for Unicode
|
||||||
|
ii libidn2-0:amd64 2.3.7-2build1.1 amd64 Internationalized domain names (IDNA2008/TR46) library
|
||||||
ii libio-pty-perl 1:1.20-1build2 amd64 Perl module for pseudo tty IO
|
ii libio-pty-perl 1:1.20-1build2 amd64 Perl module for pseudo tty IO
|
||||||
ii libipc-run-perl 20231003.0-1 all Perl module for running processes
|
ii libipc-run-perl 20231003.0-1 all Perl module for running processes
|
||||||
ii libipt2 2.0.6-1build1 amd64 Intel Processor Trace Decoder Library
|
ii libipt2 2.0.6-1build1 amd64 Intel Processor Trace Decoder Library
|
||||||
ii libisl23:amd64 0.26-3build1 amd64 manipulating sets and relations of integer points bounded by linear constraints
|
ii libisl23:amd64 0.26-3build1.1 amd64 manipulating sets and relations of integer points bounded by linear constraints
|
||||||
ii libitm1:amd64 14-20240412-0ubuntu1 amd64 GNU Transactional Memory Library
|
ii libitm1:amd64 14.2.0-4ubuntu2~24.04 amd64 GNU Transactional Memory Library
|
||||||
ii libjansson4:amd64 2.14-2build2 amd64 C library for encoding, decoding and manipulating JSON data
|
ii libjansson4:amd64 2.14-2build2 amd64 C library for encoding, decoding and manipulating JSON data
|
||||||
ii libjq1:amd64 1.7.1-3build1 amd64 lightweight and flexible command-line JSON processor - shared library
|
ii libjq1:amd64 1.7.1-3build1 amd64 lightweight and flexible command-line JSON processor - shared library
|
||||||
ii libjsoncpp25:amd64 1.9.5-6build1 amd64 library for reading and writing JSON for C++
|
ii libjsoncpp25:amd64 1.9.5-6build1 amd64 library for reading and writing JSON for C++
|
||||||
ii libk5crypto3:amd64 1.20.1-6ubuntu2 amd64 MIT Kerberos runtime libraries - Crypto Library
|
ii libk5crypto3:amd64 1.20.1-6ubuntu2.5 amd64 MIT Kerberos runtime libraries - Crypto Library
|
||||||
ii libkeyutils1:amd64 1.6.3-3build1 amd64 Linux Key Management Utilities (library)
|
ii libkeyutils1:amd64 1.6.3-3build1 amd64 Linux Key Management Utilities (library)
|
||||||
ii libkrb5-3:amd64 1.20.1-6ubuntu2 amd64 MIT Kerberos runtime libraries
|
ii libkrb5-3:amd64 1.20.1-6ubuntu2.5 amd64 MIT Kerberos runtime libraries
|
||||||
ii libkrb5support0:amd64 1.20.1-6ubuntu2 amd64 MIT Kerberos runtime libraries - Support library
|
ii libkrb5support0:amd64 1.20.1-6ubuntu2.5 amd64 MIT Kerberos runtime libraries - Support library
|
||||||
ii libldap2:amd64 2.6.7+dfsg-1~exp1ubuntu8 amd64 OpenLDAP libraries
|
ii libldap2:amd64 2.6.7+dfsg-1~exp1ubuntu8.2 amd64 OpenLDAP libraries
|
||||||
ii liblsan0:amd64 14-20240412-0ubuntu1 amd64 LeakSanitizer -- a memory leak detector (runtime)
|
ii liblsan0:amd64 14.2.0-4ubuntu2~24.04 amd64 LeakSanitizer -- a memory leak detector (runtime)
|
||||||
ii libluajit-5.1-2:amd64 2.1.0+git20231223.c525bcb+dfsg-1 amd64 Just in time compiler for Lua - library version
|
ii libluajit-5.1-2:amd64 2.1.0+git20231223.c525bcb+dfsg-1 amd64 Just in time compiler for Lua - library version
|
||||||
ii libluajit-5.1-common 2.1.0+git20231223.c525bcb+dfsg-1 all Just in time compiler for Lua - common files
|
ii libluajit-5.1-common 2.1.0+git20231223.c525bcb+dfsg-1 all Just in time compiler for Lua - common files
|
||||||
ii liblz4-1:amd64 1.9.4-1build1 amd64 Fast LZ compression algorithm library - runtime
|
ii liblz4-1:amd64 1.9.4-1build1.1 amd64 Fast LZ compression algorithm library - runtime
|
||||||
ii liblzma5:amd64 5.6.1+really5.4.5-1 amd64 XZ-format compression library
|
ii liblzma5:amd64 5.6.1+really5.4.5-1build0.1 amd64 XZ-format compression library
|
||||||
ii liblzo2-2:amd64 2.10-2build4 amd64 data compression library
|
ii liblzo2-2:amd64 2.10-2build4 amd64 data compression library
|
||||||
ii libmagic-mgc 1:5.45-3build1 amd64 File type determination library using "magic" numbers (compiled magic file)
|
ii libmagic-mgc 1:5.45-3build1 amd64 File type determination library using "magic" numbers (compiled magic file)
|
||||||
ii libmagic1t64:amd64 1:5.45-3build1 amd64 Recognize the type of data in a file using "magic" numbers - library
|
ii libmagic1t64:amd64 1:5.45-3build1 amd64 Recognize the type of data in a file using "magic" numbers - library
|
||||||
ii libmd0:amd64 1.1.0-2build1 amd64 message digest functions from BSD systems - shared library
|
ii libmd0:amd64 1.1.0-2build1.1 amd64 message digest functions from BSD systems - shared library
|
||||||
ii libmount1:amd64 2.39.3-9ubuntu6 amd64 device mounting library
|
ii libmount1:amd64 2.39.3-9ubuntu6.2 amd64 device mounting library
|
||||||
ii libmpc3:amd64 1.3.1-1build1 amd64 multiple precision complex floating-point library
|
ii libmpc3:amd64 1.3.1-1build1.1 amd64 multiple precision complex floating-point library
|
||||||
ii libmpfr6:amd64 4.2.1-1build1 amd64 multiple precision floating-point computation
|
ii libmpfr6:amd64 4.2.1-1build1.1 amd64 multiple precision floating-point computation
|
||||||
ii libmsgpackc2:amd64 4.0.0-3build1 amd64 binary-based efficient object serialization library
|
ii libmsgpackc2:amd64 4.0.0-3build1 amd64 binary-based efficient object serialization library
|
||||||
ii libmspack0t64:amd64 0.11-1.1build1 amd64 library for Microsoft compression formats (shared library)
|
ii libmspack0t64:amd64 0.11-1.1build1 amd64 library for Microsoft compression formats (shared library)
|
||||||
ii libncurses6:amd64 6.4+20240113-1ubuntu2 amd64 shared libraries for terminal handling
|
ii libncurses6:amd64 6.4+20240113-1ubuntu2 amd64 shared libraries for terminal handling
|
||||||
ii libncursesw6:amd64 6.4+20240113-1ubuntu2 amd64 shared libraries for terminal handling (wide character support)
|
ii libncursesw6:amd64 6.4+20240113-1ubuntu2 amd64 shared libraries for terminal handling (wide character support)
|
||||||
ii libnettle8t64:amd64 3.9.1-2.2build1 amd64 low level cryptographic library (symmetric and one-way cryptos)
|
ii libnettle8t64:amd64 3.9.1-2.2build1.1 amd64 low level cryptographic library (symmetric and one-way cryptos)
|
||||||
ii libnghttp2-14:amd64 1.59.0-1build4 amd64 library implementing HTTP/2 protocol (shared library)
|
ii libnghttp2-14:amd64 1.59.0-1ubuntu0.2 amd64 library implementing HTTP/2 protocol (shared library)
|
||||||
ii libnl-3-200:amd64 3.7.0-0.3build1 amd64 library for dealing with netlink sockets
|
ii libnl-3-200:amd64 3.7.0-0.3build1.1 amd64 library for dealing with netlink sockets
|
||||||
ii libnl-genl-3-200:amd64 3.7.0-0.3build1 amd64 library for dealing with netlink sockets - generic netlink
|
ii libnl-genl-3-200:amd64 3.7.0-0.3build1.1 amd64 library for dealing with netlink sockets - generic netlink
|
||||||
ii libnpth0t64:amd64 1.6-3.1build1 amd64 replacement for GNU Pth using system threads
|
ii libnpth0t64:amd64 1.6-3.1build1 amd64 replacement for GNU Pth using system threads
|
||||||
ii libonig5:amd64 6.9.9-1build1 amd64 regular expressions library
|
ii libonig5:amd64 6.9.9-1build1 amd64 regular expressions library
|
||||||
ii libp11-kit0:amd64 0.25.3-4ubuntu2 amd64 library for loading and coordinating access to PKCS#11 modules - runtime
|
ii libp11-kit0:amd64 0.25.3-4ubuntu2.1 amd64 library for loading and coordinating access to PKCS#11 modules - runtime
|
||||||
ii libpam-modules-bin 1.5.3-5ubuntu5 amd64 Pluggable Authentication Modules for PAM - helper binaries
|
ii libpam-modules-bin 1.5.3-5ubuntu5.1 amd64 Pluggable Authentication Modules for PAM - helper binaries
|
||||||
ii libpam-modules:amd64 1.5.3-5ubuntu5 amd64 Pluggable Authentication Modules for PAM
|
ii libpam-modules:amd64 1.5.3-5ubuntu5.1 amd64 Pluggable Authentication Modules for PAM
|
||||||
ii libpam-runtime 1.5.3-5ubuntu5 all Runtime support for the PAM library
|
ii libpam-runtime 1.5.3-5ubuntu5.1 all Runtime support for the PAM library
|
||||||
ii libpam0g:amd64 1.5.3-5ubuntu5 amd64 Pluggable Authentication Modules library
|
ii libpam0g:amd64 1.5.3-5ubuntu5.1 amd64 Pluggable Authentication Modules library
|
||||||
ii libpcre2-32-0:amd64 10.42-4ubuntu2 amd64 New Perl Compatible Regular Expression Library - 32 bit runtime files
|
ii libpcre2-32-0:amd64 10.42-4ubuntu2.1 amd64 New Perl Compatible Regular Expression Library - 32 bit runtime files
|
||||||
ii libpcre2-8-0:amd64 10.42-4ubuntu2 amd64 New Perl Compatible Regular Expression Library- 8 bit runtime files
|
ii libpcre2-8-0:amd64 10.42-4ubuntu2.1 amd64 New Perl Compatible Regular Expression Library- 8 bit runtime files
|
||||||
ii libperl5.38t64:amd64 5.38.2-3.2build2 amd64 shared Perl library
|
ii libperl5.38t64:amd64 5.38.2-3.2build2.1 amd64 shared Perl library
|
||||||
ii libpipeline1:amd64 1.5.7-2 amd64 Unix process pipeline manipulation library
|
ii libpipeline1:amd64 1.5.7-2 amd64 Unix process pipeline manipulation library
|
||||||
ii libpopt0:amd64 1.19+dfsg-1build1 amd64 lib for parsing cmdline parameters
|
ii libpopt0:amd64 1.19+dfsg-1build1 amd64 lib for parsing cmdline parameters
|
||||||
ii libproc2-0:amd64 2:4.0.4-4ubuntu3 amd64 library for accessing process information from /proc
|
ii libproc2-0:amd64 2:4.0.4-4ubuntu3.2 amd64 library for accessing process information from /proc
|
||||||
ii libpsl5t64:amd64 0.21.2-1.1build1 amd64 Library for Public Suffix List (shared libraries)
|
ii libpsl5t64:amd64 0.21.2-1.1build1 amd64 Library for Public Suffix List (shared libraries)
|
||||||
ii libpython2.7-minimal:amd64 2.7.18-8+deb11u1 amd64 Minimal subset of the Python language (version 2.7)
|
ii libpython2.7-minimal:amd64 2.7.18-8+deb11u1 amd64 Minimal subset of the Python language (version 2.7)
|
||||||
ii libpython3-stdlib:amd64 3.12.3-0ubuntu1 amd64 interactive high-level object-oriented language (default python3 version)
|
ii libpython3-stdlib:amd64 3.12.3-0ubuntu2 amd64 interactive high-level object-oriented language (default python3 version)
|
||||||
ii libpython3.12-minimal:amd64 3.12.3-1 amd64 Minimal subset of the Python language (version 3.12)
|
ii libpython3.12-minimal:amd64 3.12.3-1ubuntu0.5 amd64 Minimal subset of the Python language (version 3.12)
|
||||||
ii libpython3.12-stdlib:amd64 3.12.3-1 amd64 Interactive high-level object-oriented language (standard library, version 3.12)
|
ii libpython3.12-stdlib:amd64 3.12.3-1ubuntu0.5 amd64 Interactive high-level object-oriented language (standard library, version 3.12)
|
||||||
ii libpython3.12t64:amd64 3.12.3-1 amd64 Shared Python runtime library (version 3.12)
|
ii libpython3.12t64:amd64 3.12.3-1ubuntu0.5 amd64 Shared Python runtime library (version 3.12)
|
||||||
ii libquadmath0:amd64 14-20240412-0ubuntu1 amd64 GCC Quad-Precision Math Library
|
ii libquadmath0:amd64 14.2.0-4ubuntu2~24.04 amd64 GCC Quad-Precision Math Library
|
||||||
ii libreadline8t64:amd64 8.2-4build1 amd64 GNU readline and history libraries, run-time libraries
|
ii libreadline8t64:amd64 8.2-4build1 amd64 GNU readline and history libraries, run-time libraries
|
||||||
ii librhash0:amd64 1.4.3-3build1 amd64 shared library for hash functions computing
|
ii librhash0:amd64 1.4.3-3build1 amd64 shared library for hash functions computing
|
||||||
ii librtmp1:amd64 2.4+20151223.gitfa8646d.1-2build7 amd64 toolkit for RTMP streams (shared library)
|
ii librtmp1:amd64 2.4+20151223.gitfa8646d.1-2build7 amd64 toolkit for RTMP streams (shared library)
|
||||||
ii libsasl2-2:amd64 2.1.28+dfsg1-5ubuntu3 amd64 Cyrus SASL - authentication abstraction library
|
ii libsasl2-2:amd64 2.1.28+dfsg1-5ubuntu3.1 amd64 Cyrus SASL - authentication abstraction library
|
||||||
ii libsasl2-modules-db:amd64 2.1.28+dfsg1-5ubuntu3 amd64 Cyrus SASL - pluggable authentication modules (DB)
|
ii libsasl2-modules-db:amd64 2.1.28+dfsg1-5ubuntu3.1 amd64 Cyrus SASL - pluggable authentication modules (DB)
|
||||||
ii libseccomp2:amd64 2.5.5-1ubuntu3 amd64 high level interface to Linux seccomp filter
|
ii libseccomp2:amd64 2.5.5-1ubuntu3.1 amd64 high level interface to Linux seccomp filter
|
||||||
ii libselinux1:amd64 3.5-2ubuntu2 amd64 SELinux runtime shared libraries
|
ii libselinux1:amd64 3.5-2ubuntu2.1 amd64 SELinux runtime shared libraries
|
||||||
ii libsemanage-common 3.5-1build5 all Common files for SELinux policy management libraries
|
ii libsemanage-common 3.5-1build5 all Common files for SELinux policy management libraries
|
||||||
ii libsemanage2:amd64 3.5-1build5 amd64 SELinux policy management library
|
ii libsemanage2:amd64 3.5-1build5 amd64 SELinux policy management library
|
||||||
ii libsensors-config 1:3.6.0-9build1 all lm-sensors configuration files
|
ii libsensors-config 1:3.6.0-9build1 all lm-sensors configuration files
|
||||||
ii libsensors5:amd64 1:3.6.0-9build1 amd64 library to read temperature/voltage/fan sensors
|
ii libsensors5:amd64 1:3.6.0-9build1 amd64 library to read temperature/voltage/fan sensors
|
||||||
ii libsepol2:amd64 3.5-2build1 amd64 SELinux library for manipulating binary security policies
|
ii libsepol2:amd64 3.5-2build1 amd64 SELinux library for manipulating binary security policies
|
||||||
ii libsframe1:amd64 2.42-4ubuntu2 amd64 Library to handle the SFrame format (runtime library)
|
ii libsframe1:amd64 2.42-4ubuntu2.4 amd64 Library to handle the SFrame format (runtime library)
|
||||||
ii libsigsegv2:amd64 2.14-1ubuntu2 amd64 Library for handling page faults in a portable way
|
ii libsigsegv2:amd64 2.14-1ubuntu2 amd64 Library for handling page faults in a portable way
|
||||||
ii libsmartcols1:amd64 2.39.3-9ubuntu6 amd64 smart column output alignment library
|
ii libsmartcols1:amd64 2.39.3-9ubuntu6.2 amd64 smart column output alignment library
|
||||||
ii libsource-highlight-common 3.1.9-4.3build1 all architecture-independent files for source highlighting library
|
ii libsource-highlight-common 3.1.9-4.3build1 all architecture-independent files for source highlighting library
|
||||||
ii libsource-highlight4t64:amd64 3.1.9-4.3build1 amd64 source highlighting library
|
ii libsource-highlight4t64:amd64 3.1.9-4.3build1 amd64 source highlighting library
|
||||||
ii libsqlite3-0:amd64 3.45.1-1ubuntu2 amd64 SQLite 3 shared library
|
ii libsqlite3-0:amd64 3.45.1-1ubuntu2.1 amd64 SQLite 3 shared library
|
||||||
ii libss2:amd64 1.47.0-2.4~exp1ubuntu4 amd64 command-line interface parsing library
|
ii libss2:amd64 1.47.0-2.4~exp1ubuntu4.1 amd64 command-line interface parsing library
|
||||||
ii libssh-4:amd64 0.10.6-2build2 amd64 tiny C SSH library (OpenSSL flavor)
|
ii libssh-4:amd64 0.10.6-2build2 amd64 tiny C SSH library (OpenSSL flavor)
|
||||||
ii libssh2-1t64:amd64 1.11.0-4.1build2 amd64 SSH2 client-side library
|
ii libssh2-1t64:amd64 1.11.0-4.1build2 amd64 SSH2 client-side library
|
||||||
ii libssl3t64:amd64 3.0.13-0ubuntu3 amd64 Secure Sockets Layer toolkit - shared libraries
|
ii libssl3t64:amd64 3.0.13-0ubuntu3.5 amd64 Secure Sockets Layer toolkit - shared libraries
|
||||||
ii libstdc++-13-dev:amd64 13.2.0-23ubuntu4 amd64 GNU Standard C++ Library v3 (development files)
|
ii libstdc++-13-dev:amd64 13.3.0-6ubuntu2~24.04 amd64 GNU Standard C++ Library v3 (development files)
|
||||||
ii libstdc++6:amd64 14-20240412-0ubuntu1 amd64 GNU Standard C++ Library v3
|
ii libstdc++6:amd64 14.2.0-4ubuntu2~24.04 amd64 GNU Standard C++ Library v3
|
||||||
ii libsystemd0:amd64 255.4-1ubuntu8 amd64 systemd utility library
|
ii libsystemd0:amd64 255.4-1ubuntu8.5 amd64 systemd utility library
|
||||||
ii libtalloc2:amd64 2.4.2-1build2 amd64 hierarchical pool based memory allocator
|
ii libtalloc2:amd64 2.4.2-1build2 amd64 hierarchical pool based memory allocator
|
||||||
ii libtasn1-6:amd64 4.19.0-3build1 amd64 Manage ASN.1 structures (runtime)
|
ii libtasn1-6:amd64 4.19.0-3ubuntu0.24.04.1 amd64 Manage ASN.1 structures (runtime)
|
||||||
ii libtermkey1:amd64 0.22-1 amd64 library for processing keyboard input
|
ii libtermkey1:amd64 0.22-1 amd64 library for processing keyboard input
|
||||||
ii libtime-duration-perl 1.21-2 all module for rounded or exact English expression of durations
|
ii libtime-duration-perl 1.21-2 all module for rounded or exact English expression of durations
|
||||||
ii libtimedate-perl 2.3300-2 all collection of modules to manipulate date/time information
|
ii libtimedate-perl 2.3300-2 all collection of modules to manipulate date/time information
|
||||||
ii libtinfo6:amd64 6.4+20240113-1ubuntu2 amd64 shared low-level terminfo library for terminal handling
|
ii libtinfo6:amd64 6.4+20240113-1ubuntu2 amd64 shared low-level terminfo library for terminal handling
|
||||||
ii libtree-sitter0:amd64 0.20.8-2 amd64 incremental parsing system for programming tools
|
ii libtree-sitter0:amd64 0.20.8-2 amd64 incremental parsing system for programming tools
|
||||||
ii libtsan2:amd64 14-20240412-0ubuntu1 amd64 ThreadSanitizer -- a Valgrind-based detector of data races (runtime)
|
ii libtsan2:amd64 14.2.0-4ubuntu2~24.04 amd64 ThreadSanitizer -- a Valgrind-based detector of data races (runtime)
|
||||||
ii libubsan1:amd64 14-20240412-0ubuntu1 amd64 UBSan -- undefined behaviour sanitizer (runtime)
|
ii libubsan1:amd64 14.2.0-4ubuntu2~24.04 amd64 UBSan -- undefined behaviour sanitizer (runtime)
|
||||||
ii libuchardet0:amd64 0.0.8-1build1 amd64 universal charset detection library - shared library
|
ii libuchardet0:amd64 0.0.8-1build1 amd64 universal charset detection library - shared library
|
||||||
ii libudev1:amd64 255.4-1ubuntu8 amd64 libudev shared library
|
ii libudev1:amd64 255.4-1ubuntu8.5 amd64 libudev shared library
|
||||||
ii libunibilium4:amd64 2.1.0-3 amd64 simple, self-contained terminfo library
|
ii libunibilium4:amd64 2.1.0-3 amd64 simple, self-contained terminfo library
|
||||||
ii libunistring5:amd64 1.1-2build1 amd64 Unicode string library for C
|
ii libunistring5:amd64 1.1-2build1.1 amd64 Unicode string library for C
|
||||||
ii libunwind8:amd64 1.6.2-3build1 amd64 library to determine the call-chain of a program - runtime
|
ii libunwind8:amd64 1.6.2-3build1.1 amd64 library to determine the call-chain of a program - runtime
|
||||||
ii liburing2:amd64 2.5-1build1 amd64 Linux kernel io_uring access library - shared library
|
ii liburing2:amd64 2.5-1build1 amd64 Linux kernel io_uring access library - shared library
|
||||||
ii libutempter0:amd64 1.2.1-3build1 amd64 privileged helper for utmp/wtmp updates (runtime)
|
ii libutempter0:amd64 1.2.1-3build1 amd64 privileged helper for utmp/wtmp updates (runtime)
|
||||||
ii libuuid1:amd64 2.39.3-9ubuntu6 amd64 Universally Unique ID library
|
ii libuuid1:amd64 2.39.3-9ubuntu6.2 amd64 Universally Unique ID library
|
||||||
ii libuv1t64:amd64 1.48.0-1.1build1 amd64 asynchronous event notification library - runtime library
|
ii libuv1t64:amd64 1.48.0-1.1build1 amd64 asynchronous event notification library - runtime library
|
||||||
ii libvterm0:amd64 0.3.3-2build1 amd64 abstract terminal library
|
ii libvterm0:amd64 0.3.3-2build1 amd64 abstract terminal library
|
||||||
|
ii libwrap0:amd64 7.6.q-33 amd64 Wietse Venema's TCP wrappers library
|
||||||
ii libx11-6:amd64 2:1.8.7-1build1 amd64 X11 client-side library
|
ii libx11-6:amd64 2:1.8.7-1build1 amd64 X11 client-side library
|
||||||
ii libx11-data 2:1.8.7-1build1 all X11 client-side library
|
ii libx11-data 2:1.8.7-1build1 all X11 client-side library
|
||||||
ii libx32asan8 14-20240412-0ubuntu1 amd64 AddressSanitizer -- a fast memory error detector (x32)
|
ii libx32asan8 14.2.0-4ubuntu2~24.04 amd64 AddressSanitizer -- a fast memory error detector (x32)
|
||||||
ii libx32atomic1 14-20240412-0ubuntu1 amd64 support library providing __atomic built-in functions (x32)
|
ii libx32atomic1 14.2.0-4ubuntu2~24.04 amd64 support library providing __atomic built-in functions (x32)
|
||||||
ii libx32gcc-13-dev 13.2.0-23ubuntu4 amd64 GCC support library (x32 development files)
|
ii libx32gcc-13-dev 13.3.0-6ubuntu2~24.04 amd64 GCC support library (x32 development files)
|
||||||
ii libx32gcc-s1 14-20240412-0ubuntu1 amd64 GCC support library (x32)
|
ii libx32gcc-s1 14.2.0-4ubuntu2~24.04 amd64 GCC support library (x32)
|
||||||
ii libx32gomp1 14-20240412-0ubuntu1 amd64 GCC OpenMP (GOMP) support library (x32)
|
ii libx32gomp1 14.2.0-4ubuntu2~24.04 amd64 GCC OpenMP (GOMP) support library (x32)
|
||||||
ii libx32itm1 14-20240412-0ubuntu1 amd64 GNU Transactional Memory Library (x32)
|
ii libx32itm1 14.2.0-4ubuntu2~24.04 amd64 GNU Transactional Memory Library (x32)
|
||||||
ii libx32quadmath0 14-20240412-0ubuntu1 amd64 GCC Quad-Precision Math Library (x32)
|
ii libx32quadmath0 14.2.0-4ubuntu2~24.04 amd64 GCC Quad-Precision Math Library (x32)
|
||||||
ii libx32stdc++-13-dev 13.2.0-23ubuntu4 amd64 GNU Standard C++ Library v3 (development files)
|
ii libx32stdc++-13-dev 13.3.0-6ubuntu2~24.04 amd64 GNU Standard C++ Library v3 (development files)
|
||||||
ii libx32stdc++6 14-20240412-0ubuntu1 amd64 GNU Standard C++ Library v3 (x32)
|
ii libx32stdc++6 14.2.0-4ubuntu2~24.04 amd64 GNU Standard C++ Library v3 (x32)
|
||||||
ii libx32ubsan1 14-20240412-0ubuntu1 amd64 UBSan -- undefined behaviour sanitizer (x32)
|
ii libx32ubsan1 14.2.0-4ubuntu2~24.04 amd64 UBSan -- undefined behaviour sanitizer (x32)
|
||||||
ii libxau6:amd64 1:1.0.9-1build6 amd64 X11 authorisation library
|
ii libxau6:amd64 1:1.0.9-1build6 amd64 X11 authorisation library
|
||||||
ii libxcb1:amd64 1.15-1ubuntu2 amd64 X C Binding
|
ii libxcb1:amd64 1.15-1ubuntu2 amd64 X C Binding
|
||||||
ii libxdmcp6:amd64 1:1.1.3-0ubuntu6 amd64 X11 Display Manager Control Protocol library
|
ii libxdmcp6:amd64 1:1.1.3-0ubuntu6 amd64 X11 Display Manager Control Protocol library
|
||||||
ii libxml2:amd64 2.9.14+dfsg-1.3ubuntu3 amd64 GNOME XML library
|
ii libxml2:amd64 2.9.14+dfsg-1.3ubuntu3.2 amd64 GNOME XML library
|
||||||
ii libxxhash0:amd64 0.8.2-2build1 amd64 shared library for xxhash
|
ii libxxhash0:amd64 0.8.2-2build1 amd64 shared library for xxhash
|
||||||
ii libyaml-0-2:amd64 0.2.5-1build1 amd64 Fast YAML 1.1 parser and emitter library
|
ii libyaml-0-2:amd64 0.2.5-1build1 amd64 Fast YAML 1.1 parser and emitter library
|
||||||
ii libzstd-dev:amd64 1.5.5+dfsg2-2build1 amd64 fast lossless compression algorithm -- development files
|
ii libzstd-dev:amd64 1.5.5+dfsg2-2build1.1 amd64 fast lossless compression algorithm -- development files
|
||||||
ii libzstd1:amd64 1.5.5+dfsg2-2build1 amd64 fast lossless compression algorithm
|
ii libzstd1:amd64 1.5.5+dfsg2-2build1.1 amd64 fast lossless compression algorithm
|
||||||
ii linux-libc-dev:amd64 6.8.0-31.31 amd64 Linux Kernel Headers for development
|
ii linux-libc-dev:amd64 6.8.0-55.57 amd64 Linux Kernel Headers for development
|
||||||
ii login 1:4.13+dfsg1-4ubuntu3 amd64 system login tools
|
ii login 1:4.13+dfsg1-4ubuntu3.2 amd64 system login tools
|
||||||
ii logsave 1.47.0-2.4~exp1ubuntu4 amd64 save the output of a command in a log file
|
ii logsave 1.47.0-2.4~exp1ubuntu4.1 amd64 save the output of a command in a log file
|
||||||
ii lsb-release 12.0-2 all Linux Standard Base version reporting utility (minimal implementation)
|
ii lsb-release 12.0-2 all Linux Standard Base version reporting utility (minimal implementation)
|
||||||
|
ii lsd 1.0.0-2 amd64 ls command with a lot of pretty colors and some other stuff
|
||||||
ii lua-luv:amd64 1.48.0-2-2build1 amd64 libuv bindings for Lua
|
ii lua-luv:amd64 1.48.0-2-2build1 amd64 libuv bindings for Lua
|
||||||
ii lz4 1.9.4-1build1 amd64 Fast LZ compression algorithm library - tool
|
ii lz4 1.9.4-1build1.1 amd64 Fast LZ compression algorithm library - tool
|
||||||
ii lzip 1.24.1-1build1 amd64 lossless data compressor based on the LZMA algorithm
|
ii lzip 1.24.1-1build1 amd64 lossless data compressor based on the LZMA algorithm
|
||||||
ii lzop 1.04-2build3 amd64 fast compression program
|
ii lzop 1.04-2build3 amd64 fast compression program
|
||||||
ii make 4.3-4.1build2 amd64 utility for directing compilation
|
ii make 4.3-4.1build2 amd64 utility for directing compilation
|
||||||
@@ -288,7 +297,7 @@ ii media-types 10.1.0 all
|
|||||||
ii minify 2.20.17-1 amd64 CLI implementation of the Go minify library package
|
ii minify 2.20.17-1 amd64 CLI implementation of the Go minify library package
|
||||||
ii mksh 59c-37 amd64 MirBSD Korn Shell
|
ii mksh 59c-37 amd64 MirBSD Korn Shell
|
||||||
ii moreutils 0.69-1 amd64 additional Unix utilities
|
ii moreutils 0.69-1 amd64 additional Unix utilities
|
||||||
ii mount 2.39.3-9ubuntu6 amd64 tools for mounting and manipulating filesystems
|
ii mount 2.39.3-9ubuntu6.2 amd64 tools for mounting and manipulating filesystems
|
||||||
ii musl:amd64 1.2.4-2 amd64 standard C library
|
ii musl:amd64 1.2.4-2 amd64 standard C library
|
||||||
ii ncurses-base 6.4+20240113-1ubuntu2 all basic terminal type definitions
|
ii ncurses-base 6.4+20240113-1ubuntu2 all basic terminal type definitions
|
||||||
ii ncurses-bin 6.4+20240113-1ubuntu2 amd64 terminal-related programs and man pages
|
ii ncurses-bin 6.4+20240113-1ubuntu2 amd64 terminal-related programs and man pages
|
||||||
@@ -297,228 +306,240 @@ ii neovim 0.9.5-6ubuntu2 amd64
|
|||||||
ii neovim-runtime 0.9.5-6ubuntu2 all heavily refactored vim fork (runtime files)
|
ii neovim-runtime 0.9.5-6ubuntu2 all heavily refactored vim fork (runtime files)
|
||||||
ii netbase 6.4 all Basic TCP/IP networking system
|
ii netbase 6.4 all Basic TCP/IP networking system
|
||||||
ii ninja-build 1.11.1-2 amd64 small build system closest in spirit to Make
|
ii ninja-build 1.11.1-2 amd64 small build system closest in spirit to Make
|
||||||
ii openssl 3.0.13-0ubuntu3 amd64 Secure Sockets Layer toolkit - cryptographic utility
|
ii openssl 3.0.13-0ubuntu3.5 amd64 Secure Sockets Layer toolkit - cryptographic utility
|
||||||
ii p7zip 16.02+transitional.1 all transitional package
|
ii p7zip 16.02+transitional.1 all transitional package
|
||||||
ii parallel 20231122+ds-1 all build and execute command lines from standard input in parallel
|
ii parallel 20231122+ds-1 all build and execute command lines from standard input in parallel
|
||||||
ii passwd 1:4.13+dfsg1-4ubuntu3 amd64 change and administer password and group data
|
ii passwd 1:4.13+dfsg1-4ubuntu3.2 amd64 change and administer password and group data
|
||||||
ii patch 2.7.6-7build3 amd64 Apply a diff file to an original
|
ii patch 2.7.6-7build3 amd64 Apply a diff file to an original
|
||||||
ii patchelf 0.18.0-1.1build1 amd64 modify properties of ELF executables
|
ii patchelf 0.18.0-1.1build1 amd64 modify properties of ELF executables
|
||||||
ii patchutils 0.4.2-1build3 amd64 Utilities to work with patches
|
ii patchutils 0.4.2-1build3 amd64 Utilities to work with patches
|
||||||
ii pax-utils 1.3.7-1 amd64 Security-focused ELF files checking tool
|
ii pax-utils 1.3.7-1 amd64 Security-focused ELF files checking tool
|
||||||
ii perl 5.38.2-3.2build2 amd64 Larry Wall's Practical Extraction and Report Language
|
ii perl 5.38.2-3.2build2.1 amd64 Larry Wall's Practical Extraction and Report Language
|
||||||
ii perl-base 5.38.2-3.2build2 amd64 minimal Perl system
|
ii perl-base 5.38.2-3.2build2.1 amd64 minimal Perl system
|
||||||
ii perl-modules-5.38 5.38.2-3.2build2 all Core Perl modules
|
ii perl-modules-5.38 5.38.2-3.2build2.1 all Core Perl modules
|
||||||
ii procps 2:4.0.4-4ubuntu3 amd64 /proc file system utilities
|
ii procps 2:4.0.4-4ubuntu3.2 amd64 /proc file system utilities
|
||||||
ii proot 5.1.0-1.3 amd64 emulate chroot, bind mount and binfmt_misc for non-root users
|
ii proot 5.1.0-1.3 amd64 emulate chroot, bind mount and binfmt_misc for non-root users
|
||||||
ii python2.7-minimal 2.7.18-8+deb11u1 amd64 Minimal subset of the Python language (version 2.7)
|
ii python2.7-minimal 2.7.18-8+deb11u1 amd64 Minimal subset of the Python language (version 2.7)
|
||||||
ii python3 3.12.3-0ubuntu1 amd64 interactive high-level object-oriented language (default python3 version)
|
ii python3 3.12.3-0ubuntu2 amd64 interactive high-level object-oriented language (default python3 version)
|
||||||
ii python3-argcomplete 3.1.4-1 all bash tab completion for argparse (for Python 3)
|
ii python3-argcomplete 3.1.4-1ubuntu0.1 all bash tab completion for argparse (for Python 3)
|
||||||
ii python3-minimal 3.12.3-0ubuntu1 amd64 minimal subset of the Python language (default python3 version)
|
ii python3-minimal 3.12.3-0ubuntu2 amd64 minimal subset of the Python language (default python3 version)
|
||||||
ii python3-pyasn1 0.4.8-4 all ASN.1 library for Python (Python 3 module)
|
ii python3-pyasn1 0.4.8-4 all ASN.1 library for Python (Python 3 module)
|
||||||
ii python3-pycryptodome 3.20.0+dfsg-1 amd64 cryptographic Python library (Python 3)
|
ii python3-pycryptodome 3.20.0+dfsg-1 amd64 cryptographic Python library (Python 3)
|
||||||
ii python3-pycurl 7.45.3-1build2 amd64 Python bindings to libcurl (Python 3)
|
ii python3-pycurl 7.45.3-1build2 amd64 Python bindings to libcurl (Python 3)
|
||||||
ii python3-pyelftools 0.30-1 all pure-python3 library for parsing ELF and DWARF
|
ii python3-pyelftools 0.30-1 all pure-python3 library for parsing ELF and DWARF
|
||||||
ii python3-toml 0.10.2-1 all library for Tom's Obvious, Minimal Language - Python 3.x
|
ii python3-toml 0.10.2-1 all library for Tom's Obvious, Minimal Language - Python 3.x
|
||||||
|
ii python3-tomli 2.0.1-2 all lil' TOML parser for Python
|
||||||
|
ii python3-tomli-w 1.0.0-2 all lil' TOML writer for Python
|
||||||
ii python3-xmltodict 0.13.0-1 all Makes working with XML feel like you are working with JSON (Python 3)
|
ii python3-xmltodict 0.13.0-1 all Makes working with XML feel like you are working with JSON (Python 3)
|
||||||
ii python3-yaml 6.0.1-2build2 amd64 YAML parser and emitter for Python3
|
ii python3-yaml 6.0.1-2build2 amd64 YAML parser and emitter for Python3
|
||||||
ii python3-zstd 1.5.5.1-1build1 amd64 python bindings to Yann Collet ZSTD compression library
|
ii python3-zstd 1.5.5.1-1build1 amd64 python bindings to Yann Collet ZSTD compression library
|
||||||
ii python3.12 3.12.3-1 amd64 Interactive high-level object-oriented language (version 3.12)
|
ii python3.12 3.12.3-1ubuntu0.5 amd64 Interactive high-level object-oriented language (version 3.12)
|
||||||
ii python3.12-minimal 3.12.3-1 amd64 Minimal subset of the Python language (version 3.12)
|
ii python3.12-minimal 3.12.3-1ubuntu0.5 amd64 Minimal subset of the Python language (version 3.12)
|
||||||
ii re2c 3.1-1build1 amd64 lexer generator for C, C++, Go and Rust
|
ii re2c 3.1-1build1 amd64 lexer generator for C, C++, Go and Rust
|
||||||
ii readline-common 8.2-4build1 all GNU readline and history libraries, common files
|
ii readline-common 8.2-4build1 all GNU readline and history libraries, common files
|
||||||
ii ripgrep 14.1.0-1 amd64 Recursively searches directories for a regex pattern
|
ii ripgrep 14.1.0-1 amd64 Recursively searches directories for a regex pattern
|
||||||
ii rpcsvc-proto 1.4.2-0ubuntu7 amd64 RPC protocol compiler and definitions
|
ii rpcsvc-proto 1.4.2-0ubuntu7 amd64 RPC protocol compiler and definitions
|
||||||
ii rsync 3.2.7-1ubuntu1 amd64 fast, versatile, remote (and local) file-copying tool
|
ii rsync 3.2.7-1ubuntu1.2 amd64 fast, versatile, remote (and local) file-copying tool
|
||||||
ii screen 4.9.1-1build1 amd64 terminal multiplexer with VT100/ANSI terminal emulation
|
ii screen 4.9.1-1build1 amd64 terminal multiplexer with VT100/ANSI terminal emulation
|
||||||
ii sed 4.9-2build1 amd64 GNU stream editor for filtering/transforming text
|
ii sed 4.9-2build1 amd64 GNU stream editor for filtering/transforming text
|
||||||
ii sensible-utils 0.0.22 all Utilities for sensible alternative selection
|
ii sensible-utils 0.0.22 all Utilities for sensible alternative selection
|
||||||
|
ii socat 1.8.0.0-4build3 amd64 multipurpose relay for bidirectional data transfer
|
||||||
ii strace 6.8-0ubuntu2 amd64 System call tracer
|
ii strace 6.8-0ubuntu2 amd64 System call tracer
|
||||||
ii sysstat 12.6.1-2 amd64 system performance tools for Linux
|
ii sysstat 12.6.1-2 amd64 system performance tools for Linux
|
||||||
ii sysvinit-utils 3.08-6ubuntu3 amd64 System-V-like utilities
|
ii sysvinit-utils 3.08-6ubuntu3 amd64 System-V-like utilities
|
||||||
ii tar 1.35+dfsg-3build1 amd64 GNU version of the tar archiving utility
|
ii tar 1.35+dfsg-3build1 amd64 GNU version of the tar archiving utility
|
||||||
ii time 1.9-0.2build1 amd64 GNU time program for measuring CPU resource usage
|
ii time 1.9-0.2build1 amd64 GNU time program for measuring CPU resource usage
|
||||||
ii tzdata 2024a-2ubuntu1 all time zone and daylight-saving time data
|
ii tzdata 2024b-0ubuntu0.24.04.1 all time zone and daylight-saving time data
|
||||||
ii ubuntu-keyring 2023.11.28.1 all GnuPG keys of the Ubuntu archive
|
ii ubuntu-keyring 2023.11.28.1 all GnuPG keys of the Ubuntu archive
|
||||||
ii ucf 3.0043+nmu1 all Update Configuration File(s): preserve user changes to config files
|
ii ucf 3.0043+nmu1 all Update Configuration File(s): preserve user changes to config files
|
||||||
ii universal-ctags 5.9.20210829.0-1 amd64 build tag file indexes of source code definitions
|
ii universal-ctags 5.9.20210829.0-1 amd64 build tag file indexes of source code definitions
|
||||||
ii unzip 6.0-28ubuntu4 amd64 De-archiver for .zip files
|
ii unminimize 0.2.1 amd64 Un-minimize your minimial images or setup
|
||||||
ii util-linux 2.39.3-9ubuntu6 amd64 miscellaneous system utilities
|
ii unzip 6.0-28ubuntu4.1 amd64 De-archiver for .zip files
|
||||||
|
ii util-linux 2.39.3-9ubuntu6.2 amd64 miscellaneous system utilities
|
||||||
ii valgrind 1:3.22.0-0ubuntu3 amd64 instrumentation framework for building dynamic analysis tools
|
ii valgrind 1:3.22.0-0ubuntu3 amd64 instrumentation framework for building dynamic analysis tools
|
||||||
ii wget 1.21.4-1ubuntu4 amd64 retrieves files from the web
|
ii wget 1.21.4-1ubuntu4.1 amd64 retrieves files from the web
|
||||||
ii xz-utils 5.6.1+really5.4.5-1 amd64 XZ-format compression utilities
|
ii xz-utils 5.6.1+really5.4.5-1build0.1 amd64 XZ-format compression utilities
|
||||||
ii yash 2.55-2 amd64 yet another shell
|
ii yash 2.55-2 amd64 yet another shell
|
||||||
ii yq 3.1.0-3 all Command-line YAML processor - jq wrapper for YAML documents
|
ii yq 3.1.0-3 all Command-line YAML processor - jq wrapper for YAML documents
|
||||||
ii zip 3.0-13build1 amd64 Archiver for .zip files
|
ii zip 3.0-13ubuntu0.2 amd64 Archiver for .zip files
|
||||||
ii zlib1g-dev:amd64 1:1.3.dfsg-3.1ubuntu2 amd64 compression library - development
|
ii zlib1g-dev:amd64 1:1.3.dfsg-3.1ubuntu2.1 amd64 compression library - development
|
||||||
ii zlib1g:amd64 1:1.3.dfsg-3.1ubuntu2 amd64 compression library - runtime
|
ii zlib1g:amd64 1:1.3.dfsg-3.1ubuntu2.1 amd64 compression library - runtime
|
||||||
ii zlib1g:i386 1:1.3.dfsg-3.1ubuntu2 i386 compression library - runtime
|
ii zlib1g:i386 1:1.3.dfsg-3.1ubuntu2.1 i386 compression library - runtime
|
||||||
ii zoxide 0.9.3-1 amd64 Smarter cd command for your terminal
|
ii zoxide 0.9.3-1 amd64 Smarter cd command for your terminal
|
||||||
ii zsh 5.9-6ubuntu2 amd64 shell with lots of features
|
ii zsh 5.9-6ubuntu2 amd64 shell with lots of features
|
||||||
ii zsh-common 5.9-6ubuntu2 all architecture independent files for Zsh
|
ii zsh-common 5.9-6ubuntu2 all architecture independent files for Zsh
|
||||||
ii zstd 1.5.5+dfsg2-2build1 amd64 fast lossless compression algorithm -- CLI tool
|
ii zstd 1.5.5+dfsg2-2build1.1 amd64 fast lossless compression algorithm -- CLI tool
|
||||||
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|
||||||
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
|
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
|
||||||
||/ Name Version Architecture Description
|
||/ Name Version Architecture Description
|
||||||
|
|
||||||
Packages sorted by Installed-Size:
|
Packages sorted by Installed-Size:
|
||||||
964659 ===== TOTAL (355 packages)
|
971255 ===== TOTAL (368 packages)
|
||||||
76943 valgrind amd64
|
76943 valgrind amd64
|
||||||
72249 gcc-13-x86-64-linux-gnu amd64
|
61333 gcc-13-x86-64-linux-gnu amd64
|
||||||
37841 g++-13-x86-64-linux-gnu amd64
|
|
||||||
36493 cmake amd64
|
36493 cmake amd64
|
||||||
35919 libicu74 amd64
|
35919 libicu74 amd64
|
||||||
35027 cpp-13-x86-64-linux-gnu amd64
|
33545 g++-13-x86-64-linux-gnu amd64
|
||||||
|
30811 cpp-13-x86-64-linux-gnu amd64
|
||||||
29327 libperl5.38t64 amd64
|
29327 libperl5.38t64 amd64
|
||||||
21815 neovim-runtime all
|
21815 neovim-runtime all
|
||||||
21684 git amd64
|
21692 git amd64
|
||||||
20518 libstdc++-13-dev amd64
|
21662 libstdc++-13-dev amd64
|
||||||
19159 perl-modules-5.38 all
|
19159 perl-modules-5.38 all
|
||||||
16248 zsh-common all
|
16248 zsh-common all
|
||||||
16092 libgcc-13-dev amd64
|
16082 libgcc-13-dev amd64
|
||||||
13430 libc6 amd64
|
13431 libc6 amd64
|
||||||
13111 libc6-dev amd64
|
13112 libc6-dev amd64
|
||||||
12519 gdb amd64
|
12519 gdb amd64
|
||||||
12321 fish-common all
|
12321 fish-common all
|
||||||
12296 libc6 i386
|
12297 libc6 i386
|
||||||
12003 libc6-x32 amd64
|
12004 libc6-x32 amd64
|
||||||
11992 libc6-i386 amd64
|
11989 libc6-i386 amd64
|
||||||
11569 binutils-x86-64-linux-gnu amd64
|
11549 binutils-x86-64-linux-gnu amd64
|
||||||
11174 libc6-dbg amd64
|
11182 libc6-dbg amd64
|
||||||
10984 cmake-data all
|
10984 cmake-data all
|
||||||
10764 libasan8 amd64
|
10791 libasan8 amd64
|
||||||
9665 libx32asan8 amd64
|
9704 libx32asan8 amd64
|
||||||
9556 lib32asan8 amd64
|
9539 lib32asan8 amd64
|
||||||
9012 libpython3.12-stdlib amd64
|
9017 libpython3.12-stdlib amd64
|
||||||
8905 libpython3.12t64 amd64
|
8917 libpython3.12t64 amd64
|
||||||
8893 libtsan2 amd64
|
8902 libtsan2 amd64
|
||||||
8636 lib32gcc-13-dev amd64
|
|
||||||
8335 libmagic-mgc amd64
|
8335 libmagic-mgc amd64
|
||||||
8118 libc6-dev-x32 amd64
|
8296 lib32gcc-13-dev amd64
|
||||||
7923 python3.12-minimal amd64
|
8119 libc6-dev-x32 amd64
|
||||||
|
7924 python3.12-minimal amd64
|
||||||
7913 perl-base amd64
|
7913 perl-base amd64
|
||||||
7492 libx32gcc-13-dev amd64
|
7531 libx32gcc-13-dev amd64
|
||||||
7166 linux-libc-dev amd64
|
7359 linux-libc-dev amd64
|
||||||
6946 libc6-dev-i386 amd64
|
7226 lib32stdc++-13-dev amd64
|
||||||
|
7059 libx32stdc++-13-dev amd64
|
||||||
|
7024 direnv amd64
|
||||||
|
6947 libc6-dev-i386 amd64
|
||||||
6944 coreutils amd64
|
6944 coreutils amd64
|
||||||
6775 neovim amd64
|
6775 neovim amd64
|
||||||
6743 lib32stdc++-13-dev amd64
|
6608 libssl3t64 amd64
|
||||||
6607 libssl3t64 amd64
|
|
||||||
6433 libx32stdc++-13-dev amd64
|
|
||||||
6237 dpkg amd64
|
6237 dpkg amd64
|
||||||
6158 7zip amd64
|
6158 7zip amd64
|
||||||
|
5219 bat amd64
|
||||||
5210 ripgrep amd64
|
5210 ripgrep amd64
|
||||||
5169 libpython3.12-minimal amd64
|
5179 libpython3.12-minimal amd64
|
||||||
4879 libhwasan0 amd64
|
4897 libhwasan0 amd64
|
||||||
4341 ncurses-term all
|
4341 ncurses-term all
|
||||||
4244 minify amd64
|
4244 minify amd64
|
||||||
|
4193 libglib2.0-0t64 amd64
|
||||||
4103 apt amd64
|
4103 apt amd64
|
||||||
3983 gojq amd64
|
4074 gojq amd64
|
||||||
3956 python3-pycryptodome amd64
|
3956 python3-pycryptodome amd64
|
||||||
3949 libglib2.0-0t64 amd64
|
3833 libgprofng0 amd64
|
||||||
3849 libgprofng0 amd64
|
3828 liblsan0 amd64
|
||||||
3806 liblsan0 amd64
|
3738 fzf amd64
|
||||||
3721 groff-base amd64
|
3721 groff-base amd64
|
||||||
3627 fzf amd64
|
|
||||||
3605 python2.7-minimal amd64
|
3605 python2.7-minimal amd64
|
||||||
3443 fish amd64
|
3443 fish amd64
|
||||||
3441 re2c amd64
|
3441 re2c amd64
|
||||||
3438 util-linux amd64
|
3438 util-linux amd64
|
||||||
|
3408 lsd amd64
|
||||||
3403 libaria2-0 amd64
|
3403 libaria2-0 amd64
|
||||||
3382 fd-find amd64
|
3382 fd-find amd64
|
||||||
3349 libubsan1 amd64
|
3364 libubsan1 amd64
|
||||||
3244 libapt-pkg6.0t64 amd64
|
3244 libapt-pkg6.0t64 amd64
|
||||||
3157 libx32ubsan1 amd64
|
3181 libx32ubsan1 amd64
|
||||||
3111 ksh93u+m amd64
|
3111 ksh93u+m amd64
|
||||||
3110 libstdc++6 amd64
|
3110 libstdc++6 amd64
|
||||||
3109 lib32ubsan1 amd64
|
3104 lib32ubsan1 amd64
|
||||||
2995 parallel all
|
2995 parallel all
|
||||||
2966 lib32stdc++6 amd64
|
|
||||||
2957 elfutils amd64
|
2957 elfutils amd64
|
||||||
2928 man-db amd64
|
2928 man-db amd64
|
||||||
|
2894 lib32stdc++6 amd64
|
||||||
|
2810 libx32stdc++6 amd64
|
||||||
2785 libpython2.7-minimal amd64
|
2785 libpython2.7-minimal amd64
|
||||||
2770 libx32stdc++6 amd64
|
|
||||||
2431 zsh amd64
|
2431 zsh amd64
|
||||||
2419 passwd amd64
|
2419 passwd amd64
|
||||||
2352 libgnutls30t64 amd64
|
2352 libgnutls30t64 amd64
|
||||||
2346 libbinutils amd64
|
2346 libbinutils amd64
|
||||||
2191 ht amd64
|
2191 ht amd64
|
||||||
2182 libc-bin amd64
|
2183 libc-bin amd64
|
||||||
2161 git-man all
|
2163 git-man all
|
||||||
2103 strace amd64
|
2103 strace amd64
|
||||||
2078 libxml2 amd64
|
2079 libxml2 amd64
|
||||||
2032 libisl23 amd64
|
2032 libisl23 amd64
|
||||||
2009 universal-ctags amd64
|
2009 universal-ctags amd64
|
||||||
1980 aria2 amd64
|
1980 aria2 amd64
|
||||||
1900 bash amd64
|
1900 bash amd64
|
||||||
1884 openssl amd64
|
1885 openssl amd64
|
||||||
1798 zstd amd64
|
1848 lftp amd64
|
||||||
1796 procps amd64
|
1802 zstd amd64
|
||||||
|
1800 procps amd64
|
||||||
1761 libdb5.3t64 amd64
|
1761 libdb5.3t64 amd64
|
||||||
1757 libunistring5 amd64
|
1757 libunistring5 amd64
|
||||||
1736 gawk amd64
|
1736 gawk amd64
|
||||||
1730 libsqlite3-0 amd64
|
1730 libsqlite3-0 amd64
|
||||||
1712 libp11-kit0 amd64
|
1712 libp11-kit0 amd64
|
||||||
1634 mksh amd64
|
1634 mksh amd64
|
||||||
|
1610 socat amd64
|
||||||
|
1582 btop amd64
|
||||||
1579 ccache amd64
|
1579 ccache amd64
|
||||||
1504 e2fsprogs amd64
|
1504 e2fsprogs amd64
|
||||||
1454 bash-completion all
|
1454 bash-completion all
|
||||||
1452 sysstat amd64
|
1452 sysstat amd64
|
||||||
1448 yash amd64
|
1448 yash amd64
|
||||||
1396 libgcrypt20 amd64
|
1396 libgcrypt20 amd64
|
||||||
1381 tzdata all
|
1382 tzdata all
|
||||||
1362 libx11-6 amd64
|
1362 libx11-6 amd64
|
||||||
1342 libx11-data all
|
1342 libx11-data all
|
||||||
1321 zlib1g-dev amd64
|
1322 zlib1g-dev amd64
|
||||||
1314 hyperfine amd64
|
1314 hyperfine amd64
|
||||||
1237 libzstd-dev amd64
|
1237 libzstd-dev amd64
|
||||||
|
1237 libgit2-1.7 amd64
|
||||||
1186 libmpfr6 amd64
|
1186 libmpfr6 amd64
|
||||||
|
1145 libpam-modules amd64
|
||||||
|
1142 eza amd64
|
||||||
1136 zoxide amd64
|
1136 zoxide amd64
|
||||||
1123 libpam-modules amd64
|
|
||||||
1025 libsystemd0 amd64
|
1025 libsystemd0 amd64
|
||||||
1014 libkrb5-3 amd64
|
1015 libkrb5-3 amd64
|
||||||
996 screen amd64
|
996 screen amd64
|
||||||
924 libcurl4t64 amd64
|
925 libcurl4t64 amd64
|
||||||
916 wget amd64
|
916 wget amd64
|
||||||
905 libcurl3t64-gnutls amd64
|
906 libcurl3t64-gnutls amd64
|
||||||
904 libarchive13t64 amd64
|
904 libarchive13t64 amd64
|
||||||
884 login amd64
|
884 login amd64
|
||||||
852 busybox amd64
|
852 busybox amd64
|
||||||
843 libbrotli1 amd64
|
843 libbrotli1 amd64
|
||||||
812 lua-luv amd64
|
812 lua-luv amd64
|
||||||
785 musl amd64
|
785 musl amd64
|
||||||
780 rsync amd64
|
781 rsync amd64
|
||||||
765 libdw1t64 amd64
|
765 libdw1t64 amd64
|
||||||
761 libzstd1 amd64
|
761 libzstd1 amd64
|
||||||
751 libsepol2 amd64
|
751 libsepol2 amd64
|
||||||
745 libsource-highlight4t64 amd64
|
745 libsource-highlight4t64 amd64
|
||||||
735 python3.12 amd64
|
736 python3.12 amd64
|
||||||
732 xz-utils amd64
|
732 xz-utils amd64
|
||||||
708 tar amd64
|
708 tar amd64
|
||||||
698 lib32quadmath0 amd64
|
|
||||||
672 perl amd64
|
672 perl amd64
|
||||||
647 ncurses-bin amd64
|
647 ncurses-bin amd64
|
||||||
635 libpcre2-8-0 amd64
|
635 libpcre2-8-0 amd64
|
||||||
629 libonig5 amd64
|
629 libonig5 amd64
|
||||||
624 python3-pyelftools all
|
624 python3-pyelftools all
|
||||||
|
614 lib32quadmath0 amd64
|
||||||
602 libluajit-5.1-2 amd64
|
602 libluajit-5.1-2 amd64
|
||||||
560 binutils-common amd64
|
564 binutils-common amd64
|
||||||
556 libtinfo6 amd64
|
556 libtinfo6 amd64
|
||||||
554 libpcre2-32-0 amd64
|
554 libpcre2-32-0 amd64
|
||||||
|
553 gcc-13 amd64
|
||||||
552 findutils amd64
|
552 findutils amd64
|
||||||
543 libgmp10 amd64
|
543 libgmp10 amd64
|
||||||
542 gcc-13 amd64
|
540 libldap2 amd64
|
||||||
538 libext2fs2t64 amd64
|
538 libext2fs2t64 amd64
|
||||||
536 zip amd64
|
536 zip amd64
|
||||||
536 libldap2 amd64
|
521 curl amd64
|
||||||
520 curl amd64
|
|
||||||
512 python3-yaml amd64
|
512 python3-yaml amd64
|
||||||
508 libbabeltrace1 amd64
|
508 libbabeltrace1 amd64
|
||||||
496 libssh-4 amd64
|
496 libssh-4 amd64
|
||||||
493 debconf all
|
493 debconf all
|
||||||
467 libreadline8t64 amd64
|
467 libreadline8t64 amd64
|
||||||
452 diffutils amd64
|
452 diffutils amd64
|
||||||
|
426 libgssapi-krb5-2 amd64
|
||||||
426 base-files amd64
|
426 base-files amd64
|
||||||
425 libgssapi-krb5-2 amd64
|
|
||||||
424 libnettle8t64 amd64
|
424 libnettle8t64 amd64
|
||||||
424 htop amd64
|
424 htop amd64
|
||||||
422 libncursesw6 amd64
|
422 libncursesw6 amd64
|
||||||
@@ -528,16 +549,16 @@ Packages sorted by Installed-Size:
|
|||||||
386 ca-certificates all
|
386 ca-certificates all
|
||||||
384 ncurses-base all
|
384 ncurses-base all
|
||||||
384 libexpat1 amd64
|
384 libexpat1 amd64
|
||||||
378 liblzma5 amd64
|
379 liblzma5 amd64
|
||||||
375 unzip amd64
|
375 unzip amd64
|
||||||
374 lib32gomp1 amd64
|
373 libgomp1 amd64
|
||||||
372 libgomp1 amd64
|
|
||||||
367 libmount1 amd64
|
367 libmount1 amd64
|
||||||
358 libjq1 amd64
|
358 libjq1 amd64
|
||||||
357 bfs amd64
|
357 bfs amd64
|
||||||
355 ninja-build amd64
|
355 ninja-build amd64
|
||||||
351 libx32gomp1 amd64
|
351 libx32gomp1 amd64
|
||||||
348 mount amd64
|
348 mount amd64
|
||||||
|
346 lib32gomp1 amd64
|
||||||
344 libcrypt-dev amd64
|
344 libcrypt-dev amd64
|
||||||
344 grep amd64
|
344 grep amd64
|
||||||
340 sed amd64
|
340 sed amd64
|
||||||
@@ -546,11 +567,11 @@ Packages sorted by Installed-Size:
|
|||||||
336 libncurses6 amd64
|
336 libncurses6 amd64
|
||||||
328 cpio amd64
|
328 cpio amd64
|
||||||
314 libudev1 amd64
|
314 libudev1 amd64
|
||||||
310 libctf-nobfd0 amd64
|
311 libx32quadmath0 amd64
|
||||||
309 less amd64
|
309 less amd64
|
||||||
|
307 libctf-nobfd0 amd64
|
||||||
305 libsource-highlight-common all
|
305 libsource-highlight-common all
|
||||||
300 libquadmath0 amd64
|
300 libquadmath0 amd64
|
||||||
299 libx32quadmath0 amd64
|
|
||||||
289 libblkid1 amd64
|
289 libblkid1 amd64
|
||||||
288 libsemanage2 amd64
|
288 libsemanage2 amd64
|
||||||
288 bsdutils amd64
|
288 bsdutils amd64
|
||||||
@@ -559,9 +580,9 @@ Packages sorted by Installed-Size:
|
|||||||
273 patchelf amd64
|
273 patchelf amd64
|
||||||
273 mawk amd64
|
273 mawk amd64
|
||||||
270 pax-utils amd64
|
270 pax-utils amd64
|
||||||
269 libpam-modules-bin amd64
|
270 libpam-modules-bin amd64
|
||||||
264 libuv1t64 amd64
|
264 libuv1t64 amd64
|
||||||
257 libk5crypto3 amd64
|
258 libk5crypto3 amd64
|
||||||
255 libipc-run-perl all
|
255 libipc-run-perl all
|
||||||
254 base-passwd amd64
|
254 base-passwd amd64
|
||||||
245 rpcsvc-proto amd64
|
245 rpcsvc-proto amd64
|
||||||
@@ -572,43 +593,43 @@ Packages sorted by Installed-Size:
|
|||||||
232 lz4 amd64
|
232 lz4 amd64
|
||||||
232 libctf0 amd64
|
232 libctf0 amd64
|
||||||
231 moreutils amd64
|
231 moreutils amd64
|
||||||
231 lib32gcc-s1 amd64
|
|
||||||
230 librhash0 amd64
|
230 librhash0 amd64
|
||||||
226 libcrypt1 amd64
|
226 libcrypt1 amd64
|
||||||
224 libidn2-0 amd64
|
224 libidn2-0 amd64
|
||||||
224 debianutils amd64
|
224 debianutils amd64
|
||||||
|
223 lib32gcc-s1 amd64
|
||||||
218 patch amd64
|
218 patch amd64
|
||||||
218 libluajit-5.1-common all
|
218 libluajit-5.1-common all
|
||||||
215 patchutils amd64
|
215 patchutils amd64
|
||||||
214 ucf all
|
214 ucf all
|
||||||
211 libmagic1t64 amd64
|
211 libmagic1t64 amd64
|
||||||
208 libpam0g amd64
|
209 libpam0g amd64
|
||||||
207 libuchardet0 amd64
|
207 libuchardet0 amd64
|
||||||
206 proot amd64
|
206 proot amd64
|
||||||
202 python3-pycurl amd64
|
202 python3-pycurl amd64
|
||||||
200 libselinux1 amd64
|
200 libselinux1 amd64
|
||||||
200 libnghttp2-14 amd64
|
200 libnghttp2-14 amd64
|
||||||
|
200 libelf1t64 amd64
|
||||||
199 execstack amd64
|
199 execstack amd64
|
||||||
198 libtree-sitter0 amd64
|
198 libtree-sitter0 amd64
|
||||||
197 libgcc-s1 amd64
|
197 libgcc-s1 amd64
|
||||||
196 libxcb1 amd64
|
196 libxcb1 amd64
|
||||||
196 libelf1t64 amd64
|
188 libx32gcc-s1 amd64
|
||||||
187 libunwind8 amd64
|
187 libunwind8 amd64
|
||||||
187 dash amd64
|
187 dash amd64
|
||||||
185 libgpg-error0 amd64
|
185 libgpg-error0 amd64
|
||||||
184 libx32gcc-s1 amd64
|
|
||||||
176 libcares2 amd64
|
176 libcares2 amd64
|
||||||
172 libnl-3-200 amd64
|
172 libnl-3-200 amd64
|
||||||
171 libsmartcols1 amd64
|
171 libsmartcols1 amd64
|
||||||
|
163 zlib1g amd64
|
||||||
163 lzip amd64
|
163 lzip amd64
|
||||||
162 zlib1g amd64
|
160 binutils amd64
|
||||||
159 binutils amd64
|
158 zlib1g i386
|
||||||
157 zlib1g i386
|
|
||||||
157 lzop amd64
|
157 lzop amd64
|
||||||
157 liblzo2-2 amd64
|
157 liblzo2-2 amd64
|
||||||
155 liblz4-1 amd64
|
155 liblz4-1 amd64
|
||||||
154 python3-argcomplete all
|
|
||||||
151 libaudit1 amd64
|
151 libaudit1 amd64
|
||||||
|
150 python3-argcomplete all
|
||||||
149 libmpc3 amd64
|
149 libmpc3 amd64
|
||||||
148 libsasl2-2 amd64
|
148 libsasl2-2 amd64
|
||||||
148 libcc1-0 amd64
|
148 libcc1-0 amd64
|
||||||
@@ -616,32 +637,33 @@ Packages sorted by Installed-Size:
|
|||||||
143 libseccomp2 amd64
|
143 libseccomp2 amd64
|
||||||
137 librtmp1 amd64
|
137 librtmp1 amd64
|
||||||
136 libhiredis1.1.0 amd64
|
136 libhiredis1.1.0 amd64
|
||||||
132 libkrb5support0 amd64
|
133 libkrb5support0 amd64
|
||||||
131 libipt2 amd64
|
131 libipt2 amd64
|
||||||
130 init-system-helpers all
|
130 init-system-helpers all
|
||||||
129 bubblewrap amd64
|
130 bubblewrap amd64
|
||||||
|
127 libsframe1 amd64
|
||||||
127 libbsd0 amd64
|
127 libbsd0 amd64
|
||||||
126 time amd64
|
126 time amd64
|
||||||
126 libsframe1 amd64
|
|
||||||
123 libtimedate-perl all
|
123 libtimedate-perl all
|
||||||
121 libtasn1-6 amd64
|
122 libtasn1-6 amd64
|
||||||
120 libpopt0 amd64
|
120 libpopt0 amd64
|
||||||
115 libitm1 amd64
|
115 libitm1 amd64
|
||||||
113 lib32itm1 amd64
|
113 gcc-13-base amd64
|
||||||
112 jq amd64
|
112 jq amd64
|
||||||
|
112 gcc-14-base i386
|
||||||
|
112 gcc-14-base amd64
|
||||||
111 python3-minimal amd64
|
111 python3-minimal amd64
|
||||||
110 gcc-14-base i386
|
109 libx32itm1 amd64
|
||||||
110 gcc-14-base amd64
|
|
||||||
110 gcc-13-base amd64
|
|
||||||
109 bzip2 amd64
|
109 bzip2 amd64
|
||||||
107 sysvinit-utils amd64
|
107 sysvinit-utils amd64
|
||||||
105 libx32itm1 amd64
|
107 libwrap0 amd64
|
||||||
105 libc-dev-bin amd64
|
106 libc-dev-bin amd64
|
||||||
|
105 lib32itm1 amd64
|
||||||
103 libio-pty-perl amd64
|
103 libio-pty-perl amd64
|
||||||
100 libassuan0 amd64
|
100 libassuan0 amd64
|
||||||
99 libpsl5t64 amd64
|
99 libpsl5t64 amd64
|
||||||
98 libmspack0t64 amd64
|
98 libmspack0t64 amd64
|
||||||
97 libcap2 amd64
|
98 libcap2 amd64
|
||||||
96 liburing2 amd64
|
96 liburing2 amd64
|
||||||
95 libunibilium4 amd64
|
95 libunibilium4 amd64
|
||||||
95 libjansson4 amd64
|
95 libjansson4 amd64
|
||||||
@@ -652,8 +674,8 @@ Packages sorted by Installed-Size:
|
|||||||
90 libxxhash0 amd64
|
90 libxxhash0 amd64
|
||||||
84 libuuid1 amd64
|
84 libuuid1 amd64
|
||||||
83 libtalloc2 amd64
|
83 libtalloc2 amd64
|
||||||
82 python3 amd64
|
|
||||||
82 cabextract amd64
|
82 cabextract amd64
|
||||||
|
81 python3 amd64
|
||||||
81 libbzip3-0 amd64
|
81 libbzip3-0 amd64
|
||||||
79 libsensors5 amd64
|
79 libsensors5 amd64
|
||||||
79 libmd0 amd64
|
79 libmd0 amd64
|
||||||
@@ -669,11 +691,13 @@ Packages sorted by Installed-Size:
|
|||||||
69 liberror-perl all
|
69 liberror-perl all
|
||||||
69 libdebuginfod1t64 amd64
|
69 libdebuginfod1t64 amd64
|
||||||
67 libpipeline1 amd64
|
67 libpipeline1 amd64
|
||||||
|
66 libhttp-parser2.9 amd64
|
||||||
66 bzip3 amd64
|
66 bzip3 amd64
|
||||||
63 sensible-utils all
|
63 sensible-utils all
|
||||||
63 libtermkey1 amd64
|
63 libtermkey1 amd64
|
||||||
63 file amd64
|
63 file amd64
|
||||||
61 ksh all
|
61 ksh all
|
||||||
|
60 python3-tomli all
|
||||||
60 libcap-ng0 amd64
|
60 libcap-ng0 amd64
|
||||||
60 libattr1 amd64
|
60 libattr1 amd64
|
||||||
57 libcom-err2 amd64
|
57 libcom-err2 amd64
|
||||||
@@ -681,13 +705,13 @@ Packages sorted by Installed-Size:
|
|||||||
51 logsave amd64
|
51 logsave amd64
|
||||||
51 libutempter0 amd64
|
51 libutempter0 amd64
|
||||||
50 libdebuginfod-common all
|
50 libdebuginfod-common all
|
||||||
|
49 libatomic1 amd64
|
||||||
48 libmsgpackc2 amd64
|
48 libmsgpackc2 amd64
|
||||||
47 python3-xmltodict all
|
47 python3-xmltodict all
|
||||||
|
47 libx32atomic1 amd64
|
||||||
47 libsigsegv2 amd64
|
47 libsigsegv2 amd64
|
||||||
46 hostname amd64
|
46 hostname amd64
|
||||||
45 libatomic1 amd64
|
|
||||||
44 python3-zstd amd64
|
44 python3-zstd amd64
|
||||||
43 libx32atomic1 amd64
|
|
||||||
42 libnpth0t64 amd64
|
42 libnpth0t64 amd64
|
||||||
41 libxdmcp6 amd64
|
41 libxdmcp6 amd64
|
||||||
41 libkeyutils1 amd64
|
41 libkeyutils1 amd64
|
||||||
@@ -700,8 +724,9 @@ Packages sorted by Installed-Size:
|
|||||||
34 libtime-duration-perl all
|
34 libtime-duration-perl all
|
||||||
34 libgdbm-compat4t64 amd64
|
34 libgdbm-compat4t64 amd64
|
||||||
33 libxau6 amd64
|
33 libxau6 amd64
|
||||||
|
31 python3-tomli-w all
|
||||||
29 ubuntu-keyring all
|
29 ubuntu-keyring all
|
||||||
28 g++-13 amd64
|
29 g++-13 amd64
|
||||||
27 libpython3-stdlib amd64
|
27 libpython3-stdlib amd64
|
||||||
26 libsemanage-common all
|
26 libsemanage-common all
|
||||||
25 libsensors-config all
|
25 libsensors-config all
|
||||||
@@ -709,6 +734,7 @@ Packages sorted by Installed-Size:
|
|||||||
20 cpp-x86-64-linux-gnu amd64
|
20 cpp-x86-64-linux-gnu amd64
|
||||||
17 lsb-release all
|
17 lsb-release all
|
||||||
17 libaudit-common all
|
17 libaudit-common all
|
||||||
|
16 unminimize amd64
|
||||||
13 g++ amd64
|
13 g++ amd64
|
||||||
11 g++-x86-64-linux-gnu amd64
|
11 g++-x86-64-linux-gnu amd64
|
||||||
11 cpp-13 amd64
|
11 cpp-13 amd64
|
||||||
|
|||||||
@@ -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$,) { }
|
||||||
|
|||||||
@@ -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$,) { }
|
||||||
|
|||||||
@@ -6,8 +6,9 @@ argv0=$0; argv0abs=$(readlink -fn "$argv0"); argv0dir=$(dirname "$argv0abs")
|
|||||||
#
|
#
|
||||||
# Copyright (C) Markus Franz Xaver Johannes Oberhumer
|
# Copyright (C) Markus Franz Xaver Johannes Oberhumer
|
||||||
#
|
#
|
||||||
# mimic running "ctest", i.e. the "test" section of CMakeLists.txt; does not redirect stdout
|
# mimic running "ctest", i.e. the "test" section of CMakeLists.txt
|
||||||
# (allows freely setting $upx_exe_runner, while CMake is restricted to configure-time settings)
|
# - does not redirect stdout
|
||||||
|
# - allows freely setting $upx_exe_runner, while CMake is restricted to configure-time settings
|
||||||
#
|
#
|
||||||
# requires:
|
# requires:
|
||||||
# $upx_exe (required, but with convenience fallback "./upx")
|
# $upx_exe (required, but with convenience fallback "./upx")
|
||||||
@@ -48,7 +49,7 @@ if ! "${run_upx[@]}" --help >/dev/null; then echo "UPX-ERROR: FATAL: upx --help
|
|||||||
#***********************************************************************
|
#***********************************************************************
|
||||||
# see CMakeLists.txt
|
# see CMakeLists.txt
|
||||||
#
|
#
|
||||||
# IDEA: create a Makefile and use "make -j" so that these tests can
|
# IDEA: create a Makefile and use "make -j8" so that these tests can
|
||||||
# run in parallel much like "ctest --parallel 8"
|
# run in parallel much like "ctest --parallel 8"
|
||||||
#***********************************************************************
|
#***********************************************************************
|
||||||
|
|
||||||
|
|||||||
+147
-147
@@ -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="\
|
||||||
ef49d1c9617dbb3dc1bb36ab70df8a263cd816cc5e91ad28cc62f91ccc77afa7 *amd64-linux.elf/upx-3.91
|
919f31ec6a70a81159f4fc1d3cd4e9d66800a242df2fac9e339a36e1bf648091 *amd64-linux.elf/upx-3.91
|
||||||
253b1542cdcd5d554eb442e263eb44e400f00e63cfd4d0d727eacec5fcdbbd00 *amd64-linux.elf/upx-3.95
|
548e950c9f082eb0eb42b18411bbc257365cfc9c937ab20f501ebf0db5850d25 *amd64-linux.elf/upx-3.95
|
||||||
d96c42d14684e7248de5712310364eafa28b337695bc0d8c37f91d593b869250 *amd64-win64.pe/upx-3.95.exe
|
822718cc0f6ac5e57bb23eeb65be6f3f7e73df8b062853abddcc924ec8207596 *amd64-win64.pe/upx-3.95.exe
|
||||||
c1d3b9ec3157f068097f5deffddce4fc4d3d95602daa539992e0accff6af0de8 *arm-linux.elf/upx-3.95
|
4d8b2a8f29b38e097287e550d11810d7ecd4c5f07744545b3a315de908987bf6 *arm-linux.elf/upx-3.95
|
||||||
9ca862c0c92d7e4068145024486bb85a6031bf06f9a37c6af543234e08e8ab36 *arm-wince.pe/upx-3.91.exe
|
1440d6b44968954baf56fbc2a0739a51873455876114d4445ae4b67cb5e7893b *arm-wince.pe/upx-3.91.exe
|
||||||
9173b4e4b1ac0b92e63dc51168dbd41d38208520b0f4c17b91d22e584ad55ae4 *arm64-linux.elf/upx-3.95
|
04c08626d4b03a4e969018eed7093c24de191b5d27db2a25221b134827806929 *arm64-linux.elf/upx-3.95
|
||||||
8c6c5f1678fb74d2f65a1e6c28e3089a4b99b49939fabac3ca1f71183bc73ffa *armeb-linux.elf/upx-3.91
|
6c8b276a0b611402d336b43cf8514b9a8d98be4f55a8301e784b7b88031b2b85 *armeb-linux.elf/upx-3.91
|
||||||
13caa682f323a0438a651f53768af9b7fb1208980d46d94c6fb984ecf4422599 *armeb-linux.elf/upx-3.95
|
dcd0c0060d44886966ae4e97b79a2c172f02d56228ea76dbc5c880ad59ef4ee5 *armeb-linux.elf/upx-3.95
|
||||||
55f30818e45da393628aa80c3518f3cf099666ae3af5014bded2196ea28ddaea *i386-dos32.djgpp2.coff/upx-3.91.exe
|
a7ee051c5f9dcf233e2ee248274121b99fb8f098eff95469bc0638a7423723f0 *i386-dos32.djgpp2.coff/upx-3.91.exe
|
||||||
6b80b2be79ec38af3071fcaf8f0d0ec524e4523e7e52e2f10111862ab93ec793 *i386-dos32.djgpp2.coff/upx-3.95.exe
|
85cf31be166cb59587a99419cdd0fc5a79825d7508ab2c9a4bc0d700d603354d *i386-dos32.djgpp2.coff/upx-3.95.exe
|
||||||
9bb71da401ae398ca42cde73afffe0c0db29fff24f22196c4116636ab6385170 *i386-linux.elf/upx-3.91
|
fc7656d9a877967be7e339bfc98a0c63ea7b5abc30b96fa9e5931c75ecbe9827 *i386-linux.elf/upx-3.91
|
||||||
c2375a808f989c0f8290fcd9760db0033413323d8597deb796f182f8ac38afa2 *i386-linux.elf/upx-3.95
|
d454a7639e96b986ad422b02045ecfefa3b9405901eaa32d92a2c489292b9600 *i386-linux.elf/upx-3.95
|
||||||
892695e1abdc0fbbd110ee30c317fde56947f4a8b3dfe413507ee7665f109986 *i386-win32.pe/upx-3.91.exe
|
934dd17076c0298d35a738533ea668e1fcbf8fc85c6671fcdd3a12e7722502ce *i386-win32.pe/upx-3.91.exe
|
||||||
f76ec227836388da3174007e2c5e27fb6cb397a83297872e78befb298a65796d *i386-win32.pe/upx-3.95.exe
|
519a9f6b3de56f5f080151074b9d5d81e31c1961cd6e395f73d2d522b7f7f8e0 *i386-win32.pe/upx-3.95.exe
|
||||||
8f7c5b3d67c78c117c02bec8b30ec5fca7baa79a35d250a4d981cb7137f8635d *m68k-atari.tos/upx-3.91.ttp
|
a7bd9f616231d883f6700b09e3c9a0af2880c6b5e5b0ce1cd8f06de43c48856c *m68k-atari.tos/upx-3.91.ttp
|
||||||
745ac3afd263f3a653165bd229e35c817a58c9b894a8d6fbd4e5aaf6c38c1264 *mips-linux.elf/upx-3.95
|
7a0479691e51ea4a8a0246a1f0ffa9694ee2f0e0cf3aa43dc0f1324c4d427ba3 *mips-linux.elf/upx-3.95
|
||||||
a11da76425bc3bb308de3c19e6df22f56bf12c95afcf96ee8c2d4aaeda07ac8a *mipsel-linux.elf/upx-3.91
|
f60bab42fe3914109ab1b9f5d00a5be753cd0a2c1a79a3998d58800efedbfff7 *mipsel-linux.elf/upx-3.91
|
||||||
76c458e8e9b94eceb60d8c51f602a5dec44b2617886ea0b5b7b8802c61d962e9 *mipsel-linux.elf/upx-3.95
|
b6d8cc9e2023a3fc415166afc378ccf2eb505487df84c8d959ec74b3fb4f8256 *mipsel-linux.elf/upx-3.95
|
||||||
cec277d9e6e0cbf551f697c1d52e5d29b48533efbe4269df0aafbc12731a93ed *powerpc-linux.elf/upx-3.91
|
acd3dc5ed3e4c4eeaa42e7cca71a79d687dd844ce5f384666ed6e78327b5a8e3 *powerpc-linux.elf/upx-3.91
|
||||||
92c6cec7bf40d1aa5a62a55fce95bb99d94c5b477edbea127ee0468471ddbdb3 *powerpc-linux.elf/upx-3.95
|
03600584c97fa466ef58239452baf9ec6ff2f06b79d97d45c8490953080de6e3 *powerpc-linux.elf/upx-3.95
|
||||||
df2f12597c901196e8f10782e72fb4c294955f03a66cc4e8bf3c24414929f717 *powerpc64le-linux.elf/upx-3.95
|
2aa45e314e83a7ecc548a5116048a981755d00c3e102bd9a9fc6e9a2356047be *powerpc64le-linux.elf/upx-3.95
|
||||||
"
|
"
|
||||||
expected_sha256sums__t120_compress_ucl_nrv2d_3_no_filter="\
|
expected_sha256sums__t120_compress_ucl_nrv2d_3_no_filter="\
|
||||||
f7e51450a373cb49f88e3e17c268f4198429f7ad06bed57dda28161b5383196a *amd64-linux.elf/upx-3.91
|
c5bafac11df5a38c1b72fd070373a0e1d5a066527129937c5bc9a280e21ad656 *amd64-linux.elf/upx-3.91
|
||||||
15c57828824d18604519fd43349f0340ccebfddf246ab355f8f30253123132ea *amd64-linux.elf/upx-3.95
|
6cc1e01ac0b6140464a06f5aefb51c0388fdfe28f264a38061b50b3508203c07 *amd64-linux.elf/upx-3.95
|
||||||
728b2feceda3cfdd849aef4402d5d4e61aa6fa6d56266e7730b148dc66f4a7b0 *amd64-win64.pe/upx-3.95.exe
|
5ab022e2c3ecb09931e2181fb5f7699f35e2b453b54c823e42653c84b0df5f2c *amd64-win64.pe/upx-3.95.exe
|
||||||
188a3581ed2bac5fdfd50e08267e2e9cf4cf3ddbfc9f5ae15643298bda4bf11c *arm-linux.elf/upx-3.95
|
e21b2305df2c1896eeae61010c3b65d8a50d476ea4a9bab6ec2fa4f9a0bed5a6 *arm-linux.elf/upx-3.95
|
||||||
0711f0b8531de9659f099f43f2a883d628bee8de67f927e7137c19c6d23a30bd *arm-wince.pe/upx-3.91.exe
|
53121baf42c85991900aa3947f3d817fe6e894bc6f325ab1d576de6fba5fbcbf *arm-wince.pe/upx-3.91.exe
|
||||||
ae6fa69b1242bdfe808d64b7bbefddfe9c1c96302627ee8c65fa2851102fc502 *arm64-linux.elf/upx-3.95
|
7431abc46f0960311364ecd690965dd1fc74b2de4baca8e0af8f966735b6372e *arm64-linux.elf/upx-3.95
|
||||||
7586b4029355eff2edf25141835ee2405ab9f936956e56420315c3d3fecc8bda *armeb-linux.elf/upx-3.91
|
8b67fc95dc555c2de4e3d0c85e4ab977f4c3fba24d68a2f9c402c51e08ad5f3b *armeb-linux.elf/upx-3.91
|
||||||
e37875b1a91ef3c88bdba113649a061b72239dbfe77b77077c51254037a982b6 *armeb-linux.elf/upx-3.95
|
c3b3e5b0a379022b26bae96432c3f5f946990f45b0b26afe056afe1170bf33c7 *armeb-linux.elf/upx-3.95
|
||||||
536e5a6bb18378f3eea81be12f218f4da60ea81eddf480434aaf418610e4e52d *i386-dos32.djgpp2.coff/upx-3.91.exe
|
51e4faea51e12c7442b27bb50150f532ac51d8102f77a669cbce82f2675a2ef2 *i386-dos32.djgpp2.coff/upx-3.91.exe
|
||||||
386f3037b26b8b2ce49a527028d738956e7ef649b29a0ef15e32acef4a3b291a *i386-dos32.djgpp2.coff/upx-3.95.exe
|
1196f578ab0b862bae8ac6b5166b770f072cf0ac521a2a23a6347c19ea82a0da *i386-dos32.djgpp2.coff/upx-3.95.exe
|
||||||
5761d8e12b01163c2bf378bef813df9a621da08c4508773db992a1cce067c70c *i386-linux.elf/upx-3.91
|
3015651261f28fb43ed43a8c1fa257bcfcdc788e6fd3f436f3de23733736c724 *i386-linux.elf/upx-3.91
|
||||||
8afc2b549e2f78987641045697afaac0378b48e84c3e946334c9e4f1a7e693fa *i386-linux.elf/upx-3.95
|
8cca96ea354af889f5e9d3074b2c7005f982463a3f22e1cca2bc01aed9232de1 *i386-linux.elf/upx-3.95
|
||||||
1cc6663f3d9e847f9fec39a52c8efe38b39a66074c0ad77a880a84dde7c68d3f *i386-win32.pe/upx-3.91.exe
|
3edf364443a3cd56efd04e95cc7d7c1846bf76addedd7263cfe8330771f19509 *i386-win32.pe/upx-3.91.exe
|
||||||
edf158ec6064e9b11b677a73239a70e414fa8c4f3b8950f74e81514ccb28ef4f *i386-win32.pe/upx-3.95.exe
|
48141fd66443f85ea867d7fa0bb3a50debb10f15bdb26c71888026e17c88d3a8 *i386-win32.pe/upx-3.95.exe
|
||||||
faa36b6601743dcc5eaedb57187a893006652b6c68acecff179ce2cd123e6209 *m68k-atari.tos/upx-3.91.ttp
|
07e1c09a953a9c87afa33d1236f46244280161bf3802273a523d380318886177 *m68k-atari.tos/upx-3.91.ttp
|
||||||
6c76928b5914b5c2e072bf2f90a2c95049cc41aec6b98b1f0b3c4f84df069f02 *mips-linux.elf/upx-3.95
|
39b3a5c780d9354714d5e2ed69068511422f8faf9ab660706adc8ad5ecdf3598 *mips-linux.elf/upx-3.95
|
||||||
029c2a47f1f613c538d2f39674167489a9d1bbbb6649a06d51d2b5ea983b4924 *mipsel-linux.elf/upx-3.91
|
123ce137e4cd555470fcf9fe67df75179b6f337fee66d075ddc06f9848817a37 *mipsel-linux.elf/upx-3.91
|
||||||
4d837edcaf344505ad1a3721ec8e5db35ddaa273a747201e460b946c0a89d6ea *mipsel-linux.elf/upx-3.95
|
b78d8cd3a3402fed266c737cc34a32cc21b2b67b573e9e9071d4faf9fca89b89 *mipsel-linux.elf/upx-3.95
|
||||||
0e24a9e58939f7aacd3482db24e04bdac406a658dbb8d5e65d71d76d455e5aa5 *powerpc-linux.elf/upx-3.91
|
ea9cae1d1701db3a0c53e9a651766db5bdc30032f48913a4a9e99f193a800acc *powerpc-linux.elf/upx-3.91
|
||||||
04bd4885f37c77a34b39e76cca2fd363f794ed1611093d7fffe1ee19920ce1dd *powerpc-linux.elf/upx-3.95
|
aea86bf87870a1e48a454ac1ea9a80d90d8abe5113d418a71d8a9c4a74bb2d0a *powerpc-linux.elf/upx-3.95
|
||||||
3b6be5bff0e435a8dbd8529562912c58dafdcb9694d75564238f3d086048abd2 *powerpc64le-linux.elf/upx-3.95
|
4b0c280570213f2cd94dad68aa8251baf05f817b4a569dda9444ff0d3adbb33d *powerpc64le-linux.elf/upx-3.95
|
||||||
"
|
"
|
||||||
expected_sha256sums__t130_compress_ucl_nrv2e_3_no_filter="\
|
expected_sha256sums__t130_compress_ucl_nrv2e_3_no_filter="\
|
||||||
715de64e0911c959d0ea208db13bf23a5e635e97e73feb9e04ac9d32117e6a3f *amd64-linux.elf/upx-3.91
|
509bc9676a0f5f5ce6df118da8e792151db816fcce5490eadc87fc525aad5a35 *amd64-linux.elf/upx-3.91
|
||||||
da805c93ffea03da2f0c0dbb1b313cf0d88ef2c0cb0ad77b0be792210106cd6c *amd64-linux.elf/upx-3.95
|
e8d6bf8204c6bf5d170ca8d4c9cb48b3b7a48b04d665dd6e111980081fcba3b3 *amd64-linux.elf/upx-3.95
|
||||||
213e6d3c80b4d741e8c78da915d32c1a2b74072d31e86ec46a10ac2535cf8f6f *amd64-win64.pe/upx-3.95.exe
|
7bd7cd37093200fa94d21dd7fdfef4d7fb9c3049fbf5f408f1f242cb8d9c6a55 *amd64-win64.pe/upx-3.95.exe
|
||||||
3a66e868147347208935c042517b9f0e2e30d2dbb5c004ec8df6a9ab1e42ecd5 *arm-linux.elf/upx-3.95
|
4424d813ae55bec589779461c4d4b25361a58ea91659f4a12a7a2d08158cea64 *arm-linux.elf/upx-3.95
|
||||||
8d295980b1e6a8240bf75b86a9b8e4561424cbabeab01246f51e553d84b40839 *arm-wince.pe/upx-3.91.exe
|
ad0a7a18e87657d28260b7c527d284863becd3c5f92259c570125465f88d4042 *arm-wince.pe/upx-3.91.exe
|
||||||
194947a439c1348570e45343e404c409be3f10feb70fdd87d9bca0addc772c44 *arm64-linux.elf/upx-3.95
|
0bbeb73af475bc852313074a14360ae863364175d7fbd4c2f3450790bc3a58ee *arm64-linux.elf/upx-3.95
|
||||||
a01384f43803428e0bfc5f8152304eb8618ef862e4e996a4a4fa4dd9c4576833 *armeb-linux.elf/upx-3.91
|
7da4a04118f50824821c00f4f9abf6056128ac33de6ac45a145fb5d4810850d9 *armeb-linux.elf/upx-3.91
|
||||||
f2fdba359d52bb82fbab093176a3fbf37b9cb13e8d297523ed57051c3bd401e3 *armeb-linux.elf/upx-3.95
|
b4191959889ecb2b9bd2dd046318b414ab5a8268517572017466fbc9c986925e *armeb-linux.elf/upx-3.95
|
||||||
582030394a570f92be2d31b3862ab7fb0a6f08982c793a4d41c1471d2cabb939 *i386-dos32.djgpp2.coff/upx-3.91.exe
|
6fcdc8e34ce8b3501db2260c8a921c6e963954fdeffedfefca353a27bcc02d56 *i386-dos32.djgpp2.coff/upx-3.91.exe
|
||||||
f60dc2f332f58b7fa08f551f8c33d645d71d9ee79e2a719130d10ea4091373ef *i386-dos32.djgpp2.coff/upx-3.95.exe
|
6f4f901c1838252f9b3104060475a6f13a2ebec830096ff28d870148580e4287 *i386-dos32.djgpp2.coff/upx-3.95.exe
|
||||||
13887e5466a7d0fc2652aedcef44e33e6ee9b8d6f0ac21dbc4ec90fcc0613bfa *i386-linux.elf/upx-3.91
|
8127f8380300508e8062e9391e321abd0429a6a31fec41e769cc7fe80af27e27 *i386-linux.elf/upx-3.91
|
||||||
636759f884399ff05e8493a759f60ea52cd4640eb5e9760f12fc25fbf730b1ed *i386-linux.elf/upx-3.95
|
b0a7e6b822f038b7940a54ea160b045d2241e3dfa15a5081a23fbc4d42fb6773 *i386-linux.elf/upx-3.95
|
||||||
c4a5d27ce7d8f0f326e49489223eda188a9be61971a88758a559efb9f854611a *i386-win32.pe/upx-3.91.exe
|
c78db15a8113b806e56812fd842fb467d2a9c9557fcdc0467dae3f4c33316630 *i386-win32.pe/upx-3.91.exe
|
||||||
4ca9a3dd0e0ec38cc1aa3720d9c666f86df4fbe9dcb87ef0dad56d0a47dc327a *i386-win32.pe/upx-3.95.exe
|
89314e8621c4a00e1a65e045686245d3c1e2ba0a858f1dcc8f3cc2d0eedccfb5 *i386-win32.pe/upx-3.95.exe
|
||||||
f34a020e6325d213052d9f09c775c4d292c34c51380b1ab1b22c6663645167f0 *m68k-atari.tos/upx-3.91.ttp
|
710ad88b63cc7e0fa0b413ebdbcebf41140678f551b5dd883ed6220507be3601 *m68k-atari.tos/upx-3.91.ttp
|
||||||
3006af1262a29173c46340f1ee4526fba41145f7476841d5bf6b499aa6dea0fd *mips-linux.elf/upx-3.95
|
c7e3478872650b7f4f8ccb4a0649944e62f44f5a9249cb9425210333e1f2fdf4 *mips-linux.elf/upx-3.95
|
||||||
6af81d3c7cb6f1388925fe2d78ea96313d91d5e17249268739de4d56857f27bd *mipsel-linux.elf/upx-3.91
|
cd9b3d3780a79cb416b261d622e8e86f2369fa8bb9bc49b529c50cac2980d528 *mipsel-linux.elf/upx-3.91
|
||||||
9d3849cd0037ef550703c574e0ccb3032b0d27217ec02c90a0ad8592d2a229f1 *mipsel-linux.elf/upx-3.95
|
5baf7db9e4335c0227106262efc9d18ad23b88c6d6bb636656aea67bb063b6ec *mipsel-linux.elf/upx-3.95
|
||||||
704b6eb2033cf3eab30cbc53c35fc85bf0cb17f904528792de33967a1406091d *powerpc-linux.elf/upx-3.91
|
aba8bd826ee52d533f9e1c4270d4f4194fe8d8747ea10a1d3ce59b6443f1a9f2 *powerpc-linux.elf/upx-3.91
|
||||||
b89b2f3b250ddd156cb857717c86a0c0325a26dd084717c64f3022277ad02be4 *powerpc-linux.elf/upx-3.95
|
6f737ccbf8c830476bed9c4dd33dd7757ea25bf2f8fb03b44d03e9b77ada0f1b *powerpc-linux.elf/upx-3.95
|
||||||
d52f201ab041fa64a4ee4234bd0e443e883e402bb93ced9e22554bd3ef3cc9ab *powerpc64le-linux.elf/upx-3.95
|
91ee0982626eec07e524523d54873790b183aca5bdb27255771fcbfbc081cbc3 *powerpc64le-linux.elf/upx-3.95
|
||||||
"
|
"
|
||||||
expected_sha256sums__t140_compress_lzma_2_no_filter="\
|
expected_sha256sums__t140_compress_lzma_2_no_filter="\
|
||||||
af8536d70ecb8c0680c1c9dc45ef60dcb13fab99f0e4644d9f86216a9cf003e2 *amd64-linux.elf/upx-3.91
|
ed2849169a873bb4070e9d878126f7bc19fb326d1dc6e169901ff3a3026661c3 *amd64-linux.elf/upx-3.91
|
||||||
004a705f4981a19f35767b33bdb70b942717a701ad8635bd56ba33e347c6ed69 *amd64-linux.elf/upx-3.95
|
2b7f9baf27490274fe9301e8a962ac2bae03da0afec67c17df8f8f0e27157891 *amd64-linux.elf/upx-3.95
|
||||||
cf07c202497ab38417ec3ccb65cbb0eb9b87f6c6df40d7dc4b44616282c8e0f8 *amd64-win64.pe/upx-3.95.exe
|
a55ec5a7f2911f6da8b9336daf4f1051e753cfb7a4458c7f7baa6b63340c6daf *amd64-win64.pe/upx-3.95.exe
|
||||||
da153c1747e0e242cc8b90c04362f67caa0aa638562bc12fcc7fe08ebb1b4fcb *arm-linux.elf/upx-3.95
|
8765db7ae04a03af743ad8afc586b943b84b65aca9f1ec240232daa2161ba703 *arm-linux.elf/upx-3.95
|
||||||
9755110ebc951c9767e376155d9c6fee9789b009ce82ae47276664f5c832557e *arm-wince.pe/upx-3.91.exe
|
7a6c603eecf214e5d6742f1fce922223c97c8bd2527678a968640dd6c1bc0d71 *arm-wince.pe/upx-3.91.exe
|
||||||
bb9e92b577ace19da295032c294063d724655cf5b97d014053c3fb05ce478884 *arm64-linux.elf/upx-3.95
|
810aa1e8f15d9617a0fac4bc4e5c5c5219fc44125d41ced661c744d6c5bb9857 *arm64-linux.elf/upx-3.95
|
||||||
a3c639403fd7b2f035315773c1aa3f68cc0532cf5cd075defd34fa44c4bbbb7a *armeb-linux.elf/upx-3.91
|
1dbb05c09fb972c3a5f87ace0c802af48f8b20f7f977f5a14b91dad59800d6a6 *armeb-linux.elf/upx-3.91
|
||||||
3f9604a69a945d86b93f2182ee82f754881331c7ef566d0cd4dc36d7acfa1aa0 *armeb-linux.elf/upx-3.95
|
a1fba814639540616175e0c058267e96f839d85a187b01af764af14ae1b6019c *armeb-linux.elf/upx-3.95
|
||||||
e6518528d60861e37cb8429376628a7f3d1d5fc90f0933facd70b4e9e0b50709 *i386-dos32.djgpp2.coff/upx-3.91.exe
|
7a8eaa5139b95cc56591200fce62d3c9af163671467952cab6fcf487318107bb *i386-dos32.djgpp2.coff/upx-3.91.exe
|
||||||
53280a22c34ee1733007ccf858e1f5416c0f7043a4361799087e19a4b2a7eaf4 *i386-dos32.djgpp2.coff/upx-3.95.exe
|
9b5fc0f54a5f811bda190c36fb2fa5c5b03c6c3de0c62693e4191230b5a419b8 *i386-dos32.djgpp2.coff/upx-3.95.exe
|
||||||
a51ce8993b3577fc2ee45b52174aaadc66c2f90ff53a0148ed096a65d99d24a2 *i386-linux.elf/upx-3.91
|
68b4ce63cb0bd7dd5b287e1f9fa5d9bc234ac36359ce3ebff863984c503a698e *i386-linux.elf/upx-3.91
|
||||||
d018260f04d1efc2b46c8b7ff5b132358e58cb062c158b08a7179fbb561b0e48 *i386-linux.elf/upx-3.95
|
aa75cf22f0b59cc796de678198432a3dc2d40ab871e4989dd97ff1a6c148f294 *i386-linux.elf/upx-3.95
|
||||||
121e4acc3fbad4954cb2d2b957d229b042beaf4b68749c4f85ebfc60fcc80d43 *i386-win32.pe/upx-3.91.exe
|
0e0780f5fccc52f6c78414f7279263b26e31de7c6ca1ec65a240e37cf0a4f5c9 *i386-win32.pe/upx-3.91.exe
|
||||||
d604523130da29af35705d9008098ae8b4bb9e7d4743357674470252dd68b8d3 *i386-win32.pe/upx-3.95.exe
|
3ddd6265d69e374f5f0f8c9f602e0e59c895da2f3fef611ef89f0ee4ae2c592b *i386-win32.pe/upx-3.95.exe
|
||||||
4d26f0be2b6b6c4802515a7f0dfd97998c6d23e696ae6c0393c9ac0893885a9b *m68k-atari.tos/upx-3.91.ttp
|
e268c98fdacfd04268d76644f2bb4746ae04b57801407aaa1867798840eeeea0 *m68k-atari.tos/upx-3.91.ttp
|
||||||
4d3b0c7b4dabb5a7a193a0a2899f086f5dfc555106188131389678ecc137378a *mips-linux.elf/upx-3.95
|
499e1d1486810cfa5b6662e30189183979e25f45d35654d8cd60fd793d0c07d8 *mips-linux.elf/upx-3.95
|
||||||
be2e9fb66c087f37b58f203b406b618526296dd8c9c53e73bb622740f1e377ba *mipsel-linux.elf/upx-3.91
|
4a30189ad7312eafb2d47e1b526ec22eaf614a895f8dce96f3e1c7385438f44c *mipsel-linux.elf/upx-3.91
|
||||||
9da821fac44f787875727cf001ca33ed87e02c5fe477f0ebb965c5e0eb62c26c *mipsel-linux.elf/upx-3.95
|
339d38602413d97d9bba113f39884815af10ebcdccf37e3f5e8d0879f262a048 *mipsel-linux.elf/upx-3.95
|
||||||
98d7c0214663ae47f59244a90aabbb72a798a4ad0c74ce79d448013f5cad6893 *powerpc-linux.elf/upx-3.91
|
6d4f9d4383ebc9d8411d06a7c219dcf3e8513ea8c989f2d31ab382602f873ba5 *powerpc-linux.elf/upx-3.91
|
||||||
c58266817c4e38982c66e4b75e0002c6e7a51710864f930987b8670ee121ee0b *powerpc-linux.elf/upx-3.95
|
5dd727d8d5a35cc0ab86d629285d8ff450f52b538118679edaa886ce9c1fed7d *powerpc-linux.elf/upx-3.95
|
||||||
7fecab59271c9d4596bd79978e112a5fea72e33bd7c53c1985d187009d807724 *powerpc64le-linux.elf/upx-3.95
|
d915a3326dda439c0e30df2bd7abf9856a5b5e039142c4ea74e72cb43c854160 *powerpc64le-linux.elf/upx-3.95
|
||||||
"
|
"
|
||||||
expected_sha256sums__t150_compress_ucl_2_all_filters="\
|
expected_sha256sums__t150_compress_ucl_2_all_filters="\
|
||||||
977380191b474f5a7fa78e8015a279bfaa77626bc56d83185fec8761531b3029 *amd64-linux.elf/upx-3.91
|
fc30606d37c697f5c79742bf6e7d2afa8503e69fc87e52274d00b5210d03157a *amd64-linux.elf/upx-3.91
|
||||||
4f94c9bee7a2f7deed245dc767c215654a41373be978123c3f1ef9074454c59d *amd64-linux.elf/upx-3.95
|
c6d66f6d4f92812801c021a854fbd94745a7b63e0477678b8eb1dc26c5b0a9a4 *amd64-linux.elf/upx-3.95
|
||||||
00aa338efc865f720a901afb1c19064cf137abb71d361be9b19192b0ff8a9479 *amd64-win64.pe/upx-3.95.exe
|
cbb5c90bd9195bd9e3acd931312a70deeccfab5540f398ceda8826f8d6b332bf *amd64-win64.pe/upx-3.95.exe
|
||||||
c1908a58fcc23a9a964f2cd5f76f805a7cc9ca39480d129c6bdb8db30033840b *arm-linux.elf/upx-3.95
|
bb88759de778b1099b51a012f915e646ebfddcbd2fb26b3a1e760fc81a41d2b9 *arm-linux.elf/upx-3.95
|
||||||
78ffa99aa69e2f66f864dce88e787e3b1c0c056009e0f863986d65aabd186107 *arm-wince.pe/upx-3.91.exe
|
76a5f0518fc797bd3f132ce6eb61ca187b5d463f191417883a73d4584716c23a *arm-wince.pe/upx-3.91.exe
|
||||||
245c6bb22ae2b39671503244329f1e4498277b06d600447ad81c7d41ebc872d6 *arm64-linux.elf/upx-3.95
|
7b9290c2ab01632d8baa28b24498fbcd734caf8e3846864bb62a8282de3ffd9a *arm64-linux.elf/upx-3.95
|
||||||
9e359728cdb9bf6ea21a864b2c9da56809eda27d6b88828b85ab815311bf77b6 *armeb-linux.elf/upx-3.91
|
0bafd7837327b590b3be06676ee73c52405e5e4a36a6d06f8b6773e93c499420 *armeb-linux.elf/upx-3.91
|
||||||
86edb5959b5cabad270d7c77e750bc710424b92cfb2ebaeedf3ba403382f4e93 *armeb-linux.elf/upx-3.95
|
aea39071ff8ce0b2a59f30e50603ef2ec39789693a3dd9baa4e6be1e49b4e068 *armeb-linux.elf/upx-3.95
|
||||||
b65db2766ffdd45657a07edd57426c55acce2a73a1e3559ab43903ae77574131 *i386-dos32.djgpp2.coff/upx-3.91.exe
|
aa05c3a2953f0f2d70842cba45786b707a79ffef22fd084f51e304762cc67765 *i386-dos32.djgpp2.coff/upx-3.91.exe
|
||||||
e827d64700b14e8c19de2882e66d0df0fca4cda0255ae41a66810e4c86583a93 *i386-dos32.djgpp2.coff/upx-3.95.exe
|
c677241e9a8753ba1332ac3875ab6398fb2d792d2627edd9e58f2535b3131abe *i386-dos32.djgpp2.coff/upx-3.95.exe
|
||||||
c95a7ad9a5015abb1b8a163afe46b4f1529c70ca4ef9353cfb6e5c7eef60245c *i386-linux.elf/upx-3.91
|
7bcd42f58dcc8ddb6cb1a4e33d56b584fe6d49b002b01a0859571d1324dd593a *i386-linux.elf/upx-3.91
|
||||||
21ef65f5c756f216c0f9db9475a7514e10b8e003c30bc22416ec8156cba65252 *i386-linux.elf/upx-3.95
|
b6fe6220c0b3f4df131da3aaae566810f2aa1f13b63d23de3ead9174d08d82e1 *i386-linux.elf/upx-3.95
|
||||||
6db34f6cdc626c4857fc7b188910562909e571eed3be2116448e244ca82eaa64 *i386-win32.pe/upx-3.91.exe
|
8ec02f816f4727b519e8775edc1afb1df32991319a6c6f050ece416011925379 *i386-win32.pe/upx-3.91.exe
|
||||||
68a08dd3995681af594c66df4b94559e5900f0a09fcf822e3fc2522c3133ad69 *i386-win32.pe/upx-3.95.exe
|
d5aeeedada49c0c2870ea450ed66b2cea31369bccfccf9407378ae0fb0736deb *i386-win32.pe/upx-3.95.exe
|
||||||
1546ce426b3cfe38bdea18fafadee409253d5d2b452aae5476e073b29e17bb58 *m68k-atari.tos/upx-3.91.ttp
|
e414ad0aba43790d0498b26c23055fb051129b6cbe3e070a1406c91ac5b8032b *m68k-atari.tos/upx-3.91.ttp
|
||||||
6ecc64d1fb9fb2a675980ce939b0b8142e802e7218b8ea45f2bb82205ed9242e *mips-linux.elf/upx-3.95
|
c5107a84d32de820c81401259a7dd23435ea625588d56c6c75ad6fa14b0dbf8b *mips-linux.elf/upx-3.95
|
||||||
eb3c90f8f775e70cb2cc187b7e55d66a3bb28fa760e14a17353acd1130fd122a *mipsel-linux.elf/upx-3.91
|
78473f7d7ddf56812b8dee087ca62517ecdbd10fa14972ba6670338fc19061d1 *mipsel-linux.elf/upx-3.91
|
||||||
b47964dbe65e9975d6bddfbfdd321a5e6c96b6eba79b30d0f94ec4323b796991 *mipsel-linux.elf/upx-3.95
|
fd9ea397a29b41a2143f9e02217e181d0075d7ad7d87bdbadc7fc94bfb1b0d76 *mipsel-linux.elf/upx-3.95
|
||||||
c32a2deaa707eafaed36a4ab8fb26bb8d8c63a9743b19ad207e305553d14c7fe *powerpc-linux.elf/upx-3.91
|
c47d1299f6ecf86e62528fc54979117b2b2ddbb6c80f553689402399fc7eab28 *powerpc-linux.elf/upx-3.91
|
||||||
c4dbfbd0f5021d50f1addc68273f20b49204bf26ae8c8896a0aacc7d2c5a2d47 *powerpc-linux.elf/upx-3.95
|
77c3b4ba6909a4e20180bc13775e280086d67240519c323c2005f3fcee6e0b78 *powerpc-linux.elf/upx-3.95
|
||||||
bb96ea8a29500893b729dad4afe90b09186641c32c42a70a3d2380a771f896d9 *powerpc64le-linux.elf/upx-3.95
|
9741ba142aa8f9fb554dbab3a0295b1aa58e5f246274e2831583d8f99af59764 *powerpc64le-linux.elf/upx-3.95
|
||||||
"
|
"
|
||||||
expected_sha256sums__t160_compress_all_methods_1_no_filter="\
|
expected_sha256sums__t160_compress_all_methods_1_no_filter="\
|
||||||
de00c3bcb56d78c3fd1d1e633b3f64b884b3611abc305b9e79f4f14385178418 *amd64-linux.elf/upx-3.91
|
115046275f6bccbaa34b7aefbedeba8741aba4e4876340a3d7363bae86ee4209 *amd64-linux.elf/upx-3.91
|
||||||
eb5aea4d780711dd59e3f86d34a49f16d3669acc6569292bf9ea445d406c5c80 *amd64-linux.elf/upx-3.95
|
a8394890b5d731258316b520da2a5e4b43902742d237536fb7fbc578c6197fbb *amd64-linux.elf/upx-3.95
|
||||||
2fae12ccc55eeac6c05ff2c6b27539c66816080647283ac2e1b22576242b6bb5 *amd64-win64.pe/upx-3.95.exe
|
5a0ecb45658904bcd0b823b77dba039c9814e2eff4ed429784c36b7074b9858c *amd64-win64.pe/upx-3.95.exe
|
||||||
14120b8348172a08cd7651184941820ed1c69b7a8d859e375390eee529f5c94e *arm-linux.elf/upx-3.95
|
0976be6c56de1ac2314d8a4962ae3d9d7be962847600db5e2bab529ab32cebd6 *arm-linux.elf/upx-3.95
|
||||||
a6690508c1acdaa07ce97feec0f330182c24206d8e9133949d2a42fccc1cbf27 *arm-wince.pe/upx-3.91.exe
|
fdbe0395ac401285edb9c2f9bfbb0fbd3c0eaad5052a88d8369b1a66b35a8a3e *arm-wince.pe/upx-3.91.exe
|
||||||
4f30adcd3d047fad15344bf6cf3cf4f91cfbacbb121af889df8634fa4c888247 *arm64-linux.elf/upx-3.95
|
1c8d536870d0244bb12cb8fdd6cd35ad7e9a53bbc4aa8e2e12af72447caaf467 *arm64-linux.elf/upx-3.95
|
||||||
f85f0a70b024a050999d476420b9db88206e340b2ffff3781c491b538ae03e37 *armeb-linux.elf/upx-3.91
|
912b6ca141a028974bc46aeb571314db371647201974283992752933f39200b1 *armeb-linux.elf/upx-3.91
|
||||||
e1b2dc75427212dc268c6921aa2059adf5709b21f230432a4725b16e1c64b238 *armeb-linux.elf/upx-3.95
|
0b5757e474bcf3136edf10e403f95e706b214a5cf7d8577fbf7778175b1bef61 *armeb-linux.elf/upx-3.95
|
||||||
fcf64cfce9e9762e03740d2bf9e2e86d873ade1b6f4a68eb07625f516426810d *i386-dos32.djgpp2.coff/upx-3.91.exe
|
0a0099246096d20ff6035a4df6566954b9d8aff9ed8fdbd35aa5ee4995b02bfe *i386-dos32.djgpp2.coff/upx-3.91.exe
|
||||||
9188a6f911b79fb8629880836b2f5787eb4d938872ba4f1a64c93e70cde9f428 *i386-dos32.djgpp2.coff/upx-3.95.exe
|
5df7aa9f0896df87eb8798119ad16a9b89c87a7568a67339e33b5baa99ec361f *i386-dos32.djgpp2.coff/upx-3.95.exe
|
||||||
8369ff8112aeb55a1684ce0ec16e13e6bc524b734557b49b292f9aae60edccb6 *i386-linux.elf/upx-3.91
|
53e5aae9bc70f58e3dc2aef5a94f66df2517d547670e72ee2b3189b7da809f41 *i386-linux.elf/upx-3.91
|
||||||
c4e16cc1a64db618d9038ea9ba6032b7fe5aac05c0d7731b91373094a6a0f6e4 *i386-linux.elf/upx-3.95
|
adaa1e2f46f7a235ab838b15aa7e820057e5ed7011d9d07c67dc770a88e3dd62 *i386-linux.elf/upx-3.95
|
||||||
b21cf7756542b3bab5f4a59d4036cd3176e297dceb744dec96ac365be6568dcd *i386-win32.pe/upx-3.91.exe
|
f3d33c5c9809943a902133490bcf0cfbe39a5ef1635a0c29b3bdc4f35dfffa50 *i386-win32.pe/upx-3.91.exe
|
||||||
b1bc0d360918d51ca7b7f32f5083845e4566c7fa7a425d0451f4b10f227d1eac *i386-win32.pe/upx-3.95.exe
|
474e68a2390cf0376f59402eaef4c902daa49428b628e025b1c8506428a37937 *i386-win32.pe/upx-3.95.exe
|
||||||
c40af5d1ba0531abb92587cbcbe604d4f562b685d6e7bbb40ec4d879fddf1267 *m68k-atari.tos/upx-3.91.ttp
|
1561dd69f67e8705804dba41ebd876bce6a4ce8ed8b0bc0d0e7628697e7fee68 *m68k-atari.tos/upx-3.91.ttp
|
||||||
0865d2f1d65e2693d801b3c28d64910a009707be65598772df655c640469a4e5 *mips-linux.elf/upx-3.95
|
74f7f69b4a8b2b7c428fa55e3970ee767c1947f19ed1b0644870ecb6b3cb713d *mips-linux.elf/upx-3.95
|
||||||
4cf108686c2419c6d82eecb2473a6d0ca0a0b47096cc01ea2b55113f84762cc7 *mipsel-linux.elf/upx-3.91
|
12a42365234c001a52586b74a9597dc7d65184ddf1ee1d40734823a3443cd92a *mipsel-linux.elf/upx-3.91
|
||||||
0a90a99e0ebb1e9c86e0bdf6a3eec6ca116e65b235ba1ee9029694b84cadc438 *mipsel-linux.elf/upx-3.95
|
68f674d081d87e86e54f0051eee9e2bc85b566051992774ab28ff3173cbcb75a *mipsel-linux.elf/upx-3.95
|
||||||
4d8f85d254b1fd87bebe2fd732afd6214c98b869cda17ff0c4c566358446038a *powerpc-linux.elf/upx-3.91
|
f569d8f49d7110bb8b262a48055b39d889e9977c40c5f1b21e74f8cbf93b27ae *powerpc-linux.elf/upx-3.91
|
||||||
bbc6179756637db10b636d7383226cb1d685866e8e9191069107725365b42f38 *powerpc-linux.elf/upx-3.95
|
d8227a8a88c083760889acaf259e7da59eab75a23e341289bc8e3c60563ae344 *powerpc-linux.elf/upx-3.95
|
||||||
52d7db1d6d6611d4a064c036b57044fd93d4c5762452be07188ee2ff6b1e42bc *powerpc64le-linux.elf/upx-3.95
|
1675cd12ecdccdcc8bb73d75e8841f5bfde6dfd424dc73cb0065ebf271ace1f8 *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="\
|
||||||
ee887f19ee6a5d5f0a0ce7116a41570e106c10bc0bb25acf7eb3ee254c1ed560 *amd64-linux.elf/upx-3.91
|
09cee61e2a4e94455d75a76711078719c3ca7fab77f047c4c85c9424e651956d *amd64-linux.elf/upx-3.91
|
||||||
9bd019e6442b219825f19082a20e4e73c49b24a4dee39e9e2cf0fc907ecdb46f *amd64-linux.elf/upx-3.95
|
0196cbaa36e5224b26729f1bb13990327878ffb0d2cd5784f8fbe715f12dcc1c *amd64-linux.elf/upx-3.95
|
||||||
382fe4b3e4f575322b746d7d45e4553ba3cf47cb4351b9900508fb52a00118ad *amd64-win64.pe/upx-3.95.exe
|
e07e9babdeb12fddeebbfa1b0293163cc5e63017d6f0933d02587c8da1e90a82 *amd64-win64.pe/upx-3.95.exe
|
||||||
ae71103c2e105099ab345a648abf109b9aec3039137c90af30710dd4a4b51736 *arm-linux.elf/upx-3.95
|
4b93e4dd9baea301479fa989d935b7b6b43b2b54464c5def0db1a00b6a15d719 *arm-linux.elf/upx-3.95
|
||||||
9150f49be3fcb03a5f23b209e5db443c9b96fa4d8e20d3730195f9eafff5d8e8 *arm-wince.pe/upx-3.91.exe
|
8d1706ab02013b536c3a4cec20d40a96591ffa45fdcb464ccd3f038567006d79 *arm-wince.pe/upx-3.91.exe
|
||||||
100d9cee849b7996cbde2dc82df766e5104ae030055ae9b286c53b60e9e51405 *arm64-linux.elf/upx-3.95
|
be753ff9bc789d80f32cec35cc0f9c67b102d297f607b328779ba8d80da13593 *arm64-linux.elf/upx-3.95
|
||||||
43ded21db5b7b8355bc371e39cd3b1be05e91635e3cb6d64f9a8aea16127e157 *armeb-linux.elf/upx-3.91
|
4c6d40107b5bce15a40aef514b57ac6dd644162998915aee412feca21582118a *armeb-linux.elf/upx-3.91
|
||||||
b0ac3a36871630af80bb9b6ba94604b3ebc1fe05fdb6d095a7c461916fb3d231 *armeb-linux.elf/upx-3.95
|
9d70d663c00378aa1c1c43d55327a895be33ea081bac13ce8a7ea6895b539679 *armeb-linux.elf/upx-3.95
|
||||||
36b6a947567386e325f1d3ff84a55ecbd37687e3264cfb0a57aa5e3be5ff85f9 *i386-dos32.djgpp2.coff/upx-3.91.exe
|
dda2c348c43741a1bd65049a8e7b51be1ebf873d215370ec002185c85390c168 *i386-dos32.djgpp2.coff/upx-3.91.exe
|
||||||
ad02fcac751563d49cb0711d818231c1030bad9ef2b12fd54e60e2bc6510e9d6 *i386-dos32.djgpp2.coff/upx-3.95.exe
|
560392427ded22f2f3fea59ef10e55d65cf841001e67b1e4558ef13514baa602 *i386-dos32.djgpp2.coff/upx-3.95.exe
|
||||||
d1b4e2c81a0baf4ad273dd96722783e9219e69049a78d536757f39761a7cfe8b *i386-linux.elf/upx-3.91
|
f3f8feceebe8536633554b204df68c2e94e1d1a313fe7a576b7f5d404c916083 *i386-linux.elf/upx-3.91
|
||||||
6e509d556ccd2af102d43924bd4eb1e9bed9d557e44387769032df4ede525f0d *i386-linux.elf/upx-3.95
|
e7f98419e346670f72d66ac25f3d6ad53201e768819980eecae24d801366be27 *i386-linux.elf/upx-3.95
|
||||||
2138186fb26cc7983ec4a4ead290573f2e8226fea4a0b9b6d668d86fb21d1573 *i386-win32.pe/upx-3.91.exe
|
3510bc5627237752bedd275e73c42bc02cd46145ff916e7bccbdec663f763ee4 *i386-win32.pe/upx-3.91.exe
|
||||||
5f286eaf28bab252a0f4f069b7b88910b9ce62327c4d15837b91ce65e4f9030e *i386-win32.pe/upx-3.95.exe
|
ad47c7522167f6f7e47d495e1fa119431386ca5ea9bc16b6a4b9cb38cf9cd29f *i386-win32.pe/upx-3.95.exe
|
||||||
0ab25c2cd8cf53a31323464080991344479998f45fd9b215caba003f96e9e11c *m68k-atari.tos/upx-3.91.ttp
|
1c999e5c6cded8c99a7f6b4595879893ae63d2af1388dc61dd8b4e3106676480 *m68k-atari.tos/upx-3.91.ttp
|
||||||
ba14b6b4e846d29bd4211fbcdb2a641f55f8a5700806af64c52182736b757f46 *mips-linux.elf/upx-3.95
|
55a098c2cdce1917b76ce0845f434fc23b0bd30b34e884b19401c51c8c7f4756 *mips-linux.elf/upx-3.95
|
||||||
40c23e16bfe68ec0a59f9651ac747db1e81f07deabc4c22a732e40e03e2b1100 *mipsel-linux.elf/upx-3.91
|
4b6487d412f43acb8e41951a2135e56025139a9ad3e57102749df4d4bef934fa *mipsel-linux.elf/upx-3.91
|
||||||
7d353d8381c3401c3c9765fa6091c634791ae9b7338ca5b769f63c38f8f418e7 *mipsel-linux.elf/upx-3.95
|
1dcd626fc4566c608e987fd6999b695793c5cae7f78872e3d1a9a23942fea188 *mipsel-linux.elf/upx-3.95
|
||||||
b43bd16efb19081fe0945948231486cdd1b1157d193ab7cbbd470594f46c57ca *powerpc-linux.elf/upx-3.91
|
2047a4a880322bf41e8afbb4787f6103364de4a299b543808251a4144c4d990b *powerpc-linux.elf/upx-3.91
|
||||||
7a8a24fa57d17f99b11133a0822a5e499681d09695525b80f8c61d90d06c4ac8 *powerpc-linux.elf/upx-3.95
|
63679bd238f30bfb14853246eb257536471fea10f942b2adfdd43cbef21dea30 *powerpc-linux.elf/upx-3.95
|
||||||
0339ffc1d99f5b5ad12e8492b6a9dc707f705a120494a6bc453fb8617808d10a *powerpc64le-linux.elf/upx-3.95
|
f075e10b0f7c9ab703d0f923387e7ae425fa22c04349cb8085916c32afe4eef2 *powerpc64le-linux.elf/upx-3.95
|
||||||
"
|
"
|
||||||
########## end .sha256sums.recreate
|
########## end .sha256sums.recreate
|
||||||
|
|||||||
@@ -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)"
|
||||||
|
|||||||
+1
-1
@@ -87,7 +87,7 @@ endif # /usr/bin/env
|
|||||||
# make clang-format
|
# make clang-format
|
||||||
#***********************************************************************
|
#***********************************************************************
|
||||||
|
|
||||||
# automatically format some C++ source code files
|
# automatically format most C++ source code files
|
||||||
ifneq ($(wildcard /usr/bin/env),)
|
ifneq ($(wildcard /usr/bin/env),)
|
||||||
ifeq ($(shell uname),Linux)
|
ifeq ($(shell uname),Linux)
|
||||||
|
|
||||||
|
|||||||
+420
-163
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2024 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2025 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2024 Laszlo Molnar
|
Copyright (C) 1996-2025 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
@@ -32,22 +32,29 @@
|
|||||||
// 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)
|
||||||
|
|
||||||
#if 1
|
static_assert(std::is_same_v<upx_uint32_t, unsigned>);
|
||||||
// some platforms may provide their own system bswapXX() functions, so rename to avoid conflicts
|
static_assert(std::is_same_v<byte, unsigned char>);
|
||||||
#undef bswap16
|
|
||||||
#undef bswap32
|
#if defined(upx_is_constant_evaluated)
|
||||||
#undef bswap64
|
#define bele_constexpr constexpr
|
||||||
#define bswap16 upx_bswap16
|
#else
|
||||||
#define bswap32 upx_bswap32
|
#define bele_constexpr /*empty*/
|
||||||
#define bswap64 upx_bswap64
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// forward declarations
|
||||||
|
struct BE16;
|
||||||
|
struct BE32;
|
||||||
|
struct BE64;
|
||||||
|
struct LE16;
|
||||||
|
struct LE32;
|
||||||
|
struct LE64;
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
// XE - eXtended Endian compatibility
|
// XE - eXtended Endian compatibility
|
||||||
// try to detect XX16 vs XX32 vs XX64 size mismatches
|
// try to detect XX16 vs XX32 vs XX64 size mismatches
|
||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
|
|
||||||
#if !(DEBUG)
|
#if !defined(upx_is_constant_evaluated) && !(DEBUG)
|
||||||
|
|
||||||
// permissive version using "void *"
|
// permissive version using "void *"
|
||||||
#define REQUIRE_XE16 /*empty*/
|
#define REQUIRE_XE16 /*empty*/
|
||||||
@@ -61,14 +68,6 @@ typedef void XE64;
|
|||||||
|
|
||||||
#else // permissive version
|
#else // permissive version
|
||||||
|
|
||||||
// forward declarations
|
|
||||||
struct BE16;
|
|
||||||
struct BE32;
|
|
||||||
struct BE64;
|
|
||||||
struct LE16;
|
|
||||||
struct LE32;
|
|
||||||
struct LE64;
|
|
||||||
|
|
||||||
namespace bele_detail {
|
namespace bele_detail {
|
||||||
|
|
||||||
// Note:
|
// Note:
|
||||||
@@ -109,93 +108,184 @@ using enable_if_xe64 = std::enable_if_t<is_xe64_type<T>, T>;
|
|||||||
// core - NE
|
// core - NE
|
||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
|
|
||||||
REQUIRE_XE16
|
forceinline bele_constexpr unsigned get_ne16(const byte *p) noexcept {
|
||||||
static forceinline unsigned get_ne16(const XE16 *p) noexcept {
|
#if defined(upx_is_constant_evaluated)
|
||||||
|
if (upx_is_constant_evaluated())
|
||||||
|
return upx::compile_time::get_ne16(p);
|
||||||
|
else
|
||||||
|
#endif
|
||||||
|
{
|
||||||
upx_uint16_t v = 0;
|
upx_uint16_t v = 0;
|
||||||
upx_memcpy_inline(&v, p, sizeof(v));
|
upx_memcpy_inline(&v, p, sizeof(v));
|
||||||
return v;
|
return v;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
REQUIRE_XE32
|
forceinline bele_constexpr unsigned get_ne32(const byte *p) noexcept {
|
||||||
static forceinline unsigned get_ne32(const XE32 *p) noexcept {
|
#if defined(upx_is_constant_evaluated)
|
||||||
|
if (upx_is_constant_evaluated())
|
||||||
|
return upx::compile_time::get_ne32(p);
|
||||||
|
else
|
||||||
|
#endif
|
||||||
|
{
|
||||||
upx_uint32_t v = 0;
|
upx_uint32_t v = 0;
|
||||||
upx_memcpy_inline(&v, p, sizeof(v));
|
upx_memcpy_inline(&v, p, sizeof(v));
|
||||||
return v;
|
return v;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
REQUIRE_XE64
|
forceinline bele_constexpr upx_uint64_t get_ne64(const byte *p) noexcept {
|
||||||
static forceinline upx_uint64_t get_ne64(const XE64 *p) noexcept {
|
#if defined(upx_is_constant_evaluated)
|
||||||
|
if (upx_is_constant_evaluated())
|
||||||
|
return upx::compile_time::get_ne64(p);
|
||||||
|
else
|
||||||
|
#endif
|
||||||
|
{
|
||||||
upx_uint64_t v = 0;
|
upx_uint64_t v = 0;
|
||||||
upx_memcpy_inline(&v, p, sizeof(v));
|
upx_memcpy_inline(&v, p, sizeof(v));
|
||||||
return v;
|
return v;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
forceinline bele_constexpr void set_ne16(byte *p, unsigned v) noexcept {
|
||||||
|
#if defined(upx_is_constant_evaluated)
|
||||||
|
if (upx_is_constant_evaluated())
|
||||||
|
upx::compile_time::set_ne16(p, upx_uint16_t(v & 0xffff));
|
||||||
|
else
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
upx_uint16_t vv = upx_uint16_t(v & 0xffff);
|
||||||
|
upx_memcpy_inline(p, &vv, sizeof(vv));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
forceinline bele_constexpr void set_ne32(byte *p, unsigned v) noexcept {
|
||||||
|
#if defined(upx_is_constant_evaluated)
|
||||||
|
if (upx_is_constant_evaluated())
|
||||||
|
upx::compile_time::set_ne32(p, v);
|
||||||
|
else
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
upx_uint32_t vv = v;
|
||||||
|
upx_memcpy_inline(p, &vv, sizeof(vv));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
forceinline bele_constexpr void set_ne64(byte *p, upx_uint64_t v) noexcept {
|
||||||
|
#if defined(upx_is_constant_evaluated)
|
||||||
|
if (upx_is_constant_evaluated())
|
||||||
|
upx::compile_time::set_ne64(p, v);
|
||||||
|
else
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
upx_uint64_t vv = v;
|
||||||
|
upx_memcpy_inline(p, &vv, sizeof(vv));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
// core - NE
|
||||||
|
**************************************************************************/
|
||||||
|
|
||||||
REQUIRE_XE16
|
REQUIRE_XE16
|
||||||
static forceinline void set_ne16(XE16 *p, unsigned vv) noexcept {
|
forceinline bele_constexpr unsigned get_ne16(const XE16 *p) noexcept {
|
||||||
upx_uint16_t v = (upx_uint16_t) (vv & 0xffff);
|
return get_ne16(upx::ptr_static_cast<const byte *>(p));
|
||||||
upx_memcpy_inline(p, &v, sizeof(v));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
REQUIRE_XE32
|
REQUIRE_XE32
|
||||||
static forceinline void set_ne32(XE32 *p, unsigned vv) noexcept {
|
forceinline bele_constexpr unsigned get_ne32(const XE32 *p) noexcept {
|
||||||
upx_uint32_t v = vv;
|
return get_ne32(upx::ptr_static_cast<const byte *>(p));
|
||||||
upx_memcpy_inline(p, &v, sizeof(v));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
REQUIRE_XE64
|
REQUIRE_XE64
|
||||||
static forceinline void set_ne64(XE64 *p, upx_uint64_t vv) noexcept {
|
forceinline bele_constexpr upx_uint64_t get_ne64(const XE64 *p) noexcept {
|
||||||
upx_uint64_t v = vv;
|
return get_ne64(upx::ptr_static_cast<const byte *>(p));
|
||||||
upx_memcpy_inline(p, &v, sizeof(v));
|
}
|
||||||
|
|
||||||
|
REQUIRE_XE16
|
||||||
|
forceinline bele_constexpr void set_ne16(XE16 *p, unsigned v) noexcept {
|
||||||
|
set_ne16(upx::ptr_static_cast<byte *>(p), v);
|
||||||
|
}
|
||||||
|
|
||||||
|
REQUIRE_XE32
|
||||||
|
forceinline bele_constexpr void set_ne32(XE32 *p, unsigned v) noexcept {
|
||||||
|
set_ne32(upx::ptr_static_cast<byte *>(p), v);
|
||||||
|
}
|
||||||
|
|
||||||
|
REQUIRE_XE64
|
||||||
|
forceinline bele_constexpr void set_ne64(XE64 *p, upx_uint64_t v) noexcept {
|
||||||
|
set_ne64(upx::ptr_static_cast<byte *>(p), v);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
// core - bswap
|
// core - bswap
|
||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
|
|
||||||
#if (ACC_CC_MSC)
|
#if __cpp_lib_byteswap >= 202110L
|
||||||
|
|
||||||
ACC_COMPILE_TIME_ASSERT_HEADER(sizeof(long) == 4)
|
forceinline constexpr unsigned bswap16(unsigned v) noexcept {
|
||||||
|
return std::byteswap(upx_uint16_t(v & 0xffff));
|
||||||
|
}
|
||||||
|
forceinline constexpr unsigned bswap32(unsigned v) noexcept { return std::byteswap(v); }
|
||||||
|
forceinline constexpr upx_uint64_t bswap64(upx_uint64_t v) noexcept { return std::byteswap(v); }
|
||||||
|
|
||||||
// unfortunately *not* constexpr with current MSVC
|
#elif (ACC_CC_MSC)
|
||||||
static forceinline /*constexpr*/ unsigned bswap16(unsigned v) noexcept {
|
|
||||||
|
static_assert(sizeof(long) == 4);
|
||||||
|
|
||||||
|
// _byteswap_XXX is unfortunately *not* constexpr with current MSVC
|
||||||
|
forceinline bele_constexpr unsigned bswap16(unsigned v) noexcept {
|
||||||
|
#if defined(upx_is_constant_evaluated)
|
||||||
|
if (upx_is_constant_evaluated())
|
||||||
|
return upx::compile_time::bswap16(upx_uint16_t(v & 0xffff));
|
||||||
|
else
|
||||||
|
#endif
|
||||||
return (unsigned) _byteswap_ulong(v << 16);
|
return (unsigned) _byteswap_ulong(v << 16);
|
||||||
}
|
}
|
||||||
static forceinline /*constexpr*/ unsigned bswap32(unsigned v) noexcept {
|
forceinline bele_constexpr unsigned bswap32(unsigned v) noexcept {
|
||||||
|
#if defined(upx_is_constant_evaluated)
|
||||||
|
if (upx_is_constant_evaluated())
|
||||||
|
return upx::compile_time::bswap32(v);
|
||||||
|
else
|
||||||
|
#endif
|
||||||
return (unsigned) _byteswap_ulong(v);
|
return (unsigned) _byteswap_ulong(v);
|
||||||
}
|
}
|
||||||
static forceinline /*constexpr*/ upx_uint64_t bswap64(upx_uint64_t v) noexcept {
|
forceinline bele_constexpr upx_uint64_t bswap64(upx_uint64_t v) noexcept {
|
||||||
|
#if defined(upx_is_constant_evaluated)
|
||||||
|
if (upx_is_constant_evaluated())
|
||||||
|
return upx::compile_time::bswap64(v);
|
||||||
|
else
|
||||||
|
#endif
|
||||||
return _byteswap_uint64(v);
|
return _byteswap_uint64(v);
|
||||||
}
|
}
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
static forceinline constexpr unsigned bswap16(unsigned v) noexcept {
|
forceinline constexpr unsigned bswap16(unsigned v) noexcept {
|
||||||
#if defined(__riscv) && __riscv_xlen == 64
|
#if defined(__riscv) && __riscv_xlen == 64
|
||||||
return (unsigned) __builtin_bswap64((upx_uint64_t) v << 48);
|
return (unsigned) __builtin_bswap64(upx_uint64_t(v) << 48);
|
||||||
#else
|
#else
|
||||||
// return __builtin_bswap16((upx_uint16_t) (v & 0xffff));
|
// return __builtin_bswap16(upx_uint16_t(v & 0xffff));
|
||||||
return __builtin_bswap32(v << 16);
|
return __builtin_bswap32(v << 16);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
static forceinline constexpr unsigned bswap32(unsigned v) noexcept {
|
forceinline constexpr unsigned bswap32(unsigned v) noexcept {
|
||||||
#if defined(__riscv) && __riscv_xlen == 64
|
#if defined(__riscv) && __riscv_xlen == 64
|
||||||
return (unsigned) __builtin_bswap64((upx_uint64_t) v << 32);
|
return (unsigned) __builtin_bswap64(upx_uint64_t(v) << 32);
|
||||||
#else
|
#else
|
||||||
return __builtin_bswap32(v);
|
return __builtin_bswap32(v);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
static forceinline constexpr upx_uint64_t bswap64(upx_uint64_t v) noexcept {
|
forceinline constexpr upx_uint64_t bswap64(upx_uint64_t v) noexcept { return __builtin_bswap64(v); }
|
||||||
return __builtin_bswap64(v);
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static forceinline constexpr unsigned no_bswap16(unsigned v) noexcept {
|
forceinline constexpr unsigned no_bswap16(unsigned v) noexcept {
|
||||||
// mask is needed so that for all v: bswap16(bswap16(v)) == no_bswap16(v)
|
// mask is needed so that for all v: bswap16(bswap16(v)) == no_bswap16(v)
|
||||||
return v & 0xffff;
|
return v & 0xffff;
|
||||||
}
|
}
|
||||||
static forceinline constexpr unsigned no_bswap32(unsigned v) noexcept { return v; }
|
forceinline constexpr unsigned no_bswap32(unsigned v) noexcept { return v; }
|
||||||
static forceinline constexpr upx_uint64_t no_bswap64(upx_uint64_t v) noexcept { return v; }
|
forceinline constexpr upx_uint64_t no_bswap64(upx_uint64_t v) noexcept { return v; }
|
||||||
|
|
||||||
#if (ACC_ABI_BIG_ENDIAN)
|
#if (ACC_ABI_BIG_ENDIAN)
|
||||||
#define ne16_to_be16(v) no_bswap16(v)
|
#define ne16_to_be16(v) no_bswap16(v)
|
||||||
@@ -218,72 +308,90 @@ static forceinline constexpr upx_uint64_t no_bswap64(upx_uint64_t v) noexcept {
|
|||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
|
|
||||||
REQUIRE_XE16
|
REQUIRE_XE16
|
||||||
inline unsigned get_be16(const XE16 *p) noexcept { return ne16_to_be16(get_ne16(p)); }
|
inline bele_constexpr unsigned get_be16(const XE16 *p) noexcept {
|
||||||
|
return ne16_to_be16(get_ne16(p));
|
||||||
|
}
|
||||||
REQUIRE_XE32
|
REQUIRE_XE32
|
||||||
inline unsigned get_be32(const XE32 *p) noexcept { return ne32_to_be32(get_ne32(p)); }
|
inline bele_constexpr unsigned get_be32(const XE32 *p) noexcept {
|
||||||
|
return ne32_to_be32(get_ne32(p));
|
||||||
|
}
|
||||||
REQUIRE_XE64
|
REQUIRE_XE64
|
||||||
inline upx_uint64_t get_be64(const XE64 *p) noexcept { return ne64_to_be64(get_ne64(p)); }
|
inline bele_constexpr upx_uint64_t get_be64(const XE64 *p) noexcept {
|
||||||
|
return ne64_to_be64(get_ne64(p));
|
||||||
|
}
|
||||||
REQUIRE_XE16
|
REQUIRE_XE16
|
||||||
inline unsigned get_le16(const XE16 *p) noexcept { return ne16_to_le16(get_ne16(p)); }
|
inline bele_constexpr unsigned get_le16(const XE16 *p) noexcept {
|
||||||
|
return ne16_to_le16(get_ne16(p));
|
||||||
|
}
|
||||||
REQUIRE_XE32
|
REQUIRE_XE32
|
||||||
inline unsigned get_le32(const XE32 *p) noexcept { return ne32_to_le32(get_ne32(p)); }
|
inline bele_constexpr unsigned get_le32(const XE32 *p) noexcept {
|
||||||
|
return ne32_to_le32(get_ne32(p));
|
||||||
|
}
|
||||||
REQUIRE_XE64
|
REQUIRE_XE64
|
||||||
inline upx_uint64_t get_le64(const XE64 *p) noexcept { return ne64_to_le64(get_ne64(p)); }
|
inline bele_constexpr upx_uint64_t get_le64(const XE64 *p) noexcept {
|
||||||
|
return ne64_to_le64(get_ne64(p));
|
||||||
|
}
|
||||||
|
|
||||||
REQUIRE_XE16
|
REQUIRE_XE16
|
||||||
inline void set_be16(XE16 *p, unsigned v) noexcept { set_ne16(p, ne16_to_be16(v)); }
|
inline bele_constexpr void set_be16(XE16 *p, unsigned v) noexcept { set_ne16(p, ne16_to_be16(v)); }
|
||||||
REQUIRE_XE32
|
REQUIRE_XE32
|
||||||
inline void set_be32(XE32 *p, unsigned v) noexcept { set_ne32(p, ne32_to_be32(v)); }
|
inline bele_constexpr void set_be32(XE32 *p, unsigned v) noexcept { set_ne32(p, ne32_to_be32(v)); }
|
||||||
REQUIRE_XE64
|
REQUIRE_XE64
|
||||||
inline void set_be64(XE64 *p, upx_uint64_t v) noexcept { set_ne64(p, ne64_to_be64(v)); }
|
inline bele_constexpr void set_be64(XE64 *p, upx_uint64_t v) noexcept {
|
||||||
|
set_ne64(p, ne64_to_be64(v));
|
||||||
|
}
|
||||||
REQUIRE_XE16
|
REQUIRE_XE16
|
||||||
inline void set_le16(XE16 *p, unsigned v) noexcept { set_ne16(p, ne16_to_le16(v)); }
|
inline bele_constexpr void set_le16(XE16 *p, unsigned v) noexcept { set_ne16(p, ne16_to_le16(v)); }
|
||||||
REQUIRE_XE32
|
REQUIRE_XE32
|
||||||
inline void set_le32(XE32 *p, unsigned v) noexcept { set_ne32(p, ne32_to_le32(v)); }
|
inline bele_constexpr void set_le32(XE32 *p, unsigned v) noexcept { set_ne32(p, ne32_to_le32(v)); }
|
||||||
REQUIRE_XE64
|
REQUIRE_XE64
|
||||||
inline void set_le64(XE64 *p, upx_uint64_t v) noexcept { set_ne64(p, ne64_to_le64(v)); }
|
inline bele_constexpr void set_le64(XE64 *p, upx_uint64_t v) noexcept {
|
||||||
|
set_ne64(p, ne64_to_le64(v));
|
||||||
|
}
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
// get/set 24/26
|
// get/set 24/26
|
||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
|
|
||||||
REQUIRE_XE24
|
inline constexpr unsigned get_be24(const byte *p) noexcept {
|
||||||
inline unsigned get_be24(const XE24 *p) noexcept {
|
return upx::compile_time::get_be24(p);
|
||||||
const byte *b = ACC_CCAST(const byte *, p);
|
|
||||||
return (b[0] << 16) | (b[1] << 8) | (b[2] << 0);
|
|
||||||
}
|
}
|
||||||
|
inline constexpr unsigned get_le24(const byte *p) noexcept {
|
||||||
|
return upx::compile_time::get_le24(p);
|
||||||
|
}
|
||||||
|
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); }
|
||||||
|
|
||||||
REQUIRE_XE24
|
REQUIRE_XE24
|
||||||
inline unsigned get_le24(const XE24 *p) noexcept {
|
forceinline bele_constexpr unsigned get_be24(const XE24 *p) noexcept {
|
||||||
const byte *b = ACC_CCAST(const byte *, p);
|
return get_be24(upx::ptr_static_cast<const byte *>(p));
|
||||||
return (b[0] << 0) | (b[1] << 8) | (b[2] << 16);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
REQUIRE_XE24
|
REQUIRE_XE24
|
||||||
inline void set_be24(XE24 *p, unsigned v) noexcept {
|
forceinline bele_constexpr unsigned get_le24(const XE24 *p) noexcept {
|
||||||
byte *b = ACC_PCAST(byte *, p);
|
return get_le24(upx::ptr_static_cast<const byte *>(p));
|
||||||
b[0] = ACC_ICONV(byte, (v >> 16) & 0xff);
|
|
||||||
b[1] = ACC_ICONV(byte, (v >> 8) & 0xff);
|
|
||||||
b[2] = ACC_ICONV(byte, (v >> 0) & 0xff);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
REQUIRE_XE24
|
REQUIRE_XE24
|
||||||
inline void set_le24(XE24 *p, unsigned v) noexcept {
|
forceinline bele_constexpr void set_be24(XE24 *p, unsigned v) noexcept {
|
||||||
byte *b = ACC_PCAST(byte *, p);
|
set_be24(upx::ptr_static_cast<byte *>(p), v);
|
||||||
b[0] = ACC_ICONV(byte, (v >> 0) & 0xff);
|
}
|
||||||
b[1] = ACC_ICONV(byte, (v >> 8) & 0xff);
|
REQUIRE_XE24
|
||||||
b[2] = ACC_ICONV(byte, (v >> 16) & 0xff);
|
forceinline bele_constexpr void set_le24(XE24 *p, unsigned v) noexcept {
|
||||||
|
set_le24(upx::ptr_static_cast<byte *>(p), v);
|
||||||
}
|
}
|
||||||
|
|
||||||
REQUIRE_XE32
|
REQUIRE_XE32
|
||||||
inline 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; }
|
||||||
REQUIRE_XE32
|
REQUIRE_XE32
|
||||||
inline unsigned get_le19_5(const XE32 *p) noexcept { return (get_le32(p) >> 5) & 0x0007ffff; }
|
inline bele_constexpr unsigned get_le19_5(const XE32 *p) noexcept {
|
||||||
|
return (get_le32(p) >> 5) & 0x0007ffff;
|
||||||
|
}
|
||||||
REQUIRE_XE32
|
REQUIRE_XE32
|
||||||
inline unsigned get_le14_5(const XE32 *p) noexcept { return (get_le32(p) >> 5) & 0x00003fff; }
|
inline bele_constexpr unsigned get_le14_5(const XE32 *p) noexcept {
|
||||||
|
return (get_le32(p) >> 5) & 0x00003fff;
|
||||||
|
}
|
||||||
|
|
||||||
REQUIRE_XE32
|
REQUIRE_XE32
|
||||||
inline void set_le26(XE32 *p, unsigned v) noexcept {
|
inline bele_constexpr void set_le26(XE32 *p, unsigned v) noexcept {
|
||||||
// preserve the top 6 bits
|
// preserve the top 6 bits
|
||||||
// set_le32(p, (get_le32(p) & 0xfc000000) | (v & 0x03ffffff));
|
// set_le32(p, (get_le32(p) & 0xfc000000) | (v & 0x03ffffff));
|
||||||
// optimized version, saving a runtime bswap32
|
// optimized version, saving a runtime bswap32
|
||||||
@@ -291,11 +399,11 @@ inline void set_le26(XE32 *p, unsigned v) noexcept {
|
|||||||
(ne32_to_le32(v) & ne32_to_le32(0x03ffffff)));
|
(ne32_to_le32(v) & ne32_to_le32(0x03ffffff)));
|
||||||
}
|
}
|
||||||
REQUIRE_XE32
|
REQUIRE_XE32
|
||||||
inline void set_le19_5(XE32 *p, unsigned v) noexcept {
|
inline bele_constexpr void set_le19_5(XE32 *p, unsigned v) noexcept {
|
||||||
set_le32(p, (get_le32(p) & 0xff00001f) | ((v & 0x0007ffff) << 5));
|
set_le32(p, (get_le32(p) & 0xff00001f) | ((v & 0x0007ffff) << 5));
|
||||||
}
|
}
|
||||||
REQUIRE_XE32
|
REQUIRE_XE32
|
||||||
inline void set_le14_5(XE32 *p, unsigned v) noexcept {
|
inline bele_constexpr void set_le14_5(XE32 *p, unsigned v) noexcept {
|
||||||
set_le32(p, (get_le32(p) & 0xfff8001f) | ((v & 0x00003fff) << 5));
|
set_le32(p, (get_le32(p) & 0xfff8001f) | ((v & 0x00003fff) << 5));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -303,7 +411,7 @@ inline void set_le14_5(XE32 *p, unsigned v) noexcept {
|
|||||||
// get signed values
|
// get signed values
|
||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
|
|
||||||
static forceinline constexpr int sign_extend(unsigned v, unsigned bits) noexcept {
|
forceinline constexpr int sign_extend(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));
|
||||||
@@ -312,9 +420,9 @@ static forceinline constexpr int sign_extend(unsigned v, unsigned bits) noexcept
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
static forceinline constexpr upx_int64_t sign_extend(upx_uint64_t v, unsigned bits) noexcept {
|
forceinline constexpr upx_int64_t sign_extend(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 = 1ull << (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));
|
||||||
#else
|
#else
|
||||||
return ACC_ICAST(upx_int64_t, v << (64 - bits)) >> (64 - bits);
|
return ACC_ICAST(upx_int64_t, v << (64 - bits)) >> (64 - bits);
|
||||||
@@ -322,49 +430,49 @@ static forceinline constexpr upx_int64_t sign_extend(upx_uint64_t v, unsigned bi
|
|||||||
}
|
}
|
||||||
|
|
||||||
REQUIRE_XE16
|
REQUIRE_XE16
|
||||||
inline 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_extend(v, 16);
|
||||||
}
|
}
|
||||||
|
|
||||||
REQUIRE_XE24
|
REQUIRE_XE24
|
||||||
inline 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_extend(v, 24);
|
||||||
}
|
}
|
||||||
|
|
||||||
REQUIRE_XE32
|
REQUIRE_XE32
|
||||||
inline 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_extend(v, 32);
|
||||||
}
|
}
|
||||||
|
|
||||||
REQUIRE_XE64
|
REQUIRE_XE64
|
||||||
inline 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_extend(v, 64);
|
||||||
}
|
}
|
||||||
|
|
||||||
REQUIRE_XE16
|
REQUIRE_XE16
|
||||||
inline 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_extend(v, 16);
|
||||||
}
|
}
|
||||||
|
|
||||||
REQUIRE_XE24
|
REQUIRE_XE24
|
||||||
inline 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_extend(v, 24);
|
||||||
}
|
}
|
||||||
|
|
||||||
REQUIRE_XE32
|
REQUIRE_XE32
|
||||||
inline 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_extend(v, 32);
|
||||||
}
|
}
|
||||||
|
|
||||||
REQUIRE_XE64
|
REQUIRE_XE64
|
||||||
inline 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_extend(v, 64);
|
||||||
}
|
}
|
||||||
@@ -372,21 +480,25 @@ inline upx_int64_t get_le64_signed(const XE64 *p) noexcept {
|
|||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
// classes for portable unaligned access
|
// classes for portable unaligned access
|
||||||
//
|
//
|
||||||
// Important: these classes must be PODs (Plain Old Data), i.e. no
|
// Note: these classes must be PODs (Plain Old Data), i.e. no
|
||||||
// constructor, no destructor, no virtual functions and no default
|
// constructor, no destructor, no virtual functions and no default
|
||||||
// assignment operator, and all fields must be public(!).
|
// assignment operator, and all fields must be public
|
||||||
//
|
|
||||||
// [Actually we _can_ use a safe non-POD subset, but for this we need
|
|
||||||
// to have gcc bug 17519 fixed - see http://gcc.gnu.org/PR17519 ]
|
|
||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
|
|
||||||
struct alignas(1) BE16 final {
|
struct alignas(1) BE16 final {
|
||||||
typedef unsigned integral_conversion_type; // automatic conversion to unsigned
|
typedef unsigned integral_conversion_type; // automatic conversion to unsigned
|
||||||
byte d[2];
|
byte d[2];
|
||||||
|
|
||||||
forceinline operator unsigned() const noexcept { return get_be16(d); }
|
static forceinline constexpr BE16 make(const BE16 &x) noexcept { return x; }
|
||||||
|
static forceinline bele_constexpr BE16 make(unsigned v) noexcept {
|
||||||
|
BE16 x = {};
|
||||||
|
set_be16(x.d, v);
|
||||||
|
return x;
|
||||||
|
}
|
||||||
|
|
||||||
forceinline BE16 &operator=(unsigned v) noexcept {
|
forceinline bele_constexpr operator unsigned() const noexcept { return get_be16(d); }
|
||||||
|
|
||||||
|
forceinline bele_constexpr BE16 &operator=(unsigned v) noexcept {
|
||||||
set_be16(d, v);
|
set_be16(d, v);
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
@@ -427,17 +539,33 @@ struct alignas(1) BE16 final {
|
|||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool operator==(const BE16 &x) const noexcept { return memcmp(d, x.d, sizeof(d)) == 0; }
|
bele_constexpr bool operator==(const BE16 &x) const noexcept {
|
||||||
bool operator<(const BE16 &x) const noexcept { return unsigned(*this) < unsigned(x); }
|
#if defined(upx_is_constant_evaluated)
|
||||||
|
if (upx_is_constant_evaluated())
|
||||||
|
return upx::compile_time::mem_eq(d, x.d, sizeof(d));
|
||||||
|
else
|
||||||
|
#endif
|
||||||
|
return upx_memcmp_inline(d, x.d, sizeof(d)) == 0;
|
||||||
|
}
|
||||||
|
bele_constexpr bool operator<(const BE16 &x) const noexcept {
|
||||||
|
return unsigned(*this) < unsigned(x);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
struct alignas(1) BE32 final {
|
struct alignas(1) BE32 final {
|
||||||
typedef unsigned integral_conversion_type; // automatic conversion to unsigned
|
typedef unsigned integral_conversion_type; // automatic conversion to unsigned
|
||||||
byte d[4];
|
byte d[4];
|
||||||
|
|
||||||
forceinline operator unsigned() const noexcept { return get_be32(d); }
|
static forceinline constexpr BE32 make(const BE32 &x) noexcept { return x; }
|
||||||
|
static forceinline bele_constexpr BE32 make(unsigned v) noexcept {
|
||||||
|
BE32 x = {};
|
||||||
|
set_be32(x.d, v);
|
||||||
|
return x;
|
||||||
|
}
|
||||||
|
|
||||||
forceinline BE32 &operator=(unsigned v) noexcept {
|
forceinline bele_constexpr operator unsigned() const noexcept { return get_be32(d); }
|
||||||
|
|
||||||
|
forceinline bele_constexpr BE32 &operator=(unsigned v) noexcept {
|
||||||
set_be32(d, v);
|
set_be32(d, v);
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
@@ -478,17 +606,33 @@ struct alignas(1) BE32 final {
|
|||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool operator==(const BE32 &x) const noexcept { return memcmp(d, x.d, sizeof(d)) == 0; }
|
bele_constexpr bool operator==(const BE32 &x) const noexcept {
|
||||||
bool operator<(const BE32 &x) const noexcept { return unsigned(*this) < unsigned(x); }
|
#if defined(upx_is_constant_evaluated)
|
||||||
|
if (upx_is_constant_evaluated())
|
||||||
|
return upx::compile_time::mem_eq(d, x.d, sizeof(d));
|
||||||
|
else
|
||||||
|
#endif
|
||||||
|
return upx_memcmp_inline(d, x.d, sizeof(d)) == 0;
|
||||||
|
}
|
||||||
|
bele_constexpr bool operator<(const BE32 &x) const noexcept {
|
||||||
|
return unsigned(*this) < unsigned(x);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
struct alignas(1) BE64 final {
|
struct alignas(1) BE64 final {
|
||||||
typedef upx_uint64_t integral_conversion_type; // automatic conversion to upx_uint64_t
|
typedef upx_uint64_t integral_conversion_type; // automatic conversion to upx_uint64_t
|
||||||
byte d[8];
|
byte d[8];
|
||||||
|
|
||||||
forceinline operator upx_uint64_t() const noexcept { return get_be64(d); }
|
static forceinline constexpr BE64 make(const BE64 &x) noexcept { return x; }
|
||||||
|
static forceinline bele_constexpr BE64 make(upx_uint64_t v) noexcept {
|
||||||
|
BE64 x = {};
|
||||||
|
set_be64(x.d, v);
|
||||||
|
return x;
|
||||||
|
}
|
||||||
|
|
||||||
forceinline BE64 &operator=(upx_uint64_t v) noexcept {
|
forceinline bele_constexpr operator upx_uint64_t() const noexcept { return get_be64(d); }
|
||||||
|
|
||||||
|
forceinline bele_constexpr BE64 &operator=(upx_uint64_t v) noexcept {
|
||||||
set_be64(d, v);
|
set_be64(d, v);
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
@@ -529,17 +673,33 @@ struct alignas(1) BE64 final {
|
|||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool operator==(const BE64 &x) const noexcept { return memcmp(d, x.d, sizeof(d)) == 0; }
|
bele_constexpr bool operator==(const BE64 &x) const noexcept {
|
||||||
bool operator<(const BE64 &x) const noexcept { return upx_uint64_t(*this) < upx_uint64_t(x); }
|
#if defined(upx_is_constant_evaluated)
|
||||||
|
if (upx_is_constant_evaluated())
|
||||||
|
return upx::compile_time::mem_eq(d, x.d, sizeof(d));
|
||||||
|
else
|
||||||
|
#endif
|
||||||
|
return upx_memcmp_inline(d, x.d, sizeof(d)) == 0;
|
||||||
|
}
|
||||||
|
bele_constexpr bool operator<(const BE64 &x) const noexcept {
|
||||||
|
return upx_uint64_t(*this) < upx_uint64_t(x);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
struct alignas(1) LE16 final {
|
struct alignas(1) LE16 final {
|
||||||
typedef unsigned integral_conversion_type; // automatic conversion to unsigned
|
typedef unsigned integral_conversion_type; // automatic conversion to unsigned
|
||||||
byte d[2];
|
byte d[2];
|
||||||
|
|
||||||
forceinline operator unsigned() const noexcept { return get_le16(d); }
|
static forceinline constexpr LE16 make(const LE16 &x) noexcept { return x; }
|
||||||
|
static forceinline bele_constexpr LE16 make(unsigned v) noexcept {
|
||||||
|
LE16 x = {};
|
||||||
|
set_le16(x.d, v);
|
||||||
|
return x;
|
||||||
|
}
|
||||||
|
|
||||||
forceinline LE16 &operator=(unsigned v) noexcept {
|
forceinline bele_constexpr operator unsigned() const noexcept { return get_le16(d); }
|
||||||
|
|
||||||
|
forceinline bele_constexpr LE16 &operator=(unsigned v) noexcept {
|
||||||
set_le16(d, v);
|
set_le16(d, v);
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
@@ -580,17 +740,33 @@ struct alignas(1) LE16 final {
|
|||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool operator==(const LE16 &x) const noexcept { return memcmp(d, x.d, sizeof(d)) == 0; }
|
bele_constexpr bool operator==(const LE16 &x) const noexcept {
|
||||||
bool operator<(const LE16 &x) const noexcept { return unsigned(*this) < unsigned(x); }
|
#if defined(upx_is_constant_evaluated)
|
||||||
|
if (upx_is_constant_evaluated())
|
||||||
|
return upx::compile_time::mem_eq(d, x.d, sizeof(d));
|
||||||
|
else
|
||||||
|
#endif
|
||||||
|
return upx_memcmp_inline(d, x.d, sizeof(d)) == 0;
|
||||||
|
}
|
||||||
|
bele_constexpr bool operator<(const LE16 &x) const noexcept {
|
||||||
|
return unsigned(*this) < unsigned(x);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
struct alignas(1) LE32 final {
|
struct alignas(1) LE32 final {
|
||||||
typedef unsigned integral_conversion_type; // automatic conversion to unsigned
|
typedef unsigned integral_conversion_type; // automatic conversion to unsigned
|
||||||
byte d[4];
|
byte d[4];
|
||||||
|
|
||||||
forceinline operator unsigned() const noexcept { return get_le32(d); }
|
static forceinline constexpr LE32 make(const LE32 &x) noexcept { return x; }
|
||||||
|
static forceinline bele_constexpr LE32 make(unsigned v) noexcept {
|
||||||
|
LE32 x = {};
|
||||||
|
set_le32(x.d, v);
|
||||||
|
return x;
|
||||||
|
}
|
||||||
|
|
||||||
forceinline LE32 &operator=(unsigned v) noexcept {
|
forceinline bele_constexpr operator unsigned() const noexcept { return get_le32(d); }
|
||||||
|
|
||||||
|
forceinline bele_constexpr LE32 &operator=(unsigned v) noexcept {
|
||||||
set_le32(d, v);
|
set_le32(d, v);
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
@@ -631,17 +807,33 @@ struct alignas(1) LE32 final {
|
|||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool operator==(const LE32 &x) const noexcept { return memcmp(d, x.d, sizeof(d)) == 0; }
|
bele_constexpr bool operator==(const LE32 &x) const noexcept {
|
||||||
bool operator<(const LE32 &x) const noexcept { return unsigned(*this) < unsigned(x); }
|
#if defined(upx_is_constant_evaluated)
|
||||||
|
if (upx_is_constant_evaluated())
|
||||||
|
return upx::compile_time::mem_eq(d, x.d, sizeof(d));
|
||||||
|
else
|
||||||
|
#endif
|
||||||
|
return upx_memcmp_inline(d, x.d, sizeof(d)) == 0;
|
||||||
|
}
|
||||||
|
bele_constexpr bool operator<(const LE32 &x) const noexcept {
|
||||||
|
return unsigned(*this) < unsigned(x);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
struct alignas(1) LE64 final {
|
struct alignas(1) LE64 final {
|
||||||
typedef upx_uint64_t integral_conversion_type; // automatic conversion to upx_uint64_t
|
typedef upx_uint64_t integral_conversion_type; // automatic conversion to upx_uint64_t
|
||||||
byte d[8];
|
byte d[8];
|
||||||
|
|
||||||
forceinline operator upx_uint64_t() const noexcept { return get_le64(d); }
|
static forceinline constexpr LE64 make(const LE64 &x) noexcept { return x; }
|
||||||
|
static forceinline bele_constexpr LE64 make(upx_uint64_t v) noexcept {
|
||||||
|
LE64 x = {};
|
||||||
|
set_le64(x.d, v);
|
||||||
|
return x;
|
||||||
|
}
|
||||||
|
|
||||||
forceinline LE64 &operator=(upx_uint64_t v) noexcept {
|
forceinline bele_constexpr operator upx_uint64_t() const noexcept { return get_le64(d); }
|
||||||
|
|
||||||
|
forceinline bele_constexpr LE64 &operator=(upx_uint64_t v) noexcept {
|
||||||
set_le64(d, v);
|
set_le64(d, v);
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
@@ -682,8 +874,17 @@ struct alignas(1) LE64 final {
|
|||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool operator==(const LE64 &x) const noexcept { return memcmp(d, x.d, sizeof(d)) == 0; }
|
bele_constexpr bool operator==(const LE64 &x) const noexcept {
|
||||||
bool operator<(const LE64 &x) const noexcept { return upx_uint64_t(*this) < upx_uint64_t(x); }
|
#if defined(upx_is_constant_evaluated)
|
||||||
|
if (upx_is_constant_evaluated())
|
||||||
|
return upx::compile_time::mem_eq(d, x.d, sizeof(d));
|
||||||
|
else
|
||||||
|
#endif
|
||||||
|
return upx_memcmp_inline(d, x.d, sizeof(d)) == 0;
|
||||||
|
}
|
||||||
|
bele_constexpr bool operator<(const LE64 &x) const noexcept {
|
||||||
|
return upx_uint64_t(*this) < upx_uint64_t(x);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
@@ -691,35 +892,35 @@ struct alignas(1) LE64 final {
|
|||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
|
|
||||||
template <class T>
|
template <class T>
|
||||||
inline T *operator+(T *ptr, const BE16 &v) noexcept {
|
inline bele_constexpr T *operator+(T *ptr, const BE16 &v) noexcept {
|
||||||
return ptr + unsigned(v);
|
return ptr + unsigned(v);
|
||||||
}
|
}
|
||||||
template <class T>
|
template <class T>
|
||||||
inline T *operator-(T *ptr, const BE16 &v) noexcept {
|
inline bele_constexpr T *operator-(T *ptr, const BE16 &v) noexcept {
|
||||||
return ptr - unsigned(v);
|
return ptr - unsigned(v);
|
||||||
}
|
}
|
||||||
template <class T>
|
template <class T>
|
||||||
inline T *operator+(T *ptr, const BE32 &v) noexcept {
|
inline bele_constexpr T *operator+(T *ptr, const BE32 &v) noexcept {
|
||||||
return ptr + unsigned(v);
|
return ptr + unsigned(v);
|
||||||
}
|
}
|
||||||
template <class T>
|
template <class T>
|
||||||
inline T *operator-(T *ptr, const BE32 &v) noexcept {
|
inline bele_constexpr T *operator-(T *ptr, const BE32 &v) noexcept {
|
||||||
return ptr - unsigned(v);
|
return ptr - unsigned(v);
|
||||||
}
|
}
|
||||||
template <class T>
|
template <class T>
|
||||||
inline T *operator+(T *ptr, const LE16 &v) noexcept {
|
inline bele_constexpr T *operator+(T *ptr, const LE16 &v) noexcept {
|
||||||
return ptr + unsigned(v);
|
return ptr + unsigned(v);
|
||||||
}
|
}
|
||||||
template <class T>
|
template <class T>
|
||||||
inline T *operator-(T *ptr, const LE16 &v) noexcept {
|
inline bele_constexpr T *operator-(T *ptr, const LE16 &v) noexcept {
|
||||||
return ptr - unsigned(v);
|
return ptr - unsigned(v);
|
||||||
}
|
}
|
||||||
template <class T>
|
template <class T>
|
||||||
inline T *operator+(T *ptr, const LE32 &v) noexcept {
|
inline bele_constexpr T *operator+(T *ptr, const LE32 &v) noexcept {
|
||||||
return ptr + unsigned(v);
|
return ptr + unsigned(v);
|
||||||
}
|
}
|
||||||
template <class T>
|
template <class T>
|
||||||
inline T *operator-(T *ptr, const LE32 &v) noexcept {
|
inline bele_constexpr T *operator-(T *ptr, const LE32 &v) noexcept {
|
||||||
return ptr - unsigned(v);
|
return ptr - unsigned(v);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -750,40 +951,96 @@ template <class T>
|
|||||||
T *operator+(const LE64 &v, T *ptr) noexcept DELETED_FUNCTION;
|
T *operator+(const LE64 &v, T *ptr) noexcept DELETED_FUNCTION;
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
// global overloads
|
// some global overloads
|
||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
|
|
||||||
// TODO later: move these to upx namespace in util/cxxlib.h; see conf.h
|
namespace upx {
|
||||||
inline unsigned ALIGN_DOWN(unsigned a, const BE32 &b) { return ALIGN_DOWN(a, unsigned(b)); }
|
|
||||||
inline unsigned ALIGN_DOWN(const BE32 &a, unsigned b) { return ALIGN_DOWN(unsigned(a), b); }
|
|
||||||
inline unsigned ALIGN_UP(unsigned a, const BE32 &b) { return ALIGN_UP(a, unsigned(b)); }
|
|
||||||
inline unsigned ALIGN_UP(const BE32 &a, unsigned b) { return ALIGN_UP(unsigned(a), b); }
|
|
||||||
|
|
||||||
inline unsigned ALIGN_DOWN(unsigned a, const LE32 &b) { return ALIGN_DOWN(a, unsigned(b)); }
|
#define REQUIRE_UINT32 \
|
||||||
inline unsigned ALIGN_DOWN(const LE32 &a, unsigned b) { return ALIGN_DOWN(unsigned(a), b); }
|
template <class T, class = std::enable_if_t<std::is_same_v<T, upx_uint32_t>, T> >
|
||||||
inline unsigned ALIGN_UP(unsigned a, const LE32 &b) { return ALIGN_UP(a, unsigned(b)); }
|
#define REQUIRE_UINT64 \
|
||||||
inline unsigned ALIGN_UP(const LE32 &a, unsigned b) { return ALIGN_UP(unsigned(a), b); }
|
template <class T, class = std::enable_if_t<std::is_same_v<T, upx_uint64_t>, T> >
|
||||||
|
|
||||||
// TODO later: introduce upx::umax() and upx::umin()
|
REQUIRE_UINT32
|
||||||
inline unsigned UPX_MAX(unsigned a, const BE16 &b) { return UPX_MAX(a, unsigned(b)); }
|
inline bele_constexpr T align_down(const T &a, const BE32 &b) noexcept {
|
||||||
inline unsigned UPX_MAX(const BE16 &a, unsigned b) { return UPX_MAX(unsigned(a), b); }
|
return align_down(a, T(b));
|
||||||
inline unsigned UPX_MIN(unsigned a, const BE16 &b) { return UPX_MIN(a, unsigned(b)); }
|
}
|
||||||
inline unsigned UPX_MIN(const BE16 &a, unsigned b) { return UPX_MIN(unsigned(a), b); }
|
REQUIRE_UINT32
|
||||||
|
inline bele_constexpr T align_down(const BE32 &a, const T &b) noexcept {
|
||||||
|
return align_down(T(a), b);
|
||||||
|
}
|
||||||
|
REQUIRE_UINT32
|
||||||
|
inline bele_constexpr T align_down(const T &a, const LE32 &b) noexcept {
|
||||||
|
return align_down(a, T(b));
|
||||||
|
}
|
||||||
|
REQUIRE_UINT32
|
||||||
|
inline bele_constexpr T align_down(const LE32 &a, const T &b) noexcept {
|
||||||
|
return align_down(T(a), b);
|
||||||
|
}
|
||||||
|
|
||||||
inline unsigned UPX_MAX(unsigned a, const BE32 &b) { return UPX_MAX(a, unsigned(b)); }
|
REQUIRE_UINT32
|
||||||
inline unsigned UPX_MAX(const BE32 &a, unsigned b) { return UPX_MAX(unsigned(a), b); }
|
inline bele_constexpr T align_up(const T &a, const LE32 &b) noexcept { return align_up(a, T(b)); }
|
||||||
inline unsigned UPX_MIN(unsigned a, const BE32 &b) { return UPX_MIN(a, unsigned(b)); }
|
REQUIRE_UINT32
|
||||||
inline unsigned UPX_MIN(const BE32 &a, unsigned b) { return UPX_MIN(unsigned(a), b); }
|
inline bele_constexpr T align_up(const LE32 &a, const T &b) noexcept { return align_up(T(a), b); }
|
||||||
|
REQUIRE_UINT32
|
||||||
|
inline bele_constexpr T align_up(const T &a, const BE32 &b) noexcept { return align_up(a, T(b)); }
|
||||||
|
REQUIRE_UINT32
|
||||||
|
inline bele_constexpr T align_up(const BE32 &a, const T &b) noexcept { return align_up(T(a), b); }
|
||||||
|
|
||||||
inline unsigned UPX_MAX(unsigned a, const LE16 &b) { return UPX_MAX(a, unsigned(b)); }
|
REQUIRE_UINT32
|
||||||
inline unsigned UPX_MAX(const LE16 &a, unsigned b) { return UPX_MAX(unsigned(a), b); }
|
inline bele_constexpr T min(const T &a, const BE16 &b) noexcept { return min(a, T(b)); }
|
||||||
inline unsigned UPX_MIN(unsigned a, const LE16 &b) { return UPX_MIN(a, unsigned(b)); }
|
REQUIRE_UINT32
|
||||||
inline unsigned UPX_MIN(const LE16 &a, unsigned b) { return UPX_MIN(unsigned(a), b); }
|
inline bele_constexpr T min(const BE16 &a, const T &b) noexcept { return min(T(a), b); }
|
||||||
|
REQUIRE_UINT32
|
||||||
|
inline bele_constexpr T min(const T &a, const BE32 &b) noexcept { return min(a, T(b)); }
|
||||||
|
REQUIRE_UINT32
|
||||||
|
inline bele_constexpr T min(const BE32 &a, const T &b) noexcept { return min(T(a), b); }
|
||||||
|
REQUIRE_UINT64
|
||||||
|
inline bele_constexpr T min(const T &a, const BE64 &b) noexcept { return min(a, T(b)); }
|
||||||
|
REQUIRE_UINT64
|
||||||
|
inline bele_constexpr T min(const BE64 &a, const T &b) noexcept { return min(T(a), b); }
|
||||||
|
REQUIRE_UINT32
|
||||||
|
inline bele_constexpr T min(const T &a, const LE16 &b) noexcept { return min(a, T(b)); }
|
||||||
|
REQUIRE_UINT32
|
||||||
|
inline bele_constexpr T min(const LE16 &a, const T &b) noexcept { return min(T(a), b); }
|
||||||
|
REQUIRE_UINT32
|
||||||
|
inline bele_constexpr T min(const T &a, const LE32 &b) noexcept { return min(a, T(b)); }
|
||||||
|
REQUIRE_UINT32
|
||||||
|
inline bele_constexpr T min(const LE32 &a, const T &b) noexcept { return min(T(a), b); }
|
||||||
|
REQUIRE_UINT64
|
||||||
|
inline bele_constexpr T min(const T &a, const LE64 &b) noexcept { return min(a, T(b)); }
|
||||||
|
REQUIRE_UINT64
|
||||||
|
inline bele_constexpr T min(const LE64 &a, const T &b) noexcept { return min(T(a), b); }
|
||||||
|
|
||||||
inline unsigned UPX_MAX(unsigned a, const LE32 &b) { return UPX_MAX(a, unsigned(b)); }
|
REQUIRE_UINT32
|
||||||
inline unsigned UPX_MAX(const LE32 &a, unsigned b) { return UPX_MAX(unsigned(a), b); }
|
inline bele_constexpr T max(const T &a, const BE16 &b) noexcept { return max(a, T(b)); }
|
||||||
inline unsigned UPX_MIN(unsigned a, const LE32 &b) { return UPX_MIN(a, unsigned(b)); }
|
REQUIRE_UINT32
|
||||||
inline unsigned UPX_MIN(const LE32 &a, unsigned b) { return UPX_MIN(unsigned(a), b); }
|
inline bele_constexpr T max(const BE16 &a, const T &b) noexcept { return max(T(a), b); }
|
||||||
|
REQUIRE_UINT32
|
||||||
|
inline bele_constexpr T max(const T &a, const BE32 &b) noexcept { return max(a, T(b)); }
|
||||||
|
REQUIRE_UINT32
|
||||||
|
inline bele_constexpr T max(const BE32 &a, const T &b) noexcept { return max(T(a), b); }
|
||||||
|
REQUIRE_UINT64
|
||||||
|
inline bele_constexpr T max(const T &a, const BE64 &b) noexcept { return max(a, T(b)); }
|
||||||
|
REQUIRE_UINT64
|
||||||
|
inline bele_constexpr T max(const BE64 &a, const T &b) noexcept { return max(T(a), b); }
|
||||||
|
REQUIRE_UINT32
|
||||||
|
inline bele_constexpr T max(const T &a, const LE16 &b) noexcept { return max(a, T(b)); }
|
||||||
|
REQUIRE_UINT32
|
||||||
|
inline bele_constexpr T max(const LE16 &a, const T &b) noexcept { return max(T(a), b); }
|
||||||
|
REQUIRE_UINT32
|
||||||
|
inline bele_constexpr T max(const T &a, const LE32 &b) noexcept { return max(a, T(b)); }
|
||||||
|
REQUIRE_UINT32
|
||||||
|
inline bele_constexpr T max(const LE32 &a, const T &b) noexcept { return max(T(a), b); }
|
||||||
|
REQUIRE_UINT64
|
||||||
|
inline bele_constexpr T max(const T &a, const LE64 &b) noexcept { return max(a, T(b)); }
|
||||||
|
REQUIRE_UINT64
|
||||||
|
inline bele_constexpr T max(const LE64 &a, const T &b) noexcept { return max(T(a), b); }
|
||||||
|
|
||||||
|
#undef REQUIRE_UINT32
|
||||||
|
#undef REQUIRE_UINT64
|
||||||
|
|
||||||
|
} // namespace upx
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
// misc support
|
// misc support
|
||||||
|
|||||||
+6
-6
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2024 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2025 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2024 Laszlo Molnar
|
Copyright (C) 1996-2025 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
@@ -33,7 +33,7 @@
|
|||||||
|
|
||||||
#if defined(BELE_CTP)
|
#if defined(BELE_CTP)
|
||||||
// CTP - Compile-Time Polymorphism (templates)
|
// CTP - Compile-Time Polymorphism (templates)
|
||||||
#define V static inline
|
#define V static inline bele_constexpr
|
||||||
#define VV static forceinline_constexpr
|
#define VV static forceinline_constexpr
|
||||||
#define S static int __acc_cdecl_qsort
|
#define S static int __acc_cdecl_qsort
|
||||||
#define C noexcept
|
#define C noexcept
|
||||||
@@ -49,7 +49,7 @@
|
|||||||
|
|
||||||
#if defined(BELE_RTP)
|
#if defined(BELE_RTP)
|
||||||
struct AbstractPolicy {
|
struct AbstractPolicy {
|
||||||
explicit inline AbstractPolicy() noexcept {}
|
explicit inline AbstractPolicy() noexcept = default;
|
||||||
virtual inline ~AbstractPolicy() noexcept {}
|
virtual inline ~AbstractPolicy() noexcept {}
|
||||||
V bool isBE() C = 0;
|
V bool isBE() C = 0;
|
||||||
V bool isLE() C = 0;
|
V bool isLE() C = 0;
|
||||||
@@ -97,7 +97,7 @@ struct BEPolicy final
|
|||||||
: public AbstractPolicy
|
: public AbstractPolicy
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
explicit inline BEPolicy() noexcept {}
|
explicit inline BEPolicy() noexcept = default;
|
||||||
#if defined(BELE_CTP)
|
#if defined(BELE_CTP)
|
||||||
typedef N_BELE_RTP::BEPolicy RTP_Policy;
|
typedef N_BELE_RTP::BEPolicy RTP_Policy;
|
||||||
#elif defined(BELE_RTP)
|
#elif defined(BELE_RTP)
|
||||||
@@ -156,7 +156,7 @@ struct LEPolicy final
|
|||||||
: public AbstractPolicy
|
: public AbstractPolicy
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
explicit inline LEPolicy() noexcept {}
|
explicit inline LEPolicy() noexcept = default;
|
||||||
#if defined(BELE_CTP)
|
#if defined(BELE_CTP)
|
||||||
typedef N_BELE_RTP::LEPolicy RTP_Policy;
|
typedef N_BELE_RTP::LEPolicy RTP_Policy;
|
||||||
#elif defined(BELE_RTP)
|
#elif defined(BELE_RTP)
|
||||||
|
|||||||
+712
-89
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2024 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2025 Markus Franz Xaver Johannes Oberhumer
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
@@ -25,7 +25,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
// doctest checks, and various tests to catch toolchain/qemu/sanitizer/valgrind/wine/etc
|
// doctest checks, and various tests to catch toolchain/qemu/sanitizer/valgrind/wine/etc
|
||||||
// problems; grown historically
|
// problems; grown historically; modern compilers will optimize away much of this code
|
||||||
|
|
||||||
#include "../util/system_headers.h"
|
#include "../util/system_headers.h"
|
||||||
#include <cmath> // std::isinf std::isnan
|
#include <cmath> // std::isinf std::isnan
|
||||||
@@ -92,68 +92,235 @@ int upx_doctest_check(int argc, char **argv) {
|
|||||||
|
|
||||||
int upx_doctest_check() { return upx_doctest_check(0, nullptr); }
|
int upx_doctest_check() { return upx_doctest_check(0, nullptr); }
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
// check fundamental types
|
||||||
|
**************************************************************************/
|
||||||
|
|
||||||
|
static_assert(std::is_integral<ptrdiff_t>::value, "");
|
||||||
|
static_assert(std::is_integral<size_t>::value, "");
|
||||||
|
static_assert(std::is_integral<intptr_t>::value, "");
|
||||||
|
static_assert(std::is_integral<uintptr_t>::value, "");
|
||||||
|
|
||||||
|
static_assert(std::is_signed<ptrdiff_t>::value, "");
|
||||||
|
static_assert(!std::is_signed<size_t>::value, "");
|
||||||
|
static_assert(std::is_signed<intptr_t>::value, "");
|
||||||
|
static_assert(!std::is_signed<uintptr_t>::value, "");
|
||||||
|
|
||||||
|
static_assert(!std::is_unsigned<ptrdiff_t>::value, "");
|
||||||
|
static_assert(std::is_unsigned<size_t>::value, "");
|
||||||
|
static_assert(!std::is_unsigned<intptr_t>::value, "");
|
||||||
|
static_assert(std::is_unsigned<uintptr_t>::value, "");
|
||||||
|
|
||||||
|
#if defined(__SIZEOF_SHORT__)
|
||||||
|
static_assert(sizeof(short) == __SIZEOF_SHORT__, "");
|
||||||
|
#endif
|
||||||
|
#if defined(__SIZEOF_INT__)
|
||||||
|
static_assert(sizeof(int) == __SIZEOF_INT__, "");
|
||||||
|
#endif
|
||||||
|
#if defined(__SIZEOF_LONG__)
|
||||||
|
static_assert(sizeof(long) == __SIZEOF_LONG__, "");
|
||||||
|
#endif
|
||||||
|
#if defined(__SIZEOF_LONG_LONG__)
|
||||||
|
static_assert(sizeof(long long) == __SIZEOF_LONG_LONG__, "");
|
||||||
|
#endif
|
||||||
|
#if defined(__SIZEOF_INT128__)
|
||||||
|
static_assert(16 == __SIZEOF_INT128__, "");
|
||||||
|
static_assert(sizeof(__int128) == __SIZEOF_INT128__, "");
|
||||||
|
static_assert(sizeof(unsigned __int128) == __SIZEOF_INT128__, "");
|
||||||
|
static_assert(sizeof(upx_int128_t) == __SIZEOF_INT128__, "");
|
||||||
|
static_assert(sizeof(upx_uint128_t) == __SIZEOF_INT128__, "");
|
||||||
|
#endif
|
||||||
|
#if defined(__SIZEOF_PTRDIFF_T__)
|
||||||
|
static_assert(sizeof(ptrdiff_t) == __SIZEOF_PTRDIFF_T__, "");
|
||||||
|
#endif
|
||||||
|
#if defined(__SIZEOF_SIZE_T__)
|
||||||
|
static_assert(sizeof(size_t) == __SIZEOF_SIZE_T__, "");
|
||||||
|
#endif
|
||||||
|
#if defined(__SIZEOF_POINTER__)
|
||||||
|
static_assert(sizeof(void *) == __SIZEOF_POINTER__, "");
|
||||||
|
static_assert(sizeof(intptr_t) == __SIZEOF_POINTER__, "");
|
||||||
|
static_assert(sizeof(uintptr_t) == __SIZEOF_POINTER__, "");
|
||||||
|
#endif
|
||||||
|
#if defined(__SIZEOF_PTRADDR_T__)
|
||||||
|
static_assert(sizeof(__PTRADDR_TYPE__) == __SIZEOF_PTRADDR_T__, "");
|
||||||
|
static_assert(sizeof(upx_ptraddr_t) == __SIZEOF_PTRADDR_T__, "");
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(__SCHAR_WIDTH__)
|
||||||
|
static_assert(8 * sizeof(signed char) == __SCHAR_WIDTH__, "");
|
||||||
|
#endif
|
||||||
|
#if defined(__SHRT_WIDTH__)
|
||||||
|
static_assert(8 * sizeof(short) == __SHRT_WIDTH__, "");
|
||||||
|
#endif
|
||||||
|
#if defined(__INT_WIDTH__)
|
||||||
|
static_assert(8 * sizeof(int) == __INT_WIDTH__, "");
|
||||||
|
#endif
|
||||||
|
#if defined(__LONG_WIDTH__)
|
||||||
|
static_assert(8 * sizeof(long) == __LONG_WIDTH__, "");
|
||||||
|
#endif
|
||||||
|
#if defined(__LLONG_WIDTH__)
|
||||||
|
static_assert(8 * sizeof(long long) == __LLONG_WIDTH__, "");
|
||||||
|
#endif
|
||||||
|
#if defined(__INTMAX_WIDTH__)
|
||||||
|
static_assert(8 * sizeof(intmax_t) == __INTMAX_WIDTH__, "");
|
||||||
|
static_assert(8 * sizeof(uintmax_t) == __INTMAX_WIDTH__, "");
|
||||||
|
#endif
|
||||||
|
#if defined(__PTRDIFF_WIDTH__)
|
||||||
|
static_assert(8 * sizeof(ptrdiff_t) == __PTRDIFF_WIDTH__, "");
|
||||||
|
#endif
|
||||||
|
#if defined(__SIZE_WIDTH__)
|
||||||
|
static_assert(8 * sizeof(size_t) == __SIZE_WIDTH__, "");
|
||||||
|
#endif
|
||||||
|
#if defined(__INTPTR_WIDTH__)
|
||||||
|
static_assert(8 * sizeof(intptr_t) == __INTPTR_WIDTH__, "");
|
||||||
|
static_assert(8 * sizeof(uintptr_t) == __INTPTR_WIDTH__, "");
|
||||||
|
#endif
|
||||||
|
#if defined(__UINTPTR_WIDTH__)
|
||||||
|
static_assert(8 * sizeof(intptr_t) == __UINTPTR_WIDTH__, "");
|
||||||
|
static_assert(8 * sizeof(uintptr_t) == __UINTPTR_WIDTH__, "");
|
||||||
|
#endif
|
||||||
|
#if defined(__PTRADDR_WIDTH__)
|
||||||
|
static_assert(8 * sizeof(__PTRADDR_TYPE__) == __PTRADDR_WIDTH__, "");
|
||||||
|
static_assert(8 * sizeof(upx_ptraddr_t) == __PTRADDR_WIDTH__, "");
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// true types from compiler
|
||||||
|
typedef decltype((const char *) nullptr - (const char *) nullptr) true_ptrdiff_t;
|
||||||
|
typedef decltype(sizeof(0)) true_size_t;
|
||||||
|
|
||||||
|
// expected types from pre-defined macros
|
||||||
|
#if defined(__PTRDIFF_TYPE__)
|
||||||
|
typedef __PTRDIFF_TYPE__ expected_ptrdiff_t;
|
||||||
|
#endif
|
||||||
|
#if defined(__SIZE_TYPE__)
|
||||||
|
typedef __SIZE_TYPE__ expected_size_t;
|
||||||
|
#endif
|
||||||
|
#if defined(__INTPTR_TYPE__)
|
||||||
|
typedef __INTPTR_TYPE__ expected_intptr_t;
|
||||||
|
#endif
|
||||||
|
#if defined(__UINTPTR_TYPE__)
|
||||||
|
typedef __UINTPTR_TYPE__ expected_uintptr_t;
|
||||||
|
#endif
|
||||||
|
#if defined(__PTRADDR_TYPE__)
|
||||||
|
typedef __PTRADDR_TYPE__ expected_ptraddr_t;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define ASSERT_COMPATIBLE_TYPE(A, B) \
|
||||||
|
static_assert(std::is_integral<A>::value, ""); \
|
||||||
|
static_assert(std::is_integral<B>::value, ""); \
|
||||||
|
static_assert(std::is_signed<A>::value == std::is_signed<B>::value, ""); \
|
||||||
|
static_assert(std::is_unsigned<A>::value == std::is_unsigned<B>::value, ""); \
|
||||||
|
static_assert(std::is_signed<A>::value == !std::is_unsigned<A>::value, ""); \
|
||||||
|
static_assert(std::is_signed<B>::value == !std::is_unsigned<B>::value, ""); \
|
||||||
|
static_assert(sizeof(A) == sizeof(B), ""); \
|
||||||
|
static_assert(alignof(A) == alignof(B), "")
|
||||||
|
|
||||||
|
#define ASSERT_SAME_TYPE(A, B) \
|
||||||
|
ASSERT_COMPATIBLE_TYPE(A, B); \
|
||||||
|
static_assert(std::is_same<A, B>::value, "")
|
||||||
|
|
||||||
|
// C vs C++ headers
|
||||||
|
ASSERT_SAME_TYPE(ptrdiff_t, std::ptrdiff_t);
|
||||||
|
ASSERT_SAME_TYPE(size_t, std::size_t);
|
||||||
|
ASSERT_SAME_TYPE(intptr_t, std::intptr_t);
|
||||||
|
ASSERT_SAME_TYPE(uintptr_t, std::uintptr_t);
|
||||||
|
|
||||||
|
// true types
|
||||||
|
ASSERT_SAME_TYPE(ptrdiff_t, true_ptrdiff_t);
|
||||||
|
ASSERT_SAME_TYPE(size_t, true_size_t);
|
||||||
|
#if __cplusplus >= 201103L
|
||||||
|
typedef decltype(nullptr) true_nullptr_t;
|
||||||
|
static_assert(std::is_same<std::nullptr_t, true_nullptr_t>::value, "");
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// expected types
|
||||||
|
#if defined(__PTRDIFF_TYPE__)
|
||||||
|
static_assert(std::is_signed<expected_ptrdiff_t>::value, "");
|
||||||
|
ASSERT_SAME_TYPE(ptrdiff_t, expected_ptrdiff_t);
|
||||||
|
#endif
|
||||||
|
#if defined(__SIZE_TYPE__)
|
||||||
|
static_assert(std::is_unsigned<expected_size_t>::value, "");
|
||||||
|
ASSERT_SAME_TYPE(size_t, expected_size_t);
|
||||||
|
#endif
|
||||||
|
#if defined(__INTPTR_TYPE__)
|
||||||
|
static_assert(std::is_signed<expected_intptr_t>::value, "");
|
||||||
|
ASSERT_COMPATIBLE_TYPE(intptr_t, expected_intptr_t); // some toolchains are buggy
|
||||||
|
#endif
|
||||||
|
#if defined(__UINTPTR_TYPE__)
|
||||||
|
static_assert(std::is_unsigned<expected_uintptr_t>::value, "");
|
||||||
|
ASSERT_COMPATIBLE_TYPE(uintptr_t, expected_uintptr_t); // some toolchains are buggy
|
||||||
|
#endif
|
||||||
|
#if defined(__PTRADDR_TYPE__)
|
||||||
|
static_assert(std::is_unsigned<expected_ptraddr_t>::value, "");
|
||||||
|
ASSERT_SAME_TYPE(upx_ptraddr_t, expected_ptraddr_t);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// UPX types
|
||||||
|
ASSERT_SAME_TYPE(signed char, upx_int8_t);
|
||||||
|
ASSERT_SAME_TYPE(unsigned char, upx_uint8_t);
|
||||||
|
ASSERT_SAME_TYPE(short, upx_int16_t);
|
||||||
|
ASSERT_SAME_TYPE(unsigned short, upx_uint16_t);
|
||||||
|
ASSERT_SAME_TYPE(int, upx_int32_t);
|
||||||
|
ASSERT_SAME_TYPE(unsigned, upx_uint32_t);
|
||||||
|
#if (__SIZEOF_LONG_LONG__ + 0 < 128)
|
||||||
|
ASSERT_SAME_TYPE(long long, upx_int64_t);
|
||||||
|
ASSERT_SAME_TYPE(unsigned long long, upx_uint64_t);
|
||||||
|
#endif
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
// compile-time checks
|
// compile-time checks
|
||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
|
|
||||||
// need extra parenthesis because the C preprocessor does not understand C++ templates
|
static_assert(no_bswap16(0x04030201) == 0x0201);
|
||||||
ACC_COMPILE_TIME_ASSERT_HEADER((std::is_same<short, upx_int16_t>::value))
|
static_assert(no_bswap32(0x04030201) == 0x04030201);
|
||||||
ACC_COMPILE_TIME_ASSERT_HEADER((std::is_same<unsigned short, upx_uint16_t>::value))
|
static_assert(no_bswap64(0x0807060504030201ull) == 0x0807060504030201ull);
|
||||||
ACC_COMPILE_TIME_ASSERT_HEADER((std::is_same<int, upx_int32_t>::value))
|
#if !(ACC_CC_MSC) || defined(upx_is_constant_evaluated)
|
||||||
ACC_COMPILE_TIME_ASSERT_HEADER((std::is_same<unsigned, upx_uint32_t>::value))
|
static_assert(bswap16(0x04030201) == 0x0102);
|
||||||
ACC_COMPILE_TIME_ASSERT_HEADER((std::is_same<long long, upx_int64_t>::value))
|
static_assert(bswap32(0x04030201) == 0x01020304);
|
||||||
ACC_COMPILE_TIME_ASSERT_HEADER((std::is_same<unsigned long long, upx_uint64_t>::value))
|
static_assert(bswap64(0x0807060504030201ull) == 0x0102030405060708ull);
|
||||||
|
static_assert(bswap16(bswap16(0xf4f3f2f1)) == no_bswap16(0xf4f3f2f1));
|
||||||
ACC_COMPILE_TIME_ASSERT_HEADER(no_bswap16(0x04030201) == 0x0201)
|
static_assert(bswap32(bswap32(0xf4f3f2f1)) == no_bswap32(0xf4f3f2f1));
|
||||||
ACC_COMPILE_TIME_ASSERT_HEADER(no_bswap32(0x04030201) == 0x04030201)
|
static_assert(bswap64(bswap64(0xf8f7f6f5f4f3f2f1ull)) == no_bswap64(0xf8f7f6f5f4f3f2f1ull));
|
||||||
ACC_COMPILE_TIME_ASSERT_HEADER(no_bswap64(0x0807060504030201ull) == 0x0807060504030201ull)
|
|
||||||
#if !(ACC_CC_MSC) // unfortunately *not* constexpr with current MSVC
|
|
||||||
ACC_COMPILE_TIME_ASSERT_HEADER(bswap16(0x04030201) == 0x0102)
|
|
||||||
ACC_COMPILE_TIME_ASSERT_HEADER(bswap32(0x04030201) == 0x01020304)
|
|
||||||
ACC_COMPILE_TIME_ASSERT_HEADER(bswap64(0x0807060504030201ull) == 0x0102030405060708ull)
|
|
||||||
ACC_COMPILE_TIME_ASSERT_HEADER(bswap16(bswap16(0xf4f3f2f1)) == no_bswap16(0xf4f3f2f1))
|
|
||||||
ACC_COMPILE_TIME_ASSERT_HEADER(bswap32(bswap32(0xf4f3f2f1)) == no_bswap32(0xf4f3f2f1))
|
|
||||||
ACC_COMPILE_TIME_ASSERT_HEADER(bswap64(bswap64(0xf8f7f6f5f4f3f2f1ull)) ==
|
|
||||||
no_bswap64(0xf8f7f6f5f4f3f2f1ull))
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
ACC_COMPILE_TIME_ASSERT_HEADER(sign_extend(0u + 0, 8) == 0)
|
static_assert(sign_extend(0u + 0, 8) == 0);
|
||||||
ACC_COMPILE_TIME_ASSERT_HEADER(sign_extend(0u + 1, 8) == 1)
|
static_assert(sign_extend(0u + 1, 8) == 1);
|
||||||
ACC_COMPILE_TIME_ASSERT_HEADER(sign_extend(0u + 127, 8) == 127)
|
static_assert(sign_extend(0u + 127, 8) == 127);
|
||||||
ACC_COMPILE_TIME_ASSERT_HEADER(sign_extend(0u + 128, 8) == -128)
|
static_assert(sign_extend(0u + 128, 8) == -128);
|
||||||
ACC_COMPILE_TIME_ASSERT_HEADER(sign_extend(0u - 1, 8) == -1)
|
static_assert(sign_extend(0u - 1, 8) == -1);
|
||||||
ACC_COMPILE_TIME_ASSERT_HEADER(sign_extend(0u + 256, 8) == 0)
|
static_assert(sign_extend(0u + 256, 8) == 0);
|
||||||
ACC_COMPILE_TIME_ASSERT_HEADER(sign_extend(0u + 257, 8) == 1)
|
static_assert(sign_extend(0u + 257, 8) == 1);
|
||||||
ACC_COMPILE_TIME_ASSERT_HEADER(sign_extend(0u + 383, 8) == 127)
|
static_assert(sign_extend(0u + 383, 8) == 127);
|
||||||
ACC_COMPILE_TIME_ASSERT_HEADER(sign_extend(0u + 384, 8) == -128)
|
static_assert(sign_extend(0u + 384, 8) == -128);
|
||||||
ACC_COMPILE_TIME_ASSERT_HEADER(sign_extend(0u + 511, 8) == -1)
|
static_assert(sign_extend(0u + 511, 8) == -1);
|
||||||
ACC_COMPILE_TIME_ASSERT_HEADER(sign_extend(0ull + 0, 1) == 0)
|
static_assert(sign_extend(upx_uint64_t(0) + 0, 1) == 0);
|
||||||
ACC_COMPILE_TIME_ASSERT_HEADER(sign_extend(0ull + 1, 1) == -1)
|
static_assert(sign_extend(upx_uint64_t(0) + 1, 1) == -1);
|
||||||
|
|
||||||
ACC_COMPILE_TIME_ASSERT_HEADER(CHAR_BIT == 8)
|
static_assert(CHAR_BIT == 8);
|
||||||
#if 0 // does not work with MSVC
|
#if 0 // does not work with MSVC
|
||||||
#if '\0' - 1 < 0
|
#if '\0' - 1 < 0
|
||||||
ACC_COMPILE_TIME_ASSERT_HEADER(CHAR_MAX == 127)
|
static_assert(CHAR_MAX == 127);
|
||||||
#else
|
#else
|
||||||
ACC_COMPILE_TIME_ASSERT_HEADER(CHAR_MAX == 255)
|
static_assert(CHAR_MAX == 255);
|
||||||
#endif
|
#endif
|
||||||
#if L'\0' - 1 < 0
|
#if L'\0' - 1 < 0
|
||||||
ACC_COMPILE_TIME_ASSERT_HEADER((wchar_t) -1 < 0)
|
static_assert((wchar_t) -1 < 0);
|
||||||
#else
|
#else
|
||||||
ACC_COMPILE_TIME_ASSERT_HEADER((wchar_t) -1 > 0)
|
static_assert((wchar_t) -1 > 0);
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
// upx_compiler_sanity_check()
|
// upx_compiler_sanity_check()
|
||||||
// assert a sane architecture and compiler
|
// assert a sane architecture and compiler
|
||||||
// (modern compilers will optimize away most of this code)
|
|
||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
template <class T>
|
template <class T>
|
||||||
struct CheckIntegral {
|
struct CheckIntegral {
|
||||||
|
static_assert(upx_is_integral<T>::value);
|
||||||
|
static_assert(upx_is_integral_v<T>);
|
||||||
struct TestT {
|
struct TestT {
|
||||||
T a;
|
T a;
|
||||||
T x[2];
|
T x[2];
|
||||||
@@ -182,6 +349,10 @@ struct CheckIntegral {
|
|||||||
assert_noexcept(x[0] == 0 && x[1] == 0);
|
assert_noexcept(x[0] == 0 && x[1] == 0);
|
||||||
assert_noexcept(y[0] == 0 && y[1] == 0);
|
assert_noexcept(y[0] == 0 && y[1] == 0);
|
||||||
assert_noexcept(z[0] == 0 && z[1] == 0);
|
assert_noexcept(z[0] == 0 && z[1] == 0);
|
||||||
|
#if defined(upx_is_constant_evaluated)
|
||||||
|
static_assert(c == 0);
|
||||||
|
static_assert(z[0] == 0 && z[1] == 0);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
TestU<U> t;
|
TestU<U> t;
|
||||||
@@ -193,20 +364,20 @@ struct CheckIntegral {
|
|||||||
assert_noexcept(t.z[0] == 0 && t.z[1] == 0);
|
assert_noexcept(t.z[0] == 0 && t.z[1] == 0);
|
||||||
}
|
}
|
||||||
#if __cplusplus <= 201703L
|
#if __cplusplus <= 201703L
|
||||||
COMPILE_TIME_ASSERT(std::is_pod<U>::value) // std::is_pod is deprecated in C++20
|
static_assert(std::is_pod<U>::value); // std::is_pod is deprecated in C++20
|
||||||
#endif
|
#endif
|
||||||
COMPILE_TIME_ASSERT(std::is_standard_layout<U>::value)
|
static_assert(std::is_standard_layout<U>::value);
|
||||||
COMPILE_TIME_ASSERT(std::is_trivial<U>::value)
|
static_assert(std::is_trivial<U>::value);
|
||||||
// more checks, these are probably implied by std::is_trivial
|
// more checks, these are probably implied by std::is_trivial
|
||||||
COMPILE_TIME_ASSERT(std::is_nothrow_default_constructible<U>::value)
|
static_assert(std::is_nothrow_default_constructible<U>::value);
|
||||||
COMPILE_TIME_ASSERT(std::is_nothrow_destructible<U>::value)
|
static_assert(std::is_nothrow_destructible<U>::value);
|
||||||
COMPILE_TIME_ASSERT(std::is_trivially_copyable<U>::value)
|
static_assert(std::is_trivially_copyable<U>::value);
|
||||||
COMPILE_TIME_ASSERT(std::is_trivially_default_constructible<U>::value)
|
static_assert(std::is_trivially_default_constructible<U>::value);
|
||||||
// UPX extras
|
// UPX extras
|
||||||
COMPILE_TIME_ASSERT(upx_is_integral<U>::value)
|
static_assert(upx_is_integral<U>::value);
|
||||||
COMPILE_TIME_ASSERT(upx_is_integral_v<U>)
|
static_assert(upx_is_integral_v<U>);
|
||||||
}
|
}
|
||||||
static void check(void) noexcept {
|
static void check_core(void) noexcept {
|
||||||
{
|
{
|
||||||
TestT t = {};
|
TestT t = {};
|
||||||
assert_noexcept(t.a == 0);
|
assert_noexcept(t.a == 0);
|
||||||
@@ -230,8 +401,61 @@ struct CheckIntegral {
|
|||||||
}
|
}
|
||||||
checkU<T>();
|
checkU<T>();
|
||||||
checkU<typename std::add_const<T>::type>();
|
checkU<typename std::add_const<T>::type>();
|
||||||
|
{
|
||||||
|
T zero, one, three, four;
|
||||||
|
zero = 0;
|
||||||
|
one = 1;
|
||||||
|
three = 3;
|
||||||
|
four = 4;
|
||||||
|
assert_noexcept(zero == 0);
|
||||||
|
assert_noexcept(one == 1);
|
||||||
|
assert_noexcept(three == 3);
|
||||||
|
assert_noexcept(four == 4);
|
||||||
|
// min / max
|
||||||
|
assert_noexcept(upx::min(one, four) == 1);
|
||||||
|
assert_noexcept(upx::min(one, four) == one);
|
||||||
|
assert_noexcept(upx::max(one, four) == 4);
|
||||||
|
assert_noexcept(upx::max(one, four) == four);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
static void check(void) noexcept {
|
||||||
|
check_core();
|
||||||
|
{
|
||||||
|
T zero, one, three, four;
|
||||||
|
zero = 0;
|
||||||
|
one = 1;
|
||||||
|
three = 3;
|
||||||
|
four = 4;
|
||||||
|
// align - needs binary expressions which do not work
|
||||||
|
// on CHERI uintptr_t because of pointer provenance
|
||||||
|
assert_noexcept(upx::align_down(zero, four) == 0);
|
||||||
|
assert_noexcept(upx::align_down(zero, four) == zero);
|
||||||
|
assert_noexcept(upx::align_down(one, four) == 0);
|
||||||
|
assert_noexcept(upx::align_down(one, four) == zero);
|
||||||
|
assert_noexcept(upx::align_down(three, four) == 0);
|
||||||
|
assert_noexcept(upx::align_down(three, four) == zero);
|
||||||
|
assert_noexcept(upx::align_down(four, four) == 4);
|
||||||
|
assert_noexcept(upx::align_down(four, four) == four);
|
||||||
|
assert_noexcept(upx::align_up(zero, four) == 0);
|
||||||
|
assert_noexcept(upx::align_up(zero, four) == zero);
|
||||||
|
assert_noexcept(upx::align_up(one, four) == 4);
|
||||||
|
assert_noexcept(upx::align_up(one, four) == four);
|
||||||
|
assert_noexcept(upx::align_up(three, four) == 4);
|
||||||
|
assert_noexcept(upx::align_up(three, four) == four);
|
||||||
|
assert_noexcept(upx::align_up(four, four) == 4);
|
||||||
|
assert_noexcept(upx::align_up(four, four) == four);
|
||||||
|
assert_noexcept(upx::align_up_gap(zero, four) == 0);
|
||||||
|
assert_noexcept(upx::align_up_gap(zero, four) == zero);
|
||||||
|
assert_noexcept(upx::align_up_gap(one, four) == 3);
|
||||||
|
assert_noexcept(upx::align_up_gap(one, four) == three);
|
||||||
|
assert_noexcept(upx::align_up_gap(three, four) == 1);
|
||||||
|
assert_noexcept(upx::align_up_gap(three, four) == one);
|
||||||
|
assert_noexcept(upx::align_up_gap(four, four) == 0);
|
||||||
|
assert_noexcept(upx::align_up_gap(four, four) == zero);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
template <class T>
|
template <class T>
|
||||||
struct CheckAlignment {
|
struct CheckAlignment {
|
||||||
static void check(void) noexcept {
|
static void check(void) noexcept {
|
||||||
@@ -248,24 +472,32 @@ struct CheckAlignment {
|
|||||||
COMPILE_TIME_ASSERT_ALIGNED1(Test2)
|
COMPILE_TIME_ASSERT_ALIGNED1(Test2)
|
||||||
Test1 t1[7];
|
Test1 t1[7];
|
||||||
Test2 t2[7];
|
Test2 t2[7];
|
||||||
COMPILE_TIME_ASSERT(sizeof(Test1) == 1 + sizeof(T))
|
static_assert(sizeof(Test1) == 1 + sizeof(T));
|
||||||
COMPILE_TIME_ASSERT(sizeof(t1) == 7 + 7 * sizeof(T))
|
static_assert(sizeof(t1) == 7 + 7 * sizeof(T));
|
||||||
COMPILE_TIME_ASSERT(sizeof(Test2) == 1 + 3 * sizeof(T))
|
static_assert(sizeof(Test2) == 1 + 3 * sizeof(T));
|
||||||
COMPILE_TIME_ASSERT(sizeof(t2) == 7 + 21 * sizeof(T))
|
static_assert(sizeof(t2) == 7 + 21 * sizeof(T));
|
||||||
UNUSED(t1);
|
UNUSED(t1);
|
||||||
UNUSED(t2);
|
UNUSED(t2);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
template <class T>
|
template <class T>
|
||||||
struct TestBELE {
|
struct TestBELE {
|
||||||
static noinline bool test(void) noexcept {
|
static noinline bool test(void) noexcept {
|
||||||
|
static_assert(upx::is_same_any_v<T, BE16, BE32, BE64, LE16, LE32, LE64>);
|
||||||
|
static_assert(
|
||||||
|
upx::is_same_any_v<typename T::integral_conversion_type, upx_uint32_t, upx_uint64_t>);
|
||||||
CheckIntegral<T>::check();
|
CheckIntegral<T>::check();
|
||||||
CheckAlignment<T>::check();
|
CheckAlignment<T>::check();
|
||||||
// arithmetic checks
|
// arithmetic checks
|
||||||
T allbits = {};
|
{
|
||||||
assert_noexcept(allbits == 0);
|
T all_bits = {}; // == zero
|
||||||
allbits += 1;
|
assert_noexcept(all_bits == 0);
|
||||||
allbits -= 2;
|
assert_noexcept(!upx::has_single_bit(all_bits));
|
||||||
|
all_bits += 1;
|
||||||
|
assert_noexcept(upx::has_single_bit(all_bits));
|
||||||
|
all_bits -= 2;
|
||||||
|
assert_noexcept(!upx::has_single_bit(all_bits));
|
||||||
T v1;
|
T v1;
|
||||||
v1 = 1;
|
v1 = 1;
|
||||||
v1 *= 4;
|
v1 *= 4;
|
||||||
@@ -279,7 +511,7 @@ struct TestBELE {
|
|||||||
assert_noexcept((v1 >= v2));
|
assert_noexcept((v1 >= v2));
|
||||||
assert_noexcept(!(v1 < v2));
|
assert_noexcept(!(v1 < v2));
|
||||||
assert_noexcept(!(v1 > v2));
|
assert_noexcept(!(v1 > v2));
|
||||||
v2 ^= allbits;
|
v2 ^= all_bits;
|
||||||
assert_noexcept(!(v1 == v2));
|
assert_noexcept(!(v1 == v2));
|
||||||
assert_noexcept((v1 != v2));
|
assert_noexcept((v1 != v2));
|
||||||
assert_noexcept((v1 <= v2));
|
assert_noexcept((v1 <= v2));
|
||||||
@@ -301,12 +533,176 @@ struct TestBELE {
|
|||||||
assert_noexcept(v2 == 0);
|
assert_noexcept(v2 == 0);
|
||||||
if ((v1 ^ v2) != 1)
|
if ((v1 ^ v2) != 1)
|
||||||
return false;
|
return false;
|
||||||
|
}
|
||||||
|
// min/max
|
||||||
|
{
|
||||||
|
constexpr T a = {}; // == zero
|
||||||
|
typedef typename T::integral_conversion_type U;
|
||||||
|
constexpr U b = 1;
|
||||||
|
assert_noexcept(upx::min(a, a) == 0);
|
||||||
|
assert_noexcept(upx::min(a, a) == a);
|
||||||
|
assert_noexcept(upx::min(a, b) == 0);
|
||||||
|
assert_noexcept(upx::min(a, b) == a);
|
||||||
|
assert_noexcept(upx::min(b, a) == 0);
|
||||||
|
assert_noexcept(upx::min(b, a) == a);
|
||||||
|
assert_noexcept(upx::min(b, b) == 1);
|
||||||
|
assert_noexcept(upx::min(b, b) == b);
|
||||||
|
assert_noexcept(upx::max(a, a) == 0);
|
||||||
|
assert_noexcept(upx::max(a, a) == a);
|
||||||
|
assert_noexcept(upx::max(a, b) == 1);
|
||||||
|
assert_noexcept(upx::max(a, b) == b);
|
||||||
|
assert_noexcept(upx::max(b, a) == 1);
|
||||||
|
assert_noexcept(upx::max(b, a) == b);
|
||||||
|
assert_noexcept(upx::max(b, b) == 1);
|
||||||
|
assert_noexcept(upx::max(b, b) == b);
|
||||||
|
T minus_one_t = {}, minus_two_t = {};
|
||||||
|
minus_one_t -= 1;
|
||||||
|
minus_two_t -= 2;
|
||||||
|
const U minus_one_u = minus_one_t;
|
||||||
|
const U minus_two_u = minus_two_t;
|
||||||
|
assert_noexcept(upx::min(minus_one_t, minus_one_t) == minus_one_t);
|
||||||
|
assert_noexcept(upx::min(minus_one_t, minus_one_t) == minus_one_u);
|
||||||
|
assert_noexcept(upx::min(minus_one_u, minus_one_t) == minus_one_t);
|
||||||
|
assert_noexcept(upx::min(minus_one_u, minus_one_t) == minus_one_u);
|
||||||
|
assert_noexcept(upx::min(minus_one_t, minus_one_u) == minus_one_t);
|
||||||
|
assert_noexcept(upx::min(minus_one_t, minus_one_u) == minus_one_u);
|
||||||
|
assert_noexcept(upx::min(minus_two_t, minus_one_t) == minus_two_t);
|
||||||
|
assert_noexcept(upx::min(minus_two_t, minus_one_t) == minus_two_u);
|
||||||
|
assert_noexcept(upx::min(minus_two_u, minus_one_t) == minus_two_t);
|
||||||
|
assert_noexcept(upx::min(minus_two_u, minus_one_t) == minus_two_u);
|
||||||
|
assert_noexcept(upx::min(minus_two_t, minus_one_u) == minus_two_t);
|
||||||
|
assert_noexcept(upx::min(minus_two_t, minus_one_u) == minus_two_u);
|
||||||
|
assert_noexcept(upx::min(minus_one_t, minus_two_t) == minus_two_t);
|
||||||
|
assert_noexcept(upx::min(minus_one_t, minus_two_t) == minus_two_u);
|
||||||
|
assert_noexcept(upx::min(minus_one_u, minus_two_t) == minus_two_t);
|
||||||
|
assert_noexcept(upx::min(minus_one_u, minus_two_t) == minus_two_u);
|
||||||
|
assert_noexcept(upx::min(minus_one_t, minus_two_u) == minus_two_t);
|
||||||
|
assert_noexcept(upx::min(minus_one_t, minus_two_u) == minus_two_u);
|
||||||
|
assert_noexcept(upx::max(minus_one_t, minus_one_t) == minus_one_t);
|
||||||
|
assert_noexcept(upx::max(minus_one_t, minus_one_t) == minus_one_u);
|
||||||
|
assert_noexcept(upx::max(minus_one_u, minus_one_t) == minus_one_t);
|
||||||
|
assert_noexcept(upx::max(minus_one_u, minus_one_t) == minus_one_u);
|
||||||
|
assert_noexcept(upx::max(minus_one_t, minus_one_u) == minus_one_t);
|
||||||
|
assert_noexcept(upx::max(minus_one_t, minus_one_u) == minus_one_u);
|
||||||
|
assert_noexcept(upx::max(minus_two_t, minus_one_t) == minus_one_t);
|
||||||
|
assert_noexcept(upx::max(minus_two_t, minus_one_t) == minus_one_u);
|
||||||
|
assert_noexcept(upx::max(minus_two_u, minus_one_t) == minus_one_t);
|
||||||
|
assert_noexcept(upx::max(minus_two_u, minus_one_t) == minus_one_u);
|
||||||
|
assert_noexcept(upx::max(minus_two_t, minus_one_u) == minus_one_t);
|
||||||
|
assert_noexcept(upx::max(minus_two_t, minus_one_u) == minus_one_u);
|
||||||
|
assert_noexcept(upx::max(minus_one_t, minus_two_t) == minus_one_t);
|
||||||
|
assert_noexcept(upx::max(minus_one_t, minus_two_t) == minus_one_u);
|
||||||
|
assert_noexcept(upx::max(minus_one_u, minus_two_t) == minus_one_t);
|
||||||
|
assert_noexcept(upx::max(minus_one_u, minus_two_t) == minus_one_u);
|
||||||
|
assert_noexcept(upx::max(minus_one_t, minus_two_u) == minus_one_t);
|
||||||
|
assert_noexcept(upx::max(minus_one_t, minus_two_u) == minus_one_u);
|
||||||
|
}
|
||||||
|
// constexpr
|
||||||
|
{
|
||||||
|
constexpr T zero = {};
|
||||||
|
constexpr T zero_copy = T::make(zero);
|
||||||
|
assert_noexcept(zero_copy == 0);
|
||||||
|
assert_noexcept(!upx::has_single_bit(zero));
|
||||||
|
#if defined(upx_is_constant_evaluated)
|
||||||
|
static_assert(zero_copy == 0);
|
||||||
|
static_assert(zero_copy == zero);
|
||||||
|
static_assert(!upx::has_single_bit(zero));
|
||||||
|
static_assert(!upx::has_single_bit(zero_copy));
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
#if defined(upx_is_constant_evaluated)
|
||||||
|
{
|
||||||
|
typedef typename T::integral_conversion_type U;
|
||||||
|
constexpr T one = T::make(1);
|
||||||
|
static_assert(one == 1);
|
||||||
|
static_assert(upx::has_single_bit(one));
|
||||||
|
constexpr T four = T::make(one + 3);
|
||||||
|
static_assert(four == 4);
|
||||||
|
static_assert(upx::has_single_bit(four));
|
||||||
|
constexpr U all_bits_u = (U) T::make(U(0) - U(1));
|
||||||
|
constexpr T all_bits = T::make(all_bits_u);
|
||||||
|
static_assert(all_bits == all_bits_u);
|
||||||
|
static_assert(all_bits == T::make(one - 2));
|
||||||
|
static_assert(!upx::has_single_bit(all_bits));
|
||||||
|
static_assert(one == one);
|
||||||
|
static_assert(!(one == four));
|
||||||
|
static_assert(!(one == all_bits));
|
||||||
|
static_assert(one < four);
|
||||||
|
static_assert(one < all_bits);
|
||||||
|
static_assert(upx::min(one, four) == 1);
|
||||||
|
static_assert(upx::min(one, four) == one);
|
||||||
|
static_assert(upx::min(U(1), four) == 1);
|
||||||
|
static_assert(upx::min(one, U(4)) == 1);
|
||||||
|
static_assert(upx::max(one, four) == 4);
|
||||||
|
static_assert(upx::max(one, four) == four);
|
||||||
|
static_assert(upx::max(U(1), four) == 4);
|
||||||
|
static_assert(upx::max(one, U(4)) == 4);
|
||||||
|
static_assert(upx::align_down(one, four) == 0);
|
||||||
|
static_assert(upx::align_up(one, four) == 4);
|
||||||
|
static_assert(upx::align_up(one, four) == four);
|
||||||
|
static_assert(upx::align_up_gap(one, four) == 3);
|
||||||
|
static_assert(upx::align_up_gap(one, four) == T::make(four - 1));
|
||||||
|
static_assert(upx::align_up_gap(one, four) == T::make(four - one));
|
||||||
|
static_assert(upx::align_up_gap(one, four) == T::make(four + one - one - one));
|
||||||
|
static_assert(upx::align_up_gap(one, four) == T::make(four + one - 2 * one));
|
||||||
|
static_assert(upx::align_down_gap(T::make(4), four) == 0);
|
||||||
|
static_assert(upx::align_down_gap(T::make(5), four) == 1);
|
||||||
|
static_assert(upx::align_down_gap(T::make(6), four) == 2);
|
||||||
|
static_assert(upx::align_down_gap(T::make(7), four) == 3);
|
||||||
|
static_assert(upx::align_down_gap(T::make(8), four) == 0);
|
||||||
|
constexpr T one_copy = T::make(one);
|
||||||
|
static_assert(one_copy == one);
|
||||||
|
static_assert(one_copy == 1);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
template <class T, bool T_is_signed>
|
||||||
|
struct CheckSignedness {
|
||||||
|
static_assert(std::is_integral_v<T>);
|
||||||
|
static_assert(std::is_signed_v<T> == T_is_signed);
|
||||||
|
static_assert(std::is_unsigned_v<T> == !T_is_signed);
|
||||||
|
template <class U, bool U_is_signed>
|
||||||
|
static inline void checkU(void) noexcept {
|
||||||
|
static_assert(std::is_integral_v<U>);
|
||||||
|
static_assert(std::is_signed_v<U> == U_is_signed);
|
||||||
|
static_assert(std::is_unsigned_v<U> == !U_is_signed);
|
||||||
|
static_assert(sizeof(U) == sizeof(T));
|
||||||
|
static_assert(alignof(U) == alignof(T));
|
||||||
|
constexpr U all_bits = U(U(0) - U(1));
|
||||||
|
static_assert(all_bits == U(~U(0)));
|
||||||
|
static_assert(U_is_signed ? (all_bits < 0) : (all_bits > 0));
|
||||||
|
}
|
||||||
|
static void check(void) noexcept {
|
||||||
|
checkU<T, T_is_signed>();
|
||||||
|
using signed_type = std::make_signed_t<T>;
|
||||||
|
checkU<signed_type, true>();
|
||||||
|
using unsigned_type = std::make_unsigned_t<T>;
|
||||||
|
checkU<unsigned_type, false>();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
template <class A, class B>
|
template <class A, class B>
|
||||||
struct TestNoAliasingStruct {
|
struct CheckTypePair {
|
||||||
|
static_assert(std::is_integral_v<A>);
|
||||||
|
static_assert(std::is_integral_v<B>);
|
||||||
|
static_assert(std::is_signed_v<A>);
|
||||||
|
static_assert(!std::is_unsigned_v<A>);
|
||||||
|
static_assert(std::is_unsigned_v<B>);
|
||||||
|
static_assert(!std::is_signed_v<B>);
|
||||||
|
static_assert(std::is_same_v<A, std::make_signed_t<A> >);
|
||||||
|
static_assert(std::is_same_v<A, std::make_signed_t<B> >);
|
||||||
|
static_assert(std::is_same_v<B, std::make_unsigned_t<A> >);
|
||||||
|
static_assert(std::is_same_v<B, std::make_unsigned_t<B> >);
|
||||||
|
static_assert(sizeof(A) == sizeof(B));
|
||||||
|
static_assert(alignof(A) == alignof(B));
|
||||||
|
static inline void check(void) noexcept {}
|
||||||
|
};
|
||||||
|
|
||||||
|
template <class A, class B>
|
||||||
|
struct TestNoAliasingStruct { // check working -fno-strict-aliasing
|
||||||
static noinline bool test(A *a, B *b) noexcept {
|
static noinline bool test(A *a, B *b) noexcept {
|
||||||
*a = 0;
|
*a = 0;
|
||||||
*b = 0;
|
*b = 0;
|
||||||
@@ -318,11 +714,12 @@ 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 {
|
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; }
|
||||||
static inline bool dec_lt(const T x) noexcept { return x - 1 < x; }
|
static inline bool dec_lt(const T x) noexcept { return x - 1 < x; }
|
||||||
static inline bool neg_eq(const T x) noexcept { return T(0) - x == x; }
|
static inline bool neg_eq(const T x) noexcept { return T(T(0) - x) == x; }
|
||||||
};
|
};
|
||||||
|
|
||||||
//
|
//
|
||||||
@@ -454,9 +851,9 @@ void upx_compiler_sanity_check(void) noexcept {
|
|||||||
auto a = +0;
|
auto a = +0;
|
||||||
constexpr auto b = -0;
|
constexpr auto b = -0;
|
||||||
const auto &c = -1;
|
const auto &c = -1;
|
||||||
COMPILE_TIME_ASSERT((std::is_same<int, decltype(a)>::value))
|
static_assert((std::is_same<int, decltype(a)>::value));
|
||||||
COMPILE_TIME_ASSERT((std::is_same<const int, decltype(b)>::value))
|
static_assert((std::is_same<const int, decltype(b)>::value));
|
||||||
COMPILE_TIME_ASSERT((std::is_same<const int &, decltype(c)>::value))
|
static_assert((std::is_same<const int &, decltype(c)>::value));
|
||||||
UNUSED(a);
|
UNUSED(a);
|
||||||
UNUSED(b);
|
UNUSED(b);
|
||||||
UNUSED(c);
|
UNUSED(c);
|
||||||
@@ -468,18 +865,33 @@ void upx_compiler_sanity_check(void) noexcept {
|
|||||||
#include "../util/miniacc.h"
|
#include "../util/miniacc.h"
|
||||||
#undef ACCCHK_ASSERT
|
#undef ACCCHK_ASSERT
|
||||||
|
|
||||||
COMPILE_TIME_ASSERT(sizeof(char) == 1)
|
static_assert(sizeof(char) == 1);
|
||||||
COMPILE_TIME_ASSERT(sizeof(short) == 2)
|
static_assert(sizeof(short) == 2);
|
||||||
COMPILE_TIME_ASSERT(sizeof(int) == 4)
|
static_assert(sizeof(int) == 4);
|
||||||
COMPILE_TIME_ASSERT(sizeof(long) >= 4)
|
static_assert(sizeof(long) >= 4);
|
||||||
COMPILE_TIME_ASSERT(sizeof(void *) >= 4)
|
static_assert(sizeof(long long) >= 8);
|
||||||
|
static_assert(sizeof(void *) >= 4);
|
||||||
|
static_assert(sizeof(upx_off_t) >= 8);
|
||||||
|
static_assert(sizeof(upx_off_t) >= sizeof(long long));
|
||||||
|
|
||||||
COMPILE_TIME_ASSERT(sizeof(BE16) == 2)
|
// __int64
|
||||||
COMPILE_TIME_ASSERT(sizeof(BE32) == 4)
|
#if defined(_MSC_VER)
|
||||||
COMPILE_TIME_ASSERT(sizeof(BE64) == 8)
|
{
|
||||||
COMPILE_TIME_ASSERT(sizeof(LE16) == 2)
|
ASSERT_SAME_TYPE(long long, __int64);
|
||||||
COMPILE_TIME_ASSERT(sizeof(LE32) == 4)
|
ASSERT_SAME_TYPE(unsigned long long, unsigned __int64);
|
||||||
COMPILE_TIME_ASSERT(sizeof(LE64) == 8)
|
typedef __int64 my_int64;
|
||||||
|
typedef unsigned __int64 my_uint64;
|
||||||
|
ASSERT_SAME_TYPE(long long, my_int64);
|
||||||
|
ASSERT_SAME_TYPE(unsigned long long, my_uint64);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static_assert(sizeof(BE16) == 2);
|
||||||
|
static_assert(sizeof(BE32) == 4);
|
||||||
|
static_assert(sizeof(BE64) == 8);
|
||||||
|
static_assert(sizeof(LE16) == 2);
|
||||||
|
static_assert(sizeof(LE32) == 4);
|
||||||
|
static_assert(sizeof(LE64) == 8);
|
||||||
|
|
||||||
COMPILE_TIME_ASSERT_ALIGNED1(BE16)
|
COMPILE_TIME_ASSERT_ALIGNED1(BE16)
|
||||||
COMPILE_TIME_ASSERT_ALIGNED1(BE32)
|
COMPILE_TIME_ASSERT_ALIGNED1(BE32)
|
||||||
@@ -488,21 +900,166 @@ void upx_compiler_sanity_check(void) noexcept {
|
|||||||
COMPILE_TIME_ASSERT_ALIGNED1(LE32)
|
COMPILE_TIME_ASSERT_ALIGNED1(LE32)
|
||||||
COMPILE_TIME_ASSERT_ALIGNED1(LE64)
|
COMPILE_TIME_ASSERT_ALIGNED1(LE64)
|
||||||
|
|
||||||
|
// check that these types are not some multi-word macro
|
||||||
|
#define CHECK_TYPE(T) (void) (T())
|
||||||
|
CHECK_TYPE(int8_t);
|
||||||
|
CHECK_TYPE(uint8_t);
|
||||||
|
CHECK_TYPE(int16_t);
|
||||||
|
CHECK_TYPE(uint16_t);
|
||||||
|
CHECK_TYPE(int32_t);
|
||||||
|
CHECK_TYPE(uint32_t);
|
||||||
|
CHECK_TYPE(int64_t);
|
||||||
|
CHECK_TYPE(uint64_t);
|
||||||
|
CHECK_TYPE(intmax_t);
|
||||||
|
CHECK_TYPE(uintmax_t);
|
||||||
|
CHECK_TYPE(ptrdiff_t);
|
||||||
|
CHECK_TYPE(size_t);
|
||||||
|
CHECK_TYPE(intptr_t);
|
||||||
|
CHECK_TYPE(uintptr_t);
|
||||||
|
#if 0
|
||||||
|
CHECK_TYPE(acc_int8_t);
|
||||||
|
CHECK_TYPE(acc_uint8_t);
|
||||||
|
CHECK_TYPE(acc_int16_t);
|
||||||
|
CHECK_TYPE(acc_uint16_t);
|
||||||
|
CHECK_TYPE(acc_int32_t);
|
||||||
|
CHECK_TYPE(acc_uint32_t);
|
||||||
|
CHECK_TYPE(acc_int64_t);
|
||||||
|
CHECK_TYPE(acc_uint64_t);
|
||||||
|
CHECK_TYPE(acc_intptr_t);
|
||||||
|
CHECK_TYPE(acc_uintptr_t);
|
||||||
|
#endif
|
||||||
|
CHECK_TYPE(upx_int8_t);
|
||||||
|
CHECK_TYPE(upx_uint8_t);
|
||||||
|
CHECK_TYPE(upx_int16_t);
|
||||||
|
CHECK_TYPE(upx_uint16_t);
|
||||||
|
CHECK_TYPE(upx_int32_t);
|
||||||
|
CHECK_TYPE(upx_uint32_t);
|
||||||
|
CHECK_TYPE(upx_int64_t);
|
||||||
|
CHECK_TYPE(upx_uint64_t);
|
||||||
|
#if (__SIZEOF_INT128__ == 16)
|
||||||
|
CHECK_TYPE(upx_int128_t);
|
||||||
|
CHECK_TYPE(upx_uint128_t);
|
||||||
|
#endif
|
||||||
|
CHECK_TYPE(upx_ptraddr_t);
|
||||||
|
CHECK_TYPE(upx_uintptr_t);
|
||||||
|
CHECK_TYPE(upx_uptrdiff_t);
|
||||||
|
CHECK_TYPE(upx_ssize_t);
|
||||||
|
#undef CHECK_TYPE
|
||||||
|
|
||||||
CheckIntegral<char>::check();
|
CheckIntegral<char>::check();
|
||||||
CheckIntegral<signed char>::check();
|
CheckIntegral<signed char>::check();
|
||||||
CheckIntegral<unsigned char>::check();
|
CheckIntegral<unsigned char>::check();
|
||||||
CheckIntegral<short>::check();
|
CheckIntegral<short>::check();
|
||||||
|
CheckIntegral<unsigned short>::check();
|
||||||
CheckIntegral<int>::check();
|
CheckIntegral<int>::check();
|
||||||
|
CheckIntegral<unsigned>::check();
|
||||||
CheckIntegral<long>::check();
|
CheckIntegral<long>::check();
|
||||||
|
CheckIntegral<unsigned long>::check();
|
||||||
CheckIntegral<long long>::check();
|
CheckIntegral<long long>::check();
|
||||||
|
CheckIntegral<unsigned long long>::check();
|
||||||
|
CheckIntegral<intmax_t>::check();
|
||||||
|
CheckIntegral<uintmax_t>::check();
|
||||||
|
CheckIntegral<upx_int8_t>::check();
|
||||||
|
CheckIntegral<upx_uint8_t>::check();
|
||||||
|
CheckIntegral<upx_int16_t>::check();
|
||||||
|
CheckIntegral<upx_uint16_t>::check();
|
||||||
|
CheckIntegral<upx_int32_t>::check();
|
||||||
|
CheckIntegral<upx_uint32_t>::check();
|
||||||
|
CheckIntegral<upx_int64_t>::check();
|
||||||
|
CheckIntegral<upx_uint64_t>::check();
|
||||||
|
CheckIntegral<upx_off_t>::check();
|
||||||
CheckIntegral<ptrdiff_t>::check();
|
CheckIntegral<ptrdiff_t>::check();
|
||||||
CheckIntegral<size_t>::check();
|
CheckIntegral<size_t>::check();
|
||||||
CheckIntegral<upx_off_t>::check();
|
CheckIntegral<upx_ptraddr_t>::check();
|
||||||
|
#if defined(__CHERI__) && defined(__CHERI_PURE_CAPABILITY__)
|
||||||
|
static_assert(sizeof(upx_ptraddr_t) == 8);
|
||||||
|
static_assert(alignof(upx_ptraddr_t) == 8);
|
||||||
|
static_assert(sizeof(void *) == 16);
|
||||||
|
static_assert(alignof(void *) == 16);
|
||||||
|
static_assert(sizeof(uintptr_t) == 16);
|
||||||
|
static_assert(alignof(uintptr_t) == 16);
|
||||||
|
// warning: binary expression on capability types 'unsigned __intcap' and 'unsigned __intcap'
|
||||||
|
CheckIntegral<intptr_t>::check_core();
|
||||||
|
CheckIntegral<uintptr_t>::check_core();
|
||||||
|
CheckIntegral<upx_uintptr_t>::check_core();
|
||||||
|
#else
|
||||||
|
CheckIntegral<intptr_t>::check();
|
||||||
|
CheckIntegral<uintptr_t>::check();
|
||||||
CheckIntegral<upx_uintptr_t>::check();
|
CheckIntegral<upx_uintptr_t>::check();
|
||||||
|
#endif
|
||||||
|
#if (__SIZEOF_INT128__ == 16)
|
||||||
|
#if defined(_CPP_VER) || defined(_WIN32) // int128 is not fully supported by MSVC libstdc++ yet
|
||||||
|
#else
|
||||||
|
CheckIntegral<upx_int128_t>::check();
|
||||||
|
CheckIntegral<upx_uint128_t>::check();
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
COMPILE_TIME_ASSERT(sizeof(upx_charptr_unit_type) == 1)
|
CheckSignedness<char, false>::check(); // -funsigned-char
|
||||||
|
CheckSignedness<signed char, true>::check();
|
||||||
|
CheckSignedness<unsigned char, false>::check();
|
||||||
|
CheckSignedness<short, true>::check();
|
||||||
|
CheckSignedness<unsigned short, false>::check();
|
||||||
|
CheckSignedness<int, true>::check();
|
||||||
|
CheckSignedness<unsigned, false>::check();
|
||||||
|
CheckSignedness<long, true>::check();
|
||||||
|
CheckSignedness<unsigned long, false>::check();
|
||||||
|
CheckSignedness<long long, true>::check();
|
||||||
|
CheckSignedness<unsigned long long, false>::check();
|
||||||
|
CheckSignedness<intmax_t, true>::check();
|
||||||
|
CheckSignedness<uintmax_t, false>::check();
|
||||||
|
CheckSignedness<upx_int8_t, true>::check();
|
||||||
|
CheckSignedness<upx_uint8_t, false>::check();
|
||||||
|
CheckSignedness<upx_int16_t, true>::check();
|
||||||
|
CheckSignedness<upx_uint16_t, false>::check();
|
||||||
|
CheckSignedness<upx_int32_t, true>::check();
|
||||||
|
CheckSignedness<upx_uint32_t, false>::check();
|
||||||
|
CheckSignedness<upx_int64_t, true>::check();
|
||||||
|
CheckSignedness<upx_uint64_t, false>::check();
|
||||||
|
#if (__SIZEOF_INT128__ == 16)
|
||||||
|
#if defined(_CPP_VER) || defined(_WIN32) // int128 is not fully supported by MSVC libstdc++ yet
|
||||||
|
#else
|
||||||
|
CheckSignedness<upx_int128_t, true>::check();
|
||||||
|
CheckSignedness<upx_uint128_t, false>::check();
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
CheckSignedness<upx_off_t, true>::check();
|
||||||
|
CheckSignedness<ptrdiff_t, true>::check();
|
||||||
|
CheckSignedness<size_t, false>::check();
|
||||||
|
CheckSignedness<upx_ptraddr_t, false>::check();
|
||||||
|
CheckSignedness<intptr_t, true>::check();
|
||||||
|
CheckSignedness<uintptr_t, false>::check();
|
||||||
|
CheckSignedness<upx_uintptr_t, false>::check();
|
||||||
|
|
||||||
|
#define CHECK_TYPE_PAIR(A, B) \
|
||||||
|
CheckTypePair<A, B>::check(); \
|
||||||
|
static_assert(alignof(A) == alignof(B))
|
||||||
|
CHECK_TYPE_PAIR(signed char, unsigned char);
|
||||||
|
CHECK_TYPE_PAIR(short, unsigned short);
|
||||||
|
CHECK_TYPE_PAIR(int, unsigned);
|
||||||
|
CHECK_TYPE_PAIR(long, unsigned long);
|
||||||
|
CHECK_TYPE_PAIR(long long, unsigned long long);
|
||||||
|
CHECK_TYPE_PAIR(intmax_t, uintmax_t);
|
||||||
|
CHECK_TYPE_PAIR(upx_int8_t, upx_uint8_t);
|
||||||
|
CHECK_TYPE_PAIR(upx_int16_t, upx_uint16_t);
|
||||||
|
CHECK_TYPE_PAIR(upx_int32_t, upx_uint32_t);
|
||||||
|
CHECK_TYPE_PAIR(upx_int64_t, upx_uint64_t);
|
||||||
|
#if (__SIZEOF_INT128__ == 16)
|
||||||
|
#if defined(_CPP_VER) || defined(_WIN32) // int128 is not fully supported by MSVC libstdc++ yet
|
||||||
|
#else
|
||||||
|
CHECK_TYPE_PAIR(upx_int128_t, upx_uint128_t);
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
CHECK_TYPE_PAIR(ptrdiff_t, upx_uptrdiff_t);
|
||||||
|
CHECK_TYPE_PAIR(upx_ssize_t, size_t);
|
||||||
|
CHECK_TYPE_PAIR(upx_sptraddr_t, upx_ptraddr_t);
|
||||||
|
CHECK_TYPE_PAIR(intptr_t, uintptr_t);
|
||||||
|
CHECK_TYPE_PAIR(acc_intptr_t, acc_uintptr_t);
|
||||||
|
#undef CHECK_TYPE_PAIR
|
||||||
|
|
||||||
|
static_assert(sizeof(upx_charptr_unit_type) == 1);
|
||||||
COMPILE_TIME_ASSERT_ALIGNED1(upx_charptr_unit_type)
|
COMPILE_TIME_ASSERT_ALIGNED1(upx_charptr_unit_type)
|
||||||
COMPILE_TIME_ASSERT(sizeof(*((charptr) nullptr)) == 1)
|
static_assert(sizeof(*((charptr) nullptr)) == 1);
|
||||||
|
|
||||||
// check UPX_VERSION_xxx
|
// check UPX_VERSION_xxx
|
||||||
{
|
{
|
||||||
@@ -544,12 +1101,23 @@ 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 const byte dd[32] = {
|
alignas(16) static constexpr 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};
|
||||||
const byte *d;
|
constexpr const byte *d = dd + 7;
|
||||||
|
#if !defined(upx_fake_alignas_16)
|
||||||
|
assert_noexcept(ptr_is_aligned<16>(dd));
|
||||||
|
assert_noexcept(ptr_is_aligned(dd, 16));
|
||||||
|
#endif
|
||||||
|
static_assert(upx::compile_time::get_be16(d) == 0xfffe);
|
||||||
|
static_assert(upx::compile_time::get_be24(d) == 0xfffefd);
|
||||||
|
static_assert(upx::compile_time::get_be32(d) == 0xfffefdfc);
|
||||||
|
static_assert(upx::compile_time::get_be64(d) == 0xfffefdfcfbfaf9f8ULL);
|
||||||
|
static_assert(upx::compile_time::get_le16(d) == 0xfeff);
|
||||||
|
static_assert(upx::compile_time::get_le24(d) == 0xfdfeff);
|
||||||
|
static_assert(upx::compile_time::get_le32(d) == 0xfcfdfeff);
|
||||||
|
static_assert(upx::compile_time::get_le64(d) == 0xf8f9fafbfcfdfeffULL);
|
||||||
const N_BELE_RTP::AbstractPolicy *bele;
|
const N_BELE_RTP::AbstractPolicy *bele;
|
||||||
d = dd + 7;
|
|
||||||
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);
|
||||||
@@ -563,6 +1131,9 @@ void upx_compiler_sanity_check(void) noexcept {
|
|||||||
assert_noexcept(get_be32(d) == 0xfffefdfc);
|
assert_noexcept(get_be32(d) == 0xfffefdfc);
|
||||||
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(bele->get64(d) == 0xfffefdfcfbfaf9f8ULL);
|
||||||
|
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);
|
||||||
assert_noexcept(bele->get16(d) == 0xfeff);
|
assert_noexcept(bele->get16(d) == 0xfeff);
|
||||||
@@ -573,17 +1144,69 @@ void upx_compiler_sanity_check(void) noexcept {
|
|||||||
assert_noexcept(get_le32(d) == 0xfcfdfeff);
|
assert_noexcept(get_le32(d) == 0xfcfdfeff);
|
||||||
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(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_le24(d) == 0xfdfeff);
|
||||||
|
#if defined(upx_is_constant_evaluated)
|
||||||
|
static_assert(get_be24_signed(d) == -259);
|
||||||
|
static_assert(get_le24_signed(d) == -131329);
|
||||||
|
static_assert(get_be16(d) == 0xfffe);
|
||||||
|
static_assert(get_be16_signed(d) == -2);
|
||||||
|
static_assert(get_be32(d) == 0xfffefdfc);
|
||||||
|
static_assert(get_be32_signed(d) == -66052);
|
||||||
|
static_assert(get_be64(d) == 0xfffefdfcfbfaf9f8ULL);
|
||||||
|
static_assert(get_be64_signed(d) == -283686952306184LL);
|
||||||
|
static_assert(get_le16(d) == 0xfeff);
|
||||||
|
static_assert(get_le16_signed(d) == -257);
|
||||||
|
static_assert(get_le32(d) == 0xfcfdfeff);
|
||||||
|
static_assert(get_le32_signed(d) == -50462977);
|
||||||
|
static_assert(get_le64(d) == 0xf8f9fafbfcfdfeffULL);
|
||||||
|
static_assert(get_le64_signed(d) == -506097522914230529LL);
|
||||||
|
#endif
|
||||||
assert_noexcept(find_be16(d, 2, 0xfffe) == 0);
|
assert_noexcept(find_be16(d, 2, 0xfffe) == 0);
|
||||||
assert_noexcept(find_le16(d, 2, 0xfeff) == 0);
|
assert_noexcept(find_le16(d, 2, 0xfeff) == 0);
|
||||||
assert_noexcept(find_be32(d, 4, 0xfffefdfc) == 0);
|
assert_noexcept(find_be32(d, 4, 0xfffefdfc) == 0);
|
||||||
assert_noexcept(find_le32(d, 4, 0xfcfdfeff) == 0);
|
assert_noexcept(find_le32(d, 4, 0xfcfdfeff) == 0);
|
||||||
d += 12;
|
constexpr const byte *e = d + 12;
|
||||||
assert_noexcept(get_be16_signed(d) == 32638);
|
assert_noexcept(get_be16_signed(e) == 32638);
|
||||||
assert_noexcept(get_be24_signed(d) == 8355453);
|
assert_noexcept(get_be24_signed(e) == 8355453);
|
||||||
assert_noexcept(get_be32_signed(d) == 2138996092);
|
assert_noexcept(get_be32_signed(e) == 2138996092);
|
||||||
assert_noexcept(get_be64_signed(d) == 9186918263483431288LL);
|
assert_noexcept(get_be64_signed(e) == 9186918263483431288LL);
|
||||||
|
#if defined(upx_is_constant_evaluated)
|
||||||
|
static_assert(get_be16_signed(e) == 32638);
|
||||||
|
static_assert(get_be24_signed(e) == 8355453);
|
||||||
|
static_assert(get_be32_signed(e) == 2138996092);
|
||||||
|
static_assert(get_be64_signed(e) == 9186918263483431288LL);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
#if defined(upx_is_constant_evaluated)
|
||||||
|
{
|
||||||
|
constexpr upx_uint16_t v16 = 0x0201;
|
||||||
|
constexpr upx_uint32_t v32 = 0x04030201;
|
||||||
|
constexpr upx_uint64_t v64 = 0x0807060504030201ull;
|
||||||
|
constexpr BE16 be16 = BE16::make(v16);
|
||||||
|
constexpr BE32 be32 = BE32::make(v32);
|
||||||
|
constexpr BE64 be64 = BE64::make(v64);
|
||||||
|
constexpr LE16 le16 = LE16::make(v16);
|
||||||
|
constexpr LE32 le32 = LE32::make(v32);
|
||||||
|
constexpr LE64 le64 = LE64::make(v64);
|
||||||
|
using upx::compile_time::mem_eq;
|
||||||
|
static_assert(mem_eq(be16.d, "\x02\x01", 2));
|
||||||
|
static_assert(mem_eq(be32.d, "\x04\x03\x02\x01", 4));
|
||||||
|
static_assert(mem_eq(be64.d, "\x08\x07\x06\x05\x04\x03\x02\x01", 8));
|
||||||
|
static_assert(mem_eq(le16.d, "\x01\x02", 2));
|
||||||
|
static_assert(mem_eq(le32.d, "\x01\x02\x03\x04", 4));
|
||||||
|
static_assert(mem_eq(le64.d, "\x01\x02\x03\x04\x05\x06\x07\x08", 8));
|
||||||
|
constexpr NE16 ne16 = NE16::make(v16);
|
||||||
|
constexpr NE32 ne32 = NE32::make(v32);
|
||||||
|
constexpr NE64 ne64 = NE64::make(v64);
|
||||||
|
assert_noexcept(memcmp(&v16, ne16.d, 2) == 0);
|
||||||
|
assert_noexcept(memcmp(&v32, ne32.d, 4) == 0);
|
||||||
|
assert_noexcept(memcmp(&v64, ne64.d, 8) == 0);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
#if DEBUG >= 1
|
#if DEBUG >= 1
|
||||||
{
|
{
|
||||||
for (int i = 0; i < 256; i++) {
|
for (int i = 0; i < 256; i++) {
|
||||||
@@ -611,7 +1234,7 @@ void upx_compiler_sanity_check(void) noexcept {
|
|||||||
assert_noexcept(sign_extend(u, 7) == ((i & 64) ? -64 + (i & 63) : (i & 63)));
|
assert_noexcept(sign_extend(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_extend(u, 8) == ((i & 128) ? -128 + (i & 127) : (i & 127)));
|
||||||
assert_noexcept(sign_extend(u, 64) == i);
|
assert_noexcept(sign_extend(u, 64) == i);
|
||||||
assert_noexcept(sign_extend(0ull - u, 64) == -i);
|
assert_noexcept(sign_extend(upx_uint64_t(0) - u, 64) == -i);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -778,7 +1401,7 @@ TEST_CASE("libc snprintf") {
|
|||||||
// runtime check that Windows/MinGW <stdio.h> works as expected
|
// runtime check that Windows/MinGW <stdio.h> works as expected
|
||||||
char buf[64];
|
char buf[64];
|
||||||
long long ll = acc_vget_int(-1, 0);
|
long long ll = acc_vget_int(-1, 0);
|
||||||
unsigned long long llu = (unsigned long long) ll;
|
unsigned long long llu = (upx_uint64_t) (upx_int64_t) ll;
|
||||||
snprintf(buf, sizeof(buf), "%d.%ld.%lld.%u.%lu.%llu", -3, -2L, ll, 3U, 2LU, llu);
|
snprintf(buf, sizeof(buf), "%d.%ld.%lld.%u.%lu.%llu", -3, -2L, ll, 3U, 2LU, llu);
|
||||||
CHECK_EQ(strcmp(buf, "-3.-2.-1.3.2.18446744073709551615"), 0);
|
CHECK_EQ(strcmp(buf, "-3.-2.-1.3.2.18446744073709551615"), 0);
|
||||||
intmax_t im = ll;
|
intmax_t im = ll;
|
||||||
@@ -815,7 +1438,7 @@ TEST_CASE("libc qsort") {
|
|||||||
const Elem *a = (const Elem *) aa;
|
const Elem *a = (const Elem *) aa;
|
||||||
const Elem *b = (const Elem *) bb;
|
const Elem *b = (const Elem *) bb;
|
||||||
assert_noexcept(a->id != b->id); // check not IDENTICAL
|
assert_noexcept(a->id != b->id); // check not IDENTICAL
|
||||||
return a->value < b->value ? -1 : (a->value == b->value ? 0 : 1);
|
return a->value == b->value ? 0 : (a->value < b->value ? -1 : 1);
|
||||||
}
|
}
|
||||||
static noinline bool check_sort(upx_sort_func_t sort, Elem *e, size_t n, bool is_stable) {
|
static noinline bool check_sort(upx_sort_func_t sort, Elem *e, size_t n, bool is_stable) {
|
||||||
upx_uint32_t x = 5381 + (upx_rand() & 255);
|
upx_uint32_t x = 5381 + (upx_rand() & 255);
|
||||||
|
|||||||
+665
-137
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2024 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2025 Markus Franz Xaver Johannes Oberhumer
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
@@ -32,87 +32,7 @@
|
|||||||
#include "../conf.h"
|
#include "../conf.h"
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
// compile-time checks
|
// standard C++ library
|
||||||
**************************************************************************/
|
|
||||||
|
|
||||||
// need extra parenthesis because the C preprocessor does not understand C++ templates
|
|
||||||
ACC_COMPILE_TIME_ASSERT_HEADER((upx::is_same_all_v<int>) )
|
|
||||||
ACC_COMPILE_TIME_ASSERT_HEADER((upx::is_same_all_v<int, int>) )
|
|
||||||
ACC_COMPILE_TIME_ASSERT_HEADER((upx::is_same_all_v<int, int, int>) )
|
|
||||||
ACC_COMPILE_TIME_ASSERT_HEADER((!upx::is_same_all_v<int, char>) )
|
|
||||||
ACC_COMPILE_TIME_ASSERT_HEADER((!upx::is_same_all_v<int, char, int>) )
|
|
||||||
ACC_COMPILE_TIME_ASSERT_HEADER((!upx::is_same_all_v<int, int, char>) )
|
|
||||||
|
|
||||||
ACC_COMPILE_TIME_ASSERT_HEADER((!upx::is_same_any_v<int>) )
|
|
||||||
ACC_COMPILE_TIME_ASSERT_HEADER((upx::is_same_any_v<int, int>) )
|
|
||||||
ACC_COMPILE_TIME_ASSERT_HEADER((upx::is_same_any_v<int, char, int>) )
|
|
||||||
ACC_COMPILE_TIME_ASSERT_HEADER((upx::is_same_any_v<int, int, char>) )
|
|
||||||
ACC_COMPILE_TIME_ASSERT_HEADER((!upx::is_same_any_v<int, char>) )
|
|
||||||
ACC_COMPILE_TIME_ASSERT_HEADER((!upx::is_same_any_v<int, char, char>) )
|
|
||||||
ACC_COMPILE_TIME_ASSERT_HEADER((!upx::is_same_any_v<int, char, long>) )
|
|
||||||
|
|
||||||
ACC_COMPILE_TIME_ASSERT_HEADER((upx::is_same_any_v<ptrdiff_t, int, long, long long>) )
|
|
||||||
ACC_COMPILE_TIME_ASSERT_HEADER(
|
|
||||||
(upx::is_same_any_v<size_t, unsigned, unsigned long, unsigned long long>) )
|
|
||||||
ACC_COMPILE_TIME_ASSERT_HEADER(
|
|
||||||
(upx::is_same_any_v<upx_uintptr_t, unsigned, unsigned long, unsigned long long>) )
|
|
||||||
|
|
||||||
ACC_COMPILE_TIME_ASSERT_HEADER(usizeof(int) == sizeof(int))
|
|
||||||
ACC_COMPILE_TIME_ASSERT_HEADER(usizeof('a') == sizeof(char))
|
|
||||||
ACC_COMPILE_TIME_ASSERT_HEADER(usizeof("") == 1)
|
|
||||||
ACC_COMPILE_TIME_ASSERT_HEADER(usizeof("a") == 2)
|
|
||||||
ACC_COMPILE_TIME_ASSERT_HEADER(usizeof("ab") == 3)
|
|
||||||
ACC_COMPILE_TIME_ASSERT_HEADER(usizeof(L'a') == sizeof(wchar_t))
|
|
||||||
ACC_COMPILE_TIME_ASSERT_HEADER(usizeof(L"") == 1 * sizeof(wchar_t))
|
|
||||||
ACC_COMPILE_TIME_ASSERT_HEADER(usizeof(L"a") == 2 * sizeof(wchar_t))
|
|
||||||
ACC_COMPILE_TIME_ASSERT_HEADER(usizeof(L"ab") == 3 * sizeof(wchar_t))
|
|
||||||
ACC_COMPILE_TIME_ASSERT_HEADER(usizeof(0) == sizeof(int))
|
|
||||||
ACC_COMPILE_TIME_ASSERT_HEADER(usizeof(0L) == sizeof(long))
|
|
||||||
ACC_COMPILE_TIME_ASSERT_HEADER(usizeof(0LL) == sizeof(long long))
|
|
||||||
ACC_COMPILE_TIME_ASSERT_HEADER(usizeof(nullptr) == sizeof(void *))
|
|
||||||
ACC_COMPILE_TIME_ASSERT_HEADER(usizeof(sizeof(0)) == sizeof(size_t))
|
|
||||||
ACC_COMPILE_TIME_ASSERT_HEADER(usizeof(usizeof(0)) == sizeof(unsigned))
|
|
||||||
#if 0
|
|
||||||
// works, but may trigger clang/gcc warnings "-Wunused-value"
|
|
||||||
ACC_COMPILE_TIME_ASSERT_HEADER(usizeof((1LL, 1)) == sizeof(int))
|
|
||||||
ACC_COMPILE_TIME_ASSERT_HEADER(usizeof((1, 1LL)) == sizeof(long long))
|
|
||||||
#endif
|
|
||||||
|
|
||||||
namespace compile_time = upx::compile_time;
|
|
||||||
ACC_COMPILE_TIME_ASSERT_HEADER(compile_time::string_len("") == 0)
|
|
||||||
ACC_COMPILE_TIME_ASSERT_HEADER(compile_time::string_len("a") == 1)
|
|
||||||
ACC_COMPILE_TIME_ASSERT_HEADER(compile_time::string_len("ab") == 2)
|
|
||||||
ACC_COMPILE_TIME_ASSERT_HEADER(compile_time::string_len("abc") == 3)
|
|
||||||
|
|
||||||
ACC_COMPILE_TIME_ASSERT_HEADER(compile_time::string_eq("", ""))
|
|
||||||
ACC_COMPILE_TIME_ASSERT_HEADER(!compile_time::string_eq("a", ""))
|
|
||||||
ACC_COMPILE_TIME_ASSERT_HEADER(!compile_time::string_eq("", "a"))
|
|
||||||
ACC_COMPILE_TIME_ASSERT_HEADER(compile_time::string_eq("abc", "abc"))
|
|
||||||
ACC_COMPILE_TIME_ASSERT_HEADER(!compile_time::string_eq("ab", "abc"))
|
|
||||||
ACC_COMPILE_TIME_ASSERT_HEADER(!compile_time::string_eq("abc", "ab"))
|
|
||||||
|
|
||||||
ACC_COMPILE_TIME_ASSERT_HEADER(!compile_time::string_lt("", ""))
|
|
||||||
ACC_COMPILE_TIME_ASSERT_HEADER(!compile_time::string_lt("a", ""))
|
|
||||||
ACC_COMPILE_TIME_ASSERT_HEADER(compile_time::string_lt("", "a"))
|
|
||||||
ACC_COMPILE_TIME_ASSERT_HEADER(!compile_time::string_lt("abc", "abc"))
|
|
||||||
ACC_COMPILE_TIME_ASSERT_HEADER(compile_time::string_lt("ab", "abc"))
|
|
||||||
ACC_COMPILE_TIME_ASSERT_HEADER(!compile_time::string_lt("abc", "ab"))
|
|
||||||
ACC_COMPILE_TIME_ASSERT_HEADER(!compile_time::string_lt("abc", "aba"))
|
|
||||||
ACC_COMPILE_TIME_ASSERT_HEADER(compile_time::string_lt("abc", "abz"))
|
|
||||||
|
|
||||||
ACC_COMPILE_TIME_ASSERT_HEADER(compile_time::string_ne("abc", "abz"))
|
|
||||||
ACC_COMPILE_TIME_ASSERT_HEADER(!compile_time::string_gt("abc", "abz"))
|
|
||||||
ACC_COMPILE_TIME_ASSERT_HEADER(!compile_time::string_ge("abc", "abz"))
|
|
||||||
ACC_COMPILE_TIME_ASSERT_HEADER(compile_time::string_le("abc", "abz"))
|
|
||||||
|
|
||||||
ACC_COMPILE_TIME_ASSERT_HEADER(compile_time::mem_eq((const char *) nullptr, nullptr, 0))
|
|
||||||
ACC_COMPILE_TIME_ASSERT_HEADER(compile_time::mem_eq((const byte *) nullptr, nullptr, 0))
|
|
||||||
ACC_COMPILE_TIME_ASSERT_HEADER(compile_time::mem_eq("", "", 0))
|
|
||||||
ACC_COMPILE_TIME_ASSERT_HEADER(compile_time::mem_eq("abc", "abc", 3))
|
|
||||||
ACC_COMPILE_TIME_ASSERT_HEADER(!compile_time::mem_eq("abc", "abz", 3))
|
|
||||||
|
|
||||||
/*************************************************************************
|
|
||||||
//
|
|
||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
|
|
||||||
TEST_CASE("std::vector") {
|
TEST_CASE("std::vector") {
|
||||||
@@ -121,16 +41,16 @@ TEST_CASE("std::vector") {
|
|||||||
CHECK(v.end() - v.begin() == N);
|
CHECK(v.end() - v.begin() == N);
|
||||||
CHECK(&v[0] == &(*(v.begin())));
|
CHECK(&v[0] == &(*(v.begin())));
|
||||||
// CHECK(&v[0] + N == &(*(v.end()))); // TODO later: is this legal??
|
// CHECK(&v[0] + N == &(*(v.end()))); // TODO later: is this legal??
|
||||||
// TODO later: make sure that this throws
|
#if defined(_LIBCPP_HARDENING_MODE) && defined(_LIBCPP_HARDENING_MODE_DEBUG) && \
|
||||||
#if defined(_LIBCPP_HARDENING_MODE_DEBUG) && \
|
|
||||||
(_LIBCPP_HARDENING_MODE == _LIBCPP_HARDENING_MODE_DEBUG)
|
(_LIBCPP_HARDENING_MODE == _LIBCPP_HARDENING_MODE_DEBUG)
|
||||||
CHECK_THROWS((void) &v[N]);
|
// unfortunately this does NOT throw but ABORTS
|
||||||
|
////CHECK_THROWS((void) &v[N]);
|
||||||
#endif
|
#endif
|
||||||
UNUSED(v);
|
UNUSED(v);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
// UPX_CXX_DISABLE_xxx
|
// core util: UPX_CXX_DISABLE_xxx, noncopyable
|
||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
@@ -246,10 +166,350 @@ struct Z2_X2 : public X2 {
|
|||||||
|
|
||||||
} // namespace test_disable_new_delete
|
} // namespace test_disable_new_delete
|
||||||
|
|
||||||
|
TEST_CASE("upx::noncopyable") {
|
||||||
|
struct Test : private upx::noncopyable {
|
||||||
|
int v = 1;
|
||||||
|
};
|
||||||
|
Test t = {};
|
||||||
|
CHECK(t.v == 1);
|
||||||
|
#if (ACC_CC_MSC) // MSVC thinks that Test is not std::is_trivially_copyable; true or compiler bug?
|
||||||
|
// @COMPILER_BUG @MSVC_BUG
|
||||||
|
t.v = 0;
|
||||||
|
#else
|
||||||
|
mem_clear(&t);
|
||||||
|
#endif
|
||||||
|
CHECK(t.v == 0);
|
||||||
|
constexpr Test x = {};
|
||||||
|
static_assert(x.v == 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
// <type_traits>
|
||||||
|
**************************************************************************/
|
||||||
|
|
||||||
|
static_assert(!upx::is_bounded_array_v<std::nullptr_t>);
|
||||||
|
static_assert(!upx::is_bounded_array_v<decltype(nullptr)>);
|
||||||
|
static_assert(!upx::is_bounded_array_v<void *>);
|
||||||
|
static_assert(!upx::is_bounded_array_v<int *>);
|
||||||
|
static_assert(!upx::is_bounded_array_v<const int *>);
|
||||||
|
static_assert(!upx::is_bounded_array_v<volatile int *>);
|
||||||
|
static_assert(!upx::is_bounded_array_v<const volatile int *>);
|
||||||
|
static_assert(upx::is_bounded_array_v<int[1]>);
|
||||||
|
static_assert(upx::is_bounded_array_v<const int[1]>);
|
||||||
|
static_assert(upx::is_bounded_array_v<volatile int[1]>);
|
||||||
|
static_assert(upx::is_bounded_array_v<const volatile int[1]>);
|
||||||
|
static_assert(upx::is_bounded_array_v<int[1u]>);
|
||||||
|
static_assert(upx::is_bounded_array_v<const int[1u]>);
|
||||||
|
static_assert(upx::is_bounded_array_v<volatile int[1u]>);
|
||||||
|
static_assert(upx::is_bounded_array_v<const volatile int[1u]>);
|
||||||
|
static_assert(upx::is_bounded_array_v<int[1l]>);
|
||||||
|
static_assert(upx::is_bounded_array_v<const int[1l]>);
|
||||||
|
static_assert(upx::is_bounded_array_v<volatile int[1l]>);
|
||||||
|
static_assert(upx::is_bounded_array_v<const volatile int[1l]>);
|
||||||
|
|
||||||
|
static_assert(upx::is_same_all_v<int>);
|
||||||
|
static_assert(upx::is_same_all_v<int, int>);
|
||||||
|
static_assert(upx::is_same_all_v<int, int, int>);
|
||||||
|
static_assert(!upx::is_same_all_v<int, char>);
|
||||||
|
static_assert(!upx::is_same_all_v<int, char, int>);
|
||||||
|
static_assert(!upx::is_same_all_v<int, int, char>);
|
||||||
|
|
||||||
|
static_assert(!upx::is_same_any_v<int>);
|
||||||
|
static_assert(upx::is_same_any_v<int, int>);
|
||||||
|
static_assert(upx::is_same_any_v<int, char, int>);
|
||||||
|
static_assert(upx::is_same_any_v<int, int, char>);
|
||||||
|
static_assert(!upx::is_same_any_v<int, char>);
|
||||||
|
static_assert(!upx::is_same_any_v<int, char, char>);
|
||||||
|
static_assert(!upx::is_same_any_v<int, char, long>);
|
||||||
|
|
||||||
|
static_assert(upx::is_same_any_v<ptrdiff_t, int, long, long long>);
|
||||||
|
static_assert(upx::is_same_any_v<size_t, unsigned, unsigned long, unsigned long long>);
|
||||||
|
static_assert(upx::is_same_any_v<upx_ptraddr_t, unsigned, unsigned long, unsigned long long>);
|
||||||
|
#if defined(__CHERI__) && defined(__CHERI_PURE_CAPABILITY__)
|
||||||
|
static_assert(!upx::is_same_any_v<upx_uintptr_t, unsigned, unsigned long, unsigned long long>);
|
||||||
|
#else
|
||||||
|
static_assert(upx::is_same_any_v<upx_uintptr_t, unsigned, unsigned long, unsigned long long>);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static_assert(std::is_same_v<int, upx::remove_cvref_t<int> >);
|
||||||
|
static_assert(std::is_same_v<int, upx::remove_cvref_t<const int> >);
|
||||||
|
static_assert(std::is_same_v<int, upx::remove_cvref_t<int &> >);
|
||||||
|
static_assert(std::is_same_v<int, upx::remove_cvref_t<const int &> >);
|
||||||
|
static_assert(std::is_same_v<int, upx::remove_cvref_t<int &&> >);
|
||||||
|
static_assert(std::is_same_v<int, upx::remove_cvref_t<const int &&> >);
|
||||||
|
static_assert(std::is_same_v<int *, upx::remove_cvref_t<int *> >);
|
||||||
|
static_assert(std::is_same_v<int *, upx::remove_cvref_t<int *const> >);
|
||||||
|
static_assert(std::is_same_v<const int *, upx::remove_cvref_t<const int *> >);
|
||||||
|
static_assert(std::is_same_v<int *, upx::remove_cvref_t<int *&> >);
|
||||||
|
static_assert(std::is_same_v<int *, upx::remove_cvref_t<int *const &> >);
|
||||||
|
static_assert(std::is_same_v<const int *, upx::remove_cvref_t<const int *&> >);
|
||||||
|
static_assert(std::is_same_v<int *, upx::remove_cvref_t<int *&&> >);
|
||||||
|
static_assert(std::is_same_v<int *, upx::remove_cvref_t<int *const &&> >);
|
||||||
|
static_assert(std::is_same_v<const int *, upx::remove_cvref_t<const int *&&> >);
|
||||||
|
static_assert(std::is_same_v<int[1], upx::remove_cvref_t<int[1]> >);
|
||||||
|
static_assert(std::is_same_v<int[1], upx::remove_cvref_t<const int[1]> >);
|
||||||
|
|
||||||
|
static_assert(std::is_same_v<int, upx::type_identity_t<int> >);
|
||||||
|
static_assert(std::is_same_v<const int, upx::type_identity_t<const int> >);
|
||||||
|
static_assert(std::is_same_v<int *, upx::type_identity_t<int *> >);
|
||||||
|
static_assert(std::is_same_v<int *const, upx::type_identity_t<int *const> >);
|
||||||
|
static_assert(std::is_same_v<const int *, upx::type_identity_t<const int *> >);
|
||||||
|
static_assert(std::is_same_v<int &, upx::type_identity_t<int &> >);
|
||||||
|
static_assert(std::is_same_v<const int &, upx::type_identity_t<const int &> >);
|
||||||
|
static_assert(std::is_same_v<int &&, upx::type_identity_t<int &&> >);
|
||||||
|
static_assert(std::is_same_v<const int &&, upx::type_identity_t<const int &&> >);
|
||||||
|
static_assert(std::is_same_v<int[1], upx::type_identity_t<int[1]> >);
|
||||||
|
static_assert(std::is_same_v<const int[1], upx::type_identity_t<const int[1]> >);
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
// <bit>
|
||||||
|
**************************************************************************/
|
||||||
|
|
||||||
|
static_assert(!upx::has_single_bit(0));
|
||||||
|
static_assert(upx::has_single_bit(1));
|
||||||
|
static_assert(upx::has_single_bit(2));
|
||||||
|
static_assert(!upx::has_single_bit(3));
|
||||||
|
static_assert(upx::has_single_bit(4));
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
// <algorithm>
|
||||||
|
**************************************************************************/
|
||||||
|
|
||||||
|
static_assert(upx::align_down(0, 4) == 0);
|
||||||
|
static_assert(upx::align_down(1, 4) == 0);
|
||||||
|
static_assert(upx::align_down(2, 4) == 0);
|
||||||
|
static_assert(upx::align_down(3, 4) == 0);
|
||||||
|
static_assert(upx::align_down(4, 4) == 4);
|
||||||
|
static_assert(upx::align_up(0, 4) == 0);
|
||||||
|
static_assert(upx::align_up(1, 4) == 4);
|
||||||
|
static_assert(upx::align_up(2, 4) == 4);
|
||||||
|
static_assert(upx::align_up(3, 4) == 4);
|
||||||
|
static_assert(upx::align_up(4, 4) == 4);
|
||||||
|
static_assert(upx::align_up_gap(0, 4) == 0);
|
||||||
|
static_assert(upx::align_up_gap(1, 4) == 3);
|
||||||
|
static_assert(upx::align_up_gap(2, 4) == 2);
|
||||||
|
static_assert(upx::align_up_gap(3, 4) == 1);
|
||||||
|
static_assert(upx::align_up_gap(4, 4) == 0);
|
||||||
|
|
||||||
|
static_assert(upx::min<upx_int8_t>(1, 2) == 1);
|
||||||
|
static_assert(upx::min<upx_int16_t>(1, 2) == 1);
|
||||||
|
static_assert(upx::min<upx_int32_t>(1, 2) == 1);
|
||||||
|
static_assert(upx::min<upx_int64_t>(1, 2) == 1);
|
||||||
|
static_assert(upx::min<intmax_t>(1, 2) == 1);
|
||||||
|
static_assert(upx::max<upx_int8_t>(1, 2) == 2);
|
||||||
|
static_assert(upx::max<upx_int16_t>(1, 2) == 2);
|
||||||
|
static_assert(upx::max<upx_int32_t>(1, 2) == 2);
|
||||||
|
static_assert(upx::max<upx_int64_t>(1, 2) == 2);
|
||||||
|
static_assert(upx::max<intmax_t>(1, 2) == 2);
|
||||||
|
|
||||||
|
static_assert(upx::min(1, 2) == 1);
|
||||||
|
static_assert(upx::min(1l, 2l) == 1);
|
||||||
|
static_assert(upx::min(1ll, 2ll) == 1);
|
||||||
|
static_assert(upx::max(1, 2) == 2);
|
||||||
|
static_assert(upx::max(1l, 2l) == 2);
|
||||||
|
static_assert(upx::max(1ll, 2ll) == 2);
|
||||||
|
|
||||||
|
static_assert(upx::umin<upx_uint8_t>(1, 2) == 1);
|
||||||
|
static_assert(upx::umin<upx_uint16_t>(1, 2) == 1);
|
||||||
|
static_assert(upx::umin<upx_uint32_t>(1, 2) == 1);
|
||||||
|
static_assert(upx::umin<upx_uint64_t>(1, 2) == 1);
|
||||||
|
static_assert(upx::umin<uintmax_t>(1, 2) == 1);
|
||||||
|
static_assert(upx::umax<upx_uint8_t>(1, 2) == 2);
|
||||||
|
static_assert(upx::umax<upx_uint16_t>(1, 2) == 2);
|
||||||
|
static_assert(upx::umax<upx_uint32_t>(1, 2) == 2);
|
||||||
|
static_assert(upx::umax<upx_uint64_t>(1, 2) == 2);
|
||||||
|
static_assert(upx::umax<uintmax_t>(1, 2) == 2);
|
||||||
|
|
||||||
|
static_assert(upx::umin(1u, 2u) == 1);
|
||||||
|
static_assert(upx::umin(1ul, 2ul) == 1);
|
||||||
|
static_assert(upx::umin(1ull, 2ull) == 1);
|
||||||
|
static_assert(upx::umax(1u, 2u) == 2);
|
||||||
|
static_assert(upx::umax(1ul, 2ul) == 2);
|
||||||
|
static_assert(upx::umax(1ull, 2ull) == 2);
|
||||||
|
|
||||||
|
static_assert(upx::wrapping_add<upx_int8_t>(127, 2) == -127);
|
||||||
|
static_assert(upx::wrapping_add<upx_int16_t>(32767, 2) == -32767);
|
||||||
|
static_assert(upx::wrapping_add(2147483647, 2) == -2147483647);
|
||||||
|
static_assert(upx::wrapping_add(9223372036854775807ll, 2ll) == -9223372036854775807ll);
|
||||||
|
static_assert(upx::wrapping_sub<upx_int8_t>(-127, 2) == 127);
|
||||||
|
static_assert(upx::wrapping_sub<upx_int16_t>(-32767, 2) == 32767);
|
||||||
|
static_assert(upx::wrapping_sub(-2147483647, 2) == 2147483647);
|
||||||
|
static_assert(upx::wrapping_sub(-9223372036854775807ll, 2ll) == 9223372036854775807ll);
|
||||||
|
|
||||||
|
static_assert(upx::wrapping_add<upx_uint8_t>(255, 2) == 1);
|
||||||
|
static_assert(upx::wrapping_sub<upx_uint8_t>(1, 2) == 255);
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
// util
|
// util
|
||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
|
|
||||||
|
// upx::UnsignedSizeOf
|
||||||
|
static_assert(usizeof(int) == sizeof(int));
|
||||||
|
static_assert(usizeof('a') == sizeof(char));
|
||||||
|
static_assert(usizeof("") == 1);
|
||||||
|
static_assert(usizeof("a") == 2);
|
||||||
|
static_assert(usizeof("ab") == 3);
|
||||||
|
static_assert(usizeof(L'a') == sizeof(wchar_t));
|
||||||
|
static_assert(usizeof(L"") == 1 * sizeof(wchar_t));
|
||||||
|
static_assert(usizeof(L"a") == 2 * sizeof(wchar_t));
|
||||||
|
static_assert(usizeof(L"ab") == 3 * sizeof(wchar_t));
|
||||||
|
static_assert(usizeof(0) == sizeof(int));
|
||||||
|
static_assert(usizeof(0L) == sizeof(long));
|
||||||
|
static_assert(usizeof(0LL) == sizeof(long long));
|
||||||
|
static_assert(usizeof(nullptr) == sizeof(void *));
|
||||||
|
static_assert(usizeof(sizeof(0)) == sizeof(size_t));
|
||||||
|
static_assert(usizeof(usizeof(0)) == sizeof(unsigned));
|
||||||
|
#if 0
|
||||||
|
// works, but may trigger clang/gcc warnings "-Wunused-value"
|
||||||
|
static_assert(usizeof((1LL, 1)) == sizeof(int));
|
||||||
|
static_assert(usizeof((1, 1LL)) == sizeof(long long));
|
||||||
|
#endif
|
||||||
|
|
||||||
|
TEST_CASE("upx::ptr_static_cast") {
|
||||||
|
// check that we do not trigger any -Wcast-align warnings
|
||||||
|
using upx::ptr_static_cast;
|
||||||
|
|
||||||
|
void *vp = nullptr;
|
||||||
|
byte *bp = nullptr;
|
||||||
|
int *ip = nullptr;
|
||||||
|
double *dp = nullptr;
|
||||||
|
|
||||||
|
assert((vp == ptr_static_cast<void *>(vp)));
|
||||||
|
assert((vp == ptr_static_cast<void *>(bp)));
|
||||||
|
assert((vp == ptr_static_cast<void *>(ip)));
|
||||||
|
assert((vp == ptr_static_cast<void *>(dp)));
|
||||||
|
|
||||||
|
assert((bp == ptr_static_cast<byte *>(vp)));
|
||||||
|
assert((bp == ptr_static_cast<byte *>(bp)));
|
||||||
|
assert((bp == ptr_static_cast<byte *>(ip)));
|
||||||
|
assert((bp == ptr_static_cast<byte *>(dp)));
|
||||||
|
|
||||||
|
assert((ip == ptr_static_cast<int *>(vp)));
|
||||||
|
assert((ip == ptr_static_cast<int *>(bp)));
|
||||||
|
assert((ip == ptr_static_cast<int *>(ip)));
|
||||||
|
assert((ip == ptr_static_cast<int *>(dp)));
|
||||||
|
|
||||||
|
assert((dp == ptr_static_cast<double *>(vp)));
|
||||||
|
assert((dp == ptr_static_cast<double *>(bp)));
|
||||||
|
assert((dp == ptr_static_cast<double *>(ip)));
|
||||||
|
assert((dp == ptr_static_cast<double *>(dp)));
|
||||||
|
|
||||||
|
const byte *bc = nullptr;
|
||||||
|
const int *ic = nullptr;
|
||||||
|
assert((bc == ptr_static_cast<byte *>(bp)));
|
||||||
|
assert((bc == ptr_static_cast<const byte *>(bc)));
|
||||||
|
assert((bc == ptr_static_cast<byte *>(ip)));
|
||||||
|
assert((bc == ptr_static_cast<const byte *>(ic)));
|
||||||
|
assert((ic == ptr_static_cast<int *>(bp)));
|
||||||
|
assert((ic == ptr_static_cast<const int *>(bc)));
|
||||||
|
assert((ic == ptr_static_cast<int *>(ip)));
|
||||||
|
assert((ic == ptr_static_cast<const int *>(ic)));
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_CASE("upx::ptr_static_cast constexpr 1") {
|
||||||
|
// check that casts work at compile-time
|
||||||
|
using upx::ptr_static_cast;
|
||||||
|
|
||||||
|
constexpr void *vp = nullptr;
|
||||||
|
constexpr byte *bp = nullptr;
|
||||||
|
constexpr int *ip = nullptr;
|
||||||
|
constexpr double *dp = nullptr;
|
||||||
|
static_assert((vp == ptr_static_cast<void *>(vp)));
|
||||||
|
static_assert((bp == ptr_static_cast<byte *>(bp)));
|
||||||
|
static_assert((ip == ptr_static_cast<int *>(ip)));
|
||||||
|
static_assert((dp == ptr_static_cast<double *>(dp)));
|
||||||
|
|
||||||
|
constexpr const void *vc = nullptr;
|
||||||
|
constexpr const byte *bc = nullptr;
|
||||||
|
constexpr const int *ic = nullptr;
|
||||||
|
constexpr const double *dc = nullptr;
|
||||||
|
static_assert((vc == ptr_static_cast<const void *>(vc)));
|
||||||
|
static_assert((bc == ptr_static_cast<const byte *>(bc)));
|
||||||
|
static_assert((ic == ptr_static_cast<const int *>(ic)));
|
||||||
|
static_assert((dc == ptr_static_cast<const double *>(dc)));
|
||||||
|
|
||||||
|
constexpr void **vpp = nullptr;
|
||||||
|
constexpr byte **bpp = nullptr;
|
||||||
|
constexpr int **ipp = nullptr;
|
||||||
|
constexpr double **dpp = nullptr;
|
||||||
|
static_assert((vpp == ptr_static_cast<void **>(vpp)));
|
||||||
|
static_assert((bpp == ptr_static_cast<byte **>(bpp)));
|
||||||
|
static_assert((ipp == ptr_static_cast<int **>(ipp)));
|
||||||
|
static_assert((dpp == ptr_static_cast<double **>(dpp)));
|
||||||
|
|
||||||
|
constexpr const void **vcp = nullptr;
|
||||||
|
constexpr const byte **bcp = nullptr;
|
||||||
|
constexpr const int **icp = nullptr;
|
||||||
|
constexpr const double **dcp = nullptr;
|
||||||
|
static_assert((vcp == ptr_static_cast<const void **>(vcp)));
|
||||||
|
static_assert((bcp == ptr_static_cast<const byte **>(bcp)));
|
||||||
|
static_assert((icp == ptr_static_cast<const int **>(icp)));
|
||||||
|
static_assert((dcp == ptr_static_cast<const double **>(dcp)));
|
||||||
|
|
||||||
|
constexpr void *const *vpc = nullptr;
|
||||||
|
constexpr byte *const *bpc = nullptr;
|
||||||
|
constexpr int *const *ipc = nullptr;
|
||||||
|
constexpr double *const *dpc = nullptr;
|
||||||
|
static_assert((vpc == ptr_static_cast<void *const *>(vpc)));
|
||||||
|
static_assert((bpc == ptr_static_cast<byte *const *>(bpc)));
|
||||||
|
static_assert((ipc == ptr_static_cast<int *const *>(ipc)));
|
||||||
|
static_assert((dpc == ptr_static_cast<double *const *>(dpc)));
|
||||||
|
|
||||||
|
constexpr const void *const *vcc = nullptr;
|
||||||
|
constexpr const byte *const *bcc = nullptr;
|
||||||
|
constexpr const int *const *icc = nullptr;
|
||||||
|
constexpr const double *const *dcc = nullptr;
|
||||||
|
static_assert((vcc == ptr_static_cast<const void *const *>(vcc)));
|
||||||
|
static_assert((bcc == ptr_static_cast<const byte *const *>(bcc)));
|
||||||
|
static_assert((icc == ptr_static_cast<const int *const *>(icc)));
|
||||||
|
static_assert((dcc == ptr_static_cast<const double *const *>(dcc)));
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_CASE("upx::ptr_static_cast constexpr 2") {
|
||||||
|
// check that casts work at compile-time
|
||||||
|
using upx::ptr_static_cast;
|
||||||
|
|
||||||
|
constexpr void *vp = nullptr;
|
||||||
|
constexpr byte *bp = nullptr;
|
||||||
|
constexpr int *ip = nullptr;
|
||||||
|
constexpr double *dp = nullptr;
|
||||||
|
static_assert((vp == static_cast<void *>(vp)));
|
||||||
|
static_assert((vp == static_cast<void *>(bp)));
|
||||||
|
static_assert((vp == static_cast<void *>(ip)));
|
||||||
|
static_assert((vp == static_cast<void *>(dp)));
|
||||||
|
static_assert((vp == ptr_static_cast<void *>(vp)));
|
||||||
|
static_assert((vp == ptr_static_cast<void *>(bp)));
|
||||||
|
static_assert((vp == ptr_static_cast<void *>(ip)));
|
||||||
|
static_assert((vp == ptr_static_cast<void *>(dp)));
|
||||||
|
|
||||||
|
constexpr const void *vc = nullptr;
|
||||||
|
constexpr const byte *bc = nullptr;
|
||||||
|
constexpr const int *ic = nullptr;
|
||||||
|
constexpr const double *dc = nullptr;
|
||||||
|
static_assert((vc == static_cast<const void *>(vp)));
|
||||||
|
static_assert((vc == static_cast<const void *>(bp)));
|
||||||
|
static_assert((vc == static_cast<const void *>(ip)));
|
||||||
|
static_assert((vc == static_cast<const void *>(dp)));
|
||||||
|
static_assert((vc == ptr_static_cast<const void *>(vp)));
|
||||||
|
static_assert((vc == ptr_static_cast<const void *>(dp)));
|
||||||
|
static_assert((vc == ptr_static_cast<const void *>(bp)));
|
||||||
|
static_assert((vc == ptr_static_cast<const void *>(ip)));
|
||||||
|
static_assert((vc == static_cast<const void *>(vc)));
|
||||||
|
static_assert((vc == static_cast<const void *>(bc)));
|
||||||
|
static_assert((vc == static_cast<const void *>(ic)));
|
||||||
|
static_assert((vc == static_cast<const void *>(dc)));
|
||||||
|
static_assert((vc == ptr_static_cast<const void *>(vc)));
|
||||||
|
static_assert((vc == ptr_static_cast<const void *>(dc)));
|
||||||
|
static_assert((vc == ptr_static_cast<const void *>(bc)));
|
||||||
|
static_assert((vc == ptr_static_cast<const void *>(ic)));
|
||||||
|
|
||||||
|
// these are invalid:
|
||||||
|
//// constexpr char *cc1 = static_cast<char *>(bp);
|
||||||
|
//// constexpr char *cc2 = ptr_static_cast<char *>(bp);
|
||||||
|
//// constexpr unsigned *uc1 = static_cast<unsigned *>(ip);
|
||||||
|
//// constexpr unsigned *uc2 = ptr_static_cast<unsigned *>(ip);
|
||||||
|
}
|
||||||
|
|
||||||
#if WITH_THREADS
|
#if WITH_THREADS
|
||||||
TEST_CASE("upx::ptr_std_atomic_cast") {
|
TEST_CASE("upx::ptr_std_atomic_cast") {
|
||||||
// pointer-size
|
// pointer-size
|
||||||
@@ -269,7 +529,7 @@ TEST_CASE("upx::ptr_std_atomic_cast") {
|
|||||||
CHECK_EQ(upx::ptr_std_atomic_cast((upx_int32_t *) nullptr), nullptr);
|
CHECK_EQ(upx::ptr_std_atomic_cast((upx_int32_t *) nullptr), nullptr);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
#endif
|
#endif // WITH_THREADS
|
||||||
|
|
||||||
TEST_CASE("upx::atomic_exchange") {
|
TEST_CASE("upx::atomic_exchange") {
|
||||||
{
|
{
|
||||||
@@ -356,70 +616,338 @@ TEST_CASE("upx::ObjectDeleter 2") {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_CASE("upx::ptr_static_cast") {
|
/*************************************************************************
|
||||||
// check that we do not trigger any -Wcast-align warnings
|
// namespace upx::compile_time
|
||||||
using upx::ptr_static_cast;
|
**************************************************************************/
|
||||||
void *vp = nullptr;
|
|
||||||
byte *bp = nullptr;
|
|
||||||
int *ip = nullptr;
|
|
||||||
double *dp = nullptr;
|
|
||||||
|
|
||||||
assert((vp == ptr_static_cast<void *>(vp)));
|
static_assert(upx::compile_time::string_len("") == 0);
|
||||||
assert((vp == ptr_static_cast<void *>(bp)));
|
static_assert(upx::compile_time::string_len("a") == 1);
|
||||||
assert((vp == ptr_static_cast<void *>(ip)));
|
static_assert(upx::compile_time::string_len("ab") == 2);
|
||||||
assert((vp == ptr_static_cast<void *>(dp)));
|
static_assert(upx::compile_time::string_len("abc") == 3);
|
||||||
|
|
||||||
assert((bp == ptr_static_cast<byte *>(vp)));
|
static_assert(upx::compile_time::string_eq("", ""));
|
||||||
assert((bp == ptr_static_cast<byte *>(bp)));
|
static_assert(!upx::compile_time::string_eq("a", ""));
|
||||||
assert((bp == ptr_static_cast<byte *>(ip)));
|
static_assert(!upx::compile_time::string_eq("", "a"));
|
||||||
assert((bp == ptr_static_cast<byte *>(dp)));
|
static_assert(upx::compile_time::string_eq("abc", "abc"));
|
||||||
|
static_assert(!upx::compile_time::string_eq("ab", "abc"));
|
||||||
|
static_assert(!upx::compile_time::string_eq("abc", "ab"));
|
||||||
|
|
||||||
assert((ip == ptr_static_cast<int *>(vp)));
|
static_assert(!upx::compile_time::string_lt("", ""));
|
||||||
assert((ip == ptr_static_cast<int *>(bp)));
|
static_assert(!upx::compile_time::string_lt("a", ""));
|
||||||
assert((ip == ptr_static_cast<int *>(ip)));
|
static_assert(upx::compile_time::string_lt("", "a"));
|
||||||
assert((ip == ptr_static_cast<int *>(dp)));
|
static_assert(!upx::compile_time::string_lt("abc", "abc"));
|
||||||
|
static_assert(upx::compile_time::string_lt("ab", "abc"));
|
||||||
|
static_assert(!upx::compile_time::string_lt("abc", "ab"));
|
||||||
|
static_assert(!upx::compile_time::string_lt("abc", "aba"));
|
||||||
|
static_assert(upx::compile_time::string_lt("abc", "abz"));
|
||||||
|
|
||||||
assert((dp == ptr_static_cast<double *>(vp)));
|
static_assert(upx::compile_time::string_ne("abc", "abz"));
|
||||||
assert((dp == ptr_static_cast<double *>(bp)));
|
static_assert(!upx::compile_time::string_gt("abc", "abz"));
|
||||||
assert((dp == ptr_static_cast<double *>(ip)));
|
static_assert(!upx::compile_time::string_ge("abc", "abz"));
|
||||||
assert((dp == ptr_static_cast<double *>(dp)));
|
static_assert(upx::compile_time::string_le("abc", "abz"));
|
||||||
|
|
||||||
const byte *bc = nullptr;
|
static_assert(upx::compile_time::mem_eq((const char *) nullptr, (const char *) nullptr, 0));
|
||||||
const int *ic = nullptr;
|
static_assert(upx::compile_time::mem_eq((const char *) nullptr, (const byte *) nullptr, 0));
|
||||||
assert((bc == ptr_static_cast<byte *>(bp)));
|
static_assert(upx::compile_time::mem_eq((const byte *) nullptr, (const char *) nullptr, 0));
|
||||||
assert((bc == ptr_static_cast<const byte *>(bc)));
|
static_assert(upx::compile_time::mem_eq((const byte *) nullptr, (const byte *) nullptr, 0));
|
||||||
assert((bc == ptr_static_cast<byte *>(ip)));
|
static_assert(upx::compile_time::mem_eq("", "", 0));
|
||||||
assert((bc == ptr_static_cast<const byte *>(ic)));
|
static_assert(upx::compile_time::mem_eq("abc", "abc", 3));
|
||||||
assert((ic == ptr_static_cast<int *>(bp)));
|
static_assert(!upx::compile_time::mem_eq("abc", "abz", 3));
|
||||||
assert((ic == ptr_static_cast<const int *>(bc)));
|
|
||||||
assert((ic == ptr_static_cast<int *>(ip)));
|
static_assert(upx::compile_time::bswap16(0x0102) == 0x0201);
|
||||||
assert((ic == ptr_static_cast<const int *>(ic)));
|
static_assert(upx::compile_time::bswap32(0x01020304) == 0x04030201);
|
||||||
|
static_assert(upx::compile_time::bswap64(0x0102030405060708ull) == 0x0807060504030201ull);
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
struct alignas(1) TestCT final {
|
||||||
|
byte d[8]; // public data
|
||||||
|
|
||||||
|
static constexpr TestCT makeBE16(upx_uint16_t v) noexcept {
|
||||||
|
TestCT x = {};
|
||||||
|
upx::compile_time::set_be16(x.d, v);
|
||||||
|
return x;
|
||||||
|
}
|
||||||
|
static constexpr TestCT makeBE24(upx_uint32_t v) noexcept {
|
||||||
|
TestCT x = {};
|
||||||
|
upx::compile_time::set_be24(x.d, v);
|
||||||
|
return x;
|
||||||
|
}
|
||||||
|
static constexpr TestCT makeBE32(upx_uint32_t v) noexcept {
|
||||||
|
TestCT x = {};
|
||||||
|
upx::compile_time::set_be32(x.d, v);
|
||||||
|
return x;
|
||||||
|
}
|
||||||
|
static constexpr TestCT makeBE64(upx_uint64_t v) noexcept {
|
||||||
|
TestCT x = {};
|
||||||
|
upx::compile_time::set_be64(x.d, v);
|
||||||
|
return x;
|
||||||
|
}
|
||||||
|
static constexpr TestCT makeLE16(upx_uint16_t v) noexcept {
|
||||||
|
TestCT x = {};
|
||||||
|
upx::compile_time::set_le16(x.d, v);
|
||||||
|
return x;
|
||||||
|
}
|
||||||
|
static constexpr TestCT makeLE24(upx_uint32_t v) noexcept {
|
||||||
|
TestCT x = {};
|
||||||
|
upx::compile_time::set_le24(x.d, v);
|
||||||
|
return x;
|
||||||
|
}
|
||||||
|
static constexpr TestCT makeLE32(upx_uint32_t v) noexcept {
|
||||||
|
TestCT x = {};
|
||||||
|
upx::compile_time::set_le32(x.d, v);
|
||||||
|
return x;
|
||||||
|
}
|
||||||
|
static constexpr TestCT makeLE64(upx_uint64_t v) noexcept {
|
||||||
|
TestCT x = {};
|
||||||
|
upx::compile_time::set_le64(x.d, v);
|
||||||
|
return x;
|
||||||
|
}
|
||||||
|
|
||||||
|
// run-time
|
||||||
|
static noinline upx_uint16_t noinline_bswap16(upx_uint16_t v) noexcept {
|
||||||
|
return upx::compile_time::bswap16(v);
|
||||||
|
}
|
||||||
|
static noinline upx_uint32_t noinline_bswap32(upx_uint32_t v) noexcept {
|
||||||
|
return upx::compile_time::bswap32(v);
|
||||||
|
}
|
||||||
|
static noinline upx_uint64_t noinline_bswap64(upx_uint64_t v) noexcept {
|
||||||
|
return upx::compile_time::bswap64(v);
|
||||||
|
}
|
||||||
|
|
||||||
|
static noinline upx_uint16_t noinline_get_be16(const byte *p) noexcept {
|
||||||
|
return upx::compile_time::get_be16(p);
|
||||||
|
}
|
||||||
|
static noinline upx_uint32_t noinline_get_be24(const byte *p) noexcept {
|
||||||
|
return upx::compile_time::get_be24(p);
|
||||||
|
}
|
||||||
|
static noinline upx_uint32_t noinline_get_be32(const byte *p) noexcept {
|
||||||
|
return upx::compile_time::get_be32(p);
|
||||||
|
}
|
||||||
|
static noinline upx_uint64_t noinline_get_be64(const byte *p) noexcept {
|
||||||
|
return upx::compile_time::get_be64(p);
|
||||||
|
}
|
||||||
|
static noinline upx_uint16_t noinline_get_le16(const byte *p) noexcept {
|
||||||
|
return upx::compile_time::get_le16(p);
|
||||||
|
}
|
||||||
|
static noinline upx_uint32_t noinline_get_le24(const byte *p) noexcept {
|
||||||
|
return upx::compile_time::get_le24(p);
|
||||||
|
}
|
||||||
|
static noinline upx_uint32_t noinline_get_le32(const byte *p) noexcept {
|
||||||
|
return upx::compile_time::get_le32(p);
|
||||||
|
}
|
||||||
|
static noinline upx_uint64_t noinline_get_le64(const byte *p) noexcept {
|
||||||
|
return upx::compile_time::get_le64(p);
|
||||||
|
}
|
||||||
|
|
||||||
|
static noinline void noinline_set_be16(byte * p, upx_uint16_t v) noexcept {
|
||||||
|
upx::compile_time::set_be16(p, v);
|
||||||
|
}
|
||||||
|
static noinline void noinline_set_be24(byte * p, upx_uint32_t v) noexcept {
|
||||||
|
upx::compile_time::set_be24(p, v);
|
||||||
|
}
|
||||||
|
static noinline void noinline_set_be32(byte * p, upx_uint32_t v) noexcept {
|
||||||
|
upx::compile_time::set_be32(p, v);
|
||||||
|
}
|
||||||
|
static noinline void noinline_set_be64(byte * p, upx_uint64_t v) noexcept {
|
||||||
|
upx::compile_time::set_be64(p, v);
|
||||||
|
}
|
||||||
|
static noinline void noinline_set_le16(byte * p, upx_uint16_t v) noexcept {
|
||||||
|
upx::compile_time::set_le16(p, v);
|
||||||
|
}
|
||||||
|
static noinline void noinline_set_le24(byte * p, upx_uint32_t v) noexcept {
|
||||||
|
upx::compile_time::set_le24(p, v);
|
||||||
|
}
|
||||||
|
static noinline void noinline_set_le32(byte * p, upx_uint32_t v) noexcept {
|
||||||
|
upx::compile_time::set_le32(p, v);
|
||||||
|
}
|
||||||
|
static noinline void noinline_set_le64(byte * p, upx_uint64_t v) noexcept {
|
||||||
|
upx::compile_time::set_le64(p, v);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
static_assert(sizeof(TestCT) == 8);
|
||||||
|
static_assert(alignof(TestCT) == 1);
|
||||||
|
} // namespace
|
||||||
|
|
||||||
|
TEST_CASE("upx::compile_time") {
|
||||||
|
constexpr upx_uint16_t v16 = 0x0201;
|
||||||
|
constexpr upx_uint32_t v24 = 0x030201;
|
||||||
|
constexpr upx_uint32_t v32 = 0x04030201;
|
||||||
|
constexpr upx_uint64_t v64 = 0x0807060504030201ull;
|
||||||
|
{
|
||||||
|
static_assert(upx::compile_time::bswap16(v16) == 0x0102);
|
||||||
|
static_assert(upx::compile_time::bswap32(v32) == 0x01020304);
|
||||||
|
static_assert(upx::compile_time::bswap64(v64) == 0x0102030405060708ull);
|
||||||
|
assert_noexcept(TestCT::noinline_bswap16(v16) == 0x0102);
|
||||||
|
assert_noexcept(TestCT::noinline_bswap32(v32) == 0x01020304);
|
||||||
|
assert_noexcept(TestCT::noinline_bswap64(v64) == 0x0102030405060708ull);
|
||||||
|
}
|
||||||
|
{
|
||||||
|
constexpr const byte d[8] = {1, 2, 3, 4, 5, 6, 7, 8};
|
||||||
|
static_assert(upx::compile_time::get_be16(d) == 0x0102);
|
||||||
|
static_assert(upx::compile_time::get_be24(d) == 0x010203);
|
||||||
|
static_assert(upx::compile_time::get_be32(d) == 0x01020304);
|
||||||
|
static_assert(upx::compile_time::get_be64(d) == 0x0102030405060708ull);
|
||||||
|
static_assert(upx::compile_time::get_le16(d) == 0x0201);
|
||||||
|
static_assert(upx::compile_time::get_le24(d) == 0x030201);
|
||||||
|
static_assert(upx::compile_time::get_le32(d) == 0x04030201);
|
||||||
|
static_assert(upx::compile_time::get_le64(d) == 0x0807060504030201ull);
|
||||||
|
}
|
||||||
|
{
|
||||||
|
using upx::compile_time::mem_eq;
|
||||||
|
upx_alignas_max byte aligned_buffer[16] = {};
|
||||||
|
upx::compile_time::mem_set(aligned_buffer, 0xff, 16);
|
||||||
|
assert_noexcept(mem_eq(aligned_buffer, aligned_buffer + 8, 8));
|
||||||
|
byte *const buf = aligned_buffer + 7;
|
||||||
|
|
||||||
|
constexpr auto be16 = TestCT::makeBE16(v16);
|
||||||
|
static_assert(upx::compile_time::get_be16(be16.d) == v16);
|
||||||
|
static_assert(mem_eq(be16.d, "\x02\x01", 2));
|
||||||
|
upx::compile_time::mem_clear(buf, 8);
|
||||||
|
TestCT::noinline_set_be16(buf, v16);
|
||||||
|
assert_noexcept(TestCT::noinline_get_be16(buf) == v16);
|
||||||
|
assert_noexcept(upx::compile_time::get_be16(buf) == v16);
|
||||||
|
assert_noexcept(memcmp(buf, be16.d, 8) == 0);
|
||||||
|
|
||||||
|
constexpr auto be24 = TestCT::makeBE24(v24);
|
||||||
|
static_assert(upx::compile_time::get_be24(be24.d) == v24);
|
||||||
|
static_assert(mem_eq(be24.d, "\x03\x02\x01", 3));
|
||||||
|
upx::compile_time::mem_clear(buf, 8);
|
||||||
|
TestCT::noinline_set_be24(buf, v24);
|
||||||
|
assert_noexcept(TestCT::noinline_get_be24(buf) == v24);
|
||||||
|
assert_noexcept(upx::compile_time::get_be24(buf) == v24);
|
||||||
|
assert_noexcept(memcmp(buf, be24.d, 8) == 0);
|
||||||
|
|
||||||
|
constexpr auto be32 = TestCT::makeBE32(v32);
|
||||||
|
static_assert(upx::compile_time::get_be32(be32.d) == v32);
|
||||||
|
static_assert(mem_eq(be32.d, "\x04\x03\x02\x01", 4));
|
||||||
|
upx::compile_time::mem_clear(buf, 8);
|
||||||
|
TestCT::noinline_set_be32(buf, v32);
|
||||||
|
assert_noexcept(TestCT::noinline_get_be32(buf) == v32);
|
||||||
|
assert_noexcept(upx::compile_time::get_be32(buf) == v32);
|
||||||
|
assert_noexcept(memcmp(buf, be32.d, 8) == 0);
|
||||||
|
|
||||||
|
constexpr auto be64 = TestCT::makeBE64(v64);
|
||||||
|
static_assert(upx::compile_time::get_be64(be64.d) == v64);
|
||||||
|
static_assert(mem_eq(be64.d, "\x08\x07\x06\x05\x04\x03\x02\x01", 8));
|
||||||
|
upx::compile_time::mem_clear(buf, 8);
|
||||||
|
TestCT::noinline_set_be64(buf, v64);
|
||||||
|
assert_noexcept(TestCT::noinline_get_be64(buf) == v64);
|
||||||
|
assert_noexcept(upx::compile_time::get_be64(buf) == v64);
|
||||||
|
assert_noexcept(memcmp(buf, be64.d, 8) == 0);
|
||||||
|
|
||||||
|
constexpr auto le16 = TestCT::makeLE16(v16);
|
||||||
|
static_assert(upx::compile_time::get_le16(le16.d) == v16);
|
||||||
|
static_assert(mem_eq(le16.d, "\x01\x02", 2));
|
||||||
|
upx::compile_time::mem_clear(buf, 8);
|
||||||
|
TestCT::noinline_set_le16(buf, v16);
|
||||||
|
assert_noexcept(TestCT::noinline_get_le16(buf) == v16);
|
||||||
|
assert_noexcept(upx::compile_time::get_le16(buf) == v16);
|
||||||
|
assert_noexcept(memcmp(buf, le16.d, 8) == 0);
|
||||||
|
|
||||||
|
constexpr auto le24 = TestCT::makeLE24(v24);
|
||||||
|
static_assert(upx::compile_time::get_le24(le24.d) == v24);
|
||||||
|
static_assert(mem_eq(le24.d, "\x01\x02\x03", 3));
|
||||||
|
upx::compile_time::mem_clear(buf, 8);
|
||||||
|
TestCT::noinline_set_le24(buf, v24);
|
||||||
|
assert_noexcept(TestCT::noinline_get_le24(buf) == v24);
|
||||||
|
assert_noexcept(upx::compile_time::get_le24(buf) == v24);
|
||||||
|
assert_noexcept(memcmp(buf, le24.d, 8) == 0);
|
||||||
|
|
||||||
|
constexpr auto le32 = TestCT::makeLE32(v32);
|
||||||
|
static_assert(upx::compile_time::get_le32(le32.d) == v32);
|
||||||
|
static_assert(mem_eq(le32.d, "\x01\x02\x03\x04", 4));
|
||||||
|
upx::compile_time::mem_clear(buf, 8);
|
||||||
|
TestCT::noinline_set_le32(buf, v32);
|
||||||
|
assert_noexcept(TestCT::noinline_get_le32(buf) == v32);
|
||||||
|
assert_noexcept(upx::compile_time::get_le32(buf) == v32);
|
||||||
|
assert_noexcept(memcmp(buf, le32.d, 8) == 0);
|
||||||
|
|
||||||
|
constexpr auto le64 = TestCT::makeLE64(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));
|
||||||
|
memset(buf, 0, 8);
|
||||||
|
TestCT::noinline_set_le64(buf, v64);
|
||||||
|
assert_noexcept(TestCT::noinline_get_le64(buf) == v64);
|
||||||
|
assert_noexcept(upx::compile_time::get_le64(buf) == v64);
|
||||||
|
assert_noexcept(memcmp(buf, le64.d, 8) == 0);
|
||||||
|
|
||||||
|
static_assert(upx::compile_time::bswap16(upx::compile_time::get_be16(be16.d)) ==
|
||||||
|
upx::compile_time::get_be16(le16.d));
|
||||||
|
static_assert(upx::compile_time::bswap32(upx::compile_time::get_be32(be32.d)) ==
|
||||||
|
upx::compile_time::get_be32(le32.d));
|
||||||
|
static_assert(upx::compile_time::bswap64(upx::compile_time::get_be64(be64.d)) ==
|
||||||
|
upx::compile_time::get_be64(le64.d));
|
||||||
|
assert_noexcept(TestCT::noinline_bswap16(TestCT::noinline_get_be16(be16.d)) ==
|
||||||
|
TestCT::noinline_get_be16(le16.d));
|
||||||
|
assert_noexcept(TestCT::noinline_bswap32(TestCT::noinline_get_be32(be32.d)) ==
|
||||||
|
TestCT::noinline_get_be32(le32.d));
|
||||||
|
assert_noexcept(TestCT::noinline_bswap64(TestCT::noinline_get_be64(be64.d)) ==
|
||||||
|
TestCT::noinline_get_be64(le64.d));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_CASE("upx::noncopyable") {
|
TEST_CASE("upx::compile_time") {
|
||||||
struct Test : private upx::noncopyable {
|
constexpr upx_uint16_t v16 = 0xf2f1;
|
||||||
int v = 1;
|
constexpr upx_uint32_t v24 = 0xf3f2f1;
|
||||||
};
|
constexpr upx_uint32_t v32 = 0xf4f3f2f1;
|
||||||
Test t = {};
|
constexpr upx_uint64_t v64 = 0xf8f7f6f5f4f3f2f1ull;
|
||||||
CHECK(t.v == 1);
|
{
|
||||||
#if (ACC_CC_MSC) // MSVC thinks that Test is not std::is_trivially_copyable; true or compiler bug?
|
using upx::compile_time::mem_eq;
|
||||||
// @COMPILER_BUG @MSVC_BUG
|
upx_alignas_max byte aligned_buffer[32];
|
||||||
t.v = 0;
|
byte *const buf1 = aligned_buffer + 3;
|
||||||
#else
|
byte *const buf2 = aligned_buffer + 13;
|
||||||
mem_clear(&t);
|
|
||||||
#endif
|
upx::compile_time::set_be16(buf1, v16);
|
||||||
CHECK(t.v == 0);
|
TestCT::noinline_set_be16(buf2, v16);
|
||||||
constexpr Test x = {};
|
assert_noexcept(TestCT::noinline_get_be16(buf1) == v16);
|
||||||
static_assert(x.v == 1);
|
assert_noexcept(TestCT::noinline_get_be16(buf2) == v16);
|
||||||
|
assert_noexcept(memcmp(buf1, buf2, 2) == 0);
|
||||||
|
upx::compile_time::set_be24(buf1, v24);
|
||||||
|
TestCT::noinline_set_be24(buf2, v24);
|
||||||
|
assert_noexcept(TestCT::noinline_get_be24(buf1) == v24);
|
||||||
|
assert_noexcept(TestCT::noinline_get_be24(buf2) == v24);
|
||||||
|
assert_noexcept(memcmp(buf1, buf2, 3) == 0);
|
||||||
|
upx::compile_time::set_be32(buf1, v32);
|
||||||
|
TestCT::noinline_set_be32(buf2, v32);
|
||||||
|
assert_noexcept(TestCT::noinline_get_be32(buf1) == v32);
|
||||||
|
assert_noexcept(TestCT::noinline_get_be32(buf2) == v32);
|
||||||
|
assert_noexcept(memcmp(buf1, buf2, 4) == 0);
|
||||||
|
upx::compile_time::set_be64(buf1, v64);
|
||||||
|
TestCT::noinline_set_be64(buf2, v64);
|
||||||
|
assert_noexcept(TestCT::noinline_get_be64(buf1) == v64);
|
||||||
|
assert_noexcept(TestCT::noinline_get_be64(buf2) == v64);
|
||||||
|
assert_noexcept(memcmp(buf1, buf2, 8) == 0);
|
||||||
|
|
||||||
|
upx::compile_time::set_le16(buf1, v16);
|
||||||
|
TestCT::noinline_set_le16(buf2, v16);
|
||||||
|
assert_noexcept(TestCT::noinline_get_le16(buf1) == v16);
|
||||||
|
assert_noexcept(TestCT::noinline_get_le16(buf2) == v16);
|
||||||
|
assert_noexcept(memcmp(buf1, buf2, 2) == 0);
|
||||||
|
upx::compile_time::set_le24(buf1, v24);
|
||||||
|
TestCT::noinline_set_le24(buf2, v24);
|
||||||
|
assert_noexcept(TestCT::noinline_get_le24(buf1) == v24);
|
||||||
|
assert_noexcept(TestCT::noinline_get_le24(buf2) == v24);
|
||||||
|
assert_noexcept(memcmp(buf1, buf2, 3) == 0);
|
||||||
|
upx::compile_time::set_le32(buf1, v32);
|
||||||
|
TestCT::noinline_set_le32(buf2, v32);
|
||||||
|
assert_noexcept(TestCT::noinline_get_le32(buf1) == v32);
|
||||||
|
assert_noexcept(TestCT::noinline_get_le32(buf2) == v32);
|
||||||
|
assert_noexcept(memcmp(buf1, buf2, 4) == 0);
|
||||||
|
upx::compile_time::set_le64(buf1, v64);
|
||||||
|
TestCT::noinline_set_le64(buf2, v64);
|
||||||
|
assert_noexcept(TestCT::noinline_get_le64(buf1) == v64);
|
||||||
|
assert_noexcept(TestCT::noinline_get_le64(buf2) == v64);
|
||||||
|
assert_noexcept(memcmp(buf1, buf2, 8) == 0);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
// TriBool checks
|
// TriBool
|
||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
template <class T>
|
template <class T>
|
||||||
struct TestTriBool {
|
struct TestTriBool final {
|
||||||
static noinline void test(bool expect_true) {
|
static noinline void test(bool expect_true) {
|
||||||
static_assert(std::is_class<T>::value);
|
static_assert(std::is_class<T>::value);
|
||||||
static_assert(std::is_nothrow_default_constructible<T>::value);
|
static_assert(std::is_nothrow_default_constructible<T>::value);
|
||||||
|
|||||||
+10
-2
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2024 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2025 Markus Franz Xaver Johannes Oberhumer
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
@@ -55,10 +55,18 @@
|
|||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(__FAST_MATH__) && defined(__clang__) && (__clang_major__ + 0 >= 6)
|
#if defined(__FAST_MATH__) && defined(__clang__) && (__clang_major__ + 0 > 0)
|
||||||
|
#if __clang_major__ >= 6
|
||||||
// warning: comparison with NaN always evaluates to false in fast floating point modes
|
// warning: comparison with NaN always evaluates to false in fast floating point modes
|
||||||
#pragma clang diagnostic ignored "-Wtautological-constant-compare"
|
#pragma clang diagnostic ignored "-Wtautological-constant-compare"
|
||||||
#endif
|
#endif
|
||||||
|
#if defined(__has_warning)
|
||||||
|
#if __has_warning("-Wnan-infinity-disabled")
|
||||||
|
// warning: use of NaN is undefined behavior due to the currently enabled floating-point options
|
||||||
|
#pragma clang diagnostic ignored "-Wnan-infinity-disabled"
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
#include <doctest/doctest/parts/doctest.cpp>
|
#include <doctest/doctest/parts/doctest.cpp>
|
||||||
|
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2024 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2025 Markus Franz Xaver Johannes Oberhumer
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2024 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2025 Markus Franz Xaver Johannes Oberhumer
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2024 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2025 Markus Franz Xaver Johannes Oberhumer
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2024 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2025 Markus Franz Xaver Johannes Oberhumer
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2024 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2025 Markus Franz Xaver Johannes Oberhumer
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
@@ -30,11 +30,9 @@
|
|||||||
|
|
||||||
#if (ACC_CC_CLANG)
|
#if (ACC_CC_CLANG)
|
||||||
#pragma clang diagnostic ignored "-Wshadow"
|
#pragma clang diagnostic ignored "-Wshadow"
|
||||||
#endif
|
#elif (ACC_CC_GNUC >= 0x040200)
|
||||||
#if (ACC_CC_GNUC >= 0x040200)
|
|
||||||
#pragma GCC diagnostic ignored "-Wshadow"
|
#pragma GCC diagnostic ignored "-Wshadow"
|
||||||
#endif
|
#elif (ACC_CC_MSC)
|
||||||
#if (ACC_CC_MSC)
|
|
||||||
#pragma warning(disable : 4456) // -Wno-shadow
|
#pragma warning(disable : 4456) // -Wno-shadow
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -50,41 +48,15 @@ void lzma_compress_config_t::reset() noexcept {
|
|||||||
max_num_probs = 0;
|
max_num_probs = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
// INFO: the LZMA SDK is covered by a permissive license which allows
|
// INFO: LZMA SDK is placed in the public domain.
|
||||||
// using unmodified LZMA source code in UPX and the UPX stubs.
|
|
||||||
// See SPECIAL EXCEPTION below.
|
|
||||||
//
|
//
|
||||||
// Quoting from lzma-4.43/lzma.txt:
|
// Anyone is free to copy, modify, publish, use, compile, sell, or
|
||||||
|
// distribute the original LZMA SDK code, either in source code form
|
||||||
|
// or as a compiled binary, for any purpose, commercial or non-commercial,
|
||||||
|
// and by any means.
|
||||||
//
|
//
|
||||||
// LICENSE
|
// https://www.7-zip.org/sdk.html
|
||||||
// -------
|
// https://sourceforge.net/p/sevenzip/discussion/45797/thread/685169cf/
|
||||||
//
|
|
||||||
// LZMA SDK is available under any of the following licenses:
|
|
||||||
//
|
|
||||||
// 1) GNU Lesser General Public License (GNU LGPL)
|
|
||||||
// 2) Common Public License (CPL)
|
|
||||||
// 3) Simplified license for unmodified code (read SPECIAL EXCEPTION)
|
|
||||||
// 4) Proprietary license
|
|
||||||
//
|
|
||||||
// It means that you can select one of these four options and follow rules
|
|
||||||
// of that license.
|
|
||||||
//
|
|
||||||
// 1,2) GNU LGPL and CPL licenses are pretty similar and both these
|
|
||||||
// licenses are classified as
|
|
||||||
// - "Free software licenses" at http://www.gnu.org/
|
|
||||||
// - "OSI-approved" at http://www.opensource.org/
|
|
||||||
//
|
|
||||||
// 3) SPECIAL EXCEPTION
|
|
||||||
//
|
|
||||||
// Igor Pavlov, as the author of this code, expressly permits you
|
|
||||||
// to statically or dynamically link your code (or bind by name)
|
|
||||||
// to the files from LZMA SDK without subjecting your linked
|
|
||||||
// code to the terms of the CPL or GNU LGPL.
|
|
||||||
// Any modifications or additions to files from LZMA SDK, however,
|
|
||||||
// are subject to the GNU LGPL or CPL terms.
|
|
||||||
//
|
|
||||||
// SPECIAL EXCEPTION allows you to use LZMA SDK in applications with closed code,
|
|
||||||
// while you keep LZMA SDK code unmodified.
|
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
// compress defaults
|
// compress defaults
|
||||||
@@ -155,11 +127,11 @@ static bool prepare_result(lzma_compress_result_t *res, unsigned src_len, int me
|
|||||||
|
|
||||||
// cconf overrides
|
// cconf overrides
|
||||||
if (lcconf) {
|
if (lcconf) {
|
||||||
oassign(res->pos_bits, lcconf->pos_bits);
|
upx::oassign(res->pos_bits, lcconf->pos_bits);
|
||||||
oassign(res->lit_pos_bits, lcconf->lit_pos_bits);
|
upx::oassign(res->lit_pos_bits, lcconf->lit_pos_bits);
|
||||||
oassign(res->lit_context_bits, lcconf->lit_context_bits);
|
upx::oassign(res->lit_context_bits, lcconf->lit_context_bits);
|
||||||
oassign(res->dict_size, lcconf->dict_size);
|
upx::oassign(res->dict_size, lcconf->dict_size);
|
||||||
oassign(res->num_fast_bytes, lcconf->num_fast_bytes);
|
upx::oassign(res->num_fast_bytes, lcconf->num_fast_bytes);
|
||||||
}
|
}
|
||||||
|
|
||||||
// limit dictionary size
|
// limit dictionary size
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2024 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2025 Markus Franz Xaver Johannes Oberhumer
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
@@ -248,8 +248,12 @@ 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)
|
||||||
|
(void) ucl_init(); // TODO later
|
||||||
|
#else
|
||||||
if (ucl_init() != UCL_E_OK)
|
if (ucl_init() != UCL_E_OK)
|
||||||
return -1;
|
return -1;
|
||||||
|
#endif
|
||||||
if (UCL_VERSION != ucl_version() || strcmp(UCL_VERSION_STRING, ucl_version_string()) != 0)
|
if (UCL_VERSION != ucl_version() || strcmp(UCL_VERSION_STRING, ucl_version_string()) != 0)
|
||||||
return -2;
|
return -2;
|
||||||
ucl_set_malloc_hooks(my_malloc, my_free);
|
ucl_set_malloc_hooks(my_malloc, my_free);
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2024 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2025 Markus Franz Xaver Johannes Oberhumer
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
@@ -25,13 +25,6 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include "../conf.h"
|
#include "../conf.h"
|
||||||
#include "compress.h"
|
|
||||||
#include "../util/membuffer.h"
|
|
||||||
// NOLINTBEGIN(clang-analyzer-optin.performance.Padding)
|
|
||||||
#define ZLIB_CONST 1
|
|
||||||
#include <zlib/zlib.h>
|
|
||||||
#include <zlib/deflate.h>
|
|
||||||
// NOLINTEND(clang-analyzer-optin.performance.Padding)
|
|
||||||
|
|
||||||
void zlib_compress_config_t::reset() noexcept {
|
void zlib_compress_config_t::reset() noexcept {
|
||||||
mem_clear(this);
|
mem_clear(this);
|
||||||
@@ -40,6 +33,15 @@ void zlib_compress_config_t::reset() noexcept {
|
|||||||
strategy.reset();
|
strategy.reset();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if WITH_ZLIB
|
||||||
|
#include "compress.h"
|
||||||
|
#include "../util/membuffer.h"
|
||||||
|
// NOLINTBEGIN(clang-analyzer-optin.performance.Padding)
|
||||||
|
#define ZLIB_CONST 1
|
||||||
|
#include <zlib/zlib.h>
|
||||||
|
#include <zlib/deflate.h>
|
||||||
|
// NOLINTEND(clang-analyzer-optin.performance.Padding)
|
||||||
|
|
||||||
static int convert_errno_from_zlib(int zr) {
|
static int convert_errno_from_zlib(int zr) {
|
||||||
switch (zr) {
|
switch (zr) {
|
||||||
case Z_OK:
|
case Z_OK:
|
||||||
@@ -95,9 +97,9 @@ int upx_zlib_compress(const upx_bytep src, unsigned src_len, upx_bytep dst, unsi
|
|||||||
zlib_compress_config_t::strategy_t strategy;
|
zlib_compress_config_t::strategy_t strategy;
|
||||||
// cconf overrides
|
// cconf overrides
|
||||||
if (lcconf) {
|
if (lcconf) {
|
||||||
oassign(mem_level, lcconf->mem_level);
|
upx::oassign(mem_level, lcconf->mem_level);
|
||||||
oassign(window_bits, lcconf->window_bits);
|
upx::oassign(window_bits, lcconf->window_bits);
|
||||||
oassign(strategy, lcconf->strategy);
|
upx::oassign(strategy, lcconf->strategy);
|
||||||
}
|
}
|
||||||
|
|
||||||
z_stream s;
|
z_stream s;
|
||||||
@@ -307,4 +309,6 @@ TEST_CASE("upx_zlib_decompress") {
|
|||||||
UNUSED(r);
|
UNUSED(r);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endif // WITH_ZLIB
|
||||||
|
|
||||||
/* vim:set ts=4 sw=4 et: */
|
/* vim:set ts=4 sw=4 et: */
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2024 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2025 Markus Franz Xaver Johannes Oberhumer
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
|
|||||||
+88
-76
@@ -1,9 +1,9 @@
|
|||||||
/* conf.h --
|
/* conf.h -- primary configuration
|
||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2024 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2025 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2024 Laszlo Molnar
|
Copyright (C) 1996-2025 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
@@ -32,6 +32,7 @@
|
|||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
|
|
||||||
#include "util/system_headers.h"
|
#include "util/system_headers.h"
|
||||||
|
#include "util/system_undefs.h"
|
||||||
#include "version.h"
|
#include "version.h"
|
||||||
|
|
||||||
#if !defined(__has_attribute)
|
#if !defined(__has_attribute)
|
||||||
@@ -40,29 +41,42 @@
|
|||||||
#if !defined(__has_builtin)
|
#if !defined(__has_builtin)
|
||||||
#define __has_builtin(x) 0
|
#define __has_builtin(x) 0
|
||||||
#endif
|
#endif
|
||||||
|
#if !defined(__has_declspec_attribute)
|
||||||
|
#define __has_declspec_attribute(x) 0
|
||||||
|
#endif
|
||||||
#if !defined(__has_feature)
|
#if !defined(__has_feature)
|
||||||
#define __has_feature(x) 0
|
#define __has_feature(x) 0
|
||||||
#endif
|
#endif
|
||||||
|
#if !defined(__has_include)
|
||||||
|
#define __has_include(x) 0
|
||||||
|
#endif
|
||||||
|
#if !defined(__has_warning)
|
||||||
|
#define __has_warning(x) 0
|
||||||
|
#endif
|
||||||
|
|
||||||
// reserve name "upx" for namespace
|
// reserve name "upx" for namespace
|
||||||
namespace upx {}
|
namespace upx {}
|
||||||
|
|
||||||
ACC_COMPILE_TIME_ASSERT_HEADER(CHAR_BIT == 8)
|
// check compiler core
|
||||||
ACC_COMPILE_TIME_ASSERT_HEADER(sizeof(short) == 2)
|
static_assert(CHAR_BIT == 8);
|
||||||
ACC_COMPILE_TIME_ASSERT_HEADER(sizeof(int) == 4)
|
static_assert(sizeof(short) == 2);
|
||||||
ACC_COMPILE_TIME_ASSERT_HEADER(sizeof(long long) == 8)
|
static_assert(sizeof(int) == 4);
|
||||||
|
static_assert(sizeof(long long) == 8);
|
||||||
// check sane compiler mandatory flags
|
// check sane compiler mandatory flags
|
||||||
ACC_COMPILE_TIME_ASSERT_HEADER(-1 == ~0) // two's complement - see http://wg21.link/P0907R4
|
static_assert(-1 == ~0); // two's complement - see https://wg21.link/P0907R4
|
||||||
ACC_COMPILE_TIME_ASSERT_HEADER(0u - 1 == ~0u) // two's complement - see http://wg21.link/P0907R4
|
static_assert(0u - 1 == ~0u); // two's complement - see https://wg21.link/P0907R4
|
||||||
ACC_COMPILE_TIME_ASSERT_HEADER((1u << 31) << 1 == 0)
|
static_assert((1u << 31) << 1 == 0);
|
||||||
ACC_COMPILE_TIME_ASSERT_HEADER(((int) (1u << 31)) >> 31 == -1) // arithmetic right shift
|
static_assert(((int) (1u << 31)) >> 31 == -1); // arithmetic right shift
|
||||||
ACC_COMPILE_TIME_ASSERT_HEADER((-1) >> 31 == -1) // arithmetic right shift
|
static_assert((-1) >> 31 == -1); // arithmetic right shift
|
||||||
ACC_COMPILE_TIME_ASSERT_HEADER(CHAR_MAX == 255) // -funsigned-char
|
static_assert(CHAR_MAX == 255); // -funsigned-char
|
||||||
ACC_COMPILE_TIME_ASSERT_HEADER((char) (-1) == 255)
|
static_assert((char) (-1) == 255); // -funsigned-char
|
||||||
|
|
||||||
// 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)
|
||||||
|
#if (ACC_CC_MSC)
|
||||||
|
#pragma warning(error : 4714) // W4: function marked as __forceinline not inlined
|
||||||
|
#endif
|
||||||
#if (ACC_CC_CLANG >= 0x0b0000)
|
#if (ACC_CC_CLANG >= 0x0b0000)
|
||||||
#pragma clang diagnostic error "-Wsuggest-override"
|
#pragma clang diagnostic error "-Wsuggest-override"
|
||||||
#elif (ACC_CC_GNUC >= 0x0a0000)
|
#elif (ACC_CC_GNUC >= 0x0a0000)
|
||||||
@@ -82,6 +96,14 @@ ACC_COMPILE_TIME_ASSERT_HEADER((char) (-1) == 255)
|
|||||||
#endif // UPX_CONFIG_DISABLE_WERROR
|
#endif // UPX_CONFIG_DISABLE_WERROR
|
||||||
#endif // UPX_CONFIG_DISABLE_WSTRICT
|
#endif // UPX_CONFIG_DISABLE_WSTRICT
|
||||||
|
|
||||||
|
#if __cplusplus >= 202002L // C++20
|
||||||
|
#define upx_is_constant_evaluated std::is_constant_evaluated
|
||||||
|
#elif __has_builtin(__builtin_is_constant_evaluated) // clang-9, gcc-10
|
||||||
|
#define upx_is_constant_evaluated __builtin_is_constant_evaluated
|
||||||
|
#elif (ACC_CC_GNUC >= 0x090000) && 1 // gcc-9
|
||||||
|
#define upx_is_constant_evaluated __builtin_is_constant_evaluated
|
||||||
|
#endif
|
||||||
|
|
||||||
// multithreading (UPX currently does not use multithreading)
|
// multithreading (UPX currently does not use multithreading)
|
||||||
#if (WITH_THREADS)
|
#if (WITH_THREADS)
|
||||||
#define upx_thread_local thread_local
|
#define upx_thread_local thread_local
|
||||||
@@ -143,7 +165,19 @@ typedef acc_int32_t upx_int32_t;
|
|||||||
typedef acc_uint32_t upx_uint32_t;
|
typedef acc_uint32_t upx_uint32_t;
|
||||||
typedef acc_int64_t upx_int64_t;
|
typedef acc_int64_t upx_int64_t;
|
||||||
typedef acc_uint64_t upx_uint64_t;
|
typedef acc_uint64_t upx_uint64_t;
|
||||||
|
#if (__SIZEOF_INT128__ == 16)
|
||||||
|
typedef __int128 upx_int128_t;
|
||||||
|
typedef unsigned __int128 upx_uint128_t;
|
||||||
|
#endif
|
||||||
typedef acc_uintptr_t upx_uintptr_t;
|
typedef acc_uintptr_t upx_uintptr_t;
|
||||||
|
#if defined(__PTRADDR_TYPE__) // CHERI
|
||||||
|
typedef __PTRADDR_TYPE__ upx_ptraddr_t;
|
||||||
|
#else
|
||||||
|
typedef upx_uintptr_t upx_ptraddr_t;
|
||||||
|
#endif
|
||||||
|
typedef std::make_signed_t<upx_ptraddr_t> upx_sptraddr_t; // signed ptraddr_t
|
||||||
|
typedef std::make_unsigned_t<ptrdiff_t> upx_uptrdiff_t; // unsigned ptrdiff_t
|
||||||
|
typedef std::make_signed_t<size_t> upx_ssize_t; // signed size_t
|
||||||
|
|
||||||
// UPX convention: use "byte" when dealing with data; use "char/uchar" when dealing
|
// UPX convention: use "byte" when dealing with data; use "char/uchar" when dealing
|
||||||
// with strings; use "upx_uint8_t" when dealing with small integers
|
// with strings; use "upx_uint8_t" when dealing with small integers
|
||||||
@@ -156,10 +190,14 @@ typedef unsigned char uchar;
|
|||||||
// upx_charptr_unit_type is some opaque type with sizeof(type) == 1
|
// upx_charptr_unit_type is some opaque type with sizeof(type) == 1
|
||||||
//// typedef char upx_charptr_unit_type; // also works
|
//// typedef char upx_charptr_unit_type; // also works
|
||||||
struct alignas(1) upx_charptr_unit_type final { char hidden__; };
|
struct alignas(1) upx_charptr_unit_type final { char hidden__; };
|
||||||
ACC_COMPILE_TIME_ASSERT_HEADER(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...
|
||||||
typedef upx_int64_t upx_off_t;
|
#if (__SIZEOF_INT128__ == 16) && 0
|
||||||
|
typedef upx_int128_t upx_off_t;
|
||||||
|
#else
|
||||||
|
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:
|
||||||
@@ -204,20 +242,6 @@ typedef upx_int64_t upx_off_t;
|
|||||||
// portab
|
// portab
|
||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
|
|
||||||
// some platform system headers may pre-define these, so undef to avoid conflicts
|
|
||||||
#undef _
|
|
||||||
#undef __
|
|
||||||
#undef ___
|
|
||||||
#undef dos
|
|
||||||
#undef large
|
|
||||||
#undef linux
|
|
||||||
#undef PAGE_MASK
|
|
||||||
#undef PAGE_SIZE
|
|
||||||
#undef small
|
|
||||||
#undef SP
|
|
||||||
#undef SS
|
|
||||||
#undef tos
|
|
||||||
#undef unix
|
|
||||||
#if (ACC_OS_POSIX) && !defined(__unix__)
|
#if (ACC_OS_POSIX) && !defined(__unix__)
|
||||||
#define __unix__ 1
|
#define __unix__ 1
|
||||||
#endif
|
#endif
|
||||||
@@ -286,6 +310,14 @@ typedef upx_int64_t upx_off_t;
|
|||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// some platforms may provide their own system bswapXX() functions, so rename to avoid conflicts
|
||||||
|
#undef bswap16
|
||||||
|
#undef bswap32
|
||||||
|
#undef bswap64
|
||||||
|
#define bswap16 upx_bswap16
|
||||||
|
#define bswap32 upx_bswap32
|
||||||
|
#define bswap64 upx_bswap64
|
||||||
|
|
||||||
// avoid warnings about shadowing global symbols
|
// avoid warnings about shadowing global symbols
|
||||||
#undef _base
|
#undef _base
|
||||||
#undef basename
|
#undef basename
|
||||||
@@ -340,11 +372,18 @@ typedef upx_int64_t upx_off_t;
|
|||||||
|
|
||||||
// for no-op debug output
|
// for no-op debug output
|
||||||
inline void NO_printf(const char *, ...) noexcept attribute_format(1, 2);
|
inline void NO_printf(const char *, ...) noexcept attribute_format(1, 2);
|
||||||
inline void NO_fprintf(FILE *, const char *, ...) noexcept attribute_format(2, 3);
|
|
||||||
inline void NO_printf(const char *, ...) noexcept {}
|
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 {}
|
inline void NO_fprintf(FILE *, const char *, ...) noexcept {}
|
||||||
|
|
||||||
#if __has_builtin(__builtin_memcpy_inline)
|
#if __has_builtin(__builtin_memcmp)
|
||||||
|
#define upx_memcmp_inline __builtin_memcmp
|
||||||
|
#elif defined(__clang__) || defined(__GNUC__)
|
||||||
|
#define upx_memcmp_inline __builtin_memcmp
|
||||||
|
#else
|
||||||
|
#define upx_memcmp_inline memcmp
|
||||||
|
#endif
|
||||||
|
#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)
|
||||||
#define upx_memcpy_inline __builtin_memcpy
|
#define upx_memcpy_inline __builtin_memcpy
|
||||||
@@ -394,39 +433,6 @@ inline void NO_fprintf(FILE *, const char *, ...) noexcept {}
|
|||||||
|
|
||||||
#define TABLESIZE(table) ((sizeof(table) / sizeof((table)[0])))
|
#define TABLESIZE(table) ((sizeof(table) / sizeof((table)[0])))
|
||||||
|
|
||||||
// TODO later: move these to upx namespace in util/cxxlib.h; also see bele.h
|
|
||||||
template <class T>
|
|
||||||
inline T ALIGN_DOWN(const T &a, const T &b) {
|
|
||||||
T r;
|
|
||||||
r = (a / b) * b;
|
|
||||||
return r;
|
|
||||||
}
|
|
||||||
template <class T>
|
|
||||||
inline T ALIGN_UP(const T &a, const T &b) {
|
|
||||||
T r;
|
|
||||||
r = ((a + b - 1) / b) * b;
|
|
||||||
return r;
|
|
||||||
}
|
|
||||||
template <class T>
|
|
||||||
inline T ALIGN_GAP(const T &a, const T &b) {
|
|
||||||
T r;
|
|
||||||
r = ALIGN_UP(a, b) - a;
|
|
||||||
return r;
|
|
||||||
}
|
|
||||||
|
|
||||||
template <class T>
|
|
||||||
inline const T &UPX_MAX(const T &a, const T &b) {
|
|
||||||
if (a < b)
|
|
||||||
return b;
|
|
||||||
return a;
|
|
||||||
}
|
|
||||||
template <class T>
|
|
||||||
inline const T &UPX_MIN(const T &a, const T &b) {
|
|
||||||
if (a < b)
|
|
||||||
return a;
|
|
||||||
return b;
|
|
||||||
}
|
|
||||||
|
|
||||||
template <class T>
|
template <class T>
|
||||||
inline void mem_clear(T *object) noexcept {
|
inline void mem_clear(T *object) noexcept {
|
||||||
static_assert(std::is_class_v<T>); // UPX convention
|
static_assert(std::is_class_v<T>); // UPX convention
|
||||||
@@ -474,11 +480,13 @@ noreturn void throwAssertFailed(const char *expr, const char *file, int line, co
|
|||||||
|
|
||||||
// C++ support library
|
// C++ support library
|
||||||
#include "util/cxxlib.h"
|
#include "util/cxxlib.h"
|
||||||
using upx::is_same_any_v;
|
|
||||||
using upx::noncopyable;
|
|
||||||
using upx::OptVar;
|
|
||||||
using upx::tribool;
|
using upx::tribool;
|
||||||
#define usizeof(expr) (upx::UnsignedSizeOf<sizeof(expr)>::value)
|
#define usizeof(expr) (upx::UnsignedSizeOf<sizeof(expr)>::value)
|
||||||
|
#define ALIGN_DOWN(a, b) (upx::align_down((a), (b)))
|
||||||
|
#define ALIGN_UP(a, b) (upx::align_up((a), (b)))
|
||||||
|
#define ALIGN_UP_GAP(a, b) (upx::align_up_gap((a), (b)))
|
||||||
|
#define UPX_MAX(a, b) (upx::max((a), (b)))
|
||||||
|
#define UPX_MIN(a, b) (upx::min((a), (b)))
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
// constants
|
// constants
|
||||||
@@ -620,7 +628,9 @@ using upx::tribool;
|
|||||||
|
|
||||||
#define WITH_LZMA 1
|
#define WITH_LZMA 1
|
||||||
#define WITH_UCL 1
|
#define WITH_UCL 1
|
||||||
|
#ifndef WITH_ZLIB
|
||||||
#define WITH_ZLIB 1
|
#define WITH_ZLIB 1
|
||||||
|
#endif
|
||||||
#if (WITH_UCL)
|
#if (WITH_UCL)
|
||||||
#define ucl_compress_config_t REAL_ucl_compress_config_t
|
#define ucl_compress_config_t REAL_ucl_compress_config_t
|
||||||
#include <ucl/include/ucl/uclconf.h>
|
#include <ucl/include/ucl/uclconf.h>
|
||||||
@@ -650,11 +660,11 @@ struct bzip2_compress_config_t final {
|
|||||||
};
|
};
|
||||||
|
|
||||||
struct lzma_compress_config_t final {
|
struct lzma_compress_config_t final {
|
||||||
typedef OptVar<unsigned, 2u, 0u, 4u> pos_bits_t; // pb
|
typedef upx::OptVar<unsigned, 2u, 0u, 4u> pos_bits_t; // pb
|
||||||
typedef OptVar<unsigned, 0u, 0u, 4u> lit_pos_bits_t; // lp
|
typedef upx::OptVar<unsigned, 0u, 0u, 4u> lit_pos_bits_t; // lp
|
||||||
typedef OptVar<unsigned, 3u, 0u, 8u> lit_context_bits_t; // lc
|
typedef upx::OptVar<unsigned, 3u, 0u, 8u> lit_context_bits_t; // lc
|
||||||
typedef OptVar<unsigned, (1u << 22), 1u, (1u << 30)> dict_size_t;
|
typedef upx::OptVar<unsigned, (1u << 22), 1u, (1u << 30)> dict_size_t;
|
||||||
typedef OptVar<unsigned, 64u, 5u, 273u> num_fast_bytes_t;
|
typedef upx::OptVar<unsigned, 64u, 5u, 273u> num_fast_bytes_t;
|
||||||
|
|
||||||
pos_bits_t pos_bits; // pb
|
pos_bits_t pos_bits; // pb
|
||||||
lit_pos_bits_t lit_pos_bits; // lp
|
lit_pos_bits_t lit_pos_bits; // lp
|
||||||
@@ -674,9 +684,9 @@ struct ucl_compress_config_t final : public REAL_ucl_compress_config_t {
|
|||||||
};
|
};
|
||||||
|
|
||||||
struct zlib_compress_config_t final {
|
struct zlib_compress_config_t final {
|
||||||
typedef OptVar<unsigned, 8u, 1u, 9u> mem_level_t; // ml
|
typedef upx::OptVar<unsigned, 8u, 1u, 9u> mem_level_t; // ml
|
||||||
typedef OptVar<unsigned, 15u, 9u, 15u> window_bits_t; // wb
|
typedef upx::OptVar<unsigned, 15u, 9u, 15u> window_bits_t; // wb
|
||||||
typedef OptVar<unsigned, 0u, 0u, 4u> strategy_t; // st
|
typedef upx::OptVar<unsigned, 0u, 0u, 4u> strategy_t; // st
|
||||||
|
|
||||||
mem_level_t mem_level; // ml
|
mem_level_t mem_level; // ml
|
||||||
window_bits_t window_bits; // wb
|
window_bits_t window_bits; // wb
|
||||||
@@ -860,5 +870,7 @@ int upx_test_overlap ( const upx_bytep buf,
|
|||||||
// xspan
|
// xspan
|
||||||
#include "util/raw_bytes.h"
|
#include "util/raw_bytes.h"
|
||||||
#include "util/xspan.h"
|
#include "util/xspan.h"
|
||||||
|
//
|
||||||
|
#include "util/system_check_predefs.h"
|
||||||
|
|
||||||
/* vim:set ts=4 sw=4 et: */
|
/* vim:set ts=4 sw=4 et: */
|
||||||
|
|||||||
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2024 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2025 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2024 Laszlo Molnar
|
Copyright (C) 1996-2025 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
|
|||||||
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2024 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2025 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2024 Laszlo Molnar
|
Copyright (C) 1996-2025 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
|
|||||||
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2024 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2025 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2024 Laszlo Molnar
|
Copyright (C) 1996-2025 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
|
|||||||
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2024 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2025 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2024 Laszlo Molnar
|
Copyright (C) 1996-2025 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
|
|||||||
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2024 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2025 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2024 Laszlo Molnar
|
Copyright (C) 1996-2025 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
|
|||||||
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2024 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2025 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2024 Laszlo Molnar
|
Copyright (C) 1996-2025 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
|
|||||||
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2024 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2025 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2024 Laszlo Molnar
|
Copyright (C) 1996-2025 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
|
|||||||
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2024 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2025 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2024 Laszlo Molnar
|
Copyright (C) 1996-2025 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
|
|||||||
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2024 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2025 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2024 Laszlo Molnar
|
Copyright (C) 1996-2025 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
|
|||||||
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2024 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2025 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2024 Laszlo Molnar
|
Copyright (C) 1996-2025 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
|
|||||||
+6
-6
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2024 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2025 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2024 Laszlo Molnar
|
Copyright (C) 1996-2025 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
@@ -152,7 +152,7 @@ void throwCantPack(const char *format, ...) {
|
|||||||
char msg[1024];
|
char msg[1024];
|
||||||
va_list ap;
|
va_list ap;
|
||||||
va_start(ap, format);
|
va_start(ap, format);
|
||||||
(void) upx_safe_vsnprintf_noexcept(msg, sizeof(msg), format, ap);
|
upx_safe_vsnprintf_noexcept(msg, sizeof(msg), format, ap);
|
||||||
va_end(ap);
|
va_end(ap);
|
||||||
throwCantPack(msg);
|
throwCantPack(msg);
|
||||||
}
|
}
|
||||||
@@ -162,7 +162,7 @@ void throwCantUnpack(const char *format, ...) {
|
|||||||
char msg[1024];
|
char msg[1024];
|
||||||
va_list ap;
|
va_list ap;
|
||||||
va_start(ap, format);
|
va_start(ap, format);
|
||||||
(void) upx_safe_vsnprintf_noexcept(msg, sizeof(msg), format, ap);
|
upx_safe_vsnprintf_noexcept(msg, sizeof(msg), format, ap);
|
||||||
va_end(ap);
|
va_end(ap);
|
||||||
throwCantUnpack(msg);
|
throwCantUnpack(msg);
|
||||||
}
|
}
|
||||||
@@ -172,9 +172,9 @@ void throwInternalError(const char *format, ...) {
|
|||||||
char msg[1024];
|
char msg[1024];
|
||||||
va_list ap;
|
va_list ap;
|
||||||
va_start(ap, format);
|
va_start(ap, format);
|
||||||
(void) upx_safe_vsnprintf_noexcept(msg, sizeof(msg), format, ap);
|
upx_safe_vsnprintf_noexcept(msg, sizeof(msg), format, ap);
|
||||||
va_end(ap);
|
va_end(ap);
|
||||||
throwCantUnpack(msg);
|
throwInternalError(msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
|
|||||||
+3
-3
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2024 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2025 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2024 Laszlo Molnar
|
Copyright (C) 1996-2025 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
@@ -133,7 +133,7 @@ public:
|
|||||||
CantPackException(const char *m = nullptr, bool w = false) noexcept : super(m, 0, w) {}
|
CantPackException(const char *m = nullptr, bool w = false) noexcept : super(m, 0, w) {}
|
||||||
};
|
};
|
||||||
|
|
||||||
class UnknownExecutableFormatException : public CantPackException {
|
class UnknownExecutableFormatException final : public CantPackException {
|
||||||
typedef CantPackException super;
|
typedef CantPackException super;
|
||||||
public:
|
public:
|
||||||
UnknownExecutableFormatException(const char *m = nullptr, bool w = false) noexcept
|
UnknownExecutableFormatException(const char *m = nullptr, bool w = false) noexcept
|
||||||
|
|||||||
+12
-12
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2024 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2025 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2024 Laszlo Molnar
|
Copyright (C) 1996-2025 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
@@ -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,26 +319,25 @@ 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:
|
||||||
if (bytes_written < off) {
|
if (bytes_written < off)
|
||||||
bytes_written = off;
|
bytes_written = off;
|
||||||
}
|
|
||||||
_length = bytes_written; // cheap, lazy update; needed?
|
_length = bytes_written; // cheap, lazy update; needed?
|
||||||
} break;
|
break;
|
||||||
case SEEK_END: {
|
case SEEK_END:
|
||||||
_length = bytes_written; // necessary
|
_length = bytes_written; // necessary
|
||||||
} break;
|
break;
|
||||||
}
|
}
|
||||||
return super::seek(off, whence);
|
return super::seek(off, whence);
|
||||||
}
|
}
|
||||||
|
|
||||||
// WARNING: fsync() does not exist in some Windows environments.
|
// WARNING: fsync() does not exist in some Windows environments.
|
||||||
// This trick works only on UNIX-like systems.
|
// This trick works only on UNIX-like systems.
|
||||||
// int OutputFile::read(void *buf, int len)
|
// int OutputFile::read(void *buf, int len) {
|
||||||
//{
|
|
||||||
// fsync(_fd);
|
// fsync(_fd);
|
||||||
// InputFile infile;
|
// InputFile infile;
|
||||||
// infile.open(this->getName(), O_RDONLY | O_BINARY);
|
// infile.open(this->getName(), O_RDONLY | O_BINARY);
|
||||||
|
|||||||
+2
-2
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2024 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2025 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2024 Laszlo Molnar
|
Copyright (C) 1996-2025 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
|
|||||||
+2
-2
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2024 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2025 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2024 Laszlo Molnar
|
Copyright (C) 1996-2025 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
|
|||||||
+2
-2
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2024 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2025 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2024 Laszlo Molnar
|
Copyright (C) 1996-2025 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
|
|||||||
+6
-6
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2024 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2025 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2024 Laszlo Molnar
|
Copyright (C) 1996-2025 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
@@ -355,6 +355,7 @@ static int s_ct24arm_be(Filter *f) {
|
|||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
|
|
||||||
#if 1 //{ old reliable
|
#if 1 //{ old reliable
|
||||||
|
|
||||||
#define CT26ARM_LE(f, cond, addvalue, get, set) \
|
#define CT26ARM_LE(f, cond, addvalue, get, set) \
|
||||||
byte *b = f->buf; \
|
byte *b = f->buf; \
|
||||||
byte *b_end = b + f->buf_len - 4; \
|
byte *b_end = b + f->buf_len - 4; \
|
||||||
@@ -387,10 +388,9 @@ static int s_ct26arm_le(Filter *f) {
|
|||||||
|
|
||||||
#else //}{ new enhanced but DIFFERENT; need new filter type!
|
#else //}{ new enhanced but DIFFERENT; need new filter type!
|
||||||
|
|
||||||
static int CTarm64(Filter *f, int dir) // dir: 1, 0, -1
|
static int CTarm64(Filter *f, int dir) { // dir: 1, 0, -1
|
||||||
{
|
byte *b = f->buf; // will be incremented
|
||||||
upx_byte *b = f->buf; // will be incremented
|
byte *const b_end = b + f->buf_len - 4;
|
||||||
upx_byte *const b_end = b + f->buf_len - 4;
|
|
||||||
do {
|
do {
|
||||||
unsigned const a = b - f->buf;
|
unsigned const a = b - f->buf;
|
||||||
int const d = dir * (f->addvalue + (a >> 2));
|
int const d = dir * (f->addvalue + (a >> 2));
|
||||||
|
|||||||
+2
-2
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2024 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2025 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2024 Laszlo Molnar
|
Copyright (C) 1996-2025 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
|
|||||||
+3
-3
@@ -2,9 +2,9 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2024 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2025 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2024 Laszlo Molnar
|
Copyright (C) 1996-2025 Laszlo Molnar
|
||||||
Copyright (C) 2000-2024 John F. Reiser
|
Copyright (C) 2000-2025 John F. Reiser
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
|
|||||||
+3
-3
@@ -2,9 +2,9 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2024 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2025 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2024 Laszlo Molnar
|
Copyright (C) 1996-2025 Laszlo Molnar
|
||||||
Copyright (C) 2000-2024 John F. Reiser
|
Copyright (C) 2000-2025 John F. Reiser
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
|
|||||||
+3
-3
@@ -2,9 +2,9 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2024 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2025 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2024 Laszlo Molnar
|
Copyright (C) 1996-2025 Laszlo Molnar
|
||||||
Copyright (C) 2000-2024 John F. Reiser
|
Copyright (C) 2000-2025 John F. Reiser
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
|
|||||||
+2
-2
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2024 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2025 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2024 Laszlo Molnar
|
Copyright (C) 1996-2025 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
|
|||||||
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2024 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2025 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2024 Laszlo Molnar
|
Copyright (C) 1996-2025 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
@@ -28,8 +28,6 @@
|
|||||||
#include "../conf.h"
|
#include "../conf.h"
|
||||||
#include "../filter.h"
|
#include "../filter.h"
|
||||||
|
|
||||||
static unsigned umin(const unsigned a, const unsigned b) { return (a <= b) ? a : b; }
|
|
||||||
|
|
||||||
#define set_dummy(p, v) ((void) 0)
|
#define set_dummy(p, v) ((void) 0)
|
||||||
#define get_8(p) (*(p))
|
#define get_8(p) (*(p))
|
||||||
#define set_8(p, v) (*(p) = (v))
|
#define set_8(p, v) (*(p) = (v))
|
||||||
@@ -206,7 +204,8 @@ static unsigned umin(const unsigned a, const unsigned b) { return (a <= b) ? a :
|
|||||||
{ 0x36, 6, 0x00ffffff, f_ctoj32_e8e9_bswap_le, u_ctoj32_e8e9_bswap_le, s_ctoj32_e8e9_bswap_le },
|
{ 0x36, 6, 0x00ffffff, f_ctoj32_e8e9_bswap_le, u_ctoj32_e8e9_bswap_le, s_ctoj32_e8e9_bswap_le },
|
||||||
|
|
||||||
// 32-bit calltrick with jmp, optional jcc; runtime can unfilter more than one block
|
// 32-bit calltrick with jmp, optional jcc; runtime can unfilter more than one block
|
||||||
{ 0x46, 6, 0x00ffffff, f_ctok32_e8e9_bswap_le, u_ctok32_e8e9_bswap_le, s_ctok32_e8e9_bswap_le },
|
// Note 0x46 uses 'ctoj', while 0x49 uses 'ctok'.
|
||||||
|
{ 0x46, 6, 0x00ffffff, f_ctoj32_e8e9_bswap_le, u_ctoj32_e8e9_bswap_le, s_ctoj32_e8e9_bswap_le },
|
||||||
{ 0x49, 6, 0x00ffffff, f_ctok32_e8e9_bswap_le, u_ctok32_e8e9_bswap_le, s_ctok32_e8e9_bswap_le },
|
{ 0x49, 6, 0x00ffffff, f_ctok32_e8e9_bswap_le, u_ctok32_e8e9_bswap_le, s_ctok32_e8e9_bswap_le },
|
||||||
|
|
||||||
// 24-bit calltrick for arm
|
// 24-bit calltrick for arm
|
||||||
|
|||||||
+2
-2
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2024 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2025 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2024 Laszlo Molnar
|
Copyright (C) 1996-2025 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
|
|||||||
+5
-5
@@ -2,9 +2,9 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2024 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2025 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2024 Laszlo Molnar
|
Copyright (C) 1996-2025 Laszlo Molnar
|
||||||
Copyright (C) 2004-2024 John F. Reiser
|
Copyright (C) 2004-2025 John F. Reiser
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
@@ -44,7 +44,7 @@ static int F(Filter *f) {
|
|||||||
// scan
|
// scan
|
||||||
const byte *b = f->buf;
|
const byte *b = f->buf;
|
||||||
#endif
|
#endif
|
||||||
const unsigned size = umin(f->buf_len, 0u - (~0u << (32 - (6 + W_CTO))));
|
const unsigned size = upx::umin(f->buf_len, 0u - (~0u << (32 - (6 + W_CTO))));
|
||||||
const unsigned size4 = size - 4;
|
const unsigned size4 = size - 4;
|
||||||
|
|
||||||
unsigned ic;
|
unsigned ic;
|
||||||
@@ -123,7 +123,7 @@ static int F(Filter *f) {
|
|||||||
#ifdef U
|
#ifdef U
|
||||||
static int U(Filter *f) {
|
static int U(Filter *f) {
|
||||||
byte *b = f->buf;
|
byte *b = f->buf;
|
||||||
const unsigned size4 = umin(f->buf_len - 4, 0u - (~0u << (32 - (6 + W_CTO))));
|
const unsigned size4 = upx::umin(f->buf_len - 4, 0u - (~0u << (32 - (6 + W_CTO))));
|
||||||
const unsigned addvalue = f->addvalue;
|
const unsigned addvalue = f->addvalue;
|
||||||
|
|
||||||
unsigned ic;
|
unsigned ic;
|
||||||
|
|||||||
+2
-2
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2024 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2025 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2024 Laszlo Molnar
|
Copyright (C) 1996-2025 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
|
|||||||
+2
-2
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2024 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2025 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2024 Laszlo Molnar
|
Copyright (C) 1996-2025 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
|
|||||||
+2
-2
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2024 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2025 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2024 Laszlo Molnar
|
Copyright (C) 1996-2025 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
|
|||||||
+2
-2
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2024 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2025 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2024 Laszlo Molnar
|
Copyright (C) 1996-2025 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
|
|||||||
+2
-2
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2024 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2025 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2024 Laszlo Molnar
|
Copyright (C) 1996-2025 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
|
|||||||
+76
-17
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2024 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2025 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2024 Laszlo Molnar
|
Copyright (C) 1996-2025 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
@@ -114,13 +114,15 @@ struct PackerNames final {
|
|||||||
unsigned methods[PackerBase::MAX_METHODS];
|
unsigned methods[PackerBase::MAX_METHODS];
|
||||||
unsigned filters[PackerBase::MAX_FILTERS];
|
unsigned filters[PackerBase::MAX_FILTERS];
|
||||||
};
|
};
|
||||||
Entry names[MAX_NAMES];
|
Entry names_array[MAX_NAMES];
|
||||||
|
Entry *names[MAX_NAMES];
|
||||||
unsigned names_count = 0;
|
unsigned names_count = 0;
|
||||||
const Options *o = nullptr;
|
const Options *o = nullptr;
|
||||||
|
|
||||||
void add(const PackerBase *pb) {
|
void add(const PackerBase *pb) {
|
||||||
assert_noexcept(names_count < MAX_NAMES);
|
assert_noexcept(names_count < MAX_NAMES);
|
||||||
Entry &e = names[names_count++];
|
Entry &e = names_array[names_count];
|
||||||
|
names[names_count++] = &e;
|
||||||
e.fname = pb->getFullName(o);
|
e.fname = pb->getFullName(o);
|
||||||
e.sname = pb->getName();
|
e.sname = pb->getName();
|
||||||
e.methods_count = e.filters_count = 0;
|
e.methods_count = e.filters_count = 0;
|
||||||
@@ -147,11 +149,10 @@ struct PackerNames final {
|
|||||||
self->add(pb);
|
self->add(pb);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
static int __acc_cdecl_qsort compare_fname(const void *a, const void *b) {
|
static int __acc_cdecl_qsort compare_fname(const void *aa, const void *bb) {
|
||||||
return strcmp(((const Entry *) a)->fname, ((const Entry *) b)->fname);
|
const Entry *a = *(const Entry *const *) aa;
|
||||||
}
|
const Entry *b = *(const Entry *const *) bb;
|
||||||
static int __acc_cdecl_qsort compare_sname(const void *a, const void *b) {
|
return strcmp(a->fname, b->fname);
|
||||||
return strcmp(((const Entry *) a)->sname, ((const Entry *) b)->sname);
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
} // namespace
|
} // namespace
|
||||||
@@ -162,10 +163,11 @@ static noinline void list_all_packers(FILE *f, int verbose) {
|
|||||||
PackerNames pn;
|
PackerNames pn;
|
||||||
pn.o = &o;
|
pn.o = &o;
|
||||||
(void) PackMaster::visitAllPackers(PackerNames::visit, nullptr, &o, &pn);
|
(void) PackMaster::visitAllPackers(PackerNames::visit, nullptr, &o, &pn);
|
||||||
upx_gnomesort(pn.names, pn.names_count, sizeof(PackerNames::Entry), PackerNames::compare_fname);
|
// NOLINTNEXTLINE(bugprone-multi-level-implicit-pointer-conversion)
|
||||||
|
upx_gnomesort(pn.names, pn.names_count, sizeof(pn.names[0]), PackerNames::compare_fname);
|
||||||
size_t pos = 0;
|
size_t pos = 0;
|
||||||
for (size_t i = 0; i < pn.names_count; i++) {
|
for (size_t i = 0; i < pn.names_count; i++) {
|
||||||
const PackerNames::Entry &e = pn.names[i];
|
const PackerNames::Entry &e = *pn.names[i];
|
||||||
const char *const fn = e.fname;
|
const char *const fn = e.fname;
|
||||||
const char *const sn = e.sname;
|
const char *const sn = e.sname;
|
||||||
if (verbose >= 3) {
|
if (verbose >= 3) {
|
||||||
@@ -218,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");
|
||||||
@@ -463,15 +468,15 @@ void show_version(bool one_line) {
|
|||||||
fprintf(f, "doctest C++ testing framework version %s\n", DOCTEST_VERSION_STR);
|
fprintf(f, "doctest C++ testing framework version %s\n", DOCTEST_VERSION_STR);
|
||||||
#endif
|
#endif
|
||||||
// clang-format off
|
// clang-format off
|
||||||
fprintf(f, "Copyright (C) 1996-2024 Markus Franz Xaver Johannes Oberhumer\n");
|
fprintf(f, "Copyright (C) 1996-2025 Markus Franz Xaver Johannes Oberhumer\n");
|
||||||
fprintf(f, "Copyright (C) 1996-2024 Laszlo Molnar\n");
|
fprintf(f, "Copyright (C) 1996-2025 Laszlo Molnar\n");
|
||||||
fprintf(f, "Copyright (C) 2000-2024 John F. Reiser\n");
|
fprintf(f, "Copyright (C) 2000-2025 John F. Reiser\n");
|
||||||
#if (WITH_ZLIB)
|
#if (WITH_ZLIB)
|
||||||
// see vendor/zlib/LICENSE
|
// see vendor/zlib/LICENSE
|
||||||
fprintf(f, "Copyright (C) 1995" "-2024 Jean-loup Gailly and Mark Adler\n");
|
fprintf(f, "Copyright (C) 1995" "-2024 Jean-loup Gailly and Mark Adler\n");
|
||||||
#endif
|
#endif
|
||||||
#if (WITH_LZMA)
|
#if (WITH_LZMA)
|
||||||
// see vendor/lzma-sdk/lzma.txt
|
// see vendor/lzma-sdk
|
||||||
fprintf(f, "Copyright (C) 1999" "-2006 Igor Pavlov\n");
|
fprintf(f, "Copyright (C) 1999" "-2006 Igor Pavlov\n");
|
||||||
#endif
|
#endif
|
||||||
#if (WITH_ZSTD)
|
#if (WITH_ZSTD)
|
||||||
@@ -521,11 +526,16 @@ void show_sysinfo(const char *options_var) {
|
|||||||
con_fprintf(f, fmt, v);
|
con_fprintf(f, fmt, v);
|
||||||
con_fprintf(f, "\n");
|
con_fprintf(f, "\n");
|
||||||
};
|
};
|
||||||
|
|
||||||
// language
|
// language
|
||||||
cf_print("__cplusplus", "%lld", __cplusplus + 0, 3);
|
cf_print("__cplusplus", "%lld", __cplusplus + 0, 3);
|
||||||
#if defined(_MSVC_LANG)
|
#if defined(_MSVC_LANG)
|
||||||
cf_print("_MSVC_LANG", "%lld", _MSVC_LANG + 0, 3);
|
cf_print("_MSVC_LANG", "%lld", _MSVC_LANG + 0, 3);
|
||||||
#endif
|
#endif
|
||||||
|
#if defined(upx_is_constant_evaluated)
|
||||||
|
cf_print("upx_is_constant_evaluated", "%lld", 1, 3);
|
||||||
|
#endif
|
||||||
|
|
||||||
// compiler
|
// compiler
|
||||||
#if defined(ACC_CC_CLANG)
|
#if defined(ACC_CC_CLANG)
|
||||||
cf_print("ACC_CC_CLANG", "0x%06llx", ACC_CC_CLANG + 0, 3);
|
cf_print("ACC_CC_CLANG", "0x%06llx", ACC_CC_CLANG + 0, 3);
|
||||||
@@ -563,6 +573,30 @@ void show_sysinfo(const char *options_var) {
|
|||||||
#if defined(_MSC_FULL_VER)
|
#if defined(_MSC_FULL_VER)
|
||||||
cf_print("_MSC_FULL_VER", "%lld", _MSC_FULL_VER + 0);
|
cf_print("_MSC_FULL_VER", "%lld", _MSC_FULL_VER + 0);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// architecture
|
||||||
|
#if defined(__CHERI__)
|
||||||
|
cf_print("__CHERI__", "%lld", __CHERI__ + 0, 3);
|
||||||
|
#endif
|
||||||
|
#if defined(__CHERI_PURE_CAPABILITY__)
|
||||||
|
cf_print("__CHERI_PURE_CAPABILITY__", "%lld", __CHERI_PURE_CAPABILITY__ + 0, 3);
|
||||||
|
#endif
|
||||||
|
#if defined(__mips_hard_float)
|
||||||
|
cf_print("__mips_hard_float", "%lld", __mips_hard_float + 0);
|
||||||
|
#endif
|
||||||
|
#if defined(__mips_soft_float)
|
||||||
|
cf_print("__mips_soft_float", "%lld", __mips_soft_float + 0);
|
||||||
|
#endif
|
||||||
|
#if defined(__wasm__)
|
||||||
|
cf_print("__wasm__", "%lld", __wasm__ + 0);
|
||||||
|
#endif
|
||||||
|
#if defined(__wasm32__)
|
||||||
|
cf_print("__wasm32__", "%lld", __wasm32__ + 0);
|
||||||
|
#endif
|
||||||
|
#if defined(__wasm64__)
|
||||||
|
cf_print("__wasm64__", "%lld", __wasm64__ + 0);
|
||||||
|
#endif
|
||||||
|
|
||||||
// OS and libc
|
// OS and libc
|
||||||
#if defined(WINVER)
|
#if defined(WINVER)
|
||||||
cf_print("WINVER", "0x%04llx", WINVER + 0);
|
cf_print("WINVER", "0x%04llx", WINVER + 0);
|
||||||
@@ -590,7 +624,30 @@ void show_sysinfo(const char *options_var) {
|
|||||||
#if defined(__GLIBC_MINOR__)
|
#if defined(__GLIBC_MINOR__)
|
||||||
cf_print("__GLIBC_MINOR__", "%lld", __GLIBC_MINOR__ + 0);
|
cf_print("__GLIBC_MINOR__", "%lld", __GLIBC_MINOR__ + 0);
|
||||||
#endif
|
#endif
|
||||||
|
#if defined(__wasi__)
|
||||||
|
cf_print("__wasi__", "%lld", __wasi__ + 0);
|
||||||
|
#endif
|
||||||
|
|
||||||
// misc compilation options
|
// misc compilation options
|
||||||
|
#if defined(__PIC__)
|
||||||
|
cf_print("__PIC__", "%lld", __PIC__ + 0, 3);
|
||||||
|
#elif defined(__pic__)
|
||||||
|
cf_print("__pic__", "%lld", __pic__ + 0, 3);
|
||||||
|
#endif
|
||||||
|
#if defined(__PIE__)
|
||||||
|
cf_print("__PIE__", "%lld", __PIE__ + 0, 3);
|
||||||
|
#elif defined(__pie__)
|
||||||
|
cf_print("__pie__", "%lld", __pie__ + 0, 3);
|
||||||
|
#endif
|
||||||
|
#if defined(__SIZEOF_INT128__)
|
||||||
|
cf_print("__SIZEOF_INT128__", "%lld", __SIZEOF_INT128__ + 0, 3);
|
||||||
|
#endif
|
||||||
|
#if defined(__SIZEOF_LONG_LONG__) && (__SIZEOF_LONG_LONG__ + 0 > 8)
|
||||||
|
cf_print("__SIZEOF_LONG_LONG__", "%lld", __SIZEOF_LONG_LONG__ + 0, 3);
|
||||||
|
#endif
|
||||||
|
#if defined(__SIZEOF_POINTER__) && (__SIZEOF_POINTER__ + 0 > 8)
|
||||||
|
cf_print("__SIZEOF_POINTER__", "%lld", __SIZEOF_POINTER__ + 0, 3);
|
||||||
|
#endif
|
||||||
#if defined(UPX_CONFIG_DISABLE_WSTRICT)
|
#if defined(UPX_CONFIG_DISABLE_WSTRICT)
|
||||||
cf_print("UPX_CONFIG_DISABLE_WSTRICT", "%lld", UPX_CONFIG_DISABLE_WSTRICT + 0, 3);
|
cf_print("UPX_CONFIG_DISABLE_WSTRICT", "%lld", UPX_CONFIG_DISABLE_WSTRICT + 0, 3);
|
||||||
#endif
|
#endif
|
||||||
@@ -600,12 +657,13 @@ void show_sysinfo(const char *options_var) {
|
|||||||
#if defined(WITH_THREADS)
|
#if defined(WITH_THREADS)
|
||||||
cf_print("WITH_THREADS", "%lld", WITH_THREADS + 0);
|
cf_print("WITH_THREADS", "%lld", WITH_THREADS + 0);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
UNUSED(cf_count);
|
UNUSED(cf_count);
|
||||||
UNUSED(cf_print);
|
UNUSED(cf_print);
|
||||||
UNUSED(initial_win32_winnt);
|
UNUSED(initial_win32_winnt);
|
||||||
}
|
}
|
||||||
|
|
||||||
// run-time
|
// run-time settings
|
||||||
#if defined(HAVE_LOCALTIME) && defined(HAVE_GMTIME)
|
#if defined(HAVE_LOCALTIME) && defined(HAVE_GMTIME)
|
||||||
{
|
{
|
||||||
auto tm2str = [](char *s, size_t size, const struct tm *tmp) noexcept {
|
auto tm2str = [](char *s, size_t size, const struct tm *tmp) noexcept {
|
||||||
@@ -624,6 +682,7 @@ void show_sysinfo(const char *options_var) {
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// environment
|
||||||
if (options_var && options_var[0]) {
|
if (options_var && options_var[0]) {
|
||||||
const char *e = upx_getenv(options_var);
|
const char *e = upx_getenv(options_var);
|
||||||
con_fprintf(f, "\n");
|
con_fprintf(f, "\n");
|
||||||
|
|||||||
+2
-2
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2024 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2025 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2024 Laszlo Molnar
|
Copyright (C) 1996-2025 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
|
|||||||
+2
-2
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2024 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2025 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2024 Laszlo Molnar
|
Copyright (C) 1996-2025 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
|
|||||||
+4
-4
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2024 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2025 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2024 Laszlo Molnar
|
Copyright (C) 1996-2025 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
@@ -227,7 +227,7 @@ void ElfLinker::preprocessSymbols(char *start, char const *end) {
|
|||||||
else if (sscanf(start, "%x%*8c %1023s %*x %1023s", &offset, section, symbol) == 3)
|
else if (sscanf(start, "%x%*8c %1023s %*x %1023s", &offset, section, symbol) == 3)
|
||||||
#else
|
#else
|
||||||
// work around broken scanf() implementations
|
// work around broken scanf() implementations
|
||||||
// http://bugs.winehq.org/show_bug.cgi?id=10401 (fixed in Wine 0.9.58)
|
// https://bugs.winehq.org/show_bug.cgi?id=10401 (fixed in Wine 0.9.58)
|
||||||
else if (sscanf(start, "%x%*c%*c%*c%*c%*c%*c%*c%*c %1023s %*x %1023s", &offset, section,
|
else if (sscanf(start, "%x%*c%*c%*c%*c%*c%*c%*c%*c %1023s %*x %1023s", &offset, section,
|
||||||
symbol) == 3)
|
symbol) == 3)
|
||||||
#endif
|
#endif
|
||||||
@@ -680,7 +680,7 @@ void ElfLinkerArm64LE::relocate1(const Relocation *rel, byte *location, upx_uint
|
|||||||
upx_uint32_t const m19 = ~(~0u << 19);
|
upx_uint32_t const m19 = ~(~0u << 19);
|
||||||
upx_uint32_t w = get_le32(location);
|
upx_uint32_t w = get_le32(location);
|
||||||
set_le32(location, (w & ~(m19 << 5)) | ((((w >> 5) + (value >> 2)) & m19) << 5));
|
set_le32(location, (w & ~(m19 << 5)) | ((((w >> 5) + (value >> 2)) & m19) << 5));
|
||||||
} else if (!strcmp(type, "CALL26")) {
|
} else if (!strcmp(type, "CALL26") || !strcmp(type, "JUMP26")) {
|
||||||
value -= rel->section->offset + rel->offset;
|
value -= rel->section->offset + rel->offset;
|
||||||
upx_uint32_t const m26 = ~(~0u << 26);
|
upx_uint32_t const m26 = ~(~0u << 26);
|
||||||
upx_uint32_t w = get_le32(location);
|
upx_uint32_t w = get_le32(location);
|
||||||
|
|||||||
+6
-6
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2024 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2025 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2024 Laszlo Molnar
|
Copyright (C) 1996-2025 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
@@ -31,7 +31,7 @@
|
|||||||
// ElfLinker
|
// ElfLinker
|
||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
|
|
||||||
class ElfLinker : private noncopyable {
|
class ElfLinker /*not_final*/ : private upx::noncopyable {
|
||||||
friend class Packer;
|
friend class Packer;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
@@ -114,7 +114,7 @@ protected:
|
|||||||
const char *type);
|
const char *type);
|
||||||
};
|
};
|
||||||
|
|
||||||
struct ElfLinker::Section : private noncopyable {
|
struct ElfLinker::Section final : private upx::noncopyable {
|
||||||
char *name = nullptr;
|
char *name = nullptr;
|
||||||
void *input = nullptr;
|
void *input = nullptr;
|
||||||
byte *output = nullptr;
|
byte *output = nullptr;
|
||||||
@@ -128,7 +128,7 @@ struct ElfLinker::Section : private noncopyable {
|
|||||||
~Section() noexcept;
|
~Section() noexcept;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct ElfLinker::Symbol : private noncopyable {
|
struct ElfLinker::Symbol final : private upx::noncopyable {
|
||||||
char *name = nullptr;
|
char *name = nullptr;
|
||||||
Section *section = nullptr;
|
Section *section = nullptr;
|
||||||
upx_uint64_t offset = 0;
|
upx_uint64_t offset = 0;
|
||||||
@@ -137,7 +137,7 @@ struct ElfLinker::Symbol : private noncopyable {
|
|||||||
~Symbol() noexcept;
|
~Symbol() noexcept;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct ElfLinker::Relocation : private noncopyable {
|
struct ElfLinker::Relocation final : private upx::noncopyable {
|
||||||
const Section *section = nullptr;
|
const Section *section = nullptr;
|
||||||
unsigned offset = 0;
|
unsigned offset = 0;
|
||||||
const char *type = nullptr;
|
const char *type = nullptr;
|
||||||
|
|||||||
+16
-6
@@ -1,9 +1,9 @@
|
|||||||
/* main.cpp --
|
/* main.cpp -- main entry
|
||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2024 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2025 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2024 Laszlo Molnar
|
Copyright (C) 1996-2025 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
@@ -343,7 +343,8 @@ done:
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <class T, T default_value, T min_value, T max_value>
|
template <class T, T default_value, T min_value, T max_value>
|
||||||
static int getoptvar(OptVar<T, default_value, min_value, max_value> *var, const char *arg_fatal) {
|
static int getoptvar(upx::OptVar<T, default_value, min_value, max_value> *var,
|
||||||
|
const char *arg_fatal) {
|
||||||
T v = default_value;
|
T v = default_value;
|
||||||
int r = getoptvar(&v, min_value, max_value, arg_fatal);
|
int r = getoptvar(&v, min_value, max_value, arg_fatal);
|
||||||
if (r == 0)
|
if (r == 0)
|
||||||
@@ -738,6 +739,9 @@ static int do_option(int optc, const char *arg) {
|
|||||||
case 677:
|
case 677:
|
||||||
opt->o_unix.force_pie = true;
|
opt->o_unix.force_pie = true;
|
||||||
break;
|
break;
|
||||||
|
case 678:
|
||||||
|
opt->o_unix.android_old = true;
|
||||||
|
break;
|
||||||
// ps1/exe
|
// ps1/exe
|
||||||
case 670:
|
case 670:
|
||||||
opt->ps1_exe.boot_only = true;
|
opt->ps1_exe.boot_only = true;
|
||||||
@@ -836,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)
|
||||||
@@ -952,6 +956,7 @@ int main_get_options(int argc, char **argv) {
|
|||||||
{"preserve-build-id", 0, N, 675},
|
{"preserve-build-id", 0, N, 675},
|
||||||
{"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},
|
||||||
// ps1/exe
|
// ps1/exe
|
||||||
{"boot-only", 0x90, N, 670},
|
{"boot-only", 0x90, N, 670},
|
||||||
{"no-align", 0x90, N, 671},
|
{"no-align", 0x90, N, 671},
|
||||||
@@ -1210,6 +1215,7 @@ int upx_main(int argc, char *argv[]) may_throw {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Allow serial re-use of upx_main() as a subroutine
|
// Allow serial re-use of upx_main() as a subroutine
|
||||||
|
exit_code = EXIT_OK;
|
||||||
opt->reset();
|
opt->reset();
|
||||||
|
|
||||||
#if (ACC_OS_CYGWIN || ACC_OS_DOS16 || ACC_OS_DOS32 || ACC_OS_EMX || ACC_OS_TOS || ACC_OS_WIN16 || \
|
#if (ACC_OS_CYGWIN || ACC_OS_DOS16 || ACC_OS_DOS32 || ACC_OS_EMX || ACC_OS_TOS || ACC_OS_WIN16 || \
|
||||||
@@ -1246,7 +1252,9 @@ int upx_main(int argc, char *argv[]) may_throw {
|
|||||||
assert(upx_nrv_init() == 0);
|
assert(upx_nrv_init() == 0);
|
||||||
#endif
|
#endif
|
||||||
assert(upx_ucl_init() == 0);
|
assert(upx_ucl_init() == 0);
|
||||||
|
#if (WITH_ZLIB)
|
||||||
assert(upx_zlib_init() == 0);
|
assert(upx_zlib_init() == 0);
|
||||||
|
#endif
|
||||||
#if (WITH_ZSTD)
|
#if (WITH_ZSTD)
|
||||||
assert(upx_zstd_init() == 0);
|
assert(upx_zstd_init() == 0);
|
||||||
#endif
|
#endif
|
||||||
@@ -1310,8 +1318,10 @@ int upx_main(int argc, char *argv[]) may_throw {
|
|||||||
|
|
||||||
/* start work */
|
/* start work */
|
||||||
set_term(stdout);
|
set_term(stdout);
|
||||||
if (do_files(i, argc, argv) != 0)
|
if (do_files(i, argc, argv) != 0) {
|
||||||
|
assert(exit_code != 0);
|
||||||
return exit_code;
|
return exit_code;
|
||||||
|
}
|
||||||
|
|
||||||
if (gitrev[0]) {
|
if (gitrev[0]) {
|
||||||
// also see UPX_CONFIG_DISABLE_GITREV in CMakeLists.txt
|
// also see UPX_CONFIG_DISABLE_GITREV in CMakeLists.txt
|
||||||
|
|||||||
+3
-3
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2024 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2025 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2024 Laszlo Molnar
|
Copyright (C) 1996-2025 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
@@ -51,7 +51,7 @@ void printClearLine(FILE *f) noexcept {
|
|||||||
fflush(stderr);
|
fflush(stderr);
|
||||||
if (f == nullptr)
|
if (f == nullptr)
|
||||||
f = stdout;
|
f = stdout;
|
||||||
con_fprintf(f, "%s", clear_line_msg);
|
con_fprintf(f, "%s", clear_line_msg); // NOLINT(clang-analyzer-unix.Stream)
|
||||||
fflush(f);
|
fflush(f);
|
||||||
printSetNl(0);
|
printSetNl(0);
|
||||||
}
|
}
|
||||||
|
|||||||
+4
-3
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2024 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2025 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2024 Laszlo Molnar
|
Copyright (C) 1996-2025 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
@@ -28,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"
|
||||||
|
|||||||
+5
-3
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2024 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2025 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2024 Laszlo Molnar
|
Copyright (C) 1996-2025 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
@@ -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"
|
||||||
@@ -159,6 +160,7 @@ struct Options final {
|
|||||||
unsigned char osabi0; // replacement if 0==.e_ident[EI_OSABI]
|
unsigned char osabi0; // replacement if 0==.e_ident[EI_OSABI]
|
||||||
bool preserve_build_id; // copy the build-id to the compressed binary
|
bool preserve_build_id; // copy the build-id to the compressed binary
|
||||||
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 force_pie; // choose DF_1_PIE instead of is_shlib
|
bool force_pie; // choose DF_1_PIE instead of is_shlib
|
||||||
} o_unix;
|
} o_unix;
|
||||||
struct {
|
struct {
|
||||||
|
|||||||
+2
-2
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2024 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2025 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2024 Laszlo Molnar
|
Copyright (C) 1996-2025 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
|
|||||||
+2
-2
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2024 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2025 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2024 Laszlo Molnar
|
Copyright (C) 1996-2025 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
|
|||||||
+11
-15
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2024 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2025 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2024 Laszlo Molnar
|
Copyright (C) 1996-2025 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
@@ -150,27 +150,23 @@ static void handle_allegropak(InputFile *fi, OutputFile *fo) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
int PackDjgpp2::readFileHeader() {
|
int PackDjgpp2::readFileHeader() {
|
||||||
byte hdr[0x1c];
|
dos_header_t dos_hdr;
|
||||||
byte magic[8];
|
|
||||||
|
|
||||||
fi->seek(0, SEEK_SET);
|
fi->seek(0, SEEK_SET);
|
||||||
fi->readx(hdr, sizeof(hdr));
|
fi->readx(&dos_hdr, sizeof(dos_hdr));
|
||||||
if (get_le16(hdr) == 0x5a4d) // MZ exe signature, stubbed?
|
if (get_le16(&dos_hdr.e_magic) == 0x5a4d) { // MZ exe signature, stubbed?
|
||||||
{
|
byte magic[8];
|
||||||
coff_offset = 512 * get_le16(hdr + 4);
|
fi->seek(16 * get_le16(&dos_hdr.e_cparhdr), SEEK_SET);
|
||||||
if (get_le16(hdr + 2) != 0)
|
|
||||||
coff_offset += get_le16(hdr + 2) - 512;
|
|
||||||
fi->seek(512, SEEK_SET);
|
|
||||||
fi->readx(magic, 8);
|
fi->readx(magic, 8);
|
||||||
if (memcmp("go32stub", magic, 8) != 0)
|
if (memcmp("go32stub", magic, 8) != 0)
|
||||||
return 0; // not V2 image
|
return 0; // not V2 image
|
||||||
|
}
|
||||||
|
coff_offset = 512 * get_le16(&dos_hdr.e_cp);
|
||||||
|
if (get_le16(&dos_hdr.e_cblp) != 0)
|
||||||
|
coff_offset += get_le16(&dos_hdr.e_cblp) - 512;
|
||||||
fi->seek(coff_offset, SEEK_SET);
|
fi->seek(coff_offset, SEEK_SET);
|
||||||
if (fi->read(&coff_hdr, sizeof(coff_hdr)) != sizeof(coff_hdr))
|
if (fi->read(&coff_hdr, sizeof(coff_hdr)) != sizeof(coff_hdr))
|
||||||
throwCantPack("skipping djgpp symlink");
|
throwCantPack("skipping djgpp symlink");
|
||||||
} else {
|
|
||||||
fi->seek(coff_offset, SEEK_SET);
|
|
||||||
fi->readx(&coff_hdr, 0xa8);
|
|
||||||
}
|
|
||||||
if (coff_hdr.f_magic != 0x014c) // I386MAGIC
|
if (coff_hdr.f_magic != 0x014c) // I386MAGIC
|
||||||
return 0;
|
return 0;
|
||||||
if ((coff_hdr.f_flags & 2) == 0) // F_EXEC - COFF executable
|
if ((coff_hdr.f_flags & 2) == 0) // F_EXEC - COFF executable
|
||||||
|
|||||||
+12
-2
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2024 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2025 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2024 Laszlo Molnar
|
Copyright (C) 1996-2025 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
@@ -62,6 +62,16 @@ protected:
|
|||||||
|
|
||||||
unsigned coff_offset;
|
unsigned coff_offset;
|
||||||
|
|
||||||
|
// based on https://dox.ipxe.org/PeImage_8h_source.html
|
||||||
|
struct alignas(1) dos_header_t {
|
||||||
|
LE16 e_magic;
|
||||||
|
LE16 e_cblp; // Bytes on last page of file
|
||||||
|
LE16 e_cp; // Pages in file
|
||||||
|
LE16 e_crlc; // Relocations
|
||||||
|
LE16 e_cparhdr; // Size of header in paragraphs
|
||||||
|
LE16 e_OMITTED[32 - 5 * 2];
|
||||||
|
}; // 64 bytes
|
||||||
|
|
||||||
struct alignas(1) external_scnhdr_t {
|
struct alignas(1) external_scnhdr_t {
|
||||||
byte _[12]; // name, paddr
|
byte _[12]; // name, paddr
|
||||||
LE32 vaddr;
|
LE32 vaddr;
|
||||||
|
|||||||
+2
-2
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2024 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2025 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2024 Laszlo Molnar
|
Copyright (C) 1996-2025 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
|
|||||||
+9
-2
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2024 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2025 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2024 Laszlo Molnar
|
Copyright (C) 1996-2025 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
@@ -73,6 +73,7 @@ class Dummy {
|
|||||||
ET_CORE = 4, /* Core file */
|
ET_CORE = 4, /* Core file */
|
||||||
};
|
};
|
||||||
enum { // e_machine
|
enum { // e_machine
|
||||||
|
EM_NONE = 0, // No machine
|
||||||
EM_386 = 3, // i386
|
EM_386 = 3, // i386
|
||||||
EM_MIPS = 8,
|
EM_MIPS = 8,
|
||||||
EM_MIPS_RS3_LE = 10, // MIPS R3000 little-endian
|
EM_MIPS_RS3_LE = 10, // MIPS R3000 little-endian
|
||||||
@@ -103,6 +104,11 @@ class Dummy {
|
|||||||
PT_NUM = 8, /* Number of defined types in low range */
|
PT_NUM = 8, /* Number of defined types in low range */
|
||||||
PT_GNU_STACK = 0x6474e551, /* Indicates stack executability */
|
PT_GNU_STACK = 0x6474e551, /* Indicates stack executability */
|
||||||
PT_GNU_RELRO = 0x6474e552, /* Read-only after relocation */
|
PT_GNU_RELRO = 0x6474e552, /* Read-only after relocation */
|
||||||
|
PT_MIPS_REGINFO = 0x70000000,
|
||||||
|
/* Register usage information. */ //
|
||||||
|
// PT_MIPS_RTPROC = 0x70000001, /* Runtime procedure table. */
|
||||||
|
// PT_MIPS_OPTIONS = 0x70000002,
|
||||||
|
PT_MIPS_ABIFLAGS = 0x70000003, /* FP mode requirement. */
|
||||||
};
|
};
|
||||||
|
|
||||||
enum { // p_flags
|
enum { // p_flags
|
||||||
@@ -133,6 +139,7 @@ class Dummy {
|
|||||||
SHT_PREINIT_ARRAY = 16, /* Array of pre-constructors */
|
SHT_PREINIT_ARRAY = 16, /* Array of pre-constructors */
|
||||||
SHT_GROUP = 17, /* Section group */
|
SHT_GROUP = 17, /* Section group */
|
||||||
SHT_SYMTAB_SHNDX = 18, /* Extended section indices */
|
SHT_SYMTAB_SHNDX = 18, /* Extended section indices */
|
||||||
|
SHT_RELR = 19, /* RELR relative relocations */
|
||||||
SHT_GNU_HASH = 0x6ffffff6, /* GNU-style hash table. */
|
SHT_GNU_HASH = 0x6ffffff6, /* GNU-style hash table. */
|
||||||
SHT_GNU_LIBLIST = 0x6ffffff7, /* Prelink library list */
|
SHT_GNU_LIBLIST = 0x6ffffff7, /* Prelink library list */
|
||||||
SHT_GNU_verdef = 0x6ffffffd, /* Version definition section. */
|
SHT_GNU_verdef = 0x6ffffffd, /* Version definition section. */
|
||||||
|
|||||||
+2
-2
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2024 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2025 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2024 Laszlo Molnar
|
Copyright (C) 1996-2025 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
|
|||||||
+2
-2
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2024 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2025 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2024 Laszlo Molnar
|
Copyright (C) 1996-2025 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
|
|||||||
+1718
-1247
File diff suppressed because it is too large
Load Diff
+28
-7
@@ -2,9 +2,9 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2024 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2025 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2024 Laszlo Molnar
|
Copyright (C) 1996-2025 Laszlo Molnar
|
||||||
Copyright (C) 2000-2024 John F. Reiser
|
Copyright (C) 2000-2025 John F. Reiser
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
@@ -59,6 +59,12 @@ protected:
|
|||||||
virtual off_t pack3(OutputFile *, Filter &) override = 0; // append loader
|
virtual off_t pack3(OutputFile *, Filter &) override = 0; // append loader
|
||||||
//virtual void pack4(OutputFile *, Filter &) override = 0; // append pack header
|
//virtual void pack4(OutputFile *, Filter &) override = 0; // append pack header
|
||||||
|
|
||||||
|
virtual unsigned pack2_shlib_overlay_init(OutputFile *fo);
|
||||||
|
virtual unsigned pack2_shlib_overlay_compress(MemBuffer &obuf,
|
||||||
|
upx_byte const *inp, unsigned u_len);
|
||||||
|
virtual unsigned pack2_shlib_overlay_write(OutputFile *fo, MemBuffer &obuf,
|
||||||
|
unsigned hdr_u_len, unsigned hdr_c_len);
|
||||||
|
|
||||||
virtual void generateElfHdr(
|
virtual void generateElfHdr(
|
||||||
OutputFile *,
|
OutputFile *,
|
||||||
void const *proto,
|
void const *proto,
|
||||||
@@ -149,10 +155,13 @@ protected:
|
|||||||
virtual void ARM_updateLoader(OutputFile *);
|
virtual void ARM_updateLoader(OutputFile *);
|
||||||
virtual int ARM_is_QNX(void);
|
virtual int ARM_is_QNX(void);
|
||||||
|
|
||||||
|
virtual upx_uint64_t canPack_Shdr(Elf32_Phdr const *pload_x0);
|
||||||
virtual void pack1(OutputFile *, Filter &) override; // generate executable header
|
virtual void pack1(OutputFile *, Filter &) override; // generate executable header
|
||||||
virtual void asl_pack2_Shdrs(OutputFile *, unsigned pre_xct_top); // AndroidSharedLibrary processes Shdrs
|
virtual void asl_pack2_Shdrs(OutputFile *, unsigned pre_xct_top); // AndroidSharedLibrary processes Shdrs
|
||||||
virtual void asl_slide_Shdrs(); // by so_slide if above xct_off
|
virtual void asl_slide_Shdrs(); // by so_slide if above xct_off
|
||||||
|
virtual unsigned slide_sh_offset(Elf32_Shdr *shdr);
|
||||||
virtual int pack2(OutputFile *, Filter &) override; // append compressed data
|
virtual int pack2(OutputFile *, Filter &) override; // append compressed data
|
||||||
|
virtual int pack2_shlib(OutputFile *fo, Filter &ft, unsigned pre_xct_top);
|
||||||
virtual off_t pack3(OutputFile *, Filter &) override; // append loader
|
virtual off_t pack3(OutputFile *, Filter &) override; // append loader
|
||||||
virtual void pack4(OutputFile *, Filter &) override; // append pack header
|
virtual void pack4(OutputFile *, Filter &) override; // append pack header
|
||||||
virtual unsigned forward_Shdrs(OutputFile *fo, Elf32_Ehdr *ehdro);
|
virtual unsigned forward_Shdrs(OutputFile *fo, Elf32_Ehdr *ehdro);
|
||||||
@@ -206,7 +215,7 @@ protected:
|
|||||||
unsigned elf_find_table_size(unsigned dt_type, unsigned sh_type);
|
unsigned elf_find_table_size(unsigned dt_type, unsigned sh_type);
|
||||||
void sort_DT32_offsets(Elf32_Dyn const *const dynp0);
|
void sort_DT32_offsets(Elf32_Dyn const *const dynp0);
|
||||||
|
|
||||||
int is_LOAD32(Elf32_Phdr const *phdr) const; // beware confusion with (1+ LO_PROC)
|
int is_LOAD(Elf32_Phdr const *phdr) const; // beware confusion with (1+ LO_PROC)
|
||||||
unsigned check_pt_load(Elf32_Phdr const *);
|
unsigned check_pt_load(Elf32_Phdr const *);
|
||||||
unsigned check_pt_dynamic(Elf32_Phdr const *);
|
unsigned check_pt_dynamic(Elf32_Phdr const *);
|
||||||
void invert_pt_dynamic(Elf32_Dyn const *, unsigned dt_filesz);
|
void invert_pt_dynamic(Elf32_Dyn const *, unsigned dt_filesz);
|
||||||
@@ -215,6 +224,7 @@ protected:
|
|||||||
virtual upx_uint64_t elf_unsigned_dynamic(unsigned) const override;
|
virtual upx_uint64_t elf_unsigned_dynamic(unsigned) const override;
|
||||||
unsigned find_dt_ndx(unsigned rva);
|
unsigned find_dt_ndx(unsigned rva);
|
||||||
virtual int adjABS(Elf32_Sym *sym, unsigned delta);
|
virtual int adjABS(Elf32_Sym *sym, unsigned delta);
|
||||||
|
void add_phdrx(Elf32_Phdr const *);
|
||||||
|
|
||||||
char const *get_str_name(unsigned st_name, unsigned symnum) const;
|
char const *get_str_name(unsigned st_name, unsigned symnum) const;
|
||||||
char const *get_dynsym_name(unsigned symnum, unsigned relnum) const;
|
char const *get_dynsym_name(unsigned symnum, unsigned relnum) const;
|
||||||
@@ -223,7 +233,10 @@ protected:
|
|||||||
Elf32_Phdr *phdri; // for input file
|
Elf32_Phdr *phdri; // for input file
|
||||||
Elf32_Shdr *shdri; // from input file
|
Elf32_Shdr *shdri; // from input file
|
||||||
Elf32_Shdr *shdro; // for output file
|
Elf32_Shdr *shdro; // for output file
|
||||||
Elf32_Phdr const *gnu_stack; // propagate NX
|
static unsigned const END_PHDRX = 5;
|
||||||
|
Elf32_Phdr const *phdrx[END_PHDRX]; // "extra" arch-specific Phdr
|
||||||
|
unsigned n_phdrx; // number actually used
|
||||||
|
unsigned sz_phdrx; // total size of bodies
|
||||||
unsigned e_phoff;
|
unsigned e_phoff;
|
||||||
unsigned e_shoff;
|
unsigned e_shoff;
|
||||||
unsigned sz_dynseg; // PT_DYNAMIC.p_memsz
|
unsigned sz_dynseg; // PT_DYNAMIC.p_memsz
|
||||||
@@ -314,9 +327,13 @@ protected:
|
|||||||
virtual tribool canPack() override;
|
virtual tribool canPack() override;
|
||||||
virtual tribool canUnpack() override; // bool, except -1: format known, but not packed
|
virtual tribool canUnpack() override; // bool, except -1: format known, but not packed
|
||||||
|
|
||||||
|
virtual upx_uint64_t canPack_Shdr(Elf64_Phdr const *pload_x0);
|
||||||
virtual void pack1(OutputFile *, Filter &) override; // generate executable header
|
virtual void pack1(OutputFile *, Filter &) override; // generate executable header
|
||||||
virtual void asl_pack2_Shdrs(OutputFile *, unsigned pre_xct_top); // AndroidSharedLibrary processes Shdrs
|
virtual void asl_pack2_Shdrs(OutputFile *, unsigned pre_xct_top); // AndroidSharedLibrary processes Shdrs
|
||||||
|
virtual void asl_slide_Shdrs(); // by so_slide if above xct_off
|
||||||
|
virtual unsigned slide_sh_offset(Elf64_Shdr *shdr);
|
||||||
virtual int pack2(OutputFile *, Filter &) override; // append compressed data
|
virtual int pack2(OutputFile *, Filter &) override; // append compressed data
|
||||||
|
virtual int pack2_shlib(OutputFile *fo, Filter &ft, unsigned pre_xct_top);
|
||||||
virtual off_t pack3(OutputFile *, Filter &) override; // append loader
|
virtual off_t pack3(OutputFile *, Filter &) override; // append loader
|
||||||
virtual void pack4(OutputFile *, Filter &) override; // append pack header
|
virtual void pack4(OutputFile *, Filter &) override; // append pack header
|
||||||
virtual unsigned forward_Shdrs(OutputFile *fo, Elf64_Ehdr *ehdro);
|
virtual unsigned forward_Shdrs(OutputFile *fo, Elf64_Ehdr *ehdro);
|
||||||
@@ -367,7 +384,7 @@ protected:
|
|||||||
Elf64_Dyn *elf_find_dynptr(unsigned) const;
|
Elf64_Dyn *elf_find_dynptr(unsigned) const;
|
||||||
unsigned elf_find_table_size(unsigned dt_type, unsigned sh_type);
|
unsigned elf_find_table_size(unsigned dt_type, unsigned sh_type);
|
||||||
void sort_DT64_offsets(Elf64_Dyn const *const dynp0);
|
void sort_DT64_offsets(Elf64_Dyn const *const dynp0);
|
||||||
int is_LOAD64(Elf64_Phdr const *phdr) const; // beware confusion with (1+ LO_PROC)
|
int is_LOAD(Elf64_Phdr const *phdr) const; // beware confusion with (1+ LO_PROC)
|
||||||
upx_uint64_t check_pt_load(Elf64_Phdr const *);
|
upx_uint64_t check_pt_load(Elf64_Phdr const *);
|
||||||
upx_uint64_t check_pt_dynamic(Elf64_Phdr const *);
|
upx_uint64_t check_pt_dynamic(Elf64_Phdr const *);
|
||||||
void invert_pt_dynamic(Elf64_Dyn const *, upx_uint64_t dt_filesz);
|
void invert_pt_dynamic(Elf64_Dyn const *, upx_uint64_t dt_filesz);
|
||||||
@@ -376,6 +393,7 @@ protected:
|
|||||||
virtual upx_uint64_t elf_unsigned_dynamic(unsigned) const override;
|
virtual upx_uint64_t elf_unsigned_dynamic(unsigned) const override;
|
||||||
unsigned find_dt_ndx(u64_t rva);
|
unsigned find_dt_ndx(u64_t rva);
|
||||||
virtual int adjABS(Elf64_Sym *sym, unsigned long delta);
|
virtual int adjABS(Elf64_Sym *sym, unsigned long delta);
|
||||||
|
void add_phdrx(Elf64_Phdr const *);
|
||||||
|
|
||||||
char const *get_str_name(unsigned st_name, unsigned symnum) const;
|
char const *get_str_name(unsigned st_name, unsigned symnum) const;
|
||||||
char const *get_dynsym_name(unsigned symnum, unsigned relnum) const;
|
char const *get_dynsym_name(unsigned symnum, unsigned relnum) const;
|
||||||
@@ -384,7 +402,10 @@ protected:
|
|||||||
Elf64_Phdr *phdri; // for input file
|
Elf64_Phdr *phdri; // for input file
|
||||||
Elf64_Shdr *shdri; // from input file
|
Elf64_Shdr *shdri; // from input file
|
||||||
Elf64_Shdr *shdro; // for output file
|
Elf64_Shdr *shdro; // for output file
|
||||||
Elf64_Phdr const *gnu_stack; // propagate NX
|
static unsigned const END_PHDRX = 5;
|
||||||
|
Elf64_Phdr const *phdrx[END_PHDRX]; // "extra" arch-specific Phdr
|
||||||
|
unsigned n_phdrx; // number actually used
|
||||||
|
unsigned sz_phdrx; // total size of bodies
|
||||||
upx_uint64_t e_phoff;
|
upx_uint64_t e_phoff;
|
||||||
upx_uint64_t e_shoff;
|
upx_uint64_t e_shoff;
|
||||||
upx_uint64_t sz_dynseg; // PT_DYNAMIC.p_memsz
|
upx_uint64_t sz_dynseg; // PT_DYNAMIC.p_memsz
|
||||||
|
|||||||
+4
-13
@@ -2,9 +2,9 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2024 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2025 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2024 Laszlo Molnar
|
Copyright (C) 1996-2025 Laszlo Molnar
|
||||||
Copyright (C) 2001-2024 John F. Reiser
|
Copyright (C) 2001-2025 John F. Reiser
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
@@ -279,15 +279,6 @@ PackLinuxI386::pack4(OutputFile *fo, Filter &ft)
|
|||||||
fo->rewrite(&elfout, overlay_offset);
|
fo->rewrite(&elfout, overlay_offset);
|
||||||
}
|
}
|
||||||
|
|
||||||
static unsigned
|
|
||||||
umax(unsigned a, unsigned b)
|
|
||||||
{
|
|
||||||
if (a <= b) {
|
|
||||||
return b;
|
|
||||||
}
|
|
||||||
return a;
|
|
||||||
}
|
|
||||||
|
|
||||||
Linker *PackLinuxI386::newLinker() const
|
Linker *PackLinuxI386::newLinker() const
|
||||||
{
|
{
|
||||||
return new ElfLinkerX86;
|
return new ElfLinkerX86;
|
||||||
@@ -311,7 +302,7 @@ PackLinuxI386::buildLinuxLoader(
|
|||||||
usizeof(l_info);
|
usizeof(l_info);
|
||||||
if (0 == get_le32(fold_hdrlen + fold)) {
|
if (0 == get_le32(fold_hdrlen + fold)) {
|
||||||
// inconsistent SIZEOF_HEADERS in *.lds (ld, binutils)
|
// inconsistent SIZEOF_HEADERS in *.lds (ld, binutils)
|
||||||
fold_hdrlen = umax(0x80, fold_hdrlen);
|
fold_hdrlen = upx::umax(0x80u, fold_hdrlen);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// This adds the definition to the "library", to be used later.
|
// This adds the definition to the "library", to be used later.
|
||||||
|
|||||||
+2
-2
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2024 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2025 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2024 Laszlo Molnar
|
Copyright (C) 1996-2025 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
|
|||||||
+5
-4
@@ -2,9 +2,9 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2024 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2025 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2024 Laszlo Molnar
|
Copyright (C) 1996-2025 Laszlo Molnar
|
||||||
Copyright (C) 2000-2024 John F. Reiser
|
Copyright (C) 2000-2025 John F. Reiser
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
@@ -109,7 +109,8 @@ void PackLinuxElf32x86interp::pack1(OutputFile *fo, Filter &)
|
|||||||
h3.phdr[1].p_flags = Elf32_Phdr::PF_W | Elf32_Phdr::PF_R;
|
h3.phdr[1].p_flags = Elf32_Phdr::PF_W | Elf32_Phdr::PF_R;
|
||||||
h3.phdr[1].p_align = 1;
|
h3.phdr[1].p_align = 1;
|
||||||
h3.phdr[2].p_type = PT_INTERP;
|
h3.phdr[2].p_type = PT_INTERP;
|
||||||
h3.phdr[2].p_offset = (char *)&h3.phdr[2].p_vaddr - (char *)&h3;
|
// h3.phdr[2].p_offset = (char *)&h3.phdr[2].p_vaddr - (char *)&h3;
|
||||||
|
h3.phdr[2].p_offset = offsetof(cprElfHdr3, phdr[2].p_vaddr);
|
||||||
memcpy(&h3.phdr[2].p_vaddr, "/upxrun", h3.phdr[2].p_filesz = 8);
|
memcpy(&h3.phdr[2].p_vaddr, "/upxrun", h3.phdr[2].p_filesz = 8);
|
||||||
h3.phdr[2].p_align = 1;
|
h3.phdr[2].p_align = 1;
|
||||||
|
|
||||||
|
|||||||
+3
-3
@@ -2,9 +2,9 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2024 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2025 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2024 Laszlo Molnar
|
Copyright (C) 1996-2025 Laszlo Molnar
|
||||||
Copyright (C) 2000-2024 John F. Reiser
|
Copyright (C) 2000-2025 John F. Reiser
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
|
|||||||
+4
-13
@@ -2,9 +2,9 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2024 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2025 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2024 Laszlo Molnar
|
Copyright (C) 1996-2025 Laszlo Molnar
|
||||||
Copyright (C) 2000-2024 John F. Reiser
|
Copyright (C) 2000-2025 John F. Reiser
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
@@ -62,15 +62,6 @@ PackLinuxI386sh::~PackLinuxI386sh()
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
static unsigned
|
|
||||||
umax(unsigned a, unsigned b)
|
|
||||||
{
|
|
||||||
if (a <= b) {
|
|
||||||
return b;
|
|
||||||
}
|
|
||||||
return a;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
void
|
||||||
PackLinuxI386sh::buildLoader(Filter const *ft)
|
PackLinuxI386sh::buildLoader(Filter const *ft)
|
||||||
{
|
{
|
||||||
@@ -94,7 +85,7 @@ PackLinuxI386sh::buildLoader(Filter const *ft)
|
|||||||
sizeof(Elf32_Phdr) * get_te16(&((Elf32_Ehdr const *)(void *)buf)->e_phnum);
|
sizeof(Elf32_Phdr) * get_te16(&((Elf32_Ehdr const *)(void *)buf)->e_phnum);
|
||||||
if (0 == get_le32(buf + fold_hdrlen)) {
|
if (0 == get_le32(buf + fold_hdrlen)) {
|
||||||
// inconsistent SIZEOF_HEADERS in *.lds (ld, binutils)
|
// inconsistent SIZEOF_HEADERS in *.lds (ld, binutils)
|
||||||
fold_hdrlen = umax(0x80, fold_hdrlen);
|
fold_hdrlen = upx::umax(0x80u, fold_hdrlen);
|
||||||
}
|
}
|
||||||
bool success = fold_ft.filter(buf + fold_hdrlen, sz_fold - fold_hdrlen);
|
bool success = fold_ft.filter(buf + fold_hdrlen, sz_fold - fold_hdrlen);
|
||||||
UNUSED(success);
|
UNUSED(success);
|
||||||
|
|||||||
+3
-3
@@ -2,9 +2,9 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2024 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2025 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2024 Laszlo Molnar
|
Copyright (C) 1996-2025 Laszlo Molnar
|
||||||
Copyright (C) 2000-2024 John F. Reiser
|
Copyright (C) 2000-2025 John F. Reiser
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
|
|||||||
+29
-11
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 2004-2024 John Reiser
|
Copyright (C) 2004-2025 John Reiser
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
@@ -44,6 +44,9 @@
|
|||||||
#if (ACC_CC_GNUC >= 0x040200)
|
#if (ACC_CC_GNUC >= 0x040200)
|
||||||
# pragma GCC diagnostic ignored "-Wcast-align"
|
# pragma GCC diagnostic ignored "-Wcast-align"
|
||||||
#endif
|
#endif
|
||||||
|
#if defined(__CHERI__) && defined(__CHERI_PURE_CAPABILITY__)
|
||||||
|
# pragma clang diagnostic ignored "-Wcheri-capability-misuse" // TODO later
|
||||||
|
#endif
|
||||||
|
|
||||||
static const CLANG_FORMAT_DUMMY_STATEMENT
|
static const CLANG_FORMAT_DUMMY_STATEMENT
|
||||||
#include "stub/i386-darwin.macho-entry.h"
|
#include "stub/i386-darwin.macho-entry.h"
|
||||||
@@ -1462,12 +1465,6 @@ void PackMachBase<T>::pack1(OutputFile *const fo, Filter &/*ft*/) // generate e
|
|||||||
#define WANT_MACH_HEADER_ENUM 1
|
#define WANT_MACH_HEADER_ENUM 1
|
||||||
#include "p_mach_enum.h"
|
#include "p_mach_enum.h"
|
||||||
|
|
||||||
static unsigned
|
|
||||||
umin(unsigned a, unsigned b)
|
|
||||||
{
|
|
||||||
return (a <= b) ? a : b;
|
|
||||||
}
|
|
||||||
|
|
||||||
#define MAX_N_CMDS 256
|
#define MAX_N_CMDS 256
|
||||||
|
|
||||||
template <class T>
|
template <class T>
|
||||||
@@ -1549,7 +1546,7 @@ void PackMachBase<T>::unpack(OutputFile *fo)
|
|||||||
"bad packed Mach load_command @%#x", ptr_udiff_bytes(ptr, mhdr));
|
"bad packed Mach load_command @%#x", ptr_udiff_bytes(ptr, mhdr));
|
||||||
throwCantUnpack(msg);
|
throwCantUnpack(msg);
|
||||||
}
|
}
|
||||||
memcpy(&msegcmd[j], ptr, umin(sizeof(Mach_segment_command), cmdsize));
|
memcpy(&msegcmd[j], ptr, upx::umin(usizeof(Mach_segment_command), cmdsize));
|
||||||
headway -= cmdsize;
|
headway -= cmdsize;
|
||||||
ptr += cmdsize;
|
ptr += cmdsize;
|
||||||
}
|
}
|
||||||
@@ -1681,6 +1678,12 @@ tribool PackMachBase<T>::canUnpack()
|
|||||||
Mach_command const *ptr = (Mach_command const *)rawmseg;
|
Mach_command const *ptr = (Mach_command const *)rawmseg;
|
||||||
for (unsigned j= 0; j < ncmds;
|
for (unsigned j= 0; j < ncmds;
|
||||||
ptr = (Mach_command const *)(ptr->cmdsize + (char const *)ptr), ++j) {
|
ptr = (Mach_command const *)(ptr->cmdsize + (char const *)ptr), ++j) {
|
||||||
|
if (headway < (int)sizeof(Mach_command)) {
|
||||||
|
char buf[200]; snprintf(buf, sizeof(buf),
|
||||||
|
"bad Mach_command[%u]{@0x%zx,+0x%x}",
|
||||||
|
j, (sizeof(mhdri) + ((char const *)ptr - (char const *)rawmseg)), headway);
|
||||||
|
throwCantPack(buf);
|
||||||
|
}
|
||||||
unsigned const cmd = ptr->cmd;
|
unsigned const cmd = ptr->cmd;
|
||||||
unsigned const cmdsize = ptr->cmdsize;
|
unsigned const cmdsize = ptr->cmdsize;
|
||||||
if (is_bad_linker_command(cmd, cmdsize, headway, lc_seg, sizeof(Addr))) {
|
if (is_bad_linker_command(cmd, cmdsize, headway, lc_seg, sizeof(Addr))) {
|
||||||
@@ -1760,6 +1763,10 @@ tribool PackMachBase<T>::canUnpack()
|
|||||||
else { // PackHeader follows loader at __LINKEDIT
|
else { // PackHeader follows loader at __LINKEDIT
|
||||||
if ((off_t)bufsize > (fi->st_size() - offLINK)) {
|
if ((off_t)bufsize > (fi->st_size() - offLINK)) {
|
||||||
bufsize = fi->st_size() - offLINK;
|
bufsize = fi->st_size() - offLINK;
|
||||||
|
if (bufsize < sizeof(struct b_info)) {
|
||||||
|
throwCantUnpack("bad offLINK %p %p",
|
||||||
|
(void *)offLINK, (void *)file_size);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
fi->seek(offLINK, SEEK_SET);
|
fi->seek(offLINK, SEEK_SET);
|
||||||
}
|
}
|
||||||
@@ -1768,7 +1775,8 @@ tribool PackMachBase<T>::canUnpack()
|
|||||||
fi->seek(offLINK - bufsize, SEEK_SET);
|
fi->seek(offLINK - bufsize, SEEK_SET);
|
||||||
}
|
}
|
||||||
MemBuffer buf(bufsize);
|
MemBuffer buf(bufsize);
|
||||||
MemBuffer buf3(bufsize);
|
MemBuffer buf3(upx::max(bufsize, 0x1008u));
|
||||||
|
buf3.clear();
|
||||||
|
|
||||||
fi->readx(buf, bufsize);
|
fi->readx(buf, bufsize);
|
||||||
// Do not overwrite buf[]; For scratch space, then use buf3 instead.
|
// Do not overwrite buf[]; For scratch space, then use buf3 instead.
|
||||||
@@ -1881,9 +1889,13 @@ tribool PackMachBase<T>::canUnpack()
|
|||||||
unsigned const *p;
|
unsigned const *p;
|
||||||
for (p = (unsigned const *)&buf3[0x1000]; p > lo; ) if (*--p) {
|
for (p = (unsigned const *)&buf3[0x1000]; p > lo; ) if (*--p) {
|
||||||
overlay_offset = *(TE32 const *)p;
|
overlay_offset = *(TE32 const *)p;
|
||||||
|
if ((unsigned)file_size < (overlay_offset + sizeof(PackHeader) + sizeof(overlay_offset)))
|
||||||
|
throwCantUnpack("file corrupted");
|
||||||
if ((off_t)overlay_offset < offLINK) {
|
if ((off_t)overlay_offset < offLINK) {
|
||||||
overlay_offset = ((char const *)p - (char const *)lo) +
|
overlay_offset = ((char const *)p - (char const *)lo) +
|
||||||
(offLINK - 0x1000) - overlay_offset + sizeof(l_info);
|
(offLINK - 0x1000) - overlay_offset + sizeof(l_info);
|
||||||
|
if ((unsigned)file_size < (overlay_offset + sizeof(PackHeader) + sizeof(overlay_offset)))
|
||||||
|
throwCantUnpack("file corrupted");
|
||||||
fi->seek(overlay_offset, SEEK_SET);
|
fi->seek(overlay_offset, SEEK_SET);
|
||||||
fi->readx(buf3, bufsize);
|
fi->readx(buf3, bufsize);
|
||||||
if (b_ptr->sz_unc < 0x4000
|
if (b_ptr->sz_unc < 0x4000
|
||||||
@@ -1903,7 +1915,7 @@ tribool PackMachBase<T>::canUnpack()
|
|||||||
if ( overlay_offset < sz_mach_headers
|
if ( overlay_offset < sz_mach_headers
|
||||||
|| (off_t)overlay_offset >= file_size) {
|
|| (off_t)overlay_offset >= file_size) {
|
||||||
infoWarning("file corrupted: %s", fi->getName());
|
infoWarning("file corrupted: %s", fi->getName());
|
||||||
MemBuffer buf2(umin(1<<14, file_size));
|
MemBuffer buf2(upx::umin(1u<<14, file_size_u32));
|
||||||
fi->seek(sz_mach_headers, SEEK_SET);
|
fi->seek(sz_mach_headers, SEEK_SET);
|
||||||
fi->readx(buf2, buf2.getSize());
|
fi->readx(buf2, buf2.getSize());
|
||||||
unsigned const *p = (unsigned const *)&buf2[0];
|
unsigned const *p = (unsigned const *)&buf2[0];
|
||||||
@@ -1966,7 +1978,7 @@ tribool PackMachBase<T>::canPack()
|
|||||||
throwCantPack("%d < Mach_header.ncmds", MAX_N_CMDS);
|
throwCantPack("%d < Mach_header.ncmds", MAX_N_CMDS);
|
||||||
}
|
}
|
||||||
unsigned const sz_mhcmds = (unsigned)mhdri.sizeofcmds;
|
unsigned const sz_mhcmds = (unsigned)mhdri.sizeofcmds;
|
||||||
unsigned headway = umin(sz_mhcmds, file_size - sizeof(mhdri));
|
unsigned headway = upx::umin(sz_mhcmds, file_size_u32 - usizeof(mhdri));
|
||||||
if (headway < sz_mhcmds) {
|
if (headway < sz_mhcmds) {
|
||||||
char buf[32]; snprintf(buf, sizeof(buf), "bad sizeofcmds %d", sz_mhcmds);
|
char buf[32]; snprintf(buf, sizeof(buf), "bad sizeofcmds %d", sz_mhcmds);
|
||||||
throwCantPack(buf);
|
throwCantPack(buf);
|
||||||
@@ -1984,6 +1996,12 @@ tribool PackMachBase<T>::canPack()
|
|||||||
unsigned char const *ptr = (unsigned char const *)rawmseg;
|
unsigned char const *ptr = (unsigned char const *)rawmseg;
|
||||||
for (unsigned j= 0; j < ncmds; ++j) {
|
for (unsigned j= 0; j < ncmds; ++j) {
|
||||||
Mach_segment_command const *segptr = (Mach_segment_command const *)ptr;
|
Mach_segment_command const *segptr = (Mach_segment_command const *)ptr;
|
||||||
|
if (headway < sizeof(Mach_command)) {
|
||||||
|
char buf[200]; snprintf(buf, sizeof(buf),
|
||||||
|
"bad Mach_command[%u]{@0x%zx,+0x%x}",
|
||||||
|
j, (sizeof(mhdri) + ((char const *)segptr - (char const *)rawmseg)), headway);
|
||||||
|
throwCantPack(buf);
|
||||||
|
}
|
||||||
unsigned const cmd = segptr->cmd &~ LC_REQ_DYLD;
|
unsigned const cmd = segptr->cmd &~ LC_REQ_DYLD;
|
||||||
unsigned const cmdsize = segptr->cmdsize;
|
unsigned const cmdsize = segptr->cmdsize;
|
||||||
if (is_bad_linker_command(cmd, cmdsize, headway, lc_seg, sizeof(Addr))) {
|
if (is_bad_linker_command(cmd, cmdsize, headway, lc_seg, sizeof(Addr))) {
|
||||||
|
|||||||
+2
-2
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2024 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2025 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2024 Laszlo Molnar
|
Copyright (C) 1996-2025 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
|
|||||||
+1
-1
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 2007-2024 John F. Reiser
|
Copyright (C) 2007-2025 John F. Reiser
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
|
|||||||
+5
-5
@@ -2,9 +2,9 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2024 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2025 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2024 Laszlo Molnar
|
Copyright (C) 1996-2025 Laszlo Molnar
|
||||||
Copyright (C) 2002-2024 Jens Medoch
|
Copyright (C) 2002-2025 Jens Medoch
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
@@ -154,7 +154,7 @@ void PackPs1::putBkupHeader(const byte *src, byte *dst, unsigned *len) {
|
|||||||
if (r != UPX_E_OK || sz_cbh >= SZ_IH_BKUP)
|
if (r != UPX_E_OK || sz_cbh >= SZ_IH_BKUP)
|
||||||
throwInternalError("header compression failed");
|
throwInternalError("header compression failed");
|
||||||
INIT_BH_BKUP(p, sz_cbh);
|
INIT_BH_BKUP(p, sz_cbh);
|
||||||
*len = ALIGN_UP(sz_cbh + (unsigned) sizeof(ps1_exe_chb_t) - 1, 4u);
|
*len = ALIGN_UP(sz_cbh + usizeof(ps1_exe_chb_t) - 1, 4u);
|
||||||
p->ih_csum = ADLER16(upx_adler32(&ih.epc, SZ_IH_BKUP));
|
p->ih_csum = ADLER16(upx_adler32(&ih.epc, SZ_IH_BKUP));
|
||||||
memcpy(dst, cpr_bh, SZ_IH_BKUP);
|
memcpy(dst, cpr_bh, SZ_IH_BKUP);
|
||||||
} else
|
} else
|
||||||
@@ -300,7 +300,7 @@ void PackPs1::buildLoader(const Filter *) {
|
|||||||
} else
|
} else
|
||||||
initLoader(stub_mipsel_r3000_ps1, sizeof(stub_mipsel_r3000_ps1));
|
initLoader(stub_mipsel_r3000_ps1, sizeof(stub_mipsel_r3000_ps1));
|
||||||
|
|
||||||
pad_code = ALIGN_GAP((ph.c_len + (isCon ? sz_lcpr : 0)), 4u);
|
pad_code = ALIGN_UP_GAP((ph.c_len + (isCon ? sz_lcpr : 0)), 4u);
|
||||||
assert(pad_code < 4);
|
assert(pad_code < 4);
|
||||||
static const byte pad_buffer[4] = {0, 0, 0, 0};
|
static const byte pad_buffer[4] = {0, 0, 0, 0};
|
||||||
linker->addSection("pad.code", pad_buffer, pad_code, 0);
|
linker->addSection("pad.code", pad_buffer, pad_code, 0);
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user