Compare commits
129 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 5bef968068 | |||
| 543cfe0a73 | |||
| 3ba91b8072 | |||
| a27a9e6000 | |||
| 7e839e6962 | |||
| 809a1b3dae | |||
| 9b80628f84 | |||
| a21a006fe9 | |||
| 54d16a458a | |||
| cfc5f42ef2 | |||
| e3d24238e4 | |||
| 56e7b36959 | |||
| f29791470f | |||
| 52d9b53b74 | |||
| 839a78f2e0 | |||
| 680ce0a7af | |||
| 06b0de9c77 | |||
| 76b0b7b1ae | |||
| fabda4df3a | |||
| fdcdaf596a | |||
| be44cefbe7 | |||
| c1050e624b | |||
| ae6d3b9bff | |||
| 25aa0e2e46 | |||
| 8f7578eef1 | |||
| 29ce4807fb | |||
| 41f6945be1 | |||
| 718ec468ff | |||
| d429801498 | |||
| 024091e6b5 | |||
| d849e9de98 | |||
| c0e40da2ab | |||
| dff3766501 | |||
| 2767ec54e1 | |||
| ac72c02793 | |||
| 69c51eee4d | |||
| ff5a4eeb96 | |||
| b48f870701 | |||
| 10807ebdc2 | |||
| 5d649f83ec | |||
| 65b25adceb | |||
| d615985b8a | |||
| b019440980 | |||
| 38ed4b2017 | |||
| 2ad0d51226 | |||
| e4a611bcae | |||
| f3728d99b9 | |||
| b87f60a917 | |||
| 28f26da6ab | |||
| d3e780d617 | |||
| d549c2b5c9 | |||
| f310ce376e | |||
| 553fc9b1fb | |||
| 6dde9f7dc0 | |||
| 3dca1175e5 | |||
| 09c5e38322 | |||
| fe6f1f0bb6 | |||
| 250c656b9e | |||
| 9a0b5b65b8 | |||
| 57b2fb4c62 | |||
| 099c3d829e | |||
| a1a6d02b6f | |||
| f2ad7fb9c4 | |||
| 1bcf709fcf | |||
| 47fc230893 | |||
| be05d85570 | |||
| f598fa13a9 | |||
| 568859d16f | |||
| b5ed0a637b | |||
| 17eff0aed4 | |||
| 0a3f048eed | |||
| 3cde897557 | |||
| 0500e7d016 | |||
| 778663ae69 | |||
| 636cefb9f3 | |||
| 1236776aa2 | |||
| 51a6a5cca5 | |||
| 3326c86e91 | |||
| b0dbc3fe39 | |||
| decc1efb74 | |||
| 2cf1c32d18 | |||
| fc6e3840b7 | |||
| 5e85c1a11b | |||
| 468bfce599 | |||
| 1e6e4043ed | |||
| 67564513d2 | |||
| ed2633bf95 | |||
| 3e70021406 | |||
| bf8dd31914 | |||
| d4e94f5086 | |||
| ae77fd60bb | |||
| e79c790264 | |||
| 46029bb8a0 | |||
| f74c225338 | |||
| c479fe32b3 | |||
| dc23ee0ad2 | |||
| a5c32db01b | |||
| d7142312c9 | |||
| 283ab0e7ea | |||
| b6dd61cea8 | |||
| 11970d276d | |||
| d618716ec1 | |||
| 4f0f977f04 | |||
| 2c4b1d8a8c | |||
| b2810c6deb | |||
| ceb2b56b71 | |||
| d14fa5f8a4 | |||
| 79263a52ac | |||
| ecb3f83e83 | |||
| f6aedb35ce | |||
| 3b7d25ac49 | |||
| e964d4acf3 | |||
| e306085b81 | |||
| b094ad4f2b | |||
| 19c6b969ab | |||
| acfda848cd | |||
| 52400e2561 | |||
| f62576a2be | |||
| 19bf9f59e9 | |||
| fadf7cfc7b | |||
| ec0c9399fa | |||
| 37b923245d | |||
| 38a676f6f7 | |||
| cd1df6f6b1 | |||
| 4a24fe8c53 | |||
| 6dac3dd248 | |||
| 37d393cbc8 | |||
| 27f155374a | |||
| 8102137ad7 |
+6
-29
@@ -1,50 +1,27 @@
|
|||||||
# "Gofmt's style is nobody's favourite, but gofmt is everybody's favourite." --Rob Pike
|
# vim:set ft=yaml ts=2 sw=2 et:
|
||||||
#
|
# Copyright (C) Markus Franz Xaver Johannes Oberhumer
|
||||||
# for clang-format-15.0.6 from https://github.com/upx/upx-stubtools/releases
|
# for clang-format-15.0.6 from https://github.com/upx/upx-stubtools/releases
|
||||||
|
#
|
||||||
|
# "Gofmt's style is nobody's favourite, but gofmt is everybody's favourite." --Rob Pike
|
||||||
---
|
---
|
||||||
BasedOnStyle: LLVM
|
BasedOnStyle: LLVM
|
||||||
ColumnLimit: 100
|
ColumnLimit: 100
|
||||||
IndentWidth: 4
|
IndentWidth: 4
|
||||||
---
|
---
|
||||||
|
# settings for C and C++
|
||||||
Language: Cpp
|
Language: Cpp
|
||||||
AccessModifierOffset: -4
|
AccessModifierOffset: -4
|
||||||
AlignConsecutiveMacros: AcrossComments
|
AlignConsecutiveMacros: AcrossComments
|
||||||
AlwaysBreakTemplateDeclarations: true
|
AlwaysBreakTemplateDeclarations: true
|
||||||
AttributeMacros:
|
AttributeMacros:
|
||||||
- __acc_cdecl
|
|
||||||
- __acc_cdecl_atexit
|
|
||||||
- __acc_cdecl_qsort
|
|
||||||
- __acc_cdecl_sighandler
|
|
||||||
- __acc_forceinline
|
|
||||||
- __acc_noinline
|
|
||||||
- __acc_static_forceinline
|
|
||||||
- __acc_static_noinline
|
|
||||||
- DELETED_FUNCTION
|
- DELETED_FUNCTION
|
||||||
- XSPAN_DELETED_FUNCTION
|
- XSPAN_DELETED_FUNCTION
|
||||||
- forceinline
|
|
||||||
- may_throw
|
- may_throw
|
||||||
- noinline
|
|
||||||
- static_forceinline
|
|
||||||
- static_noinline
|
|
||||||
EmptyLineBeforeAccessModifier: Leave
|
EmptyLineBeforeAccessModifier: Leave
|
||||||
|
# IndentPPDirectives: AfterHash # TODO later
|
||||||
SortIncludes: false
|
SortIncludes: false
|
||||||
SpaceAfterCStyleCast: true
|
SpaceAfterCStyleCast: true
|
||||||
Standard: Cpp03
|
Standard: Cpp03
|
||||||
StatementMacros:
|
StatementMacros:
|
||||||
- ACCCHK_ASSERT
|
|
||||||
- ACCCHK_ASSERT_IS_SIGNED_T
|
|
||||||
- ACCCHK_ASSERT_IS_UNSIGNED_T
|
|
||||||
- ACCCHK_ASSERT_SIGN_T
|
|
||||||
- ACC_BLOCK_BEGIN
|
|
||||||
- ACC_COMPILE_TIME_ASSERT
|
|
||||||
- ACC_COMPILE_TIME_ASSERT_HEADER
|
|
||||||
- ACC_CXX_DISABLE_NEW_DELETE
|
|
||||||
- ACC_CXX_TRIGGER_FUNCTION
|
|
||||||
- ACC_CXX_TRIGGER_FUNCTION_IMPL
|
|
||||||
- CLANG_FORMAT_DUMMY_STATEMENT
|
- CLANG_FORMAT_DUMMY_STATEMENT
|
||||||
- COMPILE_TIME_ASSERT
|
|
||||||
- COMPILE_TIME_ASSERT_ALIGNED1
|
|
||||||
WhitespaceSensitiveMacros:
|
|
||||||
- ACC_PP_MACRO_EXPAND
|
|
||||||
- ACC_PP_STRINGIZE
|
|
||||||
...
|
...
|
||||||
|
|||||||
+3
-1
@@ -1,4 +1,6 @@
|
|||||||
# for clang-tidy-16 from https://clang.llvm.org/extra/clang-tidy/
|
# vim:set ft=yaml ts=2 sw=2 et:
|
||||||
|
# Copyright (C) Markus Franz Xaver Johannes Oberhumer
|
||||||
|
# for clang-tidy from https://clang.llvm.org/extra/clang-tidy/
|
||||||
---
|
---
|
||||||
Checks: >
|
Checks: >
|
||||||
-*,
|
-*,
|
||||||
|
|||||||
@@ -0,0 +1,43 @@
|
|||||||
|
# vim:set ft=yaml ts=2 sw=2 et:
|
||||||
|
# Copyright (C) Markus Franz Xaver Johannes Oberhumer
|
||||||
|
# for clangd from https://clangd.llvm.org/
|
||||||
|
---
|
||||||
|
# treat *.h files as C++ source code
|
||||||
|
If:
|
||||||
|
PathMatch: src/.*\.h
|
||||||
|
PathExclude: vendor/.*
|
||||||
|
CompileFlags:
|
||||||
|
Add:
|
||||||
|
- -xc++
|
||||||
|
---
|
||||||
|
# C++ flags
|
||||||
|
If:
|
||||||
|
PathMatch: [ src/.*\.h, src/.*\.cpp ]
|
||||||
|
PathExclude: vendor/.*
|
||||||
|
CompileFlags:
|
||||||
|
Add:
|
||||||
|
- -std=gnu++17
|
||||||
|
# -std=gnu++20 # requires clang >= 10.0
|
||||||
|
---
|
||||||
|
# common flags for all C/C++ files
|
||||||
|
If:
|
||||||
|
PathMatch: [ src/.*\.h, src/.*\.c, src/.*\.cpp ]
|
||||||
|
PathExclude: vendor/.*
|
||||||
|
CompileFlags:
|
||||||
|
Add:
|
||||||
|
# see https://github.com/clangd/clangd/issues/1038 : Support deterministic relative include path
|
||||||
|
- -Ivendor
|
||||||
|
- -I../vendor
|
||||||
|
- -I../../vendor
|
||||||
|
- -DDEBUG
|
||||||
|
- -fno-strict-aliasing
|
||||||
|
- -fno-strict-overflow
|
||||||
|
- -funsigned-char
|
||||||
|
Diagnostics:
|
||||||
|
Includes:
|
||||||
|
# IgnoreHeader: A list of regexes. Include Cleaner will not produce diagnostics
|
||||||
|
# for headers whose path is a suffix match for any of these.
|
||||||
|
IgnoreHeader:
|
||||||
|
- src/.*\.h
|
||||||
|
UnusedIncludes: None
|
||||||
|
...
|
||||||
+3
-2
@@ -1,3 +1,4 @@
|
|||||||
|
# Copyright (C) Markus Franz Xaver Johannes Oberhumer
|
||||||
# see https://editorconfig.org/
|
# see https://editorconfig.org/
|
||||||
|
|
||||||
root = true
|
root = true
|
||||||
@@ -14,8 +15,8 @@ trim_trailing_whitespace = true
|
|||||||
indent_size = 8
|
indent_size = 8
|
||||||
indent_style = tab
|
indent_style = tab
|
||||||
|
|
||||||
[*.S]
|
[{*.asm,*.S}]
|
||||||
indent_size = 8
|
indent_size = 8
|
||||||
|
|
||||||
[*.yml]
|
[{*.yaml,*.yml}]
|
||||||
indent_size = 2
|
indent_size = 2
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
# Copyright (C) Markus Franz Xaver Johannes Oberhumer
|
||||||
# see https://github.com/github-linguist/linguist
|
# see https://github.com/github-linguist/linguist
|
||||||
#
|
#
|
||||||
# HINT: check settings with
|
# HINT: check settings with
|
||||||
@@ -14,6 +15,9 @@
|
|||||||
/src/stub/src/arch/**/lzma_d_c[fns].S linguist-generated
|
/src/stub/src/arch/**/lzma_d_c[fns].S linguist-generated
|
||||||
/src/stub/tmp/** linguist-generated
|
/src/stub/tmp/** linguist-generated
|
||||||
|
|
||||||
|
/misc/podman/*/packages*.txt linguist-generated
|
||||||
|
/misc/testsuite/*expected_sha256sums* linguist-generated
|
||||||
|
|
||||||
#
|
#
|
||||||
# make GitHub language detection more accurate
|
# make GitHub language detection more accurate
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
* @markus-oberhumer @jreiser
|
* @markus-oberhumer @jreiser
|
||||||
|
|
||||||
/src/p_elf* @jreiser
|
|
||||||
/src/p_lx_* @jreiser
|
/src/p_lx_* @jreiser
|
||||||
/src/p_mach* @jreiser
|
/src/p_mach* @jreiser
|
||||||
/src/p_unix* @jreiser
|
/src/p_unix* @jreiser
|
||||||
|
|||||||
@@ -1,9 +0,0 @@
|
|||||||
version: 2
|
|
||||||
|
|
||||||
updates:
|
|
||||||
- package-ecosystem: 'github-actions'
|
|
||||||
directory: '/'
|
|
||||||
schedule:
|
|
||||||
# Check for updates to GitHub Actions every Wednesday
|
|
||||||
interval: 'weekly'
|
|
||||||
day: 'wednesday'
|
|
||||||
@@ -1,43 +0,0 @@
|
|||||||
# see https://github.com/crate-ci/typos
|
|
||||||
|
|
||||||
# a generic spell-checker that works on source code is quite
|
|
||||||
# tricky, so some false positives are fine
|
|
||||||
|
|
||||||
[files]
|
|
||||||
extend-exclude = ["LICENSE", "misc/*podman*/*/packages.txt"]
|
|
||||||
|
|
||||||
# misc variable names & symbols
|
|
||||||
[default.extend-identifiers]
|
|
||||||
acc_spawnve = "acc_spawnve"
|
|
||||||
ba = "ba"
|
|
||||||
fo = "fo"
|
|
||||||
fof = "fof"
|
|
||||||
O_WRONLY = "O_WRONLY"
|
|
||||||
# optin: clang-analyzer-optin.cplusplus
|
|
||||||
optin = "optin"
|
|
||||||
sidelen = "sidelen"
|
|
||||||
# macOS 11 "Big Sur"
|
|
||||||
Sur = "Sur"
|
|
||||||
tpos = "tpos"
|
|
||||||
# assembly sources
|
|
||||||
hda = "hda"
|
|
||||||
Larg = "Larg"
|
|
||||||
pard = "pard"
|
|
||||||
suble = "suble"
|
|
||||||
|
|
||||||
# identifiers are intelligently split into words and then checked again
|
|
||||||
[default.extend-words]
|
|
||||||
delt = "delt"
|
|
||||||
FO = "FO"
|
|
||||||
fo = "fo"
|
|
||||||
# parm is used like param
|
|
||||||
PARM = "PARM"
|
|
||||||
parm = "parm"
|
|
||||||
# rela: ELF relocations
|
|
||||||
RELA = "RELA"
|
|
||||||
rela = "rela"
|
|
||||||
# siz is used for size
|
|
||||||
siz = "siz"
|
|
||||||
# SEH: Structured Exception Handling
|
|
||||||
SEH = "SEH"
|
|
||||||
seh = "seh"
|
|
||||||
+213
-118
@@ -9,12 +9,15 @@ name: 'CI'
|
|||||||
on: [push, workflow_dispatch]
|
on: [push, workflow_dispatch]
|
||||||
|
|
||||||
env:
|
env:
|
||||||
CMAKE_REQUIRED_QUIET: "OFF"
|
CMAKE_REQUIRED_QUIET: 'OFF'
|
||||||
CTEST_OUTPUT_ON_FAILURE: "ON"
|
CMAKE_VERBOSE_MAKEFILE: 'ON'
|
||||||
|
CTEST_OUTPUT_ON_FAILURE: 'ON'
|
||||||
DEBIAN_FRONTEND: noninteractive
|
DEBIAN_FRONTEND: noninteractive
|
||||||
UPX_CMAKE_BUILD_FLAGS: --verbose
|
UPX_CMAKE_BUILD_FLAGS: --verbose
|
||||||
# 2023-10-24
|
UPX_CMAKE_CONFIG_FLAGS: -Wdev --warn-uninitialized
|
||||||
ZIG_DIST_VERSION: 0.12.0-dev.1245+a07f288eb
|
UPX_DEBUG_TEST_FLOAT_DIVISION_BY_ZERO: 1
|
||||||
|
# 2024-03-23
|
||||||
|
ZIG_DIST_VERSION: 0.12.0-dev.3429+13a9d94a8
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
job-rebuild-and-verify-stubs:
|
job-rebuild-and-verify-stubs:
|
||||||
@@ -28,8 +31,8 @@ jobs:
|
|||||||
if ! test -e /usr/bin/python2; then
|
if ! test -e /usr/bin/python2; then
|
||||||
####sudo apt-get update && sudo apt-get install -y --no-install-recommends python2-minimal
|
####sudo apt-get update && sudo apt-get install -y --no-install-recommends python2-minimal
|
||||||
# install python2-minimal packages from Debian-11
|
# install python2-minimal packages from Debian-11
|
||||||
wget -q 'https://ftp.debian.org/debian/pool/main/p/python2.7/libpython2.7-minimal_2.7.18-8_amd64.deb'
|
wget -q 'https://ftp.debian.org/debian/pool/main/p/python2.7/libpython2.7-minimal_2.7.18-8+deb11u1_amd64.deb'
|
||||||
wget -q 'https://ftp.debian.org/debian/pool/main/p/python2.7/python2.7-minimal_2.7.18-8_amd64.deb'
|
wget -q 'https://ftp.debian.org/debian/pool/main/p/python2.7/python2.7-minimal_2.7.18-8+deb11u1_amd64.deb'
|
||||||
sudo dpkg -i ./*python2*.deb && rm ./*python2*.deb && sudo ldconfig
|
sudo dpkg -i ./*python2*.deb && rm ./*python2*.deb && sudo ldconfig
|
||||||
sudo ln -s -v python2.7 /usr/bin/python2
|
sudo ln -s -v python2.7 /usr/bin/python2
|
||||||
fi
|
fi
|
||||||
@@ -51,23 +54,25 @@ jobs:
|
|||||||
git status || true
|
git status || true
|
||||||
make -C src/stub extra-all all
|
make -C src/stub extra-all all
|
||||||
if ! git diff --quiet; then git diff; exit 1; fi
|
if ! git diff --quiet; then git diff; exit 1; fi
|
||||||
|
- run: bash ./misc/scripts/check_whitespace_git.sh
|
||||||
- name: 'Check source code formatting'
|
- name: 'Check source code formatting'
|
||||||
run: |
|
run: |
|
||||||
bash ./misc/scripts/check_whitespace_git.sh
|
|
||||||
UPX_CLANG_FORMAT="$PWD/../deps/bin-upx-20221212/clang-format-15.0.6" make -C src clang-format
|
UPX_CLANG_FORMAT="$PWD/../deps/bin-upx-20221212/clang-format-15.0.6" 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
|
||||||
|
|
||||||
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} cmake', matrix.os) }}
|
name: ${{ format('{0}', matrix.os) }}
|
||||||
runs-on: ${{ matrix.os }}
|
runs-on: ${{ matrix.os }}
|
||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
include:
|
include:
|
||||||
- { os: ubuntu-22.04, use_m32: true }
|
- { os: ubuntu-22.04, use_m32: true }
|
||||||
- { os: ubuntu-20.04, use_m32: false } # use_m32 also works here, but save some CI time
|
- { os: ubuntu-20.04, use_m32: true } # use_m32 also works here, but save some CI time
|
||||||
|
env:
|
||||||
|
UPX_CONFIG_EXPECT_THREADS: 'ON'
|
||||||
steps:
|
steps:
|
||||||
- name: 'Install extra 32-bit and Windows packages'
|
- name: 'Install extra 32-bit and Windows packages'
|
||||||
if: ${{ matrix.use_m32 }}
|
if: ${{ matrix.use_m32 }}
|
||||||
@@ -75,31 +80,36 @@ jobs:
|
|||||||
sudo dpkg --add-architecture i386
|
sudo dpkg --add-architecture i386
|
||||||
sudo apt-get update
|
sudo apt-get update
|
||||||
sudo apt-get install -y g++-multilib g++-mingw-w64-i686 g++-mingw-w64-x86-64
|
sudo apt-get install -y g++-multilib g++-mingw-w64-i686 g++-mingw-w64-x86-64
|
||||||
|
# make sure that we use posix-threads (pthread/winpthreads) and NOT win32-threads
|
||||||
|
for f in i686-w64-mingw32-g++ i686-w64-mingw32-gcc x86_64-w64-mingw32-g++ x86_64-w64-mingw32-gcc; do
|
||||||
|
if test -f /usr/bin/$f-posix; then sudo update-alternatives --set $f /usr/bin/$f-posix; fi
|
||||||
|
done
|
||||||
|
sudo apt-get install libc6-dbg:i386 valgrind
|
||||||
- name: 'Check out code'
|
- name: 'Check out code'
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
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'
|
||||||
- name: 'Build cmake extra/gcc/debug'
|
- name: 'Build extra/gcc/debug'
|
||||||
run: 'make build/extra/gcc/debug'
|
run: 'make build/extra/gcc/debug'
|
||||||
- name: 'Build cmake extra/gcc/release'
|
- name: 'Build extra/gcc/release'
|
||||||
run: 'make build/extra/gcc/release'
|
run: 'make build/extra/gcc/release'
|
||||||
- name: 'Build cmake extra/clang/debug'
|
- name: 'Build extra/clang/debug'
|
||||||
run: 'make build/extra/clang/debug'
|
run: 'make build/extra/clang/debug'
|
||||||
- name: 'Build cmake extra/clang/release'
|
- name: 'Build extra/clang/release'
|
||||||
run: 'make build/extra/clang/release'
|
run: 'make build/extra/clang/release'
|
||||||
- name: 'Build cmake extra/gcc-m32/debug'
|
- name: 'Build extra/gcc-m32/debug'
|
||||||
if: ${{ matrix.use_m32 }}
|
if: ${{ matrix.use_m32 }}
|
||||||
run: 'make build/extra/gcc-m32/debug'
|
run: 'make build/extra/gcc-m32/debug'
|
||||||
- name: 'Build cmake extra/gcc-m32/release'
|
- name: 'Build extra/gcc-m32/release'
|
||||||
if: ${{ matrix.use_m32 }}
|
if: ${{ matrix.use_m32 && (success() || failure()) }} # run this step even if the previous step failed
|
||||||
run: 'make build/extra/gcc-m32/release'
|
run: 'make build/extra/gcc-m32/release'
|
||||||
- name: 'Build cmake extra/cross-windows-mingw32/release'
|
- name: 'Build extra/cross-windows-mingw32/release'
|
||||||
if: ${{ matrix.use_m32 }}
|
if: ${{ matrix.use_m32 && (success() || failure()) }} # run this step even if the previous step failed
|
||||||
run: 'make build/extra/cross-windows-mingw32/release'
|
run: 'make build/extra/cross-windows-mingw32/release'
|
||||||
- name: 'Build cmake extra/cross-windows-mingw64/release'
|
- name: 'Build extra/cross-windows-mingw64/release'
|
||||||
if: ${{ matrix.use_m32 }}
|
if: ${{ matrix.use_m32 && (success() || failure()) }} # run this step even if the previous step failed
|
||||||
run: 'make build/extra/cross-windows-mingw64/release'
|
run: 'make build/extra/cross-windows-mingw64/release'
|
||||||
- name: 'Make artifact'
|
- name: 'Make artifact'
|
||||||
run: |
|
run: |
|
||||||
N=$(echo "upx-${GITHUB_REF_NAME}-${GITHUB_SHA:0:7}-${{ matrix.os }}" | sed 's/[^0-9a-zA-Z_.-]/-/g')
|
N=$(echo "upx-${GITHUB_REF_NAME}-${GITHUB_SHA:0:7}-${{ matrix.os }}" | sed 's/[^0-9a-zA-Z_.-]/-/g')
|
||||||
@@ -109,124 +119,177 @@ jobs:
|
|||||||
# GitHub Actions magic: set "artifact_name" environment value for use in next step
|
# GitHub Actions magic: set "artifact_name" environment value for use in next step
|
||||||
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@v3
|
uses: actions/upload-artifact@v4
|
||||||
with:
|
with:
|
||||||
name: ${{ env.artifact_name }}
|
name: ${{ env.artifact_name }}
|
||||||
path: tmp/artifact
|
path: tmp/artifact
|
||||||
- name: 'Run install tests'
|
- name: 'Run install tests'
|
||||||
run: |
|
run: |
|
||||||
(cd build/extra/gcc/release && DESTDIR=$PWD/Install-with-cmake cmake --install .)
|
(cd build/extra/gcc/release && DESTDIR="$PWD/Install with cmake" cmake --install .)
|
||||||
(cd build/extra/gcc/release && DESTDIR=$PWD/Install-with-make make install)
|
(cd build/extra/gcc/release && DESTDIR="$PWD/Install with make" make install)
|
||||||
- name: 'Run basic tests'
|
- name: 'Run ctest tests'
|
||||||
run: |
|
run: |
|
||||||
make -C build/extra/gcc/debug test
|
make -C build/extra/gcc/debug test
|
||||||
make -C build/extra/gcc/release test
|
make -C build/extra/gcc/release test
|
||||||
make -C build/extra/clang/debug test
|
make -C build/extra/clang/debug test
|
||||||
make -C build/extra/clang/release test
|
make -C build/extra/clang/release test
|
||||||
- name: 'Run basic tests 32-bit'
|
- name: 'Run ctest tests 32-bit'
|
||||||
if: ${{ matrix.use_m32 }}
|
if: ${{ matrix.use_m32 }}
|
||||||
run: |
|
run: |
|
||||||
make -C build/extra/gcc-m32/debug test
|
make -C build/extra/gcc-m32/debug test
|
||||||
make -C build/extra/gcc-m32/release test
|
make -C build/extra/gcc-m32/release test
|
||||||
|
- name: 'Mimic ctest tests'
|
||||||
|
run: |
|
||||||
|
env -C build/extra/gcc/debug bash "$PWD"/misc/testsuite/mimic_ctest.sh
|
||||||
|
env -C build/extra/gcc/release bash "$PWD"/misc/testsuite/mimic_ctest.sh
|
||||||
|
env -C build/extra/clang/debug bash "$PWD"/misc/testsuite/mimic_ctest.sh
|
||||||
|
env -C build/extra/clang/release bash "$PWD"/misc/testsuite/mimic_ctest.sh
|
||||||
|
- name: 'Mimic ctest tests 32-bit'
|
||||||
|
if: ${{ matrix.use_m32 }}
|
||||||
|
run: |
|
||||||
|
env -C build/extra/gcc-m32/debug bash "$PWD"/misc/testsuite/mimic_ctest.sh
|
||||||
|
env -C build/extra/gcc-m32/release bash "$PWD"/misc/testsuite/mimic_ctest.sh
|
||||||
|
- name: 'Mimic ctest tests with Valgrind'
|
||||||
|
run: |
|
||||||
|
if command -v valgrind >/dev/null; then
|
||||||
|
export upx_exe_runner="valgrind --leak-check=no --error-exitcode=1 --quiet --gen-suppressions=all"
|
||||||
|
env -C build/extra/gcc/debug bash "$PWD"/misc/testsuite/mimic_ctest.sh
|
||||||
|
env -C build/extra/gcc/release bash "$PWD"/misc/testsuite/mimic_ctest.sh
|
||||||
|
# clang/debug does not work before valgrind-3.20, see https://bugs.kde.org/show_bug.cgi?id=452758
|
||||||
|
##env -C build/extra/clang/debug bash "$PWD"/misc/testsuite/mimic_ctest.sh
|
||||||
|
env -C build/extra/clang/release bash "$PWD"/misc/testsuite/mimic_ctest.sh
|
||||||
|
fi
|
||||||
|
- name: 'Mimic ctest tests 32-bit with Valgrind'
|
||||||
|
if: ${{ matrix.use_m32 }}
|
||||||
|
run: |
|
||||||
|
if command -v valgrind >/dev/null; then
|
||||||
|
export upx_exe_runner="valgrind --leak-check=no --error-exitcode=1 --quiet --gen-suppressions=all"
|
||||||
|
env -C build/extra/gcc-m32/debug bash "$PWD"/misc/testsuite/mimic_ctest.sh
|
||||||
|
env -C build/extra/gcc-m32/release bash "$PWD"/misc/testsuite/mimic_ctest.sh
|
||||||
|
fi
|
||||||
- name: 'Run file system test suite'
|
- name: 'Run file system test suite'
|
||||||
run: |
|
run: |
|
||||||
env -C build/extra/gcc/release bash "$PWD"/misc/testsuite/test_symlinks.sh
|
env -C build/extra/gcc/release bash "$PWD"/misc/testsuite/test_symlinks.sh
|
||||||
|
- name: 'Run file system test suite with Valgrind'
|
||||||
|
run: |
|
||||||
|
if command -v valgrind >/dev/null; then
|
||||||
|
export upx_exe_runner="valgrind --leak-check=no --error-exitcode=1 --quiet --gen-suppressions=all"
|
||||||
|
env -C build/extra/gcc/release bash "$PWD"/misc/testsuite/test_symlinks.sh
|
||||||
|
fi
|
||||||
- name: 'Run test suite build/extra/gcc/release'
|
- name: 'Run test suite build/extra/gcc/release'
|
||||||
run: |
|
run: |
|
||||||
export upx_testsuite_SRCDIR="$(readlink -en ../deps/upx-testsuite)"
|
export upx_testsuite_SRCDIR="$(readlink -en ../deps/upx-testsuite)"
|
||||||
testsuite_1="$(readlink -en ./misc/testsuite/upx_testsuite_1.sh)"
|
env -C build/extra/gcc/release bash "$PWD"/misc/testsuite/upx_testsuite_1.sh
|
||||||
env -C build/extra/gcc/release upx_exe=./upx bash "$testsuite_1"
|
|
||||||
|
|
||||||
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} cmake', matrix.os) }}
|
name: ${{ format('{0} {1}', matrix.os, matrix.xcode_version) }}
|
||||||
runs-on: ${{ matrix.os }}
|
runs-on: ${{ matrix.os }}
|
||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
include:
|
include:
|
||||||
# NOTE: macos does not have "env -C"; only with 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 coreutils
|
# NOTE: macos-11 does not have "readlink -f"; only on macos >= 12 or with brew coreutils
|
||||||
- { os: macos-11, gcc: gcc-10, gxx: 'g++-10', testsuite: true }
|
- { os: macos-11, gcc: gcc-10, gxx: 'g++-10', testsuite: true }
|
||||||
- { os: macos-12, gcc: gcc-11, gxx: 'g++-11', testsuite: true }
|
- { os: macos-12, gcc: gcc-11, gxx: 'g++-11', testsuite: true }
|
||||||
- { os: macos-13, gcc: gcc-12, gxx: 'g++-12', testsuite: true }
|
- { os: macos-13, gcc: gcc-12, gxx: 'g++-12', testsuite: true, xcode_version: 14.3.1 }
|
||||||
|
- { os: macos-13, testsuite: true } # use default Xcode-15
|
||||||
|
# { 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
|
||||||
|
env:
|
||||||
|
UPX_CONFIG_EXPECT_THREADS: 'ON'
|
||||||
steps:
|
steps:
|
||||||
|
- uses: maxim-lobanov/setup-xcode@v1
|
||||||
|
if: matrix.xcode_version # NOTE: gcc-12 on macos-13 does not work with Xcode-15
|
||||||
|
with:
|
||||||
|
xcode-version: ${{ matrix.xcode_version }}
|
||||||
- name: 'Install brew packages'
|
- name: 'Install brew packages'
|
||||||
if: ${{ matrix.testsuite }}
|
if: ${{ matrix.testsuite }}
|
||||||
run: |
|
run: |
|
||||||
|
test -z "$HOMEBREW_PREFIX" && HOMEBREW_PREFIX="$(brew --prefix)"
|
||||||
|
echo "HOMEBREW_PREFIX=$HOMEBREW_PREFIX" >> $GITHUB_ENV
|
||||||
# testsuite needs working "readlink -en" and "sha256sum -b"
|
# testsuite needs working "readlink -en" and "sha256sum -b"
|
||||||
if ! test -e /usr/local/opt/coreutils/libexec/gnubin/readlink; then
|
if ! test -e "$HOMEBREW_PREFIX/opt/coreutils/libexec/gnubin/readlink"; then
|
||||||
echo "===== brew leaves:"; brew leaves; echo "===== brew list:"; brew list
|
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 coreutils; then brew update && brew install coreutils; fi
|
if ! brew install coreutils; then brew update && brew install coreutils; fi
|
||||||
fi
|
fi
|
||||||
|
case "${{ matrix.os }}" in
|
||||||
|
macos-11 | macos-12) echo "UPX_DEBUG_FORCE_PACK_MACOS=1" >> $GITHUB_ENV ;;
|
||||||
|
# FIXME: UPX on macos-13+ is broken => disable self-test for now
|
||||||
|
macos-13 | macos-14) echo "UPX_CONFIG_DISABLE_SELF_PACK_TEST=ON" >> $GITHUB_ENV ;;
|
||||||
|
esac
|
||||||
- name: 'Check out code'
|
- name: 'Check out code'
|
||||||
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'
|
||||||
- name: 'Build cmake extra/clang/debug'
|
- name: 'Build extra/clang/debug'
|
||||||
run: 'make build/extra/clang/debug'
|
run: 'make build/extra/clang/debug'
|
||||||
- name: 'Build cmake extra/clang/release'
|
- name: 'Build extra/clang/release'
|
||||||
run: 'make build/extra/clang/release'
|
run: 'make build/extra/clang/release'
|
||||||
- name: 'Build cmake extra/gcc/debug'
|
- name: 'Build extra/gcc/debug'
|
||||||
if: ${{ matrix.gcc != '' }}
|
if: ${{ matrix.gcc != '' }}
|
||||||
run: 'make build/extra/gcc/debug CC="${{ matrix.gcc }} -static-libgcc" CXX="${{ matrix.gxx }} -static-libgcc -static-libstdc++"'
|
run: 'make build/extra/gcc/debug CC="${{ matrix.gcc }} -static-libgcc" CXX="${{ matrix.gxx }} -static-libgcc -static-libstdc++"'
|
||||||
- name: 'Build cmake extra/gcc/release'
|
- name: 'Build extra/gcc/release'
|
||||||
if: ${{ matrix.gcc != '' }}
|
if: ${{ matrix.gcc != '' }}
|
||||||
run: 'make build/extra/gcc/release CC="${{ matrix.gcc }} -static-libgcc" CXX="${{ matrix.gxx }} -static-libgcc -static-libstdc++"'
|
run: 'make build/extra/gcc/release CC="${{ matrix.gcc }} -static-libgcc" CXX="${{ matrix.gxx }} -static-libgcc -static-libstdc++"'
|
||||||
- name: 'Build cmake xtarget/cross-darwin-arm64/debug'
|
- name: 'Build xtarget/cross-darwin-arm64/debug'
|
||||||
run: |
|
run: |
|
||||||
CC="clang -target arm64-apple-darwin" CXX="clang++ -target arm64-apple-darwin" \
|
make UPX_XTARGET=xtarget/cross-darwin-arm64 xtarget/debug \
|
||||||
make UPX_XTARGET=cross-darwin-arm64 xtarget/debug
|
CC="clang -target arm64-apple-darwin" CXX="clang++ -target arm64-apple-darwin"
|
||||||
- name: 'Build cmake xtarget/cross-darwin-arm64/release'
|
- name: 'Build xtarget/cross-darwin-arm64/release'
|
||||||
run: |
|
run: |
|
||||||
CC="clang -target arm64-apple-darwin" CXX="clang++ -target arm64-apple-darwin" \
|
make UPX_XTARGET=xtarget/cross-darwin-arm64 xtarget/release \
|
||||||
make UPX_XTARGET=cross-darwin-arm64 xtarget/release
|
CC="clang -target arm64-apple-darwin" CXX="clang++ -target arm64-apple-darwin"
|
||||||
- name: 'Make artifact'
|
- name: 'Make artifact'
|
||||||
run: |
|
run: |
|
||||||
N=$(echo "upx-${GITHUB_REF_NAME}-${GITHUB_SHA:0:7}-${{ matrix.os }}" | sed 's/[^0-9a-zA-Z_.-]/-/g')
|
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')
|
||||||
mkdir -p "tmp/artifact/$N"
|
mkdir -p "tmp/artifact/$N"
|
||||||
(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")
|
(cd tmp/artifact && gtar --sort=name -czf "$N.tar.gz" "$N" && rm -rf "./$N")
|
||||||
# GitHub Actions magic: set "artifact_name" environment value for use in next step
|
# GitHub Actions magic: set "artifact_name" environment value for use in next step
|
||||||
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@v3
|
uses: actions/upload-artifact@v4
|
||||||
with:
|
with:
|
||||||
name: ${{ env.artifact_name }}
|
name: ${{ env.artifact_name }}
|
||||||
path: tmp/artifact
|
path: tmp/artifact
|
||||||
- name: 'Run install tests'
|
- name: 'Run install tests'
|
||||||
run: |
|
run: |
|
||||||
(cd build/extra/clang/release && DESTDIR=$PWD/Install-with-cmake cmake --install .)
|
(cd build/extra/clang/release && DESTDIR="$PWD/Install with cmake" cmake --install .)
|
||||||
(cd build/extra/clang/release && DESTDIR=$PWD/Install-with-make make install)
|
(cd build/extra/clang/release && DESTDIR="$PWD/Install with make" make install)
|
||||||
- name: 'Run basic tests'
|
- name: 'Run ctest tests'
|
||||||
if: ${{ !contains(matrix.os, 'macos-13') }} # FIXME: UPX on macos-13 is broken => disable self-test for now
|
|
||||||
run: |
|
run: |
|
||||||
make -C build/extra/clang/debug test
|
make -C build/extra/clang/debug test
|
||||||
# make -C build/extra/clang/release test
|
make -C build/extra/clang/release test
|
||||||
|
for f in ./build/extra/*/*/upx; do echo "===== $f"; $f --sysinfo -v; done
|
||||||
|
- name: 'Mimic ctest tests'
|
||||||
|
run: |
|
||||||
|
export PATH="$HOMEBREW_PREFIX/opt/coreutils/libexec/gnubin:$PATH"
|
||||||
|
env -C build/extra/clang/debug bash "$PWD"/misc/testsuite/mimic_ctest.sh
|
||||||
|
env -C build/extra/clang/release bash "$PWD"/misc/testsuite/mimic_ctest.sh
|
||||||
- name: 'Run file system test suite'
|
- name: 'Run file system test suite'
|
||||||
if: ${{ matrix.testsuite }} # for coreutils readlink
|
if: ${{ matrix.testsuite }} # for coreutils readlink
|
||||||
run: |
|
run: |
|
||||||
## macos-11 does not have "readlink -f"
|
export PATH="$HOMEBREW_PREFIX/opt/coreutils/libexec/gnubin:$PATH"
|
||||||
## testsuite="$(readlink -fn ./misc/testsuite/test_symlinks.sh)"
|
|
||||||
## (cd build/extra/clang/release && upx_exe=./upx bash "$testsuite")
|
|
||||||
export PATH="/usr/local/opt/coreutils/libexec/gnubin:$PATH"
|
|
||||||
env -C build/extra/clang/release bash "$PWD"/misc/testsuite/test_symlinks.sh
|
env -C build/extra/clang/release bash "$PWD"/misc/testsuite/test_symlinks.sh
|
||||||
- name: 'Run test suite build/extra/clang/release'
|
- name: 'Run test suite build/extra/clang/release'
|
||||||
if: ${{ matrix.testsuite }}
|
if: ${{ matrix.testsuite }}
|
||||||
run: |
|
run: |
|
||||||
export PATH="/usr/local/opt/coreutils/libexec/gnubin:$PATH"
|
export PATH="$HOMEBREW_PREFIX/opt/coreutils/libexec/gnubin:$PATH"
|
||||||
export upx_testsuite_SRCDIR="$(readlink -en ../deps/upx-testsuite)"
|
export upx_testsuite_SRCDIR="$(readlink -en ../deps/upx-testsuite)"
|
||||||
testsuite_1="$(readlink -en ./misc/testsuite/upx_testsuite_1.sh)"
|
env -C build/extra/clang/release bash "$PWD"/misc/testsuite/upx_testsuite_1.sh
|
||||||
env -C build/extra/clang/release upx_exe=./upx bash "$testsuite_1"
|
|
||||||
|
|
||||||
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} cmake', matrix.name) }}
|
name: ${{ format('{0}', matrix.name) }}
|
||||||
runs-on: ${{ matrix.os }}
|
runs-on: ${{ matrix.os }}
|
||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
@@ -234,21 +297,24 @@ jobs:
|
|||||||
include:
|
include:
|
||||||
- { name: windows-2019-amd64, os: windows-2019, vsversion: 2019, arch: amd64 }
|
- { name: windows-2019-amd64, os: windows-2019, vsversion: 2019, arch: amd64 }
|
||||||
- { name: windows-2022-amd64, os: windows-2022, vsversion: 2022, arch: amd64 }
|
- { name: windows-2022-amd64, os: windows-2022, vsversion: 2022, arch: amd64 }
|
||||||
|
env:
|
||||||
|
UPX_CONFIG_EXPECT_THREADS: 'ON'
|
||||||
steps:
|
steps:
|
||||||
|
- run: git config --global core.autocrlf false
|
||||||
- name: 'Check out code'
|
- name: 'Check out code'
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
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'
|
||||||
- name: 'Set up Developer Command Prompt'
|
- name: 'Set up Developer Command Prompt'
|
||||||
uses: ilammy/msvc-dev-cmd@cec98b9d092141f74527d0afa6feb2af698cfe89 # v1.12.1
|
uses: ilammy/msvc-dev-cmd@v1
|
||||||
with:
|
with:
|
||||||
vsversion: ${{ matrix.vsversion }}
|
vsversion: ${{ matrix.vsversion }}
|
||||||
arch: ${{ matrix.arch }}
|
arch: ${{ matrix.arch }}
|
||||||
- name: 'Build cmake debug'
|
- name: 'Build debug'
|
||||||
run: 'make build/debug'
|
run: 'make build/debug'
|
||||||
- name: 'Build cmake release'
|
- name: 'Build release'
|
||||||
run: 'make build/release'
|
run: 'make build/release'
|
||||||
- name: 'Make artifact'
|
- name: 'Make artifact'
|
||||||
shell: bash
|
shell: bash
|
||||||
run: |
|
run: |
|
||||||
@@ -258,11 +324,11 @@ jobs:
|
|||||||
# GitHub Actions magic: set "artifact_name" environment value for use in next step
|
# GitHub Actions magic: set "artifact_name" environment value for use in next step
|
||||||
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@v3
|
uses: actions/upload-artifact@v4
|
||||||
with:
|
with:
|
||||||
name: ${{ env.artifact_name }}
|
name: ${{ env.artifact_name }}
|
||||||
path: tmp/artifact
|
path: tmp/artifact
|
||||||
- name: 'Run basic tests'
|
- name: 'Run ctest tests'
|
||||||
if: ${{ matrix.arch != 'amd64_arm64' }}
|
if: ${{ matrix.arch != 'amd64_arm64' }}
|
||||||
run: |
|
run: |
|
||||||
ctest --test-dir build/debug -C Debug
|
ctest --test-dir build/debug -C Debug
|
||||||
@@ -272,18 +338,16 @@ jobs:
|
|||||||
shell: bash
|
shell: bash
|
||||||
run: |
|
run: |
|
||||||
export upx_testsuite_SRCDIR="$(readlink -en ../deps/upx-testsuite)"
|
export upx_testsuite_SRCDIR="$(readlink -en ../deps/upx-testsuite)"
|
||||||
testsuite_1="$(readlink -en ./misc/testsuite/upx_testsuite_1.sh)"
|
env -C build/release/Release bash "$PWD"/misc/testsuite/upx_testsuite_1.sh
|
||||||
env -C build/release/Release upx_exe=./upx bash "$testsuite_1"
|
|
||||||
|
|
||||||
job-windows-toolchains: # build "by hand" using cmd.exe
|
job-windows-toolchains: # build "by hand" using cmd.exe
|
||||||
if: true
|
if: github.repository_owner == 'upx'
|
||||||
needs: [ job-rebuild-and-verify-stubs ]
|
needs: [ job-rebuild-and-verify-stubs ]
|
||||||
name: ${{ format('windows {0}', matrix.name) }}
|
name: ${{ format('windows {0}', matrix.name) }}
|
||||||
runs-on: ${{ matrix.os }}
|
runs-on: ${{ matrix.os }}
|
||||||
env:
|
env:
|
||||||
C: ${{ matrix.name }}
|
C: ${{ matrix.name }}
|
||||||
B: release
|
B: release
|
||||||
H: 'd:\a\upx\upx'
|
|
||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
@@ -297,6 +361,7 @@ jobs:
|
|||||||
- { name: i386-win32-vs2019, os: windows-2019, vsversion: 2019, arch: amd64_x86 }
|
- { name: i386-win32-vs2019, os: windows-2019, vsversion: 2019, arch: amd64_x86 }
|
||||||
- { name: i386-win32-vs2022, os: windows-2022, vsversion: 2022, arch: amd64_x86 }
|
- { name: i386-win32-vs2022, os: windows-2022, vsversion: 2022, arch: amd64_x86 }
|
||||||
steps:
|
steps:
|
||||||
|
- run: git config --global core.autocrlf false
|
||||||
- name: 'Check out code'
|
- name: 'Check out code'
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
with: { submodules: true }
|
with: { submodules: true }
|
||||||
@@ -305,8 +370,10 @@ jobs:
|
|||||||
run: |
|
run: |
|
||||||
git clone --depth=1 https://github.com/upx/upx-testsuite ../deps/upx-testsuite
|
git clone --depth=1 https://github.com/upx/upx-testsuite ../deps/upx-testsuite
|
||||||
mkdir -p -v build/$C/$B/{bzip2,ucl,upx,zlib,zstd}
|
mkdir -p -v build/$C/$B/{bzip2,ucl,upx,zlib,zstd}
|
||||||
|
repository_name="${GITHUB_REPOSITORY##*/}" # basename
|
||||||
|
echo "H=d:\\a\\$repository_name\\$repository_name" >> $GITHUB_ENV
|
||||||
- name: 'Set up Developer Command Prompt'
|
- name: 'Set up Developer Command Prompt'
|
||||||
uses: ilammy/msvc-dev-cmd@cec98b9d092141f74527d0afa6feb2af698cfe89 # v1.12.1
|
uses: ilammy/msvc-dev-cmd@v1
|
||||||
with:
|
with:
|
||||||
vsversion: ${{ matrix.vsversion }}
|
vsversion: ${{ matrix.vsversion }}
|
||||||
arch: ${{ matrix.arch }}
|
arch: ${{ matrix.arch }}
|
||||||
@@ -317,12 +384,13 @@ jobs:
|
|||||||
where cl & where link
|
where cl & where link
|
||||||
set RUN_CL=cl ${{ matrix.cl_machine_flags }} -MT
|
set RUN_CL=cl ${{ matrix.cl_machine_flags }} -MT
|
||||||
set RUN_LIB=link -lib ${{ matrix.link_machine_flags }}
|
set RUN_LIB=link -lib ${{ matrix.link_machine_flags }}
|
||||||
set DEFS=-D_CRT_NONSTDC_NO_WARNINGS -D_CRT_SECURE_NO_WARNINGS -DWIN32_LEAN_AND_MEAN
|
@rem UPX only uses the very basic Windows API
|
||||||
|
set DEFS=-D_CRT_NONSTDC_NO_WARNINGS -D_CRT_SECURE_NO_WARNINGS -DWIN32_LEAN_AND_MEAN -D_WIN32_WINNT=0x0501
|
||||||
set BDIR=%H%\build\%C%\%B%
|
set BDIR=%H%\build\%C%\%B%
|
||||||
git rev-parse --short=12 HEAD > %BDIR%\upx\.GITREV.txt
|
git rev-parse --short=12 HEAD > %BDIR%\upx\.GITREV.txt
|
||||||
@REM ===== build bzip2 =====
|
@REM ===== build bzip2 =====
|
||||||
cd %BDIR%\bzip2
|
cd %BDIR%\bzip2
|
||||||
@rem %RUN_CL% -J -O2 -W4 -wd4127 -wd4244 -wd4267 -WX %DEFS% -c %H%\vendor\bzip2\*.c
|
@rem %RUN_CL% -J -O2 -W4 -wd4127 -wd4244 -wd4267 -WX %DEFS% -DBZ_NO_STDIO -c %H%\vendor\bzip2\*.c
|
||||||
@rem %RUN_LIB% -out:bzip2.lib *.obj
|
@rem %RUN_LIB% -out:bzip2.lib *.obj
|
||||||
@REM ===== build UCL =====
|
@REM ===== build UCL =====
|
||||||
cd %BDIR%\ucl
|
cd %BDIR%\ucl
|
||||||
@@ -343,7 +411,7 @@ jobs:
|
|||||||
set s=%H%\src
|
set s=%H%\src
|
||||||
cat .GITREV.txt
|
cat .GITREV.txt
|
||||||
set /p GITREV=<.GITREV.txt
|
set /p GITREV=<.GITREV.txt
|
||||||
set UPX_DEFS=-DUPX_CONFIG_DISABLE_WSTRICT=0 -DUPX_CONFIG_DISABLE_WERROR=0 -DWITH_BZIP2=0 -DWITH_ZSTD=0
|
set UPX_DEFS=-DUPX_CONFIG_DISABLE_WSTRICT=0 -DUPX_CONFIG_DISABLE_WERROR=0 -DWITH_THREADS=0 -DWITH_BZIP2=0 -DWITH_ZSTD=0
|
||||||
set UPX_LIBS=%BDIR%\ucl\ucl.lib %BDIR%\zlib\zlib.lib
|
set UPX_LIBS=%BDIR%\ucl\ucl.lib %BDIR%\zlib\zlib.lib
|
||||||
@rem set UPX_LIBS=%BDIR%\bzip2\bzip2.lib %BDIR%\ucl\ucl.lib %BDIR%\zlib\zlib.lib %BDIR%\zstd\zstd.lib
|
@rem set UPX_LIBS=%BDIR%\bzip2\bzip2.lib %BDIR%\ucl\ucl.lib %BDIR%\zlib\zlib.lib %BDIR%\zstd\zstd.lib
|
||||||
set sources=%s%\*.cpp %s%\check\*.cpp %s%\compress\*.cpp %s%\console\*.cpp %s%\filter\*.cpp %s%\util\*.cpp
|
set sources=%s%\*.cpp %s%\check\*.cpp %s%\compress\*.cpp %s%\console\*.cpp %s%\filter\*.cpp %s%\util\*.cpp
|
||||||
@@ -357,7 +425,7 @@ jobs:
|
|||||||
# GitHub Actions magic: set "artifact_name" environment value for use in next step
|
# GitHub Actions magic: set "artifact_name" environment value for use in next step
|
||||||
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@v3
|
uses: actions/upload-artifact@v4
|
||||||
with:
|
with:
|
||||||
name: ${{ env.artifact_name }}
|
name: ${{ env.artifact_name }}
|
||||||
path: tmp/artifact
|
path: tmp/artifact
|
||||||
@@ -369,6 +437,7 @@ jobs:
|
|||||||
cd $Env:H\build\$Env:C\$Env:B\upx
|
cd $Env:H\build\$Env:C\$Env:B\upx
|
||||||
$Env:UPX = "--no-color --no-progress"
|
$Env:UPX = "--no-color --no-progress"
|
||||||
.\upx.exe --version
|
.\upx.exe --version
|
||||||
|
.\upx.exe --sysinfo -v
|
||||||
.\upx.exe upx.exe -o upx_packed.exe
|
.\upx.exe upx.exe -o upx_packed.exe
|
||||||
dir *.exe
|
dir *.exe
|
||||||
.\upx.exe -l upx_packed.exe
|
.\upx.exe -l upx_packed.exe
|
||||||
@@ -379,45 +448,48 @@ jobs:
|
|||||||
shell: bash
|
shell: bash
|
||||||
run: |
|
run: |
|
||||||
export upx_testsuite_SRCDIR="$(readlink -en ../deps/upx-testsuite)"
|
export upx_testsuite_SRCDIR="$(readlink -en ../deps/upx-testsuite)"
|
||||||
testsuite_1="$(readlink -en ./misc/testsuite/upx_testsuite_1.sh)"
|
env -C build/$C/$B/upx upx_exe=./upx.exe bash "$PWD"/misc/testsuite/upx_testsuite_1.sh
|
||||||
env -C build/$C/$B/upx upx_exe=./upx.exe bash "$testsuite_1"
|
|
||||||
|
|
||||||
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) }}
|
name: ${{ format('zigcc {0} {1}', matrix.zig_target, matrix.zig_pic) }}
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
container: 'alpine:3.18' # older versions such as alpine:3.12 also work; no-container also works
|
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 targets => more targets are tested in the Weekly CI
|
||||||
- { zig_target: aarch64-linux-musl }
|
- { zig_target: aarch64-linux-musl, qemu: qemu-aarch64 }
|
||||||
# { zig_target: aarch64-linux-musl, zig_pic: -fPIE }
|
# { zig_target: aarch64-linux-musl, qemu: qemu-aarch64, zig_pic: -fPIE }
|
||||||
# { zig_target: aarch64-macos-none }
|
# { 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.12.0-none }
|
||||||
# { zig_target: aarch64-macos.13.0-none }
|
# { zig_target: aarch64-macos.13.0-none }
|
||||||
- { zig_target: aarch64-windows-gnu }
|
- { zig_target: aarch64-windows-gnu }
|
||||||
- { zig_target: arm-linux-musleabihf }
|
- { zig_target: arm-linux-musleabihf, qemu: qemu-arm }
|
||||||
# { zig_target: arm-linux-musleabihf, zig_pic: -fPIE }
|
# { zig_target: arm-linux-musleabihf, qemu: qemu-arm, zig_pic: -fPIE }
|
||||||
# { zig_target: i386-linux-musl }
|
- { zig_target: i386-linux-musl, qemu: qemu-i386 -cpu Conroe }
|
||||||
# { zig_target: i386-linux-musl, zig_pic: -fPIE }
|
# { zig_target: i386-linux-musl, qemu: qemu-i386 -cpu Conroe, zig_pic: -fPIE }
|
||||||
- { zig_target: i386-windows-gnu }
|
- { zig_target: i386-windows-gnu }
|
||||||
# { zig_target: mips-linux-musl }
|
# mips and mipsel: bad hard-float code generation(??); or QEMU bug; or UPX bug; see https://github.com/upx/upx/issues/788
|
||||||
# { zig_target: mipsel-linux-musl }
|
- { zig_target: mips-linux-musl, zig_flags: -msoft-float, qemu: qemu-mips }
|
||||||
# { zig_target: powerpc-linux-musl }
|
- { zig_target: mipsel-linux-musl, zig_flags: -msoft-float, qemu: qemu-mipsel }
|
||||||
# { zig_target: powerpc64-linux-musl }
|
- { zig_target: powerpc-linux-musl, qemu: qemu-ppc }
|
||||||
# { zig_target: powerpc64le-linux-musl }
|
- { zig_target: powerpc64-linux-musl, qemu: qemu-ppc64 }
|
||||||
- { zig_target: x86_64-linux-musl }
|
- { zig_target: powerpc64le-linux-musl, qemu: qemu-ppc64le }
|
||||||
# { zig_target: x86_64-linux-musl, zig_pic: -fPIE }
|
- { 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-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.12.0-none }
|
||||||
# { zig_target: x86_64-macos.13.0-none }
|
# { zig_target: x86_64-macos.13.0-none }
|
||||||
- { zig_target: x86_64-windows-gnu }
|
- { zig_target: x86_64-windows-gnu }
|
||||||
env:
|
env:
|
||||||
|
##UPX_CONFIG_EXPECT_THREADS: 'ON'
|
||||||
|
# zig is currently missing winpthreads; see https://github.com/ziglang/zig/issues/10989
|
||||||
|
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 }}
|
||||||
@@ -465,18 +537,14 @@ jobs:
|
|||||||
ls -la; head zig-ar zig-cc zig-cxx zig-ranlib
|
ls -la; head zig-ar zig-cc zig-cxx zig-ranlib
|
||||||
- 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: |
|
||||||
mkdir -p build/zig/${ZIG_TARGET}${ZIG_PIC}/release
|
make UPX_XTARGET=zig/${ZIG_TARGET}${ZIG_PIC} xtarget/release \
|
||||||
cd build/zig/${ZIG_TARGET}${ZIG_PIC}/release
|
CC="zig-cc" CXX="zig-cxx" CMAKE_AR="$HOME/.local/bin/zig-ar" CMAKE_RANLIB="$HOME/.local/bin/zig-ranlib"
|
||||||
cmake ../../../.. -DCMAKE_BUILD_TYPE=Release -DCMAKE_AR=$HOME/.local/bin/zig-ar -DCMAKE_C_COMPILER=zig-cc -DCMAKE_CXX_COMPILER=zig-cxx -DCMAKE_RANLIB=$HOME/.local/bin/zig-ranlib $EXTRA_CMAKE_CONFIG_FLAGS_RELEASE
|
file build/zig/${ZIG_TARGET}${ZIG_PIC}/release/upx*
|
||||||
cmake --build . --config Release --parallel --verbose
|
|
||||||
file ./upx*
|
|
||||||
- name: ${{ format('Build Debug with zig-cc -target {0} {1}', env.ZIG_TARGET, env.ZIG_PIC) }}
|
- name: ${{ format('Build Debug with zig-cc -target {0} {1}', env.ZIG_TARGET, env.ZIG_PIC) }}
|
||||||
run: |
|
run: |
|
||||||
mkdir -p build/zig/${ZIG_TARGET}${ZIG_PIC}/debug
|
make UPX_XTARGET=zig/${ZIG_TARGET}${ZIG_PIC} xtarget/debug \
|
||||||
cd build/zig/${ZIG_TARGET}${ZIG_PIC}/debug
|
CC="zig-cc" CXX="zig-cxx" CMAKE_AR="$HOME/.local/bin/zig-ar" CMAKE_RANLIB="$HOME/.local/bin/zig-ranlib"
|
||||||
cmake ../../../.. -DCMAKE_BUILD_TYPE=Debug -DCMAKE_AR=$HOME/.local/bin/zig-ar -DCMAKE_C_COMPILER=zig-cc -DCMAKE_CXX_COMPILER=zig-cxx -DCMAKE_RANLIB=$HOME/.local/bin/zig-ranlib $EXTRA_CMAKE_CONFIG_FLAGS_DEBUG
|
file build/zig/${ZIG_TARGET}${ZIG_PIC}/debug/upx*
|
||||||
cmake --build . --config Debug --parallel --verbose
|
|
||||||
file ./upx*
|
|
||||||
- name: ${{ format('Make artifact from upx-{0}-{1}', github.ref_name, env.UPX_GITREV_SHORT) }}
|
- name: ${{ format('Make artifact from upx-{0}-{1}', github.ref_name, env.UPX_GITREV_SHORT) }}
|
||||||
shell: bash
|
shell: bash
|
||||||
run: |
|
run: |
|
||||||
@@ -487,12 +555,39 @@ jobs:
|
|||||||
# GitHub Actions magic: set "artifact_name" environment value for use in next step
|
# GitHub Actions magic: set "artifact_name" environment value for use in next step
|
||||||
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@v3
|
uses: actions/upload-artifact@v4
|
||||||
with:
|
with:
|
||||||
name: ${{ env.artifact_name }}
|
name: ${{ env.artifact_name }}
|
||||||
path: tmp/artifact
|
path: tmp/artifact
|
||||||
- name: 'Run install tests'
|
- name: 'Run install tests'
|
||||||
if: ${{ contains(matrix.zig_target, '-linux') }}
|
if: ${{ contains(matrix.zig_target, '-linux') }}
|
||||||
run: |
|
run: |
|
||||||
(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'
|
||||||
|
if: ${{ matrix.zig_target == 'i386-linux-musl' || matrix.zig_target == 'x86_64-linux-musl' }}
|
||||||
|
run: |
|
||||||
|
make -C build/zig/${ZIG_TARGET}${ZIG_PIC}/debug test
|
||||||
|
make -C build/zig/${ZIG_TARGET}${ZIG_PIC}/release test
|
||||||
|
- name: 'Mimic ctest tests'
|
||||||
|
if: ${{ matrix.zig_target == 'i386-linux-musl' || matrix.zig_target == 'x86_64-linux-musl' }}
|
||||||
|
run: |
|
||||||
|
apk add coreutils
|
||||||
|
env -C build/zig/${ZIG_TARGET}${ZIG_PIC}/debug bash "$PWD"/misc/testsuite/mimic_ctest.sh
|
||||||
|
env -C build/zig/${ZIG_TARGET}${ZIG_PIC}/release bash "$PWD"/misc/testsuite/mimic_ctest.sh
|
||||||
|
- name: ${{ format('Mimic ctest tests with QEMU {0}', matrix.qemu) }}
|
||||||
|
if: ${{ matrix.qemu }}
|
||||||
|
run: |
|
||||||
|
qemu="${{ matrix.qemu }}"
|
||||||
|
apk add coreutils "${qemu%% *}"
|
||||||
|
export upx_exe_runner="$qemu"
|
||||||
|
env -C build/zig/${ZIG_TARGET}${ZIG_PIC}/debug bash "$PWD"/misc/testsuite/mimic_ctest.sh
|
||||||
|
env -C build/zig/${ZIG_TARGET}${ZIG_PIC}/release bash "$PWD"/misc/testsuite/mimic_ctest.sh
|
||||||
|
- name: 'Mimic ctest tests with Valgrind'
|
||||||
|
if: ${{ matrix.zig_target == 'x86_64-linux-musl' }}
|
||||||
|
run: |
|
||||||
|
apk add coreutils valgrind
|
||||||
|
export upx_exe_runner="valgrind --leak-check=no --error-exitcode=1 --quiet --gen-suppressions=all"
|
||||||
|
upx_exe_runner="$upx_exe_runner --suppressions=$PWD/misc/valgrind/musl.supp"
|
||||||
|
env -C build/zig/${ZIG_TARGET}${ZIG_PIC}/debug bash "$PWD"/misc/testsuite/mimic_ctest.sh
|
||||||
|
env -C build/zig/${ZIG_TARGET}${ZIG_PIC}/release bash "$PWD"/misc/testsuite/mimic_ctest.sh
|
||||||
|
|||||||
@@ -1,39 +0,0 @@
|
|||||||
# Copyright (C) Markus Franz Xaver Johannes Oberhumer
|
|
||||||
|
|
||||||
# see https://docs.github.com/en/actions/managing-issues-and-pull-requests/closing-inactive-issues
|
|
||||||
# see https://github.com/actions/stale
|
|
||||||
|
|
||||||
# Automatically closing issues is far from perfect, but then we only
|
|
||||||
# have limited resources and this approach favors issues that people
|
|
||||||
# actually care about.
|
|
||||||
#
|
|
||||||
# also see:
|
|
||||||
# "Should I Stale or Should I Close? An Analysis of a Bot that Closes
|
|
||||||
# Abandoned Issues and Pull Request".
|
|
||||||
# https://igorwiese.com/images/papers/Paper_BotSE_19.pdf
|
|
||||||
|
|
||||||
name: 'GitHub - Close inactive issues'
|
|
||||||
on:
|
|
||||||
schedule: [cron: '50 0 * * 3'] # run weekly Wednesday 00:50 UTC
|
|
||||||
workflow_dispatch:
|
|
||||||
jobs:
|
|
||||||
job-close-inactive-issues:
|
|
||||||
if: github.repository_owner == 'upx'
|
|
||||||
name: 'Close inactive issues'
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
permissions:
|
|
||||||
issues: write
|
|
||||||
pull-requests: write
|
|
||||||
steps:
|
|
||||||
- uses: actions/stale@v8
|
|
||||||
with:
|
|
||||||
operations-per-run: 300
|
|
||||||
exempt-all-milestones: true
|
|
||||||
exempt-issue-labels: 'blocker,bug,enhancement,help wanted,regression'
|
|
||||||
days-before-stale: 60
|
|
||||||
days-before-close: 30
|
|
||||||
stale-issue-message: 'This issue is stale because it has been open 60 days with no activity. Please remove the stale label or add a comment or this issue will be closed in 30 days.'
|
|
||||||
stale-pr-message: 'This PR is stale because it has been open 60 days with no activity. Please remove the stale label or add a comment or this PR will be closed in 30 days.'
|
|
||||||
close-issue-message: 'This issue was closed because it has been stalled for 30 days with no activity. Please feel free to reopen.'
|
|
||||||
close-pr-message: 'This PR was closed because it has been stalled for 30 days with no activity. Please feel free to reopen.'
|
|
||||||
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
@@ -1,18 +0,0 @@
|
|||||||
# Copyright (C) Markus Franz Xaver Johannes Oberhumer
|
|
||||||
name: 'GitHub - Close pull requests'
|
|
||||||
on:
|
|
||||||
#pull_request:
|
|
||||||
workflow_dispatch:
|
|
||||||
jobs:
|
|
||||||
job-close-pull-requests:
|
|
||||||
if: github.repository_owner == 'upx'
|
|
||||||
name: 'Close pull requests'
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
permissions:
|
|
||||||
pull-requests: write
|
|
||||||
steps:
|
|
||||||
- name: 'Close pull requests'
|
|
||||||
env:
|
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
run: |
|
|
||||||
gh pr list --repo='${{ github.repository }}' --state=open --json=number | jq '.[].number' | xargs -r -n1 -- gh pr close --repo='${{ github.repository }}'
|
|
||||||
@@ -1,21 +0,0 @@
|
|||||||
# Copyright (C) Markus Franz Xaver Johannes Oberhumer
|
|
||||||
# see https://github.com/crate-ci/typos
|
|
||||||
|
|
||||||
name: 'Misc - Spell check'
|
|
||||||
on:
|
|
||||||
schedule: [cron: '55 0 * * 3'] # run weekly Wednesday 00:55 UTC
|
|
||||||
workflow_dispatch:
|
|
||||||
env:
|
|
||||||
DEBIAN_FRONTEND: noninteractive
|
|
||||||
jobs:
|
|
||||||
job-spell-check:
|
|
||||||
if: github.repository_owner == 'upx'
|
|
||||||
name: 'Spell check'
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- name: 'Check out code'
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
with: { submodules: false }
|
|
||||||
- name: 'Spell check with crate-ci/typos'
|
|
||||||
uses: crate-ci/typos@c004e98018d8621614d1ca516eed8ca2d04b365a # v1.16.20
|
|
||||||
with: { config: ./.github/typos_config.toml }
|
|
||||||
@@ -1,34 +0,0 @@
|
|||||||
# Copyright (C) Markus Franz Xaver Johannes Oberhumer
|
|
||||||
|
|
||||||
name: 'Static Analyzer - clang-analyzer'
|
|
||||||
on:
|
|
||||||
schedule: [cron: '10 4 * * 3'] # run weekly Wednesday 04:10 UTC
|
|
||||||
workflow_dispatch:
|
|
||||||
env:
|
|
||||||
CMAKE_REQUIRED_QUIET: "OFF"
|
|
||||||
CTEST_OUTPUT_ON_FAILURE: "ON"
|
|
||||||
DEBIAN_FRONTEND: noninteractive
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
job-analyze-clang-analyzer: # uses cmake + make
|
|
||||||
if: github.repository_owner == 'upx'
|
|
||||||
strategy:
|
|
||||||
fail-fast: false
|
|
||||||
matrix: {container: ['alpine:3.16','alpine:3.17','alpine:3.18','alpine:edge','i386/alpine:edge']}
|
|
||||||
name: ${{ format('Analyze clang-analyzer {0}', matrix.container) }}
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
container: ${{ matrix.container }}
|
|
||||||
steps:
|
|
||||||
- name: ${{ format('Install packages {0}', matrix.container) }}
|
|
||||||
run: 'apk update && apk upgrade && apk add clang clang-analyzer cmake g++ git make'
|
|
||||||
- name: ${{ format('Check out UPX {0} source code', github.ref_name) }}
|
|
||||||
run: |
|
|
||||||
# this seems to be needed when running in a container (beause of UID mismatch??)
|
|
||||||
git config --global --add safe.directory '*'
|
|
||||||
git clone --branch "$GITHUB_REF_NAME" --depth 1 https://github.com/upx/upx .
|
|
||||||
git submodule update --init
|
|
||||||
- name: 'Perform clang-analyzer scan-build Analysis Debug'
|
|
||||||
run: 'make build/analyze/clang-analyzer/debug'
|
|
||||||
- name: 'Perform clang-analyzer scan-build Analysis Release'
|
|
||||||
if: success() || failure() # run this step even if the previous step failed
|
|
||||||
run: 'make build/analyze/clang-analyzer/release'
|
|
||||||
@@ -1,34 +0,0 @@
|
|||||||
# Copyright (C) Markus Franz Xaver Johannes Oberhumer
|
|
||||||
|
|
||||||
name: 'Static Analyzer - clang-tidy'
|
|
||||||
on:
|
|
||||||
schedule: [cron: '30 4 * * 3'] # run weekly Wednesday 04:30 UTC
|
|
||||||
workflow_dispatch:
|
|
||||||
env:
|
|
||||||
CMAKE_REQUIRED_QUIET: "OFF"
|
|
||||||
CTEST_OUTPUT_ON_FAILURE: "ON"
|
|
||||||
DEBIAN_FRONTEND: noninteractive
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
job-analyze-clang-tidy: # uses cmake + make
|
|
||||||
if: github.repository_owner == 'upx'
|
|
||||||
strategy:
|
|
||||||
fail-fast: false
|
|
||||||
matrix: {container: ['alpine:3.18','alpine:edge','i386/alpine:edge']}
|
|
||||||
name: ${{ format('Analyze clang-tidy {0}', matrix.container) }}
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
container: ${{ matrix.container }}
|
|
||||||
steps:
|
|
||||||
- name: ${{ format('Install packages {0}', matrix.container) }}
|
|
||||||
run: 'apk update && apk upgrade && apk add clang clang-extra-tools cmake g++ git make python3'
|
|
||||||
- name: ${{ format('Check out UPX {0} source code', github.ref_name) }}
|
|
||||||
run: |
|
|
||||||
# this seems to be needed when running in a container (beause of UID mismatch??)
|
|
||||||
git config --global --add safe.directory '*'
|
|
||||||
git clone --branch "$GITHUB_REF_NAME" --depth 1 https://github.com/upx/upx .
|
|
||||||
git submodule update --init
|
|
||||||
- name: 'Perform clang-tidy Analysis Debug'
|
|
||||||
run: 'make -k build/analyze/clang-tidy/debug'
|
|
||||||
- name: 'Perform clang-tidy Analysis Release'
|
|
||||||
if: success() || failure() # run this step even if the previous step failed
|
|
||||||
run: 'make -k build/analyze/clang-tidy/release'
|
|
||||||
@@ -1,36 +0,0 @@
|
|||||||
# Copyright (C) Markus Franz Xaver Johannes Oberhumer
|
|
||||||
|
|
||||||
name: 'Static Analyzer - CodeQL'
|
|
||||||
on:
|
|
||||||
schedule: [cron: '50 4 * * 3'] # run weekly Wednesday 04:50 UTC
|
|
||||||
workflow_dispatch:
|
|
||||||
env:
|
|
||||||
CMAKE_REQUIRED_QUIET: "OFF"
|
|
||||||
CTEST_OUTPUT_ON_FAILURE: "ON"
|
|
||||||
DEBIAN_FRONTEND: noninteractive
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
job-analyze-codeql:
|
|
||||||
if: github.repository_owner == 'upx'
|
|
||||||
name: Analyze
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
permissions:
|
|
||||||
actions: read
|
|
||||||
contents: read
|
|
||||||
security-events: write
|
|
||||||
strategy:
|
|
||||||
fail-fast: false
|
|
||||||
matrix:
|
|
||||||
language: [ 'cpp' ]
|
|
||||||
steps:
|
|
||||||
- name: Checkout repository
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
with: { submodules: true }
|
|
||||||
- name: Initialize CodeQL
|
|
||||||
uses: github/codeql-action/init@v2
|
|
||||||
with:
|
|
||||||
languages: ${{ matrix.language }}
|
|
||||||
- name: Autobuild
|
|
||||||
uses: github/codeql-action/autobuild@v2
|
|
||||||
- name: Perform CodeQL Analysis
|
|
||||||
uses: github/codeql-action/analyze@v2
|
|
||||||
@@ -1,66 +0,0 @@
|
|||||||
# Copyright (C) Markus Franz Xaver Johannes Oberhumer
|
|
||||||
# test minimal number of packages required for building UPX under Alpine Linux
|
|
||||||
# clang: apk add clang cmake make
|
|
||||||
# gcc: apk add cmake g++ make
|
|
||||||
|
|
||||||
name: 'Test - Minimal Alpine build'
|
|
||||||
on: [workflow_dispatch]
|
|
||||||
env:
|
|
||||||
CMAKE_REQUIRED_QUIET: "OFF"
|
|
||||||
CTEST_OUTPUT_ON_FAILURE: "ON"
|
|
||||||
DEBIAN_FRONTEND: noninteractive
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
job-alpine-clang: # uses cmake + make
|
|
||||||
if: true
|
|
||||||
strategy: { matrix: { container: ['alpine:edge','i386/alpine:edge'] } }
|
|
||||||
name: ${{ format('clang {0}', matrix.container) }}
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
container: ${{ matrix.container }}
|
|
||||||
steps:
|
|
||||||
- name: ${{ format('Build clang {0}', matrix.container) }}
|
|
||||||
run: |
|
|
||||||
apk update && apk upgrade && apk add clang cmake make
|
|
||||||
wget https://github.com/upx/upx/releases/download/v4.1.0/upx-4.1.0-src.tar.xz
|
|
||||||
tar -xoaf upx-*-src.tar.xz
|
|
||||||
cd upx-*-src
|
|
||||||
make build/debug CC="clang -static" CXX="clang++ -static"
|
|
||||||
make build/release CC="clang -static" CXX="clang++ -static"
|
|
||||||
make -C build/debug test
|
|
||||||
make -C build/release test
|
|
||||||
make -C build/release install DESTDIR="$PWD/Install"
|
|
||||||
N=$(echo "upx-test-alpine-linux-clang-${{ matrix.container }}" | sed 's/[^0-9a-zA-Z_.-]/-/g')
|
|
||||||
echo "artifact_name=$N" >> $GITHUB_ENV
|
|
||||||
- name: ${{ format('Upload artifact {0}', env.artifact_name) }}
|
|
||||||
if: ${{ !startsWith(matrix.container, 'i386/') }} # i386: missing nodejs on host
|
|
||||||
uses: actions/upload-artifact@v3
|
|
||||||
with:
|
|
||||||
name: ${{ env.artifact_name }}
|
|
||||||
path: 'upx*/build/*/upx'
|
|
||||||
|
|
||||||
job-alpine-gcc: # uses cmake + make
|
|
||||||
if: true
|
|
||||||
strategy: { matrix: { container: ['alpine:edge','i386/alpine:edge'] } }
|
|
||||||
name: ${{ format('gcc {0}', matrix.container) }}
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
container: ${{ matrix.container }}
|
|
||||||
steps:
|
|
||||||
- name: ${{ format('Build gcc {0}', matrix.container) }}
|
|
||||||
run: |
|
|
||||||
apk update && apk upgrade && apk add cmake g++ make
|
|
||||||
wget https://github.com/upx/upx/releases/download/v4.1.0/upx-4.1.0-src.tar.xz
|
|
||||||
tar -xoaf upx-*-src.tar.xz
|
|
||||||
cd upx-*-src
|
|
||||||
make build/debug CC="gcc -static" CXX="g++ -static"
|
|
||||||
make build/release CC="gcc -static" CXX="g++ -static"
|
|
||||||
make -C build/debug test
|
|
||||||
make -C build/release test
|
|
||||||
make -C build/release install DESTDIR="$PWD/Install"
|
|
||||||
N=$(echo "upx-test-alpine-linux-gcc-${{ matrix.container }}" | sed 's/[^0-9a-zA-Z_.-]/-/g')
|
|
||||||
echo "artifact_name=$N" >> $GITHUB_ENV
|
|
||||||
- name: ${{ format('Upload artifact {0}', env.artifact_name) }}
|
|
||||||
if: ${{ !startsWith(matrix.container, 'i386/') }} # i386: missing nodejs on host
|
|
||||||
uses: actions/upload-artifact@v3
|
|
||||||
with:
|
|
||||||
name: ${{ env.artifact_name }}
|
|
||||||
path: 'upx*/build/*/upx'
|
|
||||||
@@ -1,133 +0,0 @@
|
|||||||
# Copyright (C) Markus Franz Xaver Johannes Oberhumer
|
|
||||||
|
|
||||||
name: 'Test - CMake default build type'
|
|
||||||
on: [workflow_dispatch]
|
|
||||||
env:
|
|
||||||
CMAKE_REQUIRED_QUIET: "OFF"
|
|
||||||
CTEST_OUTPUT_ON_FAILURE: "ON"
|
|
||||||
DEBIAN_FRONTEND: noninteractive
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
|
|
||||||
#
|
|
||||||
# single-config generators - these use and respect CMAKE_BUILD_TYPE
|
|
||||||
#
|
|
||||||
|
|
||||||
cmake-make:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- name: 'Check out code'
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
with: { submodules: true }
|
|
||||||
- name: 'Config, build, test and install'
|
|
||||||
run: |
|
|
||||||
cmake -S . -B build/default -G "Unix Makefiles"
|
|
||||||
cmake --build build/default --parallel --verbose
|
|
||||||
ctest --test-dir build/default
|
|
||||||
(cd build/default && DESTDIR=$PWD/Install-default cmake --install .)
|
|
||||||
# "make test" also works
|
|
||||||
env -C build/default make test
|
|
||||||
# "make install" also works
|
|
||||||
env -C build/default DESTDIR=./Install-with-make make install
|
|
||||||
|
|
||||||
cmake-ninja:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- name: 'Check out code'
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
with: { submodules: true }
|
|
||||||
- name: 'Config, build, test and install'
|
|
||||||
run: |
|
|
||||||
test -f /usr/bin/ninja || sudo apt-get install -y ninja-build
|
|
||||||
cmake -S . -B build/default -G Ninja
|
|
||||||
cmake --build build/default --parallel --verbose
|
|
||||||
ctest --test-dir build/default
|
|
||||||
(cd build/default && DESTDIR=$PWD/Install-default cmake --install .)
|
|
||||||
# "ninja test" also works
|
|
||||||
env -C build/default ninja test
|
|
||||||
# "ninja install" also works
|
|
||||||
env -C build/default DESTDIR=./Install-with-ninja ninja install
|
|
||||||
|
|
||||||
cmake-nmake:
|
|
||||||
runs-on: windows-2022
|
|
||||||
steps:
|
|
||||||
- name: 'Check out code'
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
with: { submodules: true }
|
|
||||||
- name: 'Set up Developer Command Prompt'
|
|
||||||
uses: ilammy/msvc-dev-cmd@cec98b9d092141f74527d0afa6feb2af698cfe89 # v1.12.1
|
|
||||||
with:
|
|
||||||
vsversion: 2022
|
|
||||||
arch: amd64
|
|
||||||
- name: 'Config, build, test and install'
|
|
||||||
run: |
|
|
||||||
cmake -S . -B build/default -G "NMake Makefiles"
|
|
||||||
cmake --build build/default --parallel --verbose
|
|
||||||
ctest --test-dir build/default
|
|
||||||
# "cmake --install" works on Windows as well, nice
|
|
||||||
env -C build/default DESTDIR=./Install-default cmake --install .
|
|
||||||
# "nmake test" also works
|
|
||||||
env -C build/default nmake test
|
|
||||||
# "nmake install" also works
|
|
||||||
env -C build/default DESTDIR=./Install-with-nmake nmake install
|
|
||||||
|
|
||||||
#
|
|
||||||
# multi-config generators - these use CMAKE_CONFIGURATION_TYPES, but the defaults seem inconsistent
|
|
||||||
# => when using multi-config generators always explicitly pass the requested build-config
|
|
||||||
#
|
|
||||||
|
|
||||||
# ninja-multi-config seems to use the *first* element of CMAKE_CONFIGURATION_TYPES; nice
|
|
||||||
cmake-ninja-multi-config:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- name: 'Check out code'
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
with: { submodules: true }
|
|
||||||
- name: 'Config, build, test and install'
|
|
||||||
run: |
|
|
||||||
test -f /usr/bin/ninja || sudo apt-get install -y ninja-build
|
|
||||||
cmake -S . -B build/default -G "Ninja Multi-Config"
|
|
||||||
cmake --build build/default --parallel --verbose
|
|
||||||
# multi-config: ctest NEEDS a config
|
|
||||||
ctest --test-dir build/default -C Release
|
|
||||||
(cd build/default && DESTDIR=$PWD/Install-default cmake --install .)
|
|
||||||
# "ninja test" also works with multi-config
|
|
||||||
env -C build/default ninja test
|
|
||||||
# "ninja install" also works with multi-config
|
|
||||||
env -C build/default DESTDIR=./Install-with-ninja ninja install
|
|
||||||
|
|
||||||
# vsstudio-multi-config (msbuild) seems to use "Debug" by default
|
|
||||||
cmake-vsstudio-multi-config:
|
|
||||||
runs-on: windows-2022
|
|
||||||
steps:
|
|
||||||
- name: 'Check out code'
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
with: { submodules: true }
|
|
||||||
- name: 'Set up Developer Command Prompt'
|
|
||||||
uses: ilammy/msvc-dev-cmd@cec98b9d092141f74527d0afa6feb2af698cfe89 # v1.12.1
|
|
||||||
with:
|
|
||||||
vsversion: 2022
|
|
||||||
arch: amd64
|
|
||||||
- name: 'Config, build and test'
|
|
||||||
run: |
|
|
||||||
cmake -S . -B build/default
|
|
||||||
cmake --build build/default --parallel --verbose
|
|
||||||
# multi-config: ctest NEEDS a config
|
|
||||||
ctest --test-dir build/default -C Debug
|
|
||||||
# TODO: does cmake --install work?
|
|
||||||
|
|
||||||
# xcode-multi-config (xcodebuild) seems to use "Debug" by default, except for "cmake --install" (BUG?)
|
|
||||||
cmake-xcode-multi-config:
|
|
||||||
runs-on: macos-12
|
|
||||||
steps:
|
|
||||||
- name: 'Check out code'
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
with: { submodules: true }
|
|
||||||
- name: 'Config, build, test and install'
|
|
||||||
run: |
|
|
||||||
cmake -S . -B build/default -G Xcode
|
|
||||||
cmake --build build/default --parallel --verbose
|
|
||||||
# multi-config: ctest NEEDS a config
|
|
||||||
ctest --test-dir build/default -C Debug
|
|
||||||
# BUG(?) multi-config: cmake --install defaults to "Release" !!
|
|
||||||
(cd build/default && DESTDIR=$PWD/Install-default cmake --install . --config Debug)
|
|
||||||
@@ -1,16 +0,0 @@
|
|||||||
# Copyright (C) Markus Franz Xaver Johannes Oberhumer
|
|
||||||
|
|
||||||
name: 'Test - Unused'
|
|
||||||
on: [workflow_dispatch]
|
|
||||||
env:
|
|
||||||
CMAKE_REQUIRED_QUIET: "OFF"
|
|
||||||
CTEST_OUTPUT_ON_FAILURE: "ON"
|
|
||||||
DEBIAN_FRONTEND: noninteractive
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
job-unused: # uses cmake + make
|
|
||||||
if: true
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- run: |
|
|
||||||
true
|
|
||||||
@@ -1,154 +0,0 @@
|
|||||||
# Copyright (C) Markus Franz Xaver Johannes Oberhumer
|
|
||||||
# BS BuildSystem: build "by hand" using a POSIX-compliant shell
|
|
||||||
|
|
||||||
name: 'Weekly CI BS - By Hand'
|
|
||||||
on:
|
|
||||||
schedule: [cron: '00 1 * * 3'] # run weekly Wednesday 01:00 UTC
|
|
||||||
workflow_dispatch:
|
|
||||||
env:
|
|
||||||
CMAKE_REQUIRED_QUIET: "OFF"
|
|
||||||
CTEST_OUTPUT_ON_FAILURE: "ON"
|
|
||||||
DEBIAN_FRONTEND: noninteractive
|
|
||||||
VERBOSE: 1
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
job-by-hand-alpine-linux-gcc: # uses a POSIX-compliant shell
|
|
||||||
# ...and also uses a subdirectory "upx with space" in order to detect possible quoting issues
|
|
||||||
# ...and also uses ccache as we are running the same build-script again and again
|
|
||||||
if: github.repository_owner == 'upx'
|
|
||||||
strategy: { matrix: { container: ['alpine:3.9','alpine:3.18','alpine:edge','i386/alpine:edge'] } }
|
|
||||||
name: ${{ format('by-hand gcc {0}', matrix.container) }}
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
container: ${{ matrix.container }}
|
|
||||||
steps:
|
|
||||||
- name: ${{ format('Install packages {0}', matrix.container) }}
|
|
||||||
run: |
|
|
||||||
# install ccache, g++, git and various POSIX shells
|
|
||||||
shells="bash dash loksh mksh zsh"
|
|
||||||
case ${{ matrix.container }} in
|
|
||||||
*:3.18 | *:edge) shells="$shells oksh yash" ;;
|
|
||||||
esac
|
|
||||||
echo "installing shells: $shells"
|
|
||||||
apk update && apk upgrade && apk add ccache g++ git $shells
|
|
||||||
# enable ccache and some warnings
|
|
||||||
xflags="-static -Wall -Wextra -Werror"
|
|
||||||
echo -e "CC=ccache gcc $xflags\nCXX=ccache g++ -std=gnu++17 $xflags" >> $GITHUB_ENV
|
|
||||||
# this seems to be needed when running in a container (beause of UID mismatch??)
|
|
||||||
git config --global --add safe.directory '*'
|
|
||||||
# create user upx:upx 2000:2000 for file system tests below ("sudo")
|
|
||||||
adduser upx -u 2000 -D && cd /home/upx && chmod 00700 . && chown -R upx:upx .
|
|
||||||
- name: ${{ format('Check out UPX {0} source code', github.ref_name) }}
|
|
||||||
run: |
|
|
||||||
git clone --branch "$GITHUB_REF_NAME" --depth 1 https://github.com/upx/upx "upx with space"
|
|
||||||
git -C "upx with space" submodule update --init
|
|
||||||
- name: 'Build by-hand with /bin/sh'
|
|
||||||
run: '/bin/sh "./upx with space/misc/scripts/build_upx_by_hand.sh"'
|
|
||||||
- name: 'Build by-hand with bash'
|
|
||||||
run: 'bash "./upx with space/misc/scripts/build_upx_by_hand.sh"'
|
|
||||||
- name: 'Build by-hand with bash --posix'
|
|
||||||
run: 'bash --posix "./upx with space/misc/scripts/build_upx_by_hand.sh"'
|
|
||||||
- name: 'Build by-hand with busybox ash'
|
|
||||||
run: 'busybox ash "./upx with space/misc/scripts/build_upx_by_hand.sh"'
|
|
||||||
- name: 'Build by-hand with busybox sh'
|
|
||||||
run: 'busybox sh "./upx with space/misc/scripts/build_upx_by_hand.sh"'
|
|
||||||
- name: 'Build by-hand with dash'
|
|
||||||
run: 'dash "./upx with space/misc/scripts/build_upx_by_hand.sh"'
|
|
||||||
- name: 'Build by-hand with loksh'
|
|
||||||
run: 'ksh "./upx with space/misc/scripts/build_upx_by_hand.sh"'
|
|
||||||
- name: 'Build by-hand with loksh -o posix'
|
|
||||||
run: 'ksh -o posix "./upx with space/misc/scripts/build_upx_by_hand.sh"'
|
|
||||||
- name: 'Build by-hand with loksh -o sh'
|
|
||||||
run: 'ksh -o sh "./upx with space/misc/scripts/build_upx_by_hand.sh"'
|
|
||||||
- name: 'Build by-hand with mksh'
|
|
||||||
run: 'mksh "./upx with space/misc/scripts/build_upx_by_hand.sh"'
|
|
||||||
- name: 'Build by-hand with mksh -o posix'
|
|
||||||
run: 'mksh -o posix "./upx with space/misc/scripts/build_upx_by_hand.sh"'
|
|
||||||
- name: 'Build by-hand with mksh -o sh'
|
|
||||||
run: 'mksh -o sh "./upx with space/misc/scripts/build_upx_by_hand.sh"'
|
|
||||||
- name: 'Build by-hand with oksh'
|
|
||||||
if: endsWith(matrix.container, ':3.18') || endsWith(matrix.container, ':edge')
|
|
||||||
run: 'oksh "./upx with space/misc/scripts/build_upx_by_hand.sh"'
|
|
||||||
- name: 'Build by-hand with oksh -o posix'
|
|
||||||
if: endsWith(matrix.container, ':3.18') || endsWith(matrix.container, ':edge')
|
|
||||||
run: 'oksh -o posix "./upx with space/misc/scripts/build_upx_by_hand.sh"'
|
|
||||||
- name: 'Build by-hand with oksh -o sh'
|
|
||||||
if: endsWith(matrix.container, ':3.18') || endsWith(matrix.container, ':edge')
|
|
||||||
run: 'oksh -o sh "./upx with space/misc/scripts/build_upx_by_hand.sh"'
|
|
||||||
- name: 'Build by-hand with yash'
|
|
||||||
if: endsWith(matrix.container, ':3.18') || endsWith(matrix.container, ':edge')
|
|
||||||
run: 'yash "./upx with space/misc/scripts/build_upx_by_hand.sh"'
|
|
||||||
- name: 'Build by-hand with zsh'
|
|
||||||
run: 'zsh "./upx with space/misc/scripts/build_upx_by_hand.sh"'
|
|
||||||
- name: 'Build by-hand with zsh --emulate ksh'
|
|
||||||
run: 'zsh --emulate ksh "./upx with space/misc/scripts/build_upx_by_hand.sh"'
|
|
||||||
- name: 'Build by-hand with zsh --emulate sh'
|
|
||||||
run: 'zsh --emulate sh "./upx with space/misc/scripts/build_upx_by_hand.sh"'
|
|
||||||
- name: 'Show ccache stats'
|
|
||||||
run: |
|
|
||||||
ccache -s
|
|
||||||
ccache -p
|
|
||||||
- name: 'Run file system test suite (busybox)'
|
|
||||||
run: |
|
|
||||||
apk add bash sudo
|
|
||||||
testsuite="$(readlink -fn "upx with space"/misc/testsuite/test_symlinks.sh)"
|
|
||||||
cd "upx with space"/build/by-hand
|
|
||||||
# IMPORTANT: do NOT run as user root!
|
|
||||||
chmod a+w . && sudo -u upx bash "$testsuite"
|
|
||||||
- name: 'Run file system test suite (coreutils)'
|
|
||||||
run: |
|
|
||||||
apk add bash coreutils sudo
|
|
||||||
testsuite="$(readlink -fn "upx with space"/misc/testsuite/test_symlinks.sh)"
|
|
||||||
cd "upx with space"/build/by-hand
|
|
||||||
# IMPORTANT: do NOT run as user root!
|
|
||||||
chmod a+w . && sudo -u upx bash "$testsuite"
|
|
||||||
|
|
||||||
job-by-hand-macos: # uses a POSIX-compliant shell
|
|
||||||
# ...and also uses a subdirectory "upx with space" in order to detect possible quoting issues
|
|
||||||
if: github.repository_owner == 'upx'
|
|
||||||
strategy:
|
|
||||||
fail-fast: false
|
|
||||||
matrix:
|
|
||||||
include:
|
|
||||||
- { os: macos-11, run_fs_test: false } # macos-11 does not have "readlink -f"
|
|
||||||
- { os: macos-12, run_fs_test: true }
|
|
||||||
- { os: macos-13, run_fs_test: true }
|
|
||||||
name: ${{ format('by-hand cc {0}', matrix.os) }}
|
|
||||||
runs-on: ${{ matrix.os }}
|
|
||||||
steps:
|
|
||||||
- name: ${{ format('Check out UPX {0} source code', github.ref_name) }}
|
|
||||||
run: |
|
|
||||||
git clone --branch "$GITHUB_REF_NAME" --depth 1 https://github.com/upx/upx "upx with space"
|
|
||||||
git -C "upx with space" submodule update --init
|
|
||||||
- name: 'Build by-hand with /bin/sh'
|
|
||||||
run: 'top_srcdir="$PWD/upx with space" /bin/sh "./upx with space/misc/scripts/build_upx_by_hand.sh"'
|
|
||||||
- name: 'Build by-hand with bash'
|
|
||||||
run: 'top_srcdir="$PWD/upx with space" bash "./upx with space/misc/scripts/build_upx_by_hand.sh"'
|
|
||||||
- name: 'Run file system test suite'
|
|
||||||
if: ${{ matrix.run_fs_test }}
|
|
||||||
run: |
|
|
||||||
testsuite="$(readlink -fn "upx with space"/misc/testsuite/test_symlinks.sh)"
|
|
||||||
cd "upx with space"/build/by-hand
|
|
||||||
bash "$testsuite"
|
|
||||||
|
|
||||||
job-by-hand-windows-gcc: # uses a POSIX-compliant shell
|
|
||||||
# ...and also uses a subdirectory "upx with space" in order to detect possible quoting issues
|
|
||||||
if: github.repository_owner == 'upx'
|
|
||||||
strategy:
|
|
||||||
fail-fast: false
|
|
||||||
matrix:
|
|
||||||
include:
|
|
||||||
- { os: windows-2019 }
|
|
||||||
- { os: windows-2022 }
|
|
||||||
name: ${{ format('by-hand gcc {0}', matrix.os) }}
|
|
||||||
runs-on: ${{ matrix.os }}
|
|
||||||
steps:
|
|
||||||
- name: ${{ format('Check out UPX {0} source code', github.ref_name) }}
|
|
||||||
shell: bash
|
|
||||||
run: |
|
|
||||||
git clone --branch "$GITHUB_REF_NAME" --depth 1 https://github.com/upx/upx "upx with space"
|
|
||||||
git -C "upx with space" submodule update --init
|
|
||||||
- name: 'Build by-hand with bash'
|
|
||||||
shell: bash
|
|
||||||
run: |
|
|
||||||
xflags="-static -Wall -Wextra -Werror"
|
|
||||||
CC="gcc $xflags" CXX="g++ -std=gnu++17 $xflags" bash "./upx with space/misc/scripts/build_upx_by_hand.sh"
|
|
||||||
@@ -1,56 +0,0 @@
|
|||||||
# Copyright (C) Markus Franz Xaver Johannes Oberhumer
|
|
||||||
# BS BuildSystem: build on macOS with 'cmake -G Xcode'
|
|
||||||
|
|
||||||
name: 'Weekly CI BS - cmake macOS Xcode'
|
|
||||||
on:
|
|
||||||
schedule: [cron: '10 1 * * 3'] # run weekly Wednesday 01:10 UTC
|
|
||||||
workflow_dispatch:
|
|
||||||
env:
|
|
||||||
CMAKE_REQUIRED_QUIET: "OFF"
|
|
||||||
CTEST_OUTPUT_ON_FAILURE: "ON"
|
|
||||||
DEBIAN_FRONTEND: noninteractive
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
job-cmake-macos-xcode: # uses cmake + xcodebuild
|
|
||||||
if: github.repository_owner == 'upx'
|
|
||||||
strategy:
|
|
||||||
fail-fast: false
|
|
||||||
matrix:
|
|
||||||
include:
|
|
||||||
- { os: macos-11, run_test: true }
|
|
||||||
- { os: macos-12, run_test: true }
|
|
||||||
- { os: macos-13, run_test: false } # TODO: enable once UPX fully works on macos-13
|
|
||||||
name: ${{ format('{0} cmake Xcode', matrix.os) }}
|
|
||||||
runs-on: ${{ matrix.os }}
|
|
||||||
steps:
|
|
||||||
- name: 'Check out code'
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
with: { submodules: true }
|
|
||||||
- { name: 'Config cmake Xcode', run: 'cmake -S . -B build/xcode -G Xcode' }
|
|
||||||
- { name: 'Build cmake Xcode default', run: 'cmake --build build/xcode' }
|
|
||||||
- { name: 'Build cmake Xcode Debug', run: 'cmake --build build/xcode --config Debug' }
|
|
||||||
- { name: 'Build cmake Xcode Release', run: 'cmake --build build/xcode --config Release' }
|
|
||||||
- name: 'Make artifact'
|
|
||||||
run: |
|
|
||||||
N=$(echo "upx-${GITHUB_REF_NAME}-${GITHUB_SHA:0:7}-weekly-ci-xcode-${{ matrix.os }}" | sed 's/[^0-9a-zA-Z_.-]/-/g')
|
|
||||||
mkdir -p "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")
|
|
||||||
# GitHub Actions magic: set "artifact_name" environment value for use in next step
|
|
||||||
echo "artifact_name=$N" >> $GITHUB_ENV
|
|
||||||
- name: ${{ format('Upload artifact {0}', env.artifact_name) }}
|
|
||||||
uses: actions/upload-artifact@v3
|
|
||||||
with:
|
|
||||||
name: ${{ env.artifact_name }}
|
|
||||||
path: tmp/artifact
|
|
||||||
- name: 'Run basic tests'
|
|
||||||
if: ${{ matrix.run_test }}
|
|
||||||
run: |
|
|
||||||
ctest --test-dir build/xcode -C Debug
|
|
||||||
# ctest --test-dir build/xcode -C Release
|
|
||||||
- name: 'Run install tests'
|
|
||||||
run: |
|
|
||||||
(cd build/xcode && DESTDIR=$PWD/Install-default cmake --install .)
|
|
||||||
(cd build/xcode && DESTDIR=$PWD/Install-debug cmake --install . --config Debug)
|
|
||||||
(cd build/xcode && DESTDIR=$PWD/Install-release cmake --install . --config Release)
|
|
||||||
ls -l build/xcode/Install-*/usr/local/bin/upx
|
|
||||||
@@ -1,92 +0,0 @@
|
|||||||
# Copyright (C) Markus Franz Xaver Johannes Oberhumer
|
|
||||||
# BS BuildSystem: build on Windows with 'cmake -G "Unix Makefiles"'
|
|
||||||
|
|
||||||
name: 'Weekly CI BS - cmake Windows make'
|
|
||||||
on:
|
|
||||||
schedule: [cron: '20 1 * * 3'] # run weekly Wednesday 01:20 UTC
|
|
||||||
workflow_dispatch:
|
|
||||||
env:
|
|
||||||
CMAKE_REQUIRED_QUIET: "OFF"
|
|
||||||
CTEST_OUTPUT_ON_FAILURE: "ON"
|
|
||||||
DEBIAN_FRONTEND: noninteractive
|
|
||||||
UPX_CMAKE_BUILD_FLAGS: --verbose
|
|
||||||
UPX_CMAKE_CONFIG_FLAGS: -G "Unix Makefiles"
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
job-cmake-windows-make: # uses cmake + make
|
|
||||||
if: github.repository_owner == 'upx'
|
|
||||||
strategy:
|
|
||||||
fail-fast: false
|
|
||||||
matrix:
|
|
||||||
include:
|
|
||||||
# INFO: the following don't work with GNU make (probably some quoting problems with spaces or backslashes)
|
|
||||||
# => use Ninja generator instead; see weekly-ci-bs-cmake-windows-ninja.yml
|
|
||||||
# # cl (msvc)
|
|
||||||
# - { os: windows-2019, cc: cl, cxx: cl, vsversion: 2019, arch: amd64 }
|
|
||||||
# - { os: windows-2019, cc: cl, cxx: cl, vsversion: 2019, arch: amd64_arm64 }
|
|
||||||
# - { os: windows-2019, cc: cl, cxx: cl, vsversion: 2019, arch: amd64_x86 }
|
|
||||||
# - { os: windows-2022, cc: cl, cxx: cl, vsversion: 2022, arch: amd64 }
|
|
||||||
# - { os: windows-2022, cc: cl, cxx: cl, vsversion: 2022, arch: amd64_arm64 }
|
|
||||||
# - { os: windows-2022, cc: cl, cxx: cl, vsversion: 2022, arch: amd64_x86 }
|
|
||||||
# # clang-cl
|
|
||||||
# - { os: windows-2022, cc: clang-cl, cxx: clang-cl, vsversion: 2022, arch: amd64 }
|
|
||||||
# clang
|
|
||||||
- { os: windows-2022, cc: clang, cxx: 'clang++', arch: amd64, xflags: '-static' }
|
|
||||||
# gcc (mingw-gcc)
|
|
||||||
- { os: windows-2022, cc: gcc, cxx: 'g++', arch: amd64, xflags: '-static' }
|
|
||||||
env:
|
|
||||||
CC: ${{ matrix.cc }} ${{ matrix.xflags }}
|
|
||||||
CXX: ${{ matrix.cxx }} ${{ matrix.xflags }}
|
|
||||||
name: ${{ format('{0} {1} {2}', matrix.cc, matrix.vsversion, matrix.arch) }}
|
|
||||||
runs-on: ${{ matrix.os }}
|
|
||||||
steps:
|
|
||||||
- name: 'Check out code'
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
with: { submodules: true }
|
|
||||||
- name: 'Set up Developer Command Prompt'
|
|
||||||
if: matrix.vsversion
|
|
||||||
uses: ilammy/msvc-dev-cmd@cec98b9d092141f74527d0afa6feb2af698cfe89 # v1.12.1
|
|
||||||
with:
|
|
||||||
vsversion: ${{ matrix.vsversion }}
|
|
||||||
arch: ${{ matrix.arch }}
|
|
||||||
- name: 'Init environment'
|
|
||||||
shell: bash
|
|
||||||
run: |
|
|
||||||
xtarget="windows-make-${{ matrix.cc }}-${{ matrix.vsversion }}-${{ matrix.arch}}"
|
|
||||||
echo "xtarget=$xtarget" >> $GITHUB_ENV
|
|
||||||
- name: 'Build cmake Make Debug'
|
|
||||||
shell: bash
|
|
||||||
run: |
|
|
||||||
make UPX_XTARGET=$xtarget xtarget/debug
|
|
||||||
ls -l build/xtarget/$xtarget/debug/upx.exe
|
|
||||||
file build/xtarget/$xtarget/debug/upx.exe || true
|
|
||||||
- name: 'Build cmake Make Release'
|
|
||||||
shell: bash
|
|
||||||
run: |
|
|
||||||
make UPX_XTARGET=$xtarget xtarget/release
|
|
||||||
ls -l build/xtarget/$xtarget/release/upx.exe
|
|
||||||
file build/xtarget/$xtarget/release/upx.exe || true
|
|
||||||
- name: 'Make artifact'
|
|
||||||
shell: bash
|
|
||||||
run: |
|
|
||||||
N=$(echo "upx-${GITHUB_REF_NAME}-${GITHUB_SHA:0:7}-weekly-ci-make-${xtarget}" | sed 's/[^0-9a-zA-Z_.-]/-/g')
|
|
||||||
mkdir -p "tmp/artifact/$N"
|
|
||||||
(cd build && cp -ai --parents xtarget/*/*/upx.exe "../tmp/artifact/$N")
|
|
||||||
# GitHub Actions magic: set "artifact_name" environment value for use in next step
|
|
||||||
echo "artifact_name=$N" >> $GITHUB_ENV
|
|
||||||
- name: ${{ format('Upload artifact {0}', env.artifact_name) }}
|
|
||||||
uses: actions/upload-artifact@v3
|
|
||||||
with:
|
|
||||||
name: ${{ env.artifact_name }}
|
|
||||||
path: tmp/artifact
|
|
||||||
- name: 'Run basic tests'
|
|
||||||
if: ${{ matrix.arch != 'amd64_arm64' }}
|
|
||||||
shell: bash
|
|
||||||
run: |
|
|
||||||
ctest --test-dir build/xtarget/$xtarget/debug
|
|
||||||
ctest --test-dir build/xtarget/$xtarget/release
|
|
||||||
- name: 'Run install tests'
|
|
||||||
shell: bash
|
|
||||||
run: |
|
|
||||||
env DESTDIR=./Install-debug cmake --install build/xtarget/$xtarget/debug
|
|
||||||
env DESTDIR=./Install-release cmake --install build/xtarget/$xtarget/release
|
|
||||||
@@ -1,91 +0,0 @@
|
|||||||
# Copyright (C) Markus Franz Xaver Johannes Oberhumer
|
|
||||||
# BS BuildSystem: build on Windows with 'cmake -G Ninja'
|
|
||||||
|
|
||||||
name: 'Weekly CI BS - cmake Windows Ninja'
|
|
||||||
on:
|
|
||||||
schedule: [cron: '30 1 * * 3'] # run weekly Wednesday 01:30 UTC
|
|
||||||
workflow_dispatch:
|
|
||||||
env:
|
|
||||||
CMAKE_REQUIRED_QUIET: "OFF"
|
|
||||||
CTEST_OUTPUT_ON_FAILURE: "ON"
|
|
||||||
DEBIAN_FRONTEND: noninteractive
|
|
||||||
UPX_CMAKE_BUILD_FLAGS: --verbose
|
|
||||||
UPX_CMAKE_CONFIG_FLAGS: -G Ninja
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
job-cmake-windows-ninja: # uses cmake + ninja
|
|
||||||
if: github.repository_owner == 'upx'
|
|
||||||
strategy:
|
|
||||||
fail-fast: false
|
|
||||||
matrix:
|
|
||||||
include:
|
|
||||||
# cl (msvc)
|
|
||||||
- { os: windows-2019, cc: cl, cxx: cl, vsversion: 2019, arch: amd64 }
|
|
||||||
- { os: windows-2019, cc: cl, cxx: cl, vsversion: 2019, arch: amd64_arm64 }
|
|
||||||
- { os: windows-2019, cc: cl, cxx: cl, vsversion: 2019, arch: amd64_x86 }
|
|
||||||
- { os: windows-2022, cc: cl, cxx: cl, vsversion: 2022, arch: amd64 }
|
|
||||||
- { os: windows-2022, cc: cl, cxx: cl, vsversion: 2022, arch: amd64_arm64 }
|
|
||||||
- { os: windows-2022, cc: cl, cxx: cl, vsversion: 2022, arch: amd64_x86 }
|
|
||||||
# clang-cl
|
|
||||||
- { os: windows-2022, cc: clang-cl, cxx: clang-cl, vsversion: 2022, arch: amd64 }
|
|
||||||
# clang
|
|
||||||
- { os: windows-2022, cc: clang, cxx: 'clang++', arch: amd64, xflags: '-static' }
|
|
||||||
# gcc (mingw-gcc)
|
|
||||||
- { os: windows-2022, cc: gcc, cxx: 'g++', arch: amd64, xflags: '-static' }
|
|
||||||
env:
|
|
||||||
CC: ${{ matrix.cc }} ${{ matrix.xflags }}
|
|
||||||
CXX: ${{ matrix.cxx }} ${{ matrix.xflags }}
|
|
||||||
name: ${{ format('{0} {1} {2}', matrix.cc, matrix.vsversion, matrix.arch) }}
|
|
||||||
runs-on: ${{ matrix.os }}
|
|
||||||
steps:
|
|
||||||
- name: 'Check out code'
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
with: { submodules: true }
|
|
||||||
- name: 'Set up Developer Command Prompt'
|
|
||||||
if: matrix.vsversion
|
|
||||||
uses: ilammy/msvc-dev-cmd@cec98b9d092141f74527d0afa6feb2af698cfe89 # v1.12.1
|
|
||||||
with:
|
|
||||||
vsversion: ${{ matrix.vsversion }}
|
|
||||||
arch: ${{ matrix.arch }}
|
|
||||||
- name: 'Init environment'
|
|
||||||
shell: bash
|
|
||||||
run: |
|
|
||||||
command -v ninja >/dev/null || choco install -y --no-progress ninja
|
|
||||||
xtarget="windows-ninja-${{ matrix.cc }}-${{ matrix.vsversion }}-${{ matrix.arch}}"
|
|
||||||
echo "xtarget=$xtarget" >> $GITHUB_ENV
|
|
||||||
- name: 'Build cmake Ninja Debug'
|
|
||||||
shell: bash
|
|
||||||
run: |
|
|
||||||
make UPX_XTARGET=$xtarget xtarget/debug
|
|
||||||
ls -l build/xtarget/$xtarget/debug/upx.exe
|
|
||||||
file build/xtarget/$xtarget/debug/upx.exe || true
|
|
||||||
- name: 'Build cmake Ninja Release'
|
|
||||||
shell: bash
|
|
||||||
run: |
|
|
||||||
make UPX_XTARGET=$xtarget xtarget/release
|
|
||||||
ls -l build/xtarget/$xtarget/release/upx.exe
|
|
||||||
file build/xtarget/$xtarget/release/upx.exe || true
|
|
||||||
- name: 'Make artifact'
|
|
||||||
shell: bash
|
|
||||||
run: |
|
|
||||||
N=$(echo "upx-${GITHUB_REF_NAME}-${GITHUB_SHA:0:7}-weekly-ci-ninja-${xtarget}" | sed 's/[^0-9a-zA-Z_.-]/-/g')
|
|
||||||
mkdir -p "tmp/artifact/$N"
|
|
||||||
(cd build && cp -ai --parents xtarget/*/*/upx.exe "../tmp/artifact/$N")
|
|
||||||
# GitHub Actions magic: set "artifact_name" environment value for use in next step
|
|
||||||
echo "artifact_name=$N" >> $GITHUB_ENV
|
|
||||||
- name: ${{ format('Upload artifact {0}', env.artifact_name) }}
|
|
||||||
uses: actions/upload-artifact@v3
|
|
||||||
with:
|
|
||||||
name: ${{ env.artifact_name }}
|
|
||||||
path: tmp/artifact
|
|
||||||
- name: 'Run basic tests'
|
|
||||||
if: ${{ matrix.arch != 'amd64_arm64' }}
|
|
||||||
shell: bash
|
|
||||||
run: |
|
|
||||||
ctest --test-dir build/xtarget/$xtarget/debug
|
|
||||||
ctest --test-dir build/xtarget/$xtarget/release
|
|
||||||
- name: 'Run install tests'
|
|
||||||
shell: bash
|
|
||||||
run: |
|
|
||||||
env DESTDIR=./Install-debug cmake --install build/xtarget/$xtarget/debug
|
|
||||||
env DESTDIR=./Install-release cmake --install build/xtarget/$xtarget/release
|
|
||||||
@@ -1,78 +0,0 @@
|
|||||||
# Copyright (C) Markus Franz Xaver Johannes Oberhumer
|
|
||||||
# BS BuildSystem: build on Windows with 'cmake -G "NMake Makefiles"'
|
|
||||||
|
|
||||||
name: 'Weekly CI BS - cmake Windows NMake'
|
|
||||||
on:
|
|
||||||
schedule: [cron: '40 1 * * 3'] # run weekly Wednesday 01:40 UTC
|
|
||||||
workflow_dispatch:
|
|
||||||
env:
|
|
||||||
CMAKE_REQUIRED_QUIET: "OFF"
|
|
||||||
CTEST_OUTPUT_ON_FAILURE: "ON"
|
|
||||||
DEBIAN_FRONTEND: noninteractive
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
job-cmake-windows-nmake: # uses cmake + nmake
|
|
||||||
if: github.repository_owner == 'upx'
|
|
||||||
strategy:
|
|
||||||
fail-fast: false
|
|
||||||
matrix:
|
|
||||||
include:
|
|
||||||
# clang-cl
|
|
||||||
- { os: windows-2022, vsversion: 2022, arch: amd64, clang_cl: true }
|
|
||||||
# msvc
|
|
||||||
- { os: windows-2019, vsversion: 2019, arch: amd64 }
|
|
||||||
- { os: windows-2019, vsversion: 2019, arch: amd64_arm64 }
|
|
||||||
- { os: windows-2019, vsversion: 2019, arch: amd64_x86 }
|
|
||||||
- { os: windows-2022, vsversion: 2022, arch: amd64 }
|
|
||||||
- { os: windows-2022, vsversion: 2022, arch: amd64_arm64 }
|
|
||||||
- { os: windows-2022, vsversion: 2022, arch: amd64_x86 }
|
|
||||||
name: ${{ format('vs{0} {1} {2}', matrix.vsversion, matrix.arch, matrix.clang_cl && 'clang-cl' || '') }}
|
|
||||||
runs-on: ${{ matrix.os }}
|
|
||||||
steps:
|
|
||||||
- name: 'Check out code'
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
with: { submodules: true }
|
|
||||||
- name: 'Set up Developer Command Prompt'
|
|
||||||
uses: ilammy/msvc-dev-cmd@cec98b9d092141f74527d0afa6feb2af698cfe89 # v1.12.1
|
|
||||||
with:
|
|
||||||
vsversion: ${{ matrix.vsversion }}
|
|
||||||
arch: ${{ matrix.arch }}
|
|
||||||
- name: 'Build cmake NMake Debug'
|
|
||||||
shell: cmd
|
|
||||||
run: |
|
|
||||||
set X=${{ matrix.clang_cl && '-DCMAKE_C_COMPILER=clang-cl -DCMAKE_CXX_COMPILER=clang-cl' || '' }}
|
|
||||||
cmake -S . -B build/debug -G "NMake Makefiles" -DCMAKE_VERBOSE_MAKEFILE=ON -DCMAKE_BUILD_TYPE=Debug %X%
|
|
||||||
cd build/debug
|
|
||||||
nmake
|
|
||||||
dir *.exe
|
|
||||||
- name: 'Build cmake NMake Release'
|
|
||||||
shell: cmd
|
|
||||||
run: |
|
|
||||||
set X=${{ matrix.clang_cl && '-DCMAKE_C_COMPILER=clang-cl -DCMAKE_CXX_COMPILER=clang-cl' || '' }}
|
|
||||||
cmake -S . -B build/release -G "NMake Makefiles" -DCMAKE_VERBOSE_MAKEFILE=ON %X%
|
|
||||||
cd build/release
|
|
||||||
nmake
|
|
||||||
dir *.exe
|
|
||||||
- name: 'Make artifact'
|
|
||||||
shell: bash
|
|
||||||
run: |
|
|
||||||
X="${{ matrix.clang_cl && '-clang-cl' || '' }}"
|
|
||||||
N=$(echo "upx-${GITHUB_REF_NAME}-${GITHUB_SHA:0:7}-weekly-ci-nmake-vs${{ matrix.vsversion }}-${{ matrix.arch }}$X" | sed 's/[^0-9a-zA-Z_.-]/-/g')
|
|
||||||
mkdir -p "tmp/artifact/$N"
|
|
||||||
(cd build && cp -ai --parents */upx.exe "../tmp/artifact/$N")
|
|
||||||
# GitHub Actions magic: set "artifact_name" environment value for use in next step
|
|
||||||
echo "artifact_name=$N" >> $GITHUB_ENV
|
|
||||||
- name: ${{ format('Upload artifact {0}', env.artifact_name) }}
|
|
||||||
uses: actions/upload-artifact@v3
|
|
||||||
with:
|
|
||||||
name: ${{ env.artifact_name }}
|
|
||||||
path: tmp/artifact
|
|
||||||
- name: 'Run basic tests'
|
|
||||||
if: ${{ matrix.arch != 'amd64_arm64' }}
|
|
||||||
run: |
|
|
||||||
ctest --test-dir build/debug
|
|
||||||
ctest --test-dir build/release
|
|
||||||
- name: 'Run install tests'
|
|
||||||
run: |
|
|
||||||
env DESTDIR=./Install-debug cmake --install build/debug
|
|
||||||
env DESTDIR=./Install-release cmake --install build/release
|
|
||||||
@@ -1,204 +0,0 @@
|
|||||||
# Copyright (C) Markus Franz Xaver Johannes Oberhumer
|
|
||||||
# CC CompilationCheck: test various clang and gcc versions
|
|
||||||
|
|
||||||
# Build under various Alpine Linux versions with clang and gcc, and
|
|
||||||
# also test building with C++20, C++23 and LTO.
|
|
||||||
|
|
||||||
# And also uses a subdirectory "upx with space" that contains whitespace in order
|
|
||||||
# to detect possible quoting issues.
|
|
||||||
|
|
||||||
# info: Alpine Linux 3.9 (released Jan 2019) has clang-5, cmake-3.13.0
|
|
||||||
# and gcc-8, which nicely matches our minimal build requirements
|
|
||||||
|
|
||||||
name: 'Weekly CI CC - Alpine Linux C++23'
|
|
||||||
on:
|
|
||||||
schedule: [cron: '00 2 * * 3'] # run weekly Wednesday 02:00 UTC
|
|
||||||
workflow_dispatch:
|
|
||||||
env:
|
|
||||||
CMAKE_REQUIRED_QUIET: "OFF"
|
|
||||||
CTEST_OUTPUT_ON_FAILURE: "ON"
|
|
||||||
DEBIAN_FRONTEND: noninteractive
|
|
||||||
UPX_CMAKE_CONFIG_FLAGS: -DCMAKE_VERBOSE_MAKEFILE=ON
|
|
||||||
UPX_TESTSUITE_LEVEL: 4
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
job-alpine-cmake: # uses cmake + make
|
|
||||||
if: github.repository_owner == 'upx'
|
|
||||||
strategy:
|
|
||||||
fail-fast: false
|
|
||||||
matrix:
|
|
||||||
include:
|
|
||||||
- { container: 'alpine:3.9' , use_cxx20: 0, use_cxx2b: 0, use_lto: 0 } # Jan 2019: C++17; clang-5 & gcc-8
|
|
||||||
- { container: 'alpine:3.10', use_cxx20: 0, use_cxx2b: 0, use_lto: 0 }
|
|
||||||
- { container: 'alpine:3.11', use_cxx20: 0, use_cxx2b: 0, use_lto: 0 }
|
|
||||||
- { container: 'alpine:3.12', use_cxx20: 0, use_cxx2b: 0, use_lto: 0 }
|
|
||||||
- { container: 'alpine:3.13', use_cxx20: 1, use_cxx2b: 0, use_lto: 0 } # Jan 2021: C++20; clang-10 & gcc-10
|
|
||||||
- { container: 'alpine:3.14', use_cxx20: 1, use_cxx2b: 0, use_lto: 0 }
|
|
||||||
- { container: 'alpine:3.15', use_cxx20: 1, use_cxx2b: 0, use_lto: 1 } # Nov 2021: LTO; clang-12 & gcc-10 & binutils-2.37
|
|
||||||
- { container: 'alpine:3.16', use_cxx20: 1, use_cxx2b: 1, use_lto: 1 } # May 2022: C++2b; clang-13 & gcc-11
|
|
||||||
- { container: 'alpine:3.17', use_cxx20: 1, use_cxx2b: 1, use_lto: 1 }
|
|
||||||
- { container: 'alpine:3.18', use_cxx20: 1, use_cxx2b: 1, use_lto: 1 }
|
|
||||||
- { container: 'alpine:edge', use_cxx20: 1, use_cxx2b: 1, use_lto: 1 }
|
|
||||||
- { container: 'i386/alpine:edge', use_cxx20: 1, use_cxx2b: 1, use_lto: 1 }
|
|
||||||
name: ${{ format('container {0}', matrix.container) }}
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
container: ${{ matrix.container }}
|
|
||||||
steps:
|
|
||||||
- name: ${{ format('Install packages {0}', matrix.container) }}
|
|
||||||
run: |
|
|
||||||
apk update && apk upgrade && apk add clang cmake g++ git make
|
|
||||||
case ${{ matrix.container }} in
|
|
||||||
# clang-dev is needed on Alpine versions <= 3.11 for clang headers like <emmintrin.h>
|
|
||||||
*:3.[0-9] | *:3.1[0-1]) apk add clang-dev ;;
|
|
||||||
esac
|
|
||||||
case ${{ matrix.container }}-${{ matrix.use_lto }} in
|
|
||||||
# llvm-dev is needed on Alpine versions <= 3.18 for -flto
|
|
||||||
*:3.[0-9]-1 | *:3.1[0-8]-1) apk add llvm-dev ;;
|
|
||||||
esac
|
|
||||||
# set environment vars
|
|
||||||
x="$(apk list -I "$(apk info -Wq "$(which clang)")")"; echo "clang_package=${x%% *}" >> $GITHUB_ENV
|
|
||||||
x="$(apk list -I "$(apk info -Wq "$(which gcc)")")"; echo "gcc_package=${x%% *}" >> $GITHUB_ENV
|
|
||||||
N=$(echo "upx-${GITHUB_REF_NAME}-${GITHUB_SHA:0:7}-weekly-ci-alpine-${{ matrix.container }}" | sed 's/[^0-9a-zA-Z_.-]/-/g')
|
|
||||||
echo "artifact_name=$N" >> $GITHUB_ENV
|
|
||||||
# create user upx:upx 2000:2000 for file system tests below ("sudo")
|
|
||||||
adduser upx -u 2000 -D && cd /home/upx && chmod 00700 . && chown -R upx:upx .
|
|
||||||
- name: ${{ format('Check out UPX {0} source code', github.ref_name) }}
|
|
||||||
run: |
|
|
||||||
git clone --branch "$GITHUB_REF_NAME" --depth 1 https://github.com/upx/upx "upx with space"
|
|
||||||
git -C "upx with space" submodule update --init
|
|
||||||
|
|
||||||
# build with default C11 and C++17
|
|
||||||
- name: ${{ format('Build clang Release with {0}', env.clang_package) }}
|
|
||||||
run: 'make -C "upx with space" UPX_XTARGET=clang-static CC="clang -static" CXX="clang++ -static"'
|
|
||||||
- name: ${{ format('Build clang Debug with {0}', env.clang_package) }}
|
|
||||||
run: 'make -C "upx with space" UPX_XTARGET=clang-static CC="clang -static" CXX="clang++ -static" xtarget/debug'
|
|
||||||
- name: ${{ format('Build gcc Release with {0}', env.gcc_package) }}
|
|
||||||
run: 'make -C "upx with space" UPX_XTARGET=gcc-static CC="gcc -static" CXX="g++ -static"'
|
|
||||||
- name: ${{ format('Build gcc Debug with {0}', env.gcc_package) }}
|
|
||||||
run: 'make -C "upx with space" UPX_XTARGET=gcc-static CC="gcc -static" CXX="g++ -static" xtarget/debug'
|
|
||||||
|
|
||||||
# build with C17 and C++20
|
|
||||||
- name: ${{ format('Build clang C++20 Release with {0}', env.clang_package) }}
|
|
||||||
if: matrix.use_cxx20
|
|
||||||
run: |
|
|
||||||
export UPX_CONFIG_DISABLE_C_STANDARD=ON UPX_CONFIG_DISABLE_CXX_STANDARD=ON
|
|
||||||
make -C "upx with space" UPX_XTARGET=clang-static-cxx20 CC="clang -static -std=gnu17" CXX="clang++ -static -std=gnu++20"
|
|
||||||
- name: ${{ format('Build clang C++20 Debug with {0}', env.clang_package) }}
|
|
||||||
if: matrix.use_cxx20
|
|
||||||
run: |
|
|
||||||
export UPX_CONFIG_DISABLE_C_STANDARD=ON UPX_CONFIG_DISABLE_CXX_STANDARD=ON
|
|
||||||
make -C "upx with space" UPX_XTARGET=clang-static-cxx20 CC="clang -static -std=gnu17" CXX="clang++ -static -std=gnu++20" xtarget/debug
|
|
||||||
- name: ${{ format('Build gcc C++20 Release with {0}', env.gcc_package) }}
|
|
||||||
if: matrix.use_cxx20
|
|
||||||
run: |
|
|
||||||
export UPX_CONFIG_DISABLE_C_STANDARD=ON UPX_CONFIG_DISABLE_CXX_STANDARD=ON
|
|
||||||
make -C "upx with space" UPX_XTARGET=gcc-static-cxx20 CC="gcc -static -std=gnu17" CXX="g++ -static -std=gnu++20"
|
|
||||||
- name: ${{ format('Build gcc C++20 Debug with {0}', env.gcc_package) }}
|
|
||||||
if: matrix.use_cxx20
|
|
||||||
run: |
|
|
||||||
export UPX_CONFIG_DISABLE_C_STANDARD=ON UPX_CONFIG_DISABLE_CXX_STANDARD=ON
|
|
||||||
make -C "upx with space" UPX_XTARGET=gcc-static-cxx20 CC="gcc -static -std=gnu17" CXX="g++ -static -std=gnu++20" xtarget/debug
|
|
||||||
|
|
||||||
# build with C23 and C++23
|
|
||||||
- name: ${{ format('Build clang C++23 Release with {0}', env.clang_package) }}
|
|
||||||
if: matrix.use_cxx23 || matrix.use_cxx2b
|
|
||||||
run: |
|
|
||||||
export UPX_CONFIG_DISABLE_C_STANDARD=ON UPX_CONFIG_DISABLE_CXX_STANDARD=ON
|
|
||||||
a=gnu23; b=gnu++23; if test "X${{ matrix.use_cxx2b }}" = X1; then a=gnu2x; b=gnu++2b; fi
|
|
||||||
make -C "upx with space" UPX_XTARGET=clang-static-cxx23 CC="clang -static -std=$a" CXX="clang++ -static -std=$b"
|
|
||||||
- name: ${{ format('Build clang C++23 Debug with {0}', env.clang_package) }}
|
|
||||||
if: matrix.use_cxx23 || matrix.use_cxx2b
|
|
||||||
run: |
|
|
||||||
export UPX_CONFIG_DISABLE_C_STANDARD=ON UPX_CONFIG_DISABLE_CXX_STANDARD=ON
|
|
||||||
a=gnu23; b=gnu++23; if test "X${{ matrix.use_cxx2b }}" = X1; then a=gnu2x; b=gnu++2b; fi
|
|
||||||
make -C "upx with space" UPX_XTARGET=clang-static-cxx23 CC="clang -static -std=$a" CXX="clang++ -static -std=$b" xtarget/debug
|
|
||||||
- name: ${{ format('Build gcc C++23 Release with {0}', env.gcc_package) }}
|
|
||||||
if: matrix.use_cxx23 || matrix.use_cxx2b
|
|
||||||
run: |
|
|
||||||
export UPX_CONFIG_DISABLE_C_STANDARD=ON UPX_CONFIG_DISABLE_CXX_STANDARD=ON
|
|
||||||
a=gnu23; b=gnu++23; if test "X${{ matrix.use_cxx2b }}" = X1; then a=gnu2x; b=gnu++2b; fi
|
|
||||||
make -C "upx with space" UPX_XTARGET=gcc-static-cxx23 CC="gcc -static -std=$a" CXX="g++ -static -std=$b"
|
|
||||||
- name: ${{ format('Build gcc C++23 Debug with {0}', env.gcc_package) }}
|
|
||||||
if: matrix.use_cxx23 || matrix.use_cxx2b
|
|
||||||
run: |
|
|
||||||
export UPX_CONFIG_DISABLE_C_STANDARD=ON UPX_CONFIG_DISABLE_CXX_STANDARD=ON
|
|
||||||
a=gnu23; b=gnu++23; if test "X${{ matrix.use_cxx2b }}" = X1; then a=gnu2x; b=gnu++2b; fi
|
|
||||||
make -C "upx with space" UPX_XTARGET=gcc-static-cxx23 CC="gcc -static -std=$a" CXX="g++ -static -std=$b" xtarget/debug
|
|
||||||
|
|
||||||
# build with -flto
|
|
||||||
- name: ${{ format('Build clang LTO Release with {0}', env.clang_package) }}
|
|
||||||
if: matrix.use_lto
|
|
||||||
run: |
|
|
||||||
make -C "upx with space" UPX_XTARGET=clang-static-cxxlto CC="clang -static -flto" CXX="clang++ -static -flto"
|
|
||||||
- name: ${{ format('Build clang LTO Debug with {0}', env.clang_package) }}
|
|
||||||
if: matrix.use_lto
|
|
||||||
run: |
|
|
||||||
make -C "upx with space" UPX_XTARGET=clang-static-cxxlto CC="clang -static -flto" CXX="clang++ -static -flto" xtarget/debug
|
|
||||||
- name: ${{ format('Build gcc LTO Release with {0}', env.gcc_package) }}
|
|
||||||
if: matrix.use_lto
|
|
||||||
run: |
|
|
||||||
make -C "upx with space" UPX_XTARGET=gcc-static-cxxlto CC="gcc -static -flto" CXX="g++ -static -flto"
|
|
||||||
- name: ${{ format('Build gcc LTO Debug with {0}', env.gcc_package) }}
|
|
||||||
if: matrix.use_lto
|
|
||||||
run: |
|
|
||||||
make -C "upx with space" UPX_XTARGET=gcc-static-cxxlto CC="gcc -static -flto" CXX="g++ -static -flto" xtarget/debug
|
|
||||||
|
|
||||||
- { name: 'Strip release binaries', run: 'strip -p --strip-unneeded "upx with space"/build/*/*/release/upx' }
|
|
||||||
|
|
||||||
- name: ${{ format('Upload artifact {0}', env.artifact_name) }}
|
|
||||||
if: ${{ !startsWith(matrix.container, 'i386/') }} # i386: missing nodejs on host
|
|
||||||
uses: actions/upload-artifact@v3
|
|
||||||
with:
|
|
||||||
name: ${{ env.artifact_name }}
|
|
||||||
path: 'upx with space*/build/*/*/*/upx'
|
|
||||||
|
|
||||||
- name: 'Run install tests'
|
|
||||||
run: |
|
|
||||||
(cd "upx with space"/build/xtarget/clang-static/debug && DESTDIR="$PWD/Install with cmake" cmake --install .)
|
|
||||||
(cd "upx with space"/build/xtarget/clang-static/debug && DESTDIR="$PWD/Install with make" make install)
|
|
||||||
(cd "upx with space"/build/xtarget/clang-static/release && DESTDIR="$PWD/Install with cmake" cmake --install .)
|
|
||||||
(cd "upx with space"/build/xtarget/clang-static/release && DESTDIR="$PWD/Install with make" make install)
|
|
||||||
(cd "upx with space"/build/xtarget/gcc-static/debug && DESTDIR="$PWD/Install with cmake" cmake --install .)
|
|
||||||
(cd "upx with space"/build/xtarget/gcc-static/debug && DESTDIR="$PWD/Install with make" make install)
|
|
||||||
(cd "upx with space"/build/xtarget/gcc-static/release && DESTDIR="$PWD/Install with cmake" cmake --install .)
|
|
||||||
(cd "upx with space"/build/xtarget/gcc-static/release && DESTDIR="$PWD/Install with make" make install)
|
|
||||||
|
|
||||||
- { name: 'Run basic tests clang Debug', run: 'make -C "upx with space"/build/xtarget/clang-static/debug test' }
|
|
||||||
- { name: 'Run basic tests clang Release', run: 'make -C "upx with space"/build/xtarget/clang-static/release test' }
|
|
||||||
- { name: 'Run basic tests gcc Debug', run: 'make -C "upx with space"/build/xtarget/gcc-static/debug test' }
|
|
||||||
- { name: 'Run basic tests gcc Release', run: 'make -C "upx with space"/build/xtarget/gcc-static/release test' }
|
|
||||||
|
|
||||||
- name: 'Run basic tests C++20, C++23 and LTO'
|
|
||||||
if: matrix.use_cxx20 || matrix.use_cxx23 || matrix.use_cxx2b || matrix.use_lto
|
|
||||||
run: |
|
|
||||||
for dir in "upx with space"/build/xtarget/*-cxx*/*; do
|
|
||||||
echo "===== $dir"
|
|
||||||
make -C "$dir" test
|
|
||||||
done
|
|
||||||
|
|
||||||
- name: 'Run file system test suite (busybox)'
|
|
||||||
run: |
|
|
||||||
apk add bash sudo
|
|
||||||
testsuite="$(readlink -fn "upx with space"/misc/testsuite/test_symlinks.sh)"
|
|
||||||
cd "upx with space"/build/xtarget/gcc-static/release
|
|
||||||
# IMPORTANT: do NOT run as user root!
|
|
||||||
chmod a+w . && sudo -u upx bash "$testsuite"
|
|
||||||
|
|
||||||
# test suite
|
|
||||||
- name: ${{ format('Run test suite level {0}', env.UPX_TESTSUITE_LEVEL) }}
|
|
||||||
run: |
|
|
||||||
# testsuite needs bash and working "readlink -en" and "sha256sum -b"
|
|
||||||
apk add bash coreutils
|
|
||||||
# use a directory that contains whitespace to detect possible quoting issues
|
|
||||||
git clone --depth=1 https://github.com/upx/upx-testsuite "upx-testsuite with space"
|
|
||||||
export upx_testsuite_SRCDIR="$(readlink -fn "upx-testsuite with space")"
|
|
||||||
testsuite_1="$(readlink -fn "upx with space"/misc/testsuite/upx_testsuite_1.sh)"
|
|
||||||
(cd "upx with space"/build/xtarget/gcc-static/release && upx_exe=./upx bash "$testsuite_1")
|
|
||||||
|
|
||||||
- name: 'Run file system test suite (coreutils)'
|
|
||||||
run: |
|
|
||||||
apk add bash coreutils sudo
|
|
||||||
testsuite="$(readlink -fn "upx with space"/misc/testsuite/test_symlinks.sh)"
|
|
||||||
cd "upx with space"/build/xtarget/gcc-static/release
|
|
||||||
# IMPORTANT: do NOT run as user root!
|
|
||||||
chmod a+w . && sudo -u upx bash "$testsuite"
|
|
||||||
@@ -1,174 +0,0 @@
|
|||||||
# Copyright (C) Markus Franz Xaver Johannes Oberhumer
|
|
||||||
# CC CompilationCheck: compile with various mingw-gcc versions and run tests under Wine
|
|
||||||
|
|
||||||
name: 'Weekly CI CC - Alpine Linux MinGW'
|
|
||||||
on:
|
|
||||||
schedule: [cron: '20 2 * * 3'] # run weekly Wednesday 02:20 UTC
|
|
||||||
workflow_dispatch:
|
|
||||||
env:
|
|
||||||
CMAKE_REQUIRED_QUIET: "OFF"
|
|
||||||
CTEST_OUTPUT_ON_FAILURE: "ON"
|
|
||||||
DEBIAN_FRONTEND: noninteractive
|
|
||||||
UPX_CMAKE_CONFIG_FLAGS: -DCMAKE_VERBOSE_MAKEFILE=ON
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
job-alpine-mingw: # uses cmake + make
|
|
||||||
if: github.repository_owner == 'upx'
|
|
||||||
strategy:
|
|
||||||
fail-fast: false
|
|
||||||
matrix:
|
|
||||||
include:
|
|
||||||
- { container: 'alpine:3.11', wine: false, i686_mingw: false } # skip Wine testsuite; TODO: internal error: doctest check failed
|
|
||||||
- { container: 'alpine:3.12', wine: false, i686_mingw: false } # skip Wine testsuite; TODO: internal error: doctest check failed
|
|
||||||
- { container: 'alpine:3.13', wine: true, i686_mingw: false } # wine-4.0.3
|
|
||||||
- { container: 'alpine:3.14', wine: true, i686_mingw: false } # wine-6.18
|
|
||||||
- { container: 'alpine:3.15', wine: true, i686_mingw: false } # wine-6.23
|
|
||||||
- { container: 'alpine:3.16', wine: true, i686_mingw: false } # wine-7.8
|
|
||||||
- { container: 'alpine:3.17', wine: true, i686_mingw: false } # wine-7.21
|
|
||||||
# Wine >= 8.0 can run i686 32-bit programs in WOW64 mode on pure 64-bit systems
|
|
||||||
- { container: 'alpine:3.18', wine: true, i686_mingw: true } # wine-8.13
|
|
||||||
- { container: 'alpine:edge', wine: true, i686_mingw: true } # wine-8.17
|
|
||||||
name: ${{ format('container {0}', matrix.container) }}
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
container: ${{ matrix.container }}
|
|
||||||
steps:
|
|
||||||
- name: ${{ format('Install packages {0}', matrix.container) }}
|
|
||||||
run: |
|
|
||||||
apk update && apk upgrade && apk add bash cmake coreutils file git make tar xz
|
|
||||||
apk add mingw-w64-gcc
|
|
||||||
test "${{ matrix.i686_mingw }}" = "true" && apk add i686-mingw-w64-gcc
|
|
||||||
test "${{ matrix.wine }}" = "true" && apk add wine
|
|
||||||
true
|
|
||||||
- name: ${{ format('Check out UPX {0} source code', github.ref_name) }}
|
|
||||||
run: |
|
|
||||||
# this seems to be needed for Wine when running in a container (beause of UID mismatch??)
|
|
||||||
mkdir -p -v ~/.wine
|
|
||||||
# this seems to be needed when running in a container (beause of UID mismatch??)
|
|
||||||
git config --global --add safe.directory '*'
|
|
||||||
git clone --branch "$GITHUB_REF_NAME" --depth 1 https://github.com/upx/upx .
|
|
||||||
git submodule update --init
|
|
||||||
- name: 'Build cmake extra/cross-windows-mingw32/debug'
|
|
||||||
if: ${{ matrix.i686_mingw }}
|
|
||||||
run: 'make build/extra/cross-windows-mingw32/debug'
|
|
||||||
- name: 'Build cmake extra/cross-windows-mingw32/release'
|
|
||||||
if: ${{ matrix.i686_mingw }}
|
|
||||||
run: 'make build/extra/cross-windows-mingw32/release'
|
|
||||||
- name: 'Build cmake extra/cross-windows-mingw64/debug'
|
|
||||||
run: |
|
|
||||||
# on Alpine 3.11 and 3.12 CMake does not find AR; Alpine >= 3.13 (with CMake 3.18.4) works
|
|
||||||
X=
|
|
||||||
case ${{ matrix.container }} in
|
|
||||||
*:3.1[12]) X="CMAKE_AR=/usr/bin/x86_64-w64-mingw32-ar" ;;
|
|
||||||
esac
|
|
||||||
make build/extra/cross-windows-mingw64/debug $X
|
|
||||||
- name: 'Build cmake extra/cross-windows-mingw64/release'
|
|
||||||
run: |
|
|
||||||
# on Alpine 3.11 and 3.12 CMake does not find AR; Alpine >= 3.13 (with CMake 3.18.4) works
|
|
||||||
X=
|
|
||||||
case ${{ matrix.container }} in
|
|
||||||
*:3.1[12]) X="CMAKE_AR=/usr/bin/x86_64-w64-mingw32-ar" ;;
|
|
||||||
esac
|
|
||||||
make build/extra/cross-windows-mingw64/release $X
|
|
||||||
- name: 'Make artifact'
|
|
||||||
shell: bash
|
|
||||||
run: |
|
|
||||||
N=$(echo "upx-${GITHUB_REF_NAME}-${GITHUB_SHA:0:7}-weekly-ci-alpine-mingw-${{ matrix.container }}" | sed 's/[^0-9a-zA-Z_.-]/-/g')
|
|
||||||
mkdir -p "tmp/artifact/$N"
|
|
||||||
(cd build && shopt -s nullglob && cp -ai --parents */upx{,.exe} */*/*/upx{,.exe} "../tmp/artifact/$N")
|
|
||||||
(cd tmp/artifact && tar --sort=name -czf "$N.tar.gz" "$N" && rm -rf "./$N")
|
|
||||||
# GitHub Actions magic: set "artifact_name" environment value for use in next step
|
|
||||||
echo "artifact_name=$N" >> $GITHUB_ENV
|
|
||||||
- name: ${{ format('Upload artifact {0}', env.artifact_name) }}
|
|
||||||
uses: actions/upload-artifact@v3
|
|
||||||
with:
|
|
||||||
name: ${{ env.artifact_name }}
|
|
||||||
path: tmp/artifact
|
|
||||||
|
|
||||||
- name: ${{ format('Run test suite under Wine') }}
|
|
||||||
if: ${{ matrix.wine }}
|
|
||||||
run: |
|
|
||||||
git clone --depth=1 https://github.com/upx/upx-testsuite ../upx-testsuite
|
|
||||||
testsuite_1="$(readlink -fn ./misc/testsuite/upx_testsuite_1.sh)"
|
|
||||||
export upx_exe_runner="wine64"
|
|
||||||
if test "${{ matrix.i686_mingw }}" = "true"; then
|
|
||||||
UPX_TESTSUITE_LEVEL=2 \
|
|
||||||
env -C build/extra/cross-windows-mingw32/debug upx_exe=./upx.exe bash "$testsuite_1"
|
|
||||||
UPX_TESTSUITE_LEVEL=4 \
|
|
||||||
env -C build/extra/cross-windows-mingw32/release upx_exe=./upx.exe bash "$testsuite_1"
|
|
||||||
fi
|
|
||||||
UPX_TESTSUITE_LEVEL=2 \
|
|
||||||
env -C build/extra/cross-windows-mingw64/debug upx_exe=./upx.exe bash "$testsuite_1"
|
|
||||||
UPX_TESTSUITE_LEVEL=4 \
|
|
||||||
env -C build/extra/cross-windows-mingw64/release upx_exe=./upx.exe bash "$testsuite_1"
|
|
||||||
|
|
||||||
- name: 'Run basic tests under Wine - mingw32/debug'
|
|
||||||
if: ${{ matrix.wine && matrix.i686_mingw }}
|
|
||||||
shell: bash
|
|
||||||
run: |
|
|
||||||
set -ex -o pipefail
|
|
||||||
cd build/extra/cross-windows-mingw32/debug
|
|
||||||
[[ -f upx && ! -f upx.exe ]] && mv -i -v upx upx.exe
|
|
||||||
pwd; file ./upx.exe
|
|
||||||
wine=wine64
|
|
||||||
tt='./upx.exe'
|
|
||||||
$wine ./upx.exe --version-short
|
|
||||||
$wine ./upx.exe -3 $tt -o tt.packed.exe
|
|
||||||
$wine ./upx.exe -l tt.packed.exe
|
|
||||||
$wine ./upx.exe -t tt.packed.exe
|
|
||||||
$wine ./upx.exe -d tt.packed.exe -o tt.unpacked.exe
|
|
||||||
$wine ./tt.packed.exe --version-short
|
|
||||||
$wine ./tt.unpacked.exe --version-short
|
|
||||||
|
|
||||||
- name: 'Run basic tests under Wine - mingw32/release'
|
|
||||||
if: ${{ matrix.wine && matrix.i686_mingw }}
|
|
||||||
shell: bash
|
|
||||||
run: |
|
|
||||||
set -ex -o pipefail
|
|
||||||
cd build/extra/cross-windows-mingw32/release
|
|
||||||
[[ -f upx && ! -f upx.exe ]] && mv -i -v upx upx.exe
|
|
||||||
pwd; file ./upx.exe
|
|
||||||
wine=wine64
|
|
||||||
tt='./upx.exe'
|
|
||||||
$wine ./upx.exe --version-short
|
|
||||||
$wine ./upx.exe -3 $tt -o tt.packed.exe
|
|
||||||
$wine ./upx.exe -l tt.packed.exe
|
|
||||||
$wine ./upx.exe -t tt.packed.exe
|
|
||||||
$wine ./upx.exe -d tt.packed.exe -o tt.unpacked.exe
|
|
||||||
$wine ./tt.packed.exe --version-short
|
|
||||||
$wine ./tt.unpacked.exe --version-short
|
|
||||||
|
|
||||||
- name: 'Run basic tests under Wine - mingw64/debug'
|
|
||||||
if: ${{ matrix.wine }}
|
|
||||||
shell: bash
|
|
||||||
run: |
|
|
||||||
set -ex -o pipefail
|
|
||||||
cd build/extra/cross-windows-mingw64/debug
|
|
||||||
[[ -f upx && ! -f upx.exe ]] && mv -i -v upx upx.exe
|
|
||||||
pwd; file ./upx.exe
|
|
||||||
wine=wine64
|
|
||||||
tt='./upx.exe'
|
|
||||||
$wine ./upx.exe --version-short
|
|
||||||
$wine ./upx.exe -3 $tt -o tt.packed.exe
|
|
||||||
$wine ./upx.exe -l tt.packed.exe
|
|
||||||
$wine ./upx.exe -t tt.packed.exe
|
|
||||||
$wine ./upx.exe -d tt.packed.exe -o tt.unpacked.exe
|
|
||||||
$wine ./tt.packed.exe --version-short
|
|
||||||
$wine ./tt.unpacked.exe --version-short
|
|
||||||
|
|
||||||
- name: 'Run basic tests under Wine - mingw64/release'
|
|
||||||
if: ${{ matrix.wine }}
|
|
||||||
shell: bash
|
|
||||||
run: |
|
|
||||||
set -ex -o pipefail
|
|
||||||
cd build/extra/cross-windows-mingw64/release
|
|
||||||
[[ -f upx && ! -f upx.exe ]] && mv -i -v upx upx.exe
|
|
||||||
pwd; file ./upx.exe
|
|
||||||
wine=wine64
|
|
||||||
tt='./upx.exe'
|
|
||||||
$wine ./upx.exe --version-short
|
|
||||||
$wine ./upx.exe -3 $tt -o tt.packed.exe
|
|
||||||
$wine ./upx.exe -l tt.packed.exe
|
|
||||||
$wine ./upx.exe -t tt.packed.exe
|
|
||||||
$wine ./upx.exe -d tt.packed.exe -o tt.unpacked.exe
|
|
||||||
$wine ./tt.packed.exe --version-short
|
|
||||||
$wine ./tt.unpacked.exe --version-short
|
|
||||||
@@ -1,78 +0,0 @@
|
|||||||
# Copyright (C) Markus Franz Xaver Johannes Oberhumer
|
|
||||||
# CC CompilationCheck: test llvm-mingw
|
|
||||||
|
|
||||||
# see https://github.com/mstorsjo/llvm-mingw
|
|
||||||
|
|
||||||
name: 'Weekly CI CC - llvm-mingw'
|
|
||||||
on:
|
|
||||||
schedule: [cron: '30 2 * * 3'] # run weekly Wednesday 02:30 UTC
|
|
||||||
workflow_dispatch:
|
|
||||||
env:
|
|
||||||
CMAKE_REQUIRED_QUIET: "OFF"
|
|
||||||
CTEST_OUTPUT_ON_FAILURE: "ON"
|
|
||||||
DEBIAN_FRONTEND: noninteractive
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
job-llvm-mingw: # uses cmake + make
|
|
||||||
if: github.repository_owner == 'upx'
|
|
||||||
strategy:
|
|
||||||
fail-fast: false
|
|
||||||
matrix:
|
|
||||||
include:
|
|
||||||
- name: llvm-mingw-20230614-msvcrt
|
|
||||||
llvm_version: 16.0.6
|
|
||||||
url: 'https://github.com/mstorsjo/llvm-mingw/releases/download/20230614/llvm-mingw-20230614-msvcrt-ubuntu-20.04-x86_64.tar.xz'
|
|
||||||
- name: llvm-mingw-20230614-ucrt
|
|
||||||
llvm_version: 16.0.6
|
|
||||||
url: 'https://github.com/mstorsjo/llvm-mingw/releases/download/20230614/llvm-mingw-20230614-ucrt-ubuntu-20.04-x86_64.tar.xz'
|
|
||||||
- name: llvm-mingw-20231017-msvcrt
|
|
||||||
llvm_version: 17.0.3
|
|
||||||
url: 'https://github.com/mstorsjo/llvm-mingw/releases/download/20231017/llvm-mingw-20231017-msvcrt-ubuntu-20.04-x86_64.tar.xz'
|
|
||||||
- name: llvm-mingw-20231017-ucrt
|
|
||||||
llvm_version: 17.0.3
|
|
||||||
url: 'https://github.com/mstorsjo/llvm-mingw/releases/download/20231017/llvm-mingw-20231017-ucrt-ubuntu-20.04-x86_64.tar.xz'
|
|
||||||
name: ${{ format('{0} {1}', matrix.name, matrix.llvm_version) }}
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- name: 'Check out code'
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
with: { submodules: true }
|
|
||||||
- name: ${{ format('Install {0} {1}', matrix.name, matrix.llvm_version) }}
|
|
||||||
run: |
|
|
||||||
mkdir -p -v ~/.local/bin
|
|
||||||
cd ~/.local/bin
|
|
||||||
wget -q '${{ matrix.url }}'
|
|
||||||
ls -l ./llvm-mingw*.tar.*
|
|
||||||
tar -xoaf ./llvm-mingw*.tar.*
|
|
||||||
rm ./llvm-mingw*.tar.*
|
|
||||||
# update PATH
|
|
||||||
cd ./llvm-mingw*/bin
|
|
||||||
echo "PATH=$PWD:$PATH" >> $GITHUB_ENV
|
|
||||||
- name: 'Build clang aarch64'
|
|
||||||
run: |
|
|
||||||
export CC="aarch64-w64-mingw32-clang -static" CXX="aarch64-w64-mingw32-clang++ -static"
|
|
||||||
make UPX_XTARGET=aarch64-w64-mingw32-clang xtarget/debug xtarget/release
|
|
||||||
- name: 'Build clang armv7'
|
|
||||||
run: |
|
|
||||||
export CC="armv7-w64-mingw32-clang -static" CXX="armv7-w64-mingw32-clang++ -static"
|
|
||||||
make UPX_XTARGET=armv7-w64-mingw32-clang xtarget/debug xtarget/release
|
|
||||||
- name: 'Build clang i686'
|
|
||||||
run: |
|
|
||||||
export CC="i686-w64-mingw32-clang -static" CXX="i686-w64-mingw32-clang++ -static"
|
|
||||||
make UPX_XTARGET=i686-w64-mingw32-clang xtarget/debug xtarget/release
|
|
||||||
- name: 'Build clang x86_64'
|
|
||||||
run: |
|
|
||||||
export CC="x86_64-w64-mingw32-clang -static" CXX="x86_64-w64-mingw32-clang++ -static"
|
|
||||||
make UPX_XTARGET=x86_64-w64-mingw32-clang xtarget/debug xtarget/release
|
|
||||||
- name: 'Make artifact'
|
|
||||||
run: |
|
|
||||||
N=$(echo "upx-${GITHUB_REF_NAME}-${GITHUB_SHA:0:7}-weekly-ci-${{ matrix.name }}-${{ matrix.llvm_version }}" | sed 's/[^0-9a-zA-Z_.-]/-/g')
|
|
||||||
mkdir -p "tmp/artifact/$N"
|
|
||||||
(cd build && cp -ai --parents */*/*/upx.exe "../tmp/artifact/$N")
|
|
||||||
# GitHub Actions magic: set "artifact_name" environment value for use in next step
|
|
||||||
echo "artifact_name=$N" >> $GITHUB_ENV
|
|
||||||
- name: ${{ format('Upload artifact {0}', env.artifact_name) }}
|
|
||||||
uses: actions/upload-artifact@v3
|
|
||||||
with:
|
|
||||||
name: ${{ env.artifact_name }}
|
|
||||||
path: tmp/artifact
|
|
||||||
@@ -1,129 +0,0 @@
|
|||||||
# Copyright (C) Markus Franz Xaver Johannes Oberhumer
|
|
||||||
# CC CompilationCheck: test zigcc
|
|
||||||
|
|
||||||
# build with "zig cc"; see https://ziglang.org/download/
|
|
||||||
|
|
||||||
name: 'Weekly CI CC - zigcc'
|
|
||||||
on:
|
|
||||||
schedule: [cron: '40 2 * * 3'] # run weekly Wednesday 02:40 UTC
|
|
||||||
workflow_dispatch:
|
|
||||||
env:
|
|
||||||
CMAKE_REQUIRED_QUIET: "OFF"
|
|
||||||
CTEST_OUTPUT_ON_FAILURE: "ON"
|
|
||||||
DEBIAN_FRONTEND: noninteractive
|
|
||||||
# 2023-10-24
|
|
||||||
ZIG_DIST_VERSION: 0.12.0-dev.1245+a07f288eb
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
job-linux-zigcc: # uses cmake + make
|
|
||||||
if: github.repository_owner == 'upx'
|
|
||||||
strategy:
|
|
||||||
fail-fast: false
|
|
||||||
matrix:
|
|
||||||
include:
|
|
||||||
- { zig_target: aarch64-linux-musl }
|
|
||||||
- { zig_target: aarch64-linux-musl, zig_pic: -fPIE }
|
|
||||||
- { zig_target: aarch64-macos-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: arm-linux-musleabihf }
|
|
||||||
- { zig_target: arm-linux-musleabihf, zig_pic: -fPIE }
|
|
||||||
- { zig_target: i386-linux-musl }
|
|
||||||
- { zig_target: i386-linux-musl, zig_pic: -fPIE }
|
|
||||||
- { zig_target: i386-windows-gnu }
|
|
||||||
- { zig_target: mips-linux-musl }
|
|
||||||
- { zig_target: mipsel-linux-musl }
|
|
||||||
- { zig_target: powerpc-linux-musl }
|
|
||||||
- { zig_target: powerpc64-linux-musl }
|
|
||||||
- { zig_target: powerpc64le-linux-musl }
|
|
||||||
- { zig_target: x86_64-linux-musl }
|
|
||||||
- { zig_target: x86_64-linux-musl, zig_pic: -fPIE }
|
|
||||||
- { zig_target: x86_64-macos-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 }
|
|
||||||
name: ${{ format('zigcc {0} {1}', matrix.zig_target, matrix.zig_pic) }}
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
container: 'alpine:3.18' # older versions such as alpine:3.12 also work; no-container also works
|
|
||||||
env:
|
|
||||||
# for zig-cc wrapper scripts (see below):
|
|
||||||
ZIG_CPPFLAGS: -DUPX_DOCTEST_CONFIG_MULTITHREADING
|
|
||||||
ZIG_FLAGS: ${{ matrix.zig_flags }}
|
|
||||||
ZIG_PIC: ${{ matrix.zig_pic }}
|
|
||||||
ZIG_TARGET: ${{ matrix.zig_target }}
|
|
||||||
steps:
|
|
||||||
- name: 'Install Alpine Linux container packages'
|
|
||||||
if: ${{ job.container }}
|
|
||||||
shell: sh
|
|
||||||
run: |
|
|
||||||
apk update && apk upgrade && apk add bash cmake file git make tar xz
|
|
||||||
# set PATH like in Ubuntu
|
|
||||||
echo "PATH=$HOME/.local/bin:$PATH" >> $GITHUB_ENV
|
|
||||||
# this seems to be needed when running in a container (beause of UID mismatch??)
|
|
||||||
git config --global --add safe.directory '*'
|
|
||||||
- name: 'Check out code'
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
with: { submodules: true }
|
|
||||||
- name: ${{ format('Install Zig {0}', env.ZIG_DIST_VERSION) }}
|
|
||||||
shell: bash
|
|
||||||
run: |
|
|
||||||
# GitHub Actions magic: set "UPX_GITREV_SHORT" environment value for use in steps below
|
|
||||||
rev=$(git rev-parse --short=7 HEAD)
|
|
||||||
echo "UPX_GITREV_SHORT=$rev" >> $GITHUB_ENV
|
|
||||||
# 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
|
|
||||||
mkdir -p -v ~/.local/bin
|
|
||||||
cd ~/.local/bin
|
|
||||||
ZIG_DIST_NAME=zig-linux-x86_64-${ZIG_DIST_VERSION}
|
|
||||||
wget -q https://ziglang.org/builds/${ZIG_DIST_NAME}.tar.xz
|
|
||||||
ls -l ${ZIG_DIST_NAME}.tar.xz
|
|
||||||
tar -xoJf ${ZIG_DIST_NAME}.tar.xz
|
|
||||||
rm ${ZIG_DIST_NAME}.tar.xz
|
|
||||||
ln -s -v ${ZIG_DIST_NAME}/zig zig
|
|
||||||
#echo "PATH=$PATH" && which zig
|
|
||||||
echo -n 'zig version: '; zig version
|
|
||||||
# create wrapper scripts (needed for CMake)
|
|
||||||
echo -e '#!/bin/sh\nexec zig ar "$@"' > zig-ar
|
|
||||||
echo -e '#!/bin/sh\nexec zig cc -target $ZIG_TARGET $ZIG_PIC $ZIG_FLAGS $ZIG_CPPFLAGS $ZIG_CFLAGS "$@"' > zig-cc
|
|
||||||
echo -e '#!/bin/sh\nexec zig c++ -target $ZIG_TARGET $ZIG_PIC $ZIG_FLAGS $ZIG_CPPFLAGS $ZIG_CXXFLAGS "$@"' > zig-cxx
|
|
||||||
echo -e '#!/bin/sh\nexec zig ranlib "$@"' > zig-ranlib
|
|
||||||
chmod +x zig-ar zig-cc zig-cxx zig-ranlib
|
|
||||||
ls -la; head zig-ar zig-cc zig-cxx zig-ranlib
|
|
||||||
- name: ${{ format('Build Release with zig-cc -target {0} {1}', env.ZIG_TARGET, env.ZIG_PIC) }}
|
|
||||||
run: |
|
|
||||||
mkdir -p build/zig/${ZIG_TARGET}${ZIG_PIC}/release
|
|
||||||
cd build/zig/${ZIG_TARGET}${ZIG_PIC}/release
|
|
||||||
cmake ../../../.. -DCMAKE_BUILD_TYPE=Release -DCMAKE_AR=$HOME/.local/bin/zig-ar -DCMAKE_C_COMPILER=zig-cc -DCMAKE_CXX_COMPILER=zig-cxx -DCMAKE_RANLIB=$HOME/.local/bin/zig-ranlib $EXTRA_CMAKE_CONFIG_FLAGS_RELEASE
|
|
||||||
cmake --build . --config Release --parallel --verbose
|
|
||||||
file ./upx*
|
|
||||||
- name: ${{ format('Build Debug with zig-cc -target {0} {1}', env.ZIG_TARGET, env.ZIG_PIC) }}
|
|
||||||
run: |
|
|
||||||
mkdir -p build/zig/${ZIG_TARGET}${ZIG_PIC}/debug
|
|
||||||
cd build/zig/${ZIG_TARGET}${ZIG_PIC}/debug
|
|
||||||
cmake ../../../.. -DCMAKE_BUILD_TYPE=Debug -DCMAKE_AR=$HOME/.local/bin/zig-ar -DCMAKE_C_COMPILER=zig-cc -DCMAKE_CXX_COMPILER=zig-cxx -DCMAKE_RANLIB=$HOME/.local/bin/zig-ranlib $EXTRA_CMAKE_CONFIG_FLAGS_DEBUG
|
|
||||||
cmake --build . --config Debug --parallel --verbose
|
|
||||||
file ./upx*
|
|
||||||
- name: ${{ format('Make artifact from upx-{0}-{1}', github.ref_name, env.UPX_GITREV_SHORT) }}
|
|
||||||
shell: bash
|
|
||||||
run: |
|
|
||||||
N=$(echo "upx-${GITHUB_REF_NAME}-${GITHUB_SHA:0:7}-weekly-ci-zigcc-${{ matrix.zig_target }}${ZIG_PIC}" | sed 's/[^0-9a-zA-Z_.-]/-/g')
|
|
||||||
mkdir -p "tmp/artifact/$N"
|
|
||||||
(cd build && shopt -s nullglob && cp -ai --parents */upx{,.exe} */*/*/upx{,.exe} "../tmp/artifact/$N")
|
|
||||||
(cd tmp/artifact && tar --sort=name -czf "$N.tar.gz" "$N" && rm -rf "./$N")
|
|
||||||
# GitHub Actions magic: set "artifact_name" environment value for use in next step
|
|
||||||
echo "artifact_name=$N" >> $GITHUB_ENV
|
|
||||||
- name: ${{ format('Upload artifact {0}', env.artifact_name) }}
|
|
||||||
uses: actions/upload-artifact@v3
|
|
||||||
with:
|
|
||||||
name: ${{ env.artifact_name }}
|
|
||||||
path: tmp/artifact
|
|
||||||
- name: 'Run install tests'
|
|
||||||
if: ${{ contains(matrix.zig_target, '-linux') }}
|
|
||||||
run: |
|
|
||||||
(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)
|
|
||||||
@@ -1,116 +0,0 @@
|
|||||||
# Copyright (C) Markus Franz Xaver Johannes Oberhumer
|
|
||||||
# RT RunTime checks
|
|
||||||
|
|
||||||
# runs ASAN, MSAN, qemu and valgrind checkers; slow!
|
|
||||||
|
|
||||||
name: 'Weekly CI RT - ASAN MSAN Valgrind'
|
|
||||||
on:
|
|
||||||
schedule: [cron: '00 3 * * 3'] # run weekly Wednesday 03:00 UTC
|
|
||||||
workflow_dispatch:
|
|
||||||
env:
|
|
||||||
CMAKE_REQUIRED_QUIET: "OFF"
|
|
||||||
CTEST_OUTPUT_ON_FAILURE: "ON"
|
|
||||||
DEBIAN_FRONTEND: noninteractive
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
job-runtime-checkers: # uses cmake + make
|
|
||||||
if: github.repository_owner == 'upx'
|
|
||||||
strategy:
|
|
||||||
fail-fast: false
|
|
||||||
matrix:
|
|
||||||
include:
|
|
||||||
- container: 'alpine:3.18'
|
|
||||||
release: debug
|
|
||||||
qemu: 'qemu-x86_64 -cpu Westmere'
|
|
||||||
- container: 'alpine:3.18'
|
|
||||||
release: release
|
|
||||||
qemu: 'qemu-x86_64 -cpu Westmere'
|
|
||||||
- container: 'alpine:edge'
|
|
||||||
release: release
|
|
||||||
qemu: 'qemu-x86_64 -cpu Westmere'
|
|
||||||
- container: 'i386/alpine:edge'
|
|
||||||
release: release
|
|
||||||
qemu: 'qemu-i386'
|
|
||||||
name: ${{ format('{0} {1}', matrix.container, matrix.release) }}
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
container: ${{ matrix.container }}
|
|
||||||
env:
|
|
||||||
release: ${{ matrix.release }}
|
|
||||||
steps:
|
|
||||||
- name: ${{ format('Install packages {0} {1}', matrix.container, matrix.release) }}
|
|
||||||
run: |
|
|
||||||
apk update && apk upgrade
|
|
||||||
apk add bash clang cmake compiler-rt coreutils g++ git make qemu-i386 qemu-x86_64 tar valgrind
|
|
||||||
# this seems to be needed when running in a container (beause of UID mismatch??)
|
|
||||||
git config --global --add safe.directory '*'
|
|
||||||
- name: ${{ format('Check out UPX {0} source code', github.ref_name) }}
|
|
||||||
run: |
|
|
||||||
git clone --branch "$GITHUB_REF_NAME" --depth 1 https://github.com/upx/upx .
|
|
||||||
git submodule update --init
|
|
||||||
git clone --depth=1 https://github.com/upx/upx-testsuite ../upx-testsuite
|
|
||||||
|
|
||||||
- name: 'Build clang-static'
|
|
||||||
run: |
|
|
||||||
export CC="clang -static" CXX="clang++ -static"
|
|
||||||
make UPX_XTARGET=clang-static xtarget/$release
|
|
||||||
- name: 'Build clang-asan'
|
|
||||||
if: ${{ !startsWith(matrix.container, 'i386/') }} # i386: ASAN not supported
|
|
||||||
run: |
|
|
||||||
# unfortunately ASAN does not support static linking
|
|
||||||
flags="-fsanitize=address -fsanitize=pointer-compare -fsanitize=pointer-subtract -fsanitize=undefined -fno-omit-frame-pointer"
|
|
||||||
export CC="clang $flags" CXX="clang++ $flags"
|
|
||||||
make UPX_XTARGET=clang-asan xtarget/$release
|
|
||||||
- name: 'Build clang-msan'
|
|
||||||
if: ${{ !startsWith(matrix.container, 'i386/') }} # i386: MSAN not supported
|
|
||||||
run: |
|
|
||||||
# unfortunately MSAN does not support static linking
|
|
||||||
flags="-fsanitize=memory -fsanitize=undefined -fno-omit-frame-pointer -DDOCTEST_CONFIG_DISABLE=1"
|
|
||||||
export CC="clang $flags" CXX="clang++ $flags"
|
|
||||||
make UPX_XTARGET=clang-msan xtarget/$release
|
|
||||||
|
|
||||||
- name: 'Make artifact'
|
|
||||||
run: |
|
|
||||||
N=$(echo "upx-${GITHUB_REF_NAME}-${GITHUB_SHA:0:7}-weekly-ci-runtime-checkers-${{ matrix.container }}-${{ matrix.release }}" | sed 's/[^0-9a-zA-Z_.-]/-/g')
|
|
||||||
mkdir -p "tmp/artifact/$N"
|
|
||||||
(cd build && cp -ai --parents */*/*/upx "../tmp/artifact/$N")
|
|
||||||
(cd tmp/artifact && tar --sort=name -czf "$N.tar.gz" "$N" && rm -rf "./$N")
|
|
||||||
# GitHub Actions magic: set "artifact_name" environment value for use in next step
|
|
||||||
echo "artifact_name=$N" >> $GITHUB_ENV
|
|
||||||
- name: ${{ format('Upload artifact {0}', env.artifact_name) }}
|
|
||||||
if: ${{ !startsWith(matrix.container, 'i386/') }} # i386: missing nodejs on host
|
|
||||||
uses: actions/upload-artifact@v3
|
|
||||||
with:
|
|
||||||
name: ${{ env.artifact_name }}
|
|
||||||
path: tmp/artifact
|
|
||||||
|
|
||||||
- name: 'Run basic tests clang-static'
|
|
||||||
run: 'make -C build/xtarget/clang-static/$release test'
|
|
||||||
- name: 'Run basic tests clang-asan'
|
|
||||||
if: ${{ !startsWith(matrix.container, 'i386/') }} # i386: ASAN not supported
|
|
||||||
run: 'make -C build/xtarget/clang-asan/$release test'
|
|
||||||
- name: 'Run basic tests clang-msan'
|
|
||||||
if: ${{ !startsWith(matrix.container, 'i386/') }} # i386: MSAN not supported
|
|
||||||
run: 'make -C build/xtarget/clang-msan/$release test'
|
|
||||||
|
|
||||||
- name: 'Run testsuite clang-asan'
|
|
||||||
if: ${{ !startsWith(matrix.container, 'i386/') }} # i386: ASAN not supported
|
|
||||||
run: |
|
|
||||||
export ASAN_OPTIONS="detect_invalid_pointer_pairs=2"
|
|
||||||
env -C build/xtarget/clang-asan/$release "$PWD"/misc/testsuite/upx_testsuite_1.sh
|
|
||||||
- name: 'Run testsuite clang-msan'
|
|
||||||
if: ${{ !startsWith(matrix.container, 'i386/') }} # i386: MSAN not supported
|
|
||||||
run: |
|
|
||||||
env -C build/xtarget/clang-msan/$release "$PWD"/misc/testsuite/upx_testsuite_1.sh
|
|
||||||
- name: 'Run testsuite clang-static - QEMU'
|
|
||||||
if: ${{ matrix.qemu }}
|
|
||||||
run: |
|
|
||||||
export upx_exe_runner="${{ matrix.qemu }}"
|
|
||||||
env -C build/xtarget/clang-static/$release "$PWD"/misc/testsuite/upx_testsuite_1.sh
|
|
||||||
- name: 'Run testsuite clang-static - Valgrind'
|
|
||||||
if: true # very slow
|
|
||||||
run: |
|
|
||||||
export upx_exe_runner="valgrind --error-exitcode=1 --quiet"
|
|
||||||
# on current GitHub CI, takes about 30 minutes for release and 80 minutes for debug builds
|
|
||||||
# reduce time for debug builds to about 30 minutes
|
|
||||||
test "$release" = "debug" && export UPX_TESTSUITE_LEVEL=4
|
|
||||||
env -C build/xtarget/clang-static/$release "$PWD"/misc/testsuite/upx_testsuite_1.sh
|
|
||||||
+3
-2
@@ -1,6 +1,6 @@
|
|||||||
/.hg*
|
/.hg*
|
||||||
/.vscode*
|
/.vscode*
|
||||||
/Makevars.global*
|
/Makevars[.-]global*
|
||||||
/Testing*
|
/Testing*
|
||||||
/build*
|
/build*
|
||||||
/maint*
|
/maint*
|
||||||
@@ -8,7 +8,7 @@
|
|||||||
|
|
||||||
GNUmakefile*
|
GNUmakefile*
|
||||||
MMakefile*
|
MMakefile*
|
||||||
Makevars.local*
|
Makevars[.-]local*
|
||||||
compile_flags*.txt
|
compile_flags*.txt
|
||||||
Tmp*
|
Tmp*
|
||||||
tmp*
|
tmp*
|
||||||
@@ -16,6 +16,7 @@ tmp*
|
|||||||
*.a
|
*.a
|
||||||
*.bz2
|
*.bz2
|
||||||
*.d
|
*.d
|
||||||
|
*.diff
|
||||||
*.dll
|
*.dll
|
||||||
*.dylib
|
*.dylib
|
||||||
*.exe
|
*.exe
|
||||||
|
|||||||
+146
-220
@@ -7,15 +7,35 @@
|
|||||||
# A C++ compiler that fully implements C++17: clang-5, gcc-8 or msvc-2019-16.11
|
# A C++ compiler that fully implements C++17: clang-5, gcc-8 or msvc-2019-16.11
|
||||||
# (older or other compilers may work but are unsupported, use at your own risk)
|
# (older or other compilers may work but are unsupported, use at your own risk)
|
||||||
|
|
||||||
|
# Sections of this CMakeLists.txt:
|
||||||
|
# - options
|
||||||
|
# - init
|
||||||
|
# - common compilation flags
|
||||||
|
# - targets
|
||||||
|
# - target compilation flags
|
||||||
|
# - test
|
||||||
|
# - install
|
||||||
|
# - print summary
|
||||||
|
|
||||||
# CMake version check; using a somewhat current CMake version is highly recommended
|
# CMake version check; using a somewhat current CMake version is highly recommended
|
||||||
|
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)
|
||||||
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
|
||||||
|
include("${CMAKE_CURRENT_SOURCE_DIR}/misc/cmake/functions.cmake")
|
||||||
|
|
||||||
|
#***********************************************************************
|
||||||
|
# options
|
||||||
|
#***********************************************************************
|
||||||
|
|
||||||
|
upx_cmake_include_hook(1_options)
|
||||||
|
|
||||||
# compilation config options
|
# compilation config options
|
||||||
if(NOT IS_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/.git")
|
if(NOT IS_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/.git" OR NOT EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/misc/cmake/use_strict_defaults.cmake")
|
||||||
# permissive config defaults when building from source code tarball
|
# permissive config defaults when building from source code tarball
|
||||||
option(UPX_CONFIG_DISABLE_GITREV "Do not compile with default Git version info." ON)
|
option(UPX_CONFIG_DISABLE_GITREV "Do not compile with default Git version info." ON)
|
||||||
option(UPX_CONFIG_DISABLE_SANITIZE "Do not compile with default sanitize options." ON)
|
option(UPX_CONFIG_DISABLE_SANITIZE "Do not compile with default sanitize options." ON)
|
||||||
@@ -38,45 +58,18 @@ option(UPX_CONFIG_DISABLE_SELF_PACK_TEST "Do not test packing UPX with itself" O
|
|||||||
# init
|
# init
|
||||||
#***********************************************************************
|
#***********************************************************************
|
||||||
|
|
||||||
# Disallow in-source builds. Note that you will still have to manually
|
set(UPX_VERSION_STRING "4.2.3") # this should match src/version.h
|
||||||
|
|
||||||
|
upx_cmake_include_hook(2_init)
|
||||||
|
|
||||||
|
# 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")
|
if(IS_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/.git")
|
||||||
set(CMAKE_DISABLE_IN_SOURCE_BUILD ON)
|
upx_disallow_in_source_build()
|
||||||
set(CMAKE_DISABLE_SOURCE_CHANGES ON)
|
|
||||||
if(",${CMAKE_CURRENT_SOURCE_DIR}," STREQUAL ",${CMAKE_CURRENT_BINARY_DIR},")
|
|
||||||
message(FATAL_ERROR "ERROR: In-source builds are not allowed, please use an extra build dir.")
|
|
||||||
endif()
|
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# useful for CI jobs: allow settings via environment and cache result
|
|
||||||
function(upx_cache_bool_vars)
|
|
||||||
set(default_value "${ARGV0}")
|
|
||||||
list(REMOVE_AT ARGV 0)
|
|
||||||
foreach(var ${ARGV})
|
|
||||||
set(value ${default_value})
|
|
||||||
if(DEFINED UPX_CACHE_${var}) # cached
|
|
||||||
set(value "${UPX_CACHE_${var}}")
|
|
||||||
elseif(DEFINED ${var}) # defined via "cmake -DXXX=YYY"
|
|
||||||
set(value "${${var}}")
|
|
||||||
elseif("$ENV{${var}}" MATCHES "^(0|1|OFF|ON|FALSE|TRUE)$") # environment
|
|
||||||
set(value "$ENV{${var}}")
|
|
||||||
set(UPX_CACHE_ORIGIN_FROM_ENV_${var} TRUE CACHE INTERNAL "" FORCE)
|
|
||||||
endif()
|
|
||||||
if(value)
|
|
||||||
set(value ON)
|
|
||||||
else()
|
|
||||||
set(value OFF)
|
|
||||||
endif()
|
|
||||||
if(UPX_CACHE_ORIGIN_FROM_ENV_${var})
|
|
||||||
message(STATUS "setting from environment: ${var} = ${value}")
|
|
||||||
endif()
|
|
||||||
set(${var} "${value}" PARENT_SCOPE)
|
|
||||||
set(UPX_CACHE_${var} "${value}" CACHE INTERNAL "" FORCE)
|
|
||||||
endforeach()
|
|
||||||
endfunction()
|
|
||||||
|
|
||||||
# global settings
|
# global settings
|
||||||
if(${CMAKE_VERSION} VERSION_GREATER "3.14.7" AND NOT DEFINED CMAKE_MSVC_RUNTIME_LIBRARY)
|
if(${CMAKE_VERSION} VERSION_GREATER "3.14.99" AND NOT DEFINED CMAKE_MSVC_RUNTIME_LIBRARY)
|
||||||
set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded")
|
set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded")
|
||||||
cmake_policy(SET CMP0091 NEW)
|
cmake_policy(SET CMP0091 NEW)
|
||||||
endif()
|
endif()
|
||||||
@@ -90,7 +83,9 @@ 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_EXPECT_THREADS UPX_CONFIG_REQUIRE_THREADS
|
||||||
)
|
)
|
||||||
|
upx_print_env_var(CC CXX)
|
||||||
|
|
||||||
# determine Git revision
|
# determine Git revision
|
||||||
set(GITREV_SHORT "")
|
set(GITREV_SHORT "")
|
||||||
@@ -134,26 +129,10 @@ else()
|
|||||||
message(STATUS "UPX_VERSION_GITREV: not set")
|
message(STATUS "UPX_VERSION_GITREV: not set")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# set the default build type to "Release"
|
|
||||||
get_property(is_multi_config GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG)
|
|
||||||
if(NOT is_multi_config AND NOT CMAKE_BUILD_TYPE)
|
|
||||||
set(CMAKE_BUILD_TYPE "Release" CACHE STRING "Choose the type of build." FORCE)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# CMake init
|
# CMake init
|
||||||
project(upx VERSION 4.2.0 LANGUAGES C CXX)
|
upx_set_default_build_type(Release) # default is CMAKE_BUILD_TYPE=Release
|
||||||
|
project(upx VERSION "${UPX_VERSION_STRING}" LANGUAGES C CXX)
|
||||||
# set the default multi-config build type to "Release"
|
upx_apply_build_type()
|
||||||
if(is_multi_config)
|
|
||||||
set(c "${CMAKE_CONFIGURATION_TYPES}")
|
|
||||||
list(INSERT c 0 "Release")
|
|
||||||
list(INSERT c 1 "Debug")
|
|
||||||
if(CMAKE_BUILD_TYPE)
|
|
||||||
list(INSERT c 0 "${CMAKE_BUILD_TYPE}")
|
|
||||||
endif()
|
|
||||||
list(REMOVE_DUPLICATES c)
|
|
||||||
set(CMAKE_CONFIGURATION_TYPES "${c}" CACHE STRING "List of supported configuration types." FORCE)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# set MSVC_FRONTEND and MINGW
|
# set MSVC_FRONTEND and MINGW
|
||||||
if(NOT DEFINED MSVC_FRONTEND AND (MSVC OR CMAKE_C_COMPILER_FRONTEND_VARIANT MATCHES "^MSVC"))
|
if(NOT DEFINED MSVC_FRONTEND AND (MSVC OR CMAKE_C_COMPILER_FRONTEND_VARIANT MATCHES "^MSVC"))
|
||||||
@@ -173,17 +152,20 @@ include(CheckIncludeFile)
|
|||||||
include(CheckStructHasMember)
|
include(CheckStructHasMember)
|
||||||
include(CheckSymbolExists)
|
include(CheckSymbolExists)
|
||||||
|
|
||||||
|
upx_cmake_include_hook(3_common_compilation_flags)
|
||||||
|
|
||||||
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()
|
||||||
if(NOT DEFINED HAVE_UTIMENSAT)
|
if(NOT DEFINED HAVE_UTIMENSAT)
|
||||||
|
# proper checking for utimensat() is somewhat messy
|
||||||
check_function_exists(utimensat HAVE_UTIMENSAT_FUNCTION__)
|
check_function_exists(utimensat HAVE_UTIMENSAT_FUNCTION__)
|
||||||
if(HAVE_UTIMENSAT_FUNCTION__)
|
if(HAVE_UTIMENSAT_FUNCTION__)
|
||||||
check_symbol_exists(utimensat "sys/types.h;fcntl.h;sys/stat.h" HAVE_UTIMENSAT_SYMBOL__)
|
check_symbol_exists(utimensat "sys/types.h;fcntl.h;sys/stat.h" HAVE_UTIMENSAT_SYMBOL__)
|
||||||
if(HAVE_UTIMENSAT_SYMBOL__)
|
if(HAVE_UTIMENSAT_SYMBOL__)
|
||||||
CHECK_STRUCT_HAS_MEMBER("struct stat" "st_mtim.tv_nsec" "sys/types.h;fcntl.h;sys/stat.h" HAVE_STRUCT_STAT_ST_MTIM_TV_NSEC)
|
CHECK_STRUCT_HAS_MEMBER("struct stat" "st_mtim.tv_nsec" "sys/types.h;fcntl.h;sys/stat.h" HAVE_STRUCT_STAT_ST_MTIM_TV_NSEC) # POSIX.1-2008
|
||||||
if(NOT HAVE_STRUCT_STAT_ST_MTIM_TV_NSEC)
|
if(NOT HAVE_STRUCT_STAT_ST_MTIM_TV_NSEC)
|
||||||
CHECK_STRUCT_HAS_MEMBER("struct stat" "st_mtimespec.tv_nsec" "sys/types.h;fcntl.h;sys/stat.h" HAVE_STRUCT_STAT_ST_MTIMESPEC_TV_NSEC)
|
CHECK_STRUCT_HAS_MEMBER("struct stat" "st_mtimespec.tv_nsec" "sys/types.h;fcntl.h;sys/stat.h" HAVE_STRUCT_STAT_ST_MTIMESPEC_TV_NSEC) # macOS
|
||||||
endif()
|
endif()
|
||||||
if(HAVE_STRUCT_STAT_ST_MTIM_TV_NSEC OR HAVE_STRUCT_STAT_ST_MTIMESPEC_TV_NSEC)
|
if(HAVE_STRUCT_STAT_ST_MTIM_TV_NSEC OR HAVE_STRUCT_STAT_ST_MTIMESPEC_TV_NSEC)
|
||||||
set(HAVE_UTIMENSAT 1)
|
set(HAVE_UTIMENSAT 1)
|
||||||
@@ -215,38 +197,6 @@ if(MSVC_FRONTEND)
|
|||||||
set(warn_WX -wd5105 ${warn_WX})
|
set(warn_WX -wd5105 ${warn_WX})
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
function(upx_add_definitions_with_prefix)
|
|
||||||
set(flag_prefix "${ARGV0}")
|
|
||||||
if(flag_prefix MATCHES "^empty$") # need "empty" to work around bug in old CMake versions
|
|
||||||
set(flag_prefix "")
|
|
||||||
endif()
|
|
||||||
list(REMOVE_AT ARGV 0)
|
|
||||||
set(failed "")
|
|
||||||
foreach(f ${ARGV})
|
|
||||||
set(flag "${flag_prefix}${f}")
|
|
||||||
string(REGEX REPLACE "[^0-9a-zA-Z_]" "_" cache_var "HAVE_CFLAG_${flag}")
|
|
||||||
check_c_compiler_flag("${flag}" ${cache_var})
|
|
||||||
if(${cache_var})
|
|
||||||
#message(STATUS "add_definitions: ${flag}")
|
|
||||||
add_definitions("${flag}")
|
|
||||||
else()
|
|
||||||
list(APPEND failed "${f}")
|
|
||||||
endif()
|
|
||||||
endforeach()
|
|
||||||
set(failed_flags "${failed}" PARENT_SCOPE) # return value
|
|
||||||
endfunction()
|
|
||||||
|
|
||||||
function(upx_add_definitions)
|
|
||||||
set(failed_flags "")
|
|
||||||
if(MSVC_FRONTEND AND CMAKE_C_COMPILER_ID MATCHES "Clang")
|
|
||||||
# for clang-cl try "-clang:" flag prefix first
|
|
||||||
upx_add_definitions_with_prefix("-clang:" ${ARGV})
|
|
||||||
upx_add_definitions_with_prefix("empty" ${failed_flags})
|
|
||||||
else()
|
|
||||||
upx_add_definitions_with_prefix("empty" ${ARGV})
|
|
||||||
endif()
|
|
||||||
endfunction()
|
|
||||||
|
|
||||||
if(NOT CMAKE_C_COMPILER_ID MATCHES "^MSVC")
|
if(NOT CMAKE_C_COMPILER_ID MATCHES "^MSVC")
|
||||||
# use -O2 instead of -O3 to reduce code size
|
# use -O2 instead of -O3 to reduce code size
|
||||||
string(REGEX REPLACE "(^| )-O3( |$$)" "\\1-O2\\2" a "${CMAKE_C_FLAGS_RELEASE}")
|
string(REGEX REPLACE "(^| )-O3( |$$)" "\\1-O2\\2" a "${CMAKE_C_FLAGS_RELEASE}")
|
||||||
@@ -261,6 +211,7 @@ if(MSVC_FRONTEND OR WIN32 OR MINGW OR CYGWIN)
|
|||||||
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(-DWIN32_LEAN_AND_MEAN)
|
add_definitions(-DWIN32_LEAN_AND_MEAN)
|
||||||
|
add_definitions(-D__USE_MINGW_ANSI_STDIO)
|
||||||
endif()
|
endif()
|
||||||
if(MSVC_FRONTEND)
|
if(MSVC_FRONTEND)
|
||||||
# use -funsigned-char; set __cplusplus according to selected C++ standard
|
# use -funsigned-char; set __cplusplus according to selected C++ standard
|
||||||
@@ -281,65 +232,10 @@ if(NOT CMAKE_C_COMPILER_ID MATCHES "^MSVC")
|
|||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# compile a source file with -O2 even in Debug build
|
# examine MinGW/Cygwin compiler configuration
|
||||||
function(upx_compile_source_debug_with_O2)
|
if(IS_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/.git")
|
||||||
set(flags "$<$<CONFIG:Debug>:-O2>")
|
upx_print_mingw_symbols()
|
||||||
if (CMAKE_VERSION VERSION_LESS 3.8)
|
endif()
|
||||||
# 3.8: The COMPILE_FLAGS source file property learned to support generator expressions
|
|
||||||
if (is_multi_config OR NOT CMAKE_BUILD_TYPE MATCHES "^Debug$")
|
|
||||||
return()
|
|
||||||
endif()
|
|
||||||
set(flags "-O2")
|
|
||||||
endif()
|
|
||||||
if(CMAKE_GENERATOR MATCHES "Xcode") # multi-config
|
|
||||||
# NOTE: Xcode does not support per-config per-source COMPILE_FLAGS (as of CMake 3.27.7)
|
|
||||||
return()
|
|
||||||
endif()
|
|
||||||
foreach(t ${ARGV})
|
|
||||||
if(MSVC_FRONTEND)
|
|
||||||
# MSVC uses some Debug compilation options like -RTC1 that are incompatible with -O2
|
|
||||||
else()
|
|
||||||
get_source_file_property(prop ${t} COMPILE_FLAGS)
|
|
||||||
if(prop MATCHES "^(NOTFOUND)?$")
|
|
||||||
set_source_files_properties(${t} PROPERTIES COMPILE_FLAGS "${flags}")
|
|
||||||
else()
|
|
||||||
set_source_files_properties(${t} PROPERTIES COMPILE_FLAGS "${prop} ${flags}")
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
endforeach()
|
|
||||||
endfunction()
|
|
||||||
|
|
||||||
# compile a target with -O2 even in Debug build
|
|
||||||
function(upx_compile_target_debug_with_O2)
|
|
||||||
foreach(t ${ARGV})
|
|
||||||
if(MSVC_FRONTEND)
|
|
||||||
# MSVC uses some Debug compilation options like -RTC1 that are incompatible with -O2
|
|
||||||
else()
|
|
||||||
target_compile_options(${t} PRIVATE $<$<CONFIG:Debug>:-O2>)
|
|
||||||
endif()
|
|
||||||
endforeach()
|
|
||||||
endfunction()
|
|
||||||
|
|
||||||
# sanitize a target
|
|
||||||
function(upx_sanitize_target)
|
|
||||||
foreach(t ${ARGV})
|
|
||||||
if(UPX_CONFIG_DISABLE_SANITIZE)
|
|
||||||
# no-op
|
|
||||||
elseif(MSVC_FRONTEND)
|
|
||||||
# MSVC uses -GS (similar to -fstack-protector) by default
|
|
||||||
elseif(MINGW OR CYGWIN)
|
|
||||||
# avoid link errors with current MinGW-w64 versions
|
|
||||||
# see https://www.mingw-w64.org/contribute/#sanitizers-asan-tsan-usan
|
|
||||||
else()
|
|
||||||
# default sanitizer for Debug builds
|
|
||||||
target_compile_options(${t} PRIVATE $<$<CONFIG:Debug>:-fsanitize=undefined -fsanitize-undefined-trap-on-error -fstack-protector-all>)
|
|
||||||
# default sanitizer for Release builds
|
|
||||||
target_compile_options(${t} PRIVATE $<$<CONFIG:MinSizeRel>:-fstack-protector>)
|
|
||||||
target_compile_options(${t} PRIVATE $<$<CONFIG:Release>:-fstack-protector>)
|
|
||||||
target_compile_options(${t} PRIVATE $<$<CONFIG:RelWithDebInfo>:-fstack-protector>)
|
|
||||||
endif()
|
|
||||||
endforeach()
|
|
||||||
endfunction()
|
|
||||||
|
|
||||||
#***********************************************************************
|
#***********************************************************************
|
||||||
# targets
|
# targets
|
||||||
@@ -350,44 +246,62 @@ set(UPX_CONFIG_DISABLE_THREADS ON) # multithreading is currently not used; maybe
|
|||||||
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 5
|
||||||
|
|
||||||
|
upx_cmake_include_hook(4_targets)
|
||||||
|
|
||||||
if(NOT UPX_CONFIG_DISABLE_THREADS)
|
if(NOT UPX_CONFIG_DISABLE_THREADS)
|
||||||
find_package(Threads)
|
find_package(Threads)
|
||||||
endif()
|
endif()
|
||||||
|
# make sure that threads are indeed fully supported in C++
|
||||||
|
if(Threads_FOUND)
|
||||||
|
foreach(f std_lock_guard.cpp)
|
||||||
|
set(CMAKE_TRY_COMPILE_TARGET_TYPE "EXECUTABLE")
|
||||||
|
if(NOT UPX_CONFIG_DISABLE_CXX_STANDARD)
|
||||||
|
try_compile(result "${CMAKE_CURRENT_BINARY_DIR}"
|
||||||
|
"${CMAKE_CURRENT_SOURCE_DIR}/misc/cmake/try_compile/${f}"
|
||||||
|
OUTPUT_VARIABLE output CXX_STANDARD 17)
|
||||||
|
else()
|
||||||
|
try_compile(result "${CMAKE_CURRENT_BINARY_DIR}"
|
||||||
|
"${CMAKE_CURRENT_SOURCE_DIR}/misc/cmake/try_compile/${f}"
|
||||||
|
OUTPUT_VARIABLE output)
|
||||||
|
endif()
|
||||||
|
if(NOT result)
|
||||||
|
# failed; under MinGW be sure to use the posix-threads and NOT the win32-threads version
|
||||||
|
#message(STATUS "Threads FAILED: ${output}") # debug output from try_compile
|
||||||
|
set(Threads_FOUND OFF)
|
||||||
|
break()
|
||||||
|
endif()
|
||||||
|
endforeach()
|
||||||
|
endif()
|
||||||
|
|
||||||
if(NOT UPX_CONFIG_DISABLE_BZIP2)
|
if(NOT UPX_CONFIG_DISABLE_BZIP2)
|
||||||
file(GLOB bzip2_SOURCES "vendor/bzip2/*.c")
|
upx_add_glob_files(bzip2_SOURCES "vendor/bzip2/*.c")
|
||||||
list(SORT bzip2_SOURCES)
|
|
||||||
add_library(upx_vendor_bzip2 STATIC ${bzip2_SOURCES})
|
add_library(upx_vendor_bzip2 STATIC ${bzip2_SOURCES})
|
||||||
if(NOT UPX_CONFIG_DISABLE_C_STANDARD)
|
if(NOT UPX_CONFIG_DISABLE_C_STANDARD)
|
||||||
set_property(TARGET upx_vendor_bzip2 PROPERTY C_STANDARD 11)
|
set_property(TARGET upx_vendor_bzip2 PROPERTY C_STANDARD 11)
|
||||||
endif()
|
endif()
|
||||||
endif() # UPX_CONFIG_DISABLE_BZIP2
|
endif() # UPX_CONFIG_DISABLE_BZIP2
|
||||||
|
|
||||||
file(GLOB ucl_SOURCES "vendor/ucl/src/*.c")
|
upx_add_glob_files(ucl_SOURCES "vendor/ucl/src/*.c")
|
||||||
list(SORT ucl_SOURCES)
|
|
||||||
add_library(upx_vendor_ucl STATIC ${ucl_SOURCES})
|
add_library(upx_vendor_ucl STATIC ${ucl_SOURCES})
|
||||||
if(NOT UPX_CONFIG_DISABLE_C_STANDARD)
|
if(NOT UPX_CONFIG_DISABLE_C_STANDARD)
|
||||||
set_property(TARGET upx_vendor_ucl PROPERTY C_STANDARD 11)
|
set_property(TARGET upx_vendor_ucl PROPERTY C_STANDARD 11)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
file(GLOB zlib_SOURCES "vendor/zlib/*.c")
|
upx_add_glob_files(zlib_SOURCES "vendor/zlib/*.c")
|
||||||
list(SORT zlib_SOURCES)
|
|
||||||
add_library(upx_vendor_zlib STATIC ${zlib_SOURCES})
|
add_library(upx_vendor_zlib STATIC ${zlib_SOURCES})
|
||||||
if(NOT UPX_CONFIG_DISABLE_C_STANDARD)
|
if(NOT UPX_CONFIG_DISABLE_C_STANDARD)
|
||||||
set_property(TARGET upx_vendor_zlib PROPERTY C_STANDARD 11)
|
set_property(TARGET upx_vendor_zlib PROPERTY C_STANDARD 11)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(NOT UPX_CONFIG_DISABLE_ZSTD)
|
if(NOT UPX_CONFIG_DISABLE_ZSTD)
|
||||||
file(GLOB zstd_SOURCES "vendor/zstd/lib/*/*.c")
|
upx_add_glob_files(zstd_SOURCES "vendor/zstd/lib/*/*.c")
|
||||||
list(SORT zstd_SOURCES)
|
|
||||||
add_library(upx_vendor_zstd STATIC ${zstd_SOURCES})
|
add_library(upx_vendor_zstd STATIC ${zstd_SOURCES})
|
||||||
if(NOT UPX_CONFIG_DISABLE_C_STANDARD)
|
if(NOT UPX_CONFIG_DISABLE_C_STANDARD)
|
||||||
set_property(TARGET upx_vendor_zstd PROPERTY C_STANDARD 11)
|
set_property(TARGET upx_vendor_zstd PROPERTY C_STANDARD 11)
|
||||||
endif()
|
endif()
|
||||||
endif() # UPX_CONFIG_DISABLE_ZSTD
|
endif() # UPX_CONFIG_DISABLE_ZSTD
|
||||||
|
|
||||||
file(GLOB upx_SOURCES "src/*.cpp" "src/[cfu]*/*.cpp")
|
upx_add_glob_files(upx_SOURCES "src/*.cpp" "src/[cfu]*/*.cpp")
|
||||||
list(SORT upx_SOURCES)
|
|
||||||
add_executable(upx ${upx_SOURCES})
|
add_executable(upx ${upx_SOURCES})
|
||||||
if(NOT UPX_CONFIG_DISABLE_CXX_STANDARD)
|
if(NOT UPX_CONFIG_DISABLE_CXX_STANDARD)
|
||||||
set_property(TARGET upx PROPERTY CXX_STANDARD 17)
|
set_property(TARGET upx PROPERTY CXX_STANDARD 17)
|
||||||
@@ -407,15 +321,19 @@ endif()
|
|||||||
# target compilation flags
|
# target compilation flags
|
||||||
#***********************************************************************
|
#***********************************************************************
|
||||||
|
|
||||||
|
upx_cmake_include_hook(5_target_compilation_flags)
|
||||||
|
|
||||||
if(NOT UPX_CONFIG_DISABLE_BZIP2)
|
if(NOT UPX_CONFIG_DISABLE_BZIP2)
|
||||||
set(t upx_vendor_bzip2)
|
set(t upx_vendor_bzip2)
|
||||||
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 BZ_NO_STDIO=1)
|
||||||
if(MSVC_FRONTEND)
|
if(MSVC_FRONTEND)
|
||||||
target_compile_options(${t} PRIVATE ${warn_WN} -wd4127 -wd4244 -wd4267 ${warn_WX})
|
target_compile_options(${t} PRIVATE ${warn_WN} -wd4127 -wd4244 -wd4267 ${warn_WX})
|
||||||
else()
|
else()
|
||||||
target_compile_options(${t} PRIVATE ${warn_Wall} -Wno-implicit-fallthrough ${warn_Werror})
|
target_compile_options(${t} PRIVATE ${warn_Wall} ${warn_Werror})
|
||||||
endif()
|
endif()
|
||||||
|
upx_add_target_extra_compile_options(${t} UPX_CONFIG_EXTRA_COMPILE_OPTIONS_BZIP2)
|
||||||
endif() # UPX_CONFIG_DISABLE_BZIP2
|
endif() # UPX_CONFIG_DISABLE_BZIP2
|
||||||
|
|
||||||
set(t upx_vendor_ucl)
|
set(t upx_vendor_ucl)
|
||||||
@@ -427,6 +345,7 @@ if(MSVC_FRONTEND)
|
|||||||
else()
|
else()
|
||||||
target_compile_options(${t} PRIVATE ${warn_Wall} ${warn_Werror})
|
target_compile_options(${t} PRIVATE ${warn_Wall} ${warn_Werror})
|
||||||
endif()
|
endif()
|
||||||
|
upx_add_target_extra_compile_options(${t} UPX_CONFIG_EXTRA_COMPILE_OPTIONS_UCL)
|
||||||
|
|
||||||
set(t upx_vendor_zlib)
|
set(t upx_vendor_zlib)
|
||||||
upx_compile_target_debug_with_O2(${t})
|
upx_compile_target_debug_with_O2(${t})
|
||||||
@@ -438,9 +357,9 @@ endif()
|
|||||||
if(MSVC_FRONTEND)
|
if(MSVC_FRONTEND)
|
||||||
target_compile_options(${t} PRIVATE -W3 ${warn_WX})
|
target_compile_options(${t} PRIVATE -W3 ${warn_WX})
|
||||||
else()
|
else()
|
||||||
target_compile_options(${t} PRIVATE -Wall ${warn_Werror})
|
target_compile_options(${t} PRIVATE ${warn_Wall} -Wno-cast-align -Wno-cast-qual ${warn_Werror})
|
||||||
##target_compile_options(${t} PRIVATE ${warn_Wall} -Wno-cast-align -Wno-cast-qual ${warn_Werror})
|
|
||||||
endif()
|
endif()
|
||||||
|
upx_add_target_extra_compile_options(${t} UPX_CONFIG_EXTRA_COMPILE_OPTIONS_ZLIB)
|
||||||
|
|
||||||
if(NOT UPX_CONFIG_DISABLE_ZSTD)
|
if(NOT UPX_CONFIG_DISABLE_ZSTD)
|
||||||
set(t upx_vendor_zstd)
|
set(t upx_vendor_zstd)
|
||||||
@@ -452,6 +371,7 @@ if(MSVC_FRONTEND)
|
|||||||
else()
|
else()
|
||||||
target_compile_options(${t} PRIVATE ${warn_Wall} ${warn_Werror})
|
target_compile_options(${t} PRIVATE ${warn_Wall} ${warn_Werror})
|
||||||
endif()
|
endif()
|
||||||
|
upx_add_target_extra_compile_options(${t} UPX_CONFIG_EXTRA_COMPILE_OPTIONS_ZSTD)
|
||||||
endif() # UPX_CONFIG_DISABLE_ZSTD
|
endif() # UPX_CONFIG_DISABLE_ZSTD
|
||||||
|
|
||||||
set(t upx)
|
set(t upx)
|
||||||
@@ -473,7 +393,7 @@ if(NOT UPX_CONFIG_DISABLE_WERROR)
|
|||||||
target_compile_definitions(${t} PRIVATE UPX_CONFIG_DISABLE_WERROR=0)
|
target_compile_definitions(${t} PRIVATE UPX_CONFIG_DISABLE_WERROR=0)
|
||||||
endif()
|
endif()
|
||||||
if(NOT UPX_CONFIG_DISABLE_BZIP2)
|
if(NOT UPX_CONFIG_DISABLE_BZIP2)
|
||||||
target_compile_definitions(${t} PRIVATE WITH_BZIP2=0) # FIXME TODO
|
target_compile_definitions(${t} PRIVATE WITH_BZIP2=1)
|
||||||
endif()
|
endif()
|
||||||
if(NOT UPX_CONFIG_DISABLE_ZSTD)
|
if(NOT UPX_CONFIG_DISABLE_ZSTD)
|
||||||
target_compile_definitions(${t} PRIVATE WITH_ZSTD=1)
|
target_compile_definitions(${t} PRIVATE WITH_ZSTD=1)
|
||||||
@@ -484,7 +404,7 @@ if(HAVE_UTIMENSAT)
|
|||||||
target_compile_definitions(${t} PRIVATE HAVE_STRUCT_STAT_ST_MTIMESPEC_TV_NSEC=1)
|
target_compile_definitions(${t} PRIVATE HAVE_STRUCT_STAT_ST_MTIMESPEC_TV_NSEC=1)
|
||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
# improve speed of the debug versions
|
# improve speed of the Debug versions
|
||||||
upx_compile_source_debug_with_O2(src/compress/compress_lzma.cpp)
|
upx_compile_source_debug_with_O2(src/compress/compress_lzma.cpp)
|
||||||
upx_compile_source_debug_with_O2(src/filter/filter_impl.cpp)
|
upx_compile_source_debug_with_O2(src/filter/filter_impl.cpp)
|
||||||
#upx_compile_target_debug_with_O2(${t})
|
#upx_compile_target_debug_with_O2(${t})
|
||||||
@@ -494,53 +414,58 @@ if(MSVC_FRONTEND)
|
|||||||
else()
|
else()
|
||||||
target_compile_options(${t} PRIVATE ${warn_Wall} ${warn_Werror})
|
target_compile_options(${t} PRIVATE ${warn_Wall} ${warn_Werror})
|
||||||
endif()
|
endif()
|
||||||
|
upx_add_target_extra_compile_options(${t} UPX_CONFIG_EXTRA_COMPILE_OPTIONS_UPX)
|
||||||
|
|
||||||
#***********************************************************************
|
#***********************************************************************
|
||||||
# ctest
|
# test
|
||||||
# make test
|
# ctest
|
||||||
# ninja test
|
# make test
|
||||||
|
# ninja test
|
||||||
#***********************************************************************
|
#***********************************************************************
|
||||||
|
|
||||||
|
upx_cmake_include_hook(6_test)
|
||||||
|
|
||||||
if(NOT UPX_CONFIG_CMAKE_DISABLE_TEST)
|
if(NOT UPX_CONFIG_CMAKE_DISABLE_TEST)
|
||||||
|
|
||||||
include(CTest)
|
include(CTest)
|
||||||
# TODO later: check CMAKE_CROSSCOMPILING_EMULATOR
|
if(NOT CMAKE_CROSSCOMPILING OR CMAKE_CROSSCOMPILING_EMULATOR)
|
||||||
if(NOT CMAKE_CROSSCOMPILING)
|
|
||||||
add_test(NAME upx-version COMMAND upx --version)
|
add_test(NAME upx-version COMMAND upx --version)
|
||||||
add_test(NAME upx-help COMMAND upx --help)
|
add_test(NAME upx-help COMMAND upx --help)
|
||||||
endif()
|
add_test(NAME upx-sysinfo COMMAND upx --sysinfo -v)
|
||||||
if(NOT CMAKE_CROSSCOMPILING AND NOT UPX_CONFIG_DISABLE_SELF_PACK_TEST)
|
if(NOT UPX_CONFIG_DISABLE_SELF_PACK_TEST)
|
||||||
# IMPORTANT NOTE: these tests can only work if the host executable format is supported by UPX!
|
# IMPORTANT NOTE: these tests can only work if the host executable format is supported by UPX!
|
||||||
function(upx_add_test)
|
set(emu "")
|
||||||
set(name "${ARGV0}")
|
if(DEFINED CMAKE_CROSSCOMPILING_EMULATOR)
|
||||||
list(REMOVE_AT ARGV 0)
|
set(emu "${CMAKE_CROSSCOMPILING_EMULATOR}")
|
||||||
add_test(NAME "${name}" COMMAND ${ARGV})
|
endif()
|
||||||
set_tests_properties("${name}" PROPERTIES RUN_SERIAL TRUE) # run these tests sequentially
|
set(exe "${CMAKE_EXECUTABLE_SUFFIX}")
|
||||||
endfunction()
|
|
||||||
set(exe ${CMAKE_EXECUTABLE_SUFFIX})
|
|
||||||
set(upx_self_exe "$<TARGET_FILE:upx>")
|
set(upx_self_exe "$<TARGET_FILE:upx>")
|
||||||
set(fo "--force-overwrite")
|
set(fo "--force-overwrite")
|
||||||
upx_add_test(upx-self-pack upx -3 "${upx_self_exe}" ${fo} -o upx-packed${exe})
|
upx_add_serial_test(upx-self-pack upx -3 "${upx_self_exe}" ${fo} -o upx-packed${exe})
|
||||||
upx_add_test(upx-self-pack-n2b upx -3 --nrv2b "${upx_self_exe}" ${fo} -o upx-packed-n2b${exe})
|
upx_add_serial_test(upx-self-pack-n2b upx -3 --nrv2b "${upx_self_exe}" ${fo} -o upx-packed-n2b${exe})
|
||||||
upx_add_test(upx-self-pack-n2d upx -3 --nrv2d "${upx_self_exe}" ${fo} -o upx-packed-n2d${exe})
|
upx_add_serial_test(upx-self-pack-n2d upx -3 --nrv2d "${upx_self_exe}" ${fo} -o upx-packed-n2d${exe})
|
||||||
upx_add_test(upx-self-pack-n2e upx -3 --nrv2e "${upx_self_exe}" ${fo} -o upx-packed-n2e${exe})
|
upx_add_serial_test(upx-self-pack-n2e upx -3 --nrv2e "${upx_self_exe}" ${fo} -o upx-packed-n2e${exe})
|
||||||
upx_add_test(upx-self-pack-lzma upx -1 --lzma "${upx_self_exe}" ${fo} -o upx-packed-lzma${exe})
|
upx_add_serial_test(upx-self-pack-lzma upx -1 --lzma "${upx_self_exe}" ${fo} -o upx-packed-lzma${exe})
|
||||||
upx_add_test(upx-list upx -l upx-packed${exe} upx-packed-n2b${exe} upx-packed-n2d${exe} upx-packed-n2e${exe} upx-packed-lzma${exe})
|
upx_add_serial_test(upx-list upx -l upx-packed${exe} upx-packed-n2b${exe} upx-packed-n2d${exe} upx-packed-n2e${exe} upx-packed-lzma${exe})
|
||||||
upx_add_test(upx-fileinfo upx --fileinfo upx-packed${exe} upx-packed-n2b${exe} upx-packed-n2d${exe} upx-packed-n2e${exe} upx-packed-lzma${exe})
|
upx_add_serial_test(upx-fileinfo upx --fileinfo upx-packed${exe} upx-packed-n2b${exe} upx-packed-n2d${exe} upx-packed-n2e${exe} upx-packed-lzma${exe})
|
||||||
upx_add_test(upx-test upx -t upx-packed${exe} upx-packed-n2b${exe} upx-packed-n2d${exe} upx-packed-n2e${exe} upx-packed-lzma${exe})
|
upx_add_serial_test(upx-test upx -t upx-packed${exe} upx-packed-n2b${exe} upx-packed-n2d${exe} upx-packed-n2e${exe} upx-packed-lzma${exe})
|
||||||
upx_add_test(upx-unpack upx -d upx-packed${exe} ${fo} -o upx-unpacked${exe})
|
upx_add_serial_test(upx-unpack upx -d upx-packed${exe} ${fo} -o upx-unpacked${exe})
|
||||||
upx_add_test(upx-run-unpacked ./upx-unpacked${exe} --version-short)
|
upx_add_serial_test(upx-run-unpacked ${emu} ./upx-unpacked${exe} --version-short)
|
||||||
upx_add_test(upx-run-packed ./upx-packed${exe} --version-short)
|
upx_add_serial_test(upx-run-packed ${emu} ./upx-packed${exe} --version-short)
|
||||||
|
endif() # UPX_CONFIG_DISABLE_SELF_PACK_TEST
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
endif() # UPX_CONFIG_CMAKE_DISABLE_TEST
|
endif() # UPX_CONFIG_CMAKE_DISABLE_TEST
|
||||||
|
|
||||||
#***********************************************************************
|
#***********************************************************************
|
||||||
# cmake --install .
|
# install
|
||||||
# make install
|
# cmake --install .
|
||||||
# ninja install
|
# make install
|
||||||
|
# ninja install
|
||||||
#***********************************************************************
|
#***********************************************************************
|
||||||
|
|
||||||
|
upx_cmake_include_hook(7_install)
|
||||||
|
|
||||||
if(NOT UPX_CONFIG_CMAKE_DISABLE_INSTALL)
|
if(NOT UPX_CONFIG_CMAKE_DISABLE_INSTALL)
|
||||||
|
|
||||||
# installation prefix and directories
|
# installation prefix and directories
|
||||||
@@ -551,6 +476,7 @@ endif()
|
|||||||
if(CMAKE_INSTALL_PREFIX)
|
if(CMAKE_INSTALL_PREFIX)
|
||||||
include(GNUInstallDirs)
|
include(GNUInstallDirs)
|
||||||
endif()
|
endif()
|
||||||
|
# install files
|
||||||
if(CMAKE_INSTALL_PREFIX AND DEFINED CMAKE_INSTALL_FULL_BINDIR)
|
if(CMAKE_INSTALL_PREFIX AND DEFINED CMAKE_INSTALL_FULL_BINDIR)
|
||||||
install(TARGETS upx DESTINATION "${CMAKE_INSTALL_FULL_BINDIR}")
|
install(TARGETS upx DESTINATION "${CMAKE_INSTALL_FULL_BINDIR}")
|
||||||
install(FILES
|
install(FILES
|
||||||
@@ -563,46 +489,46 @@ endif()
|
|||||||
endif() # UPX_CONFIG_CMAKE_DISABLE_INSTALL
|
endif() # UPX_CONFIG_CMAKE_DISABLE_INSTALL
|
||||||
|
|
||||||
#***********************************************************************
|
#***********************************************************************
|
||||||
# finally print some info about the build configuration
|
# summary
|
||||||
|
# print some info about the build configuration
|
||||||
#***********************************************************************
|
#***********************************************************************
|
||||||
|
|
||||||
function(print_var)
|
upx_cmake_include_hook(8_summary)
|
||||||
foreach(var ${ARGV})
|
|
||||||
if(${var})
|
|
||||||
message(STATUS "${var} = ${${var}}")
|
|
||||||
endif()
|
|
||||||
endforeach()
|
|
||||||
endfunction()
|
|
||||||
|
|
||||||
if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/maint/make/CMakeLists.maint.txt")
|
upx_print_var(CMAKE_VERSION UPX_CONFIG_CMAKE_MINIMUM_REQUIRED_VERSION CMAKE_GENERATOR)
|
||||||
include("${CMAKE_CURRENT_SOURCE_DIR}/maint/make/CMakeLists.maint.txt")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
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_var(CMAKE_HOST_SYSTEM_NAME CMAKE_HOST_SYSTEM_VERSION)
|
if(NOT ",${CMAKE_BINARY_DIR}," STREQUAL ",${CMAKE_CURRENT_BINARY_DIR}," OR NOT ",${CMAKE_SOURCE_DIR}," STREQUAL ",${CMAKE_CURRENT_SOURCE_DIR},")
|
||||||
print_var(CMAKE_SYSTEM_NAME CMAKE_SYSTEM_VERSION CMAKE_CROSSCOMPILING)
|
upx_print_var(CMAKE_BINARY_DIR CMAKE_SOURCE_DIR CMAKE_CURRENT_BINARY_DIR CMAKE_CURRENT_SOURCE_DIR)
|
||||||
print_var(CMAKE_C_COMPILER_ID CMAKE_C_COMPILER_VERSION CMAKE_C_COMPILER_FRONTEND_VARIANT CMAKE_C_COMPILER_ARCHITECTURE_ID CMAKE_C_PLATFORM_ID CMAKE_C_COMPILER_ABI)
|
endif()
|
||||||
print_var(CMAKE_CXX_COMPILER_ID CMAKE_CXX_COMPILER_VERSION CMAKE_CXX_COMPILER_FRONTEND_VARIANT CMAKE_CXX_COMPILER_ARCHITECTURE_ID CMAKE_CXX_PLATFORM_ID CMAKE_CXX_COMPILER_ABI)
|
upx_print_var(CMAKE_HOST_SYSTEM_NAME CMAKE_HOST_SYSTEM_VERSION CMAKE_HOST_SYSTEM_PROCESSOR CMAKE_APPLE_SILICON_PROCESSOR)
|
||||||
print_var(CMAKE_POSITION_INDEPENDENT_CODE)
|
upx_print_var(CMAKE_SYSTEM_NAME CMAKE_SYSTEM_VERSION CMAKE_SYSTEM_PROCESSOR CMAKE_CROSSCOMPILING CMAKE_CROSSCOMPILING_EMULATOR)
|
||||||
print_var(CYGWIN GNUC MINGW MSVC MSVC_FRONTEND MSVC_IDE WIN32 WIN64)
|
upx_print_var(CMAKE_OSX_DEPLOYMENT_TARGET CMAKE_OSX_SYSROOT)
|
||||||
|
upx_print_var(CMAKE_C_COMPILER CMAKE_CXX_COMPILER CMAKE_AR CMAKE_RANLIB)
|
||||||
|
upx_print_var(CMAKE_C_COMPILER_ID CMAKE_C_COMPILER_VERSION CMAKE_C_COMPILER_FRONTEND_VARIANT CMAKE_C_COMPILER_ARCHITECTURE_ID CMAKE_C_PLATFORM_ID CMAKE_C_COMPILER_ABI)
|
||||||
|
upx_print_var(CMAKE_CXX_COMPILER_ID CMAKE_CXX_COMPILER_VERSION CMAKE_CXX_COMPILER_FRONTEND_VARIANT CMAKE_CXX_COMPILER_ARCHITECTURE_ID CMAKE_CXX_PLATFORM_ID CMAKE_CXX_COMPILER_ABI)
|
||||||
|
upx_print_var(CMAKE_INTERPROCEDURAL_OPTIMIZATION CMAKE_POSITION_INDEPENDENT_CODE CMAKE_TRY_COMPILE_CONFIGURATION)
|
||||||
|
upx_print_var(APPLE CYGWIN GNUC MINGW MSVC MSVC_FRONTEND MSVC_IDE UNIX WIN32 WIN64)
|
||||||
endif() # UPX_CONFIG_CMAKE_DISABLE_PRINT_INFO
|
endif() # UPX_CONFIG_CMAKE_DISABLE_PRINT_INFO
|
||||||
print_var(CMAKE_INSTALL_PREFIX CMAKE_CONFIGURATION_TYPES CMAKE_BUILD_TYPE)
|
upx_print_var(CMAKE_INSTALL_PREFIX CMAKE_CONFIGURATION_TYPES CMAKE_BUILD_TYPE)
|
||||||
|
if(Threads_FOUND)
|
||||||
|
message(STATUS "WITH_THREADS = 1")
|
||||||
|
elseif(UPX_CONFIG_REQUIRE_THREADS)
|
||||||
|
message(FATAL_ERROR "ERROR: WITH_THREADS required")
|
||||||
|
elseif(UPX_CONFIG_EXPECT_THREADS AND NOT UPX_CONFIG_DISABLE_THREADS)
|
||||||
|
message(FATAL_ERROR "ERROR: WITH_THREADS expected")
|
||||||
|
endif()
|
||||||
if(CMAKE_BUILD_TYPE AND NOT CMAKE_BUILD_TYPE MATCHES "^(Debug|None|Release)$")
|
if(CMAKE_BUILD_TYPE AND NOT CMAKE_BUILD_TYPE MATCHES "^(Debug|None|Release)$")
|
||||||
message(WARNING "WARNING: unsupported CMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}; please use \"Debug\" or \"Release\"")
|
message(WARNING "WARNING: unsupported CMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}; please use \"Debug\" or \"Release\"")
|
||||||
endif()
|
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)
|
||||||
if(NOT ",${CMAKE_C_PLATFORM_ID}," STREQUAL ",${CMAKE_CXX_PLATFORM_ID},")
|
upx_platform_check_mismatch(CMAKE_C_PLATFORM_ID CMAKE_CXX_PLATFORM_ID)
|
||||||
message(FATAL_ERROR "ERROR: CMAKE_C_PLATFORM_ID CMAKE_CXX_PLATFORM_ID mismatch")
|
upx_platform_check_mismatch(CMAKE_C_COMPILER_ABI CMAKE_CXX_COMPILER_ABI)
|
||||||
endif()
|
upx_platform_check_mismatch(CMAKE_C_COMPILER_FRONTEND_VARIANT CMAKE_CXX_COMPILER_FRONTEND_VARIANT)
|
||||||
if(NOT ",${CMAKE_C_COMPILER_ABI}," STREQUAL ",${CMAKE_CXX_COMPILER_ABI},")
|
|
||||||
message(FATAL_ERROR "ERROR: CMAKE_C_COMPILER_ABI CMAKE_CXX_COMPILER_ABI mismatch")
|
|
||||||
endif()
|
|
||||||
if(NOT ",${CMAKE_C_COMPILER_FRONTEND_VARIANT}," STREQUAL ",${CMAKE_CXX_COMPILER_FRONTEND_VARIANT},")
|
|
||||||
message(FATAL_ERROR "ERROR: CMAKE_C_COMPILER_FRONTEND_VARIANT CMAKE_CXX_COMPILER_FRONTEND_VARIANT mismatch")
|
|
||||||
endif()
|
|
||||||
endif() # UPX_CONFIG_CMAKE_DISABLE_PLATFORM_CHECK
|
endif() # UPX_CONFIG_CMAKE_DISABLE_PLATFORM_CHECK
|
||||||
|
|
||||||
|
upx_cmake_include_hook(9_finish)
|
||||||
|
file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/.upx_cmake_config_done.txt" "")
|
||||||
|
|
||||||
# vim:set ft=cmake ts=4 sw=4 tw=0 et:
|
# vim:set ft=cmake ts=4 sw=4 tw=0 et:
|
||||||
|
|||||||
@@ -24,14 +24,14 @@ endif
|
|||||||
# default
|
# default
|
||||||
#***********************************************************************
|
#***********************************************************************
|
||||||
|
|
||||||
|
.DEFAULT_GOAL = build/release
|
||||||
|
|
||||||
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 CMakeCache.txt already exists
|
# avoid re-running run_cmake_config if .upx_cmake_config_done.txt already exists
|
||||||
run_config = $(if $(wildcard $1/CMakeCache.txt),,$(call run_cmake_config,$1,$2))
|
run_config = $(if $(wildcard $1/CMakeFiles/.upx_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)
|
||||||
|
|
||||||
.DEFAULT_GOAL = build/release
|
|
||||||
|
|
||||||
build/debug: PHONY
|
build/debug: PHONY
|
||||||
$(call run_config,$@,Debug)
|
$(call run_config,$@,Debug)
|
||||||
$(call run_build,$@,Debug)
|
$(call run_build,$@,Debug)
|
||||||
@@ -46,20 +46,27 @@ build/release: PHONY
|
|||||||
.SUFFIXES:
|
.SUFFIXES:
|
||||||
|
|
||||||
# shortcuts (all => debug + release)
|
# shortcuts (all => debug + release)
|
||||||
debug: build/debug
|
debug: build/debug PHONY
|
||||||
release: build/release
|
release: build/release PHONY
|
||||||
all build/all: build/debug build/release
|
all build/all: build/debug build/release PHONY
|
||||||
build/%/all: $$(dir $$@)debug $$(dir $$@)release ;
|
build/%/all: $$(dir $$@)debug $$(dir $$@)release PHONY ;
|
||||||
|
|
||||||
#
|
#
|
||||||
# END of Makefile
|
# END of Makefile
|
||||||
#
|
#
|
||||||
|
|
||||||
# extra pre-defined build configurations and some utility; optional
|
# extra pre-defined build configurations and some utility; optional
|
||||||
|
ifneq ($(MAKEFILE_LIST),)
|
||||||
|
include $(dir $(lastword $(MAKEFILE_LIST)))/misc/make/Makefile-extra.mk
|
||||||
|
else
|
||||||
include ./misc/make/Makefile-extra.mk
|
include ./misc/make/Makefile-extra.mk
|
||||||
|
endif
|
||||||
|
|
||||||
# developer convenience
|
# developer convenience
|
||||||
ifneq ($(wildcard /usr/bin/env),) # needs bash, perl, xargs, etc.
|
test:: build/all+test PHONY
|
||||||
check-whitespace clang-format run-testsuite run-testsuite-debug run-testsuite-release: PHONY src/Makefile
|
ifneq ($(wildcard /usr/bin/env),) # need Unix utils like bash, perl, sed, xargs, etc.
|
||||||
|
ifneq ($(wildcard ./misc/scripts/.),)
|
||||||
|
check-whitespace clang-format run-testsuite run-testsuite-debug run-testsuite-release: src/Makefile PHONY
|
||||||
$(MAKE) -C src $@
|
$(MAKE) -C src $@
|
||||||
endif
|
endif
|
||||||
|
endif
|
||||||
|
|||||||
@@ -2,11 +2,25 @@
|
|||||||
User visible changes for UPX
|
User visible changes for UPX
|
||||||
==================================================================
|
==================================================================
|
||||||
|
|
||||||
|
Changes in 4.2.3 (27 Mar 2024):
|
||||||
|
* bug fixes - see https://github.com/upx/upx/milestone/16
|
||||||
|
|
||||||
|
Changes in 4.2.2 (03 Jan 2024):
|
||||||
|
* bug fixes - see https://github.com/upx/upx/milestone/15
|
||||||
|
|
||||||
|
Changes in 4.2.1 (01 Nov 2023):
|
||||||
|
* linux: /proc/self/exe now is optional
|
||||||
|
* windows: use SetFileTime to preserve sub-second file timestamps
|
||||||
|
* official Windows builds: revert activeCodePage change introduced in 4.2.0
|
||||||
|
* bug fixes - see https://github.com/upx/upx/milestone/14
|
||||||
|
|
||||||
Changes in 4.2.0 (26 Oct 2023):
|
Changes in 4.2.0 (26 Oct 2023):
|
||||||
* win32/pe and win64/pe: stricter relocation checks; please report regressions
|
* win32/pe and win64/pe: stricter relocation checks; please report regressions
|
||||||
|
* unix: use utimensat to preserve sub-second file timestamps
|
||||||
* new option '--link' to preserve hard-links (Unix only; use with care)
|
* new option '--link' to preserve hard-links (Unix only; use with care)
|
||||||
* add support for NO_COLOR env var; see https://no-color.org/
|
* add support for NO_COLOR env var; see https://no-color.org/
|
||||||
* disable macOS support until we fix compatibility with macOS 13+
|
* disable macOS support until we fix compatibility with macOS 13+
|
||||||
|
* official Windows builds: set activeCodePage to UTF-8
|
||||||
* bug fixes - see https://github.com/upx/upx/milestone/13
|
* bug fixes - see https://github.com/upx/upx/milestone/13
|
||||||
|
|
||||||
Changes in 4.1.0 (08 Aug 2023):
|
Changes in 4.1.0 (08 Aug 2023):
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
|
|
||||||
|
|
||||||
The Ultimate Packer for eXecutables
|
The Ultimate Packer for eXecutables
|
||||||
Copyright (c) 1996-2023 Markus Oberhumer, Laszlo Molnar & John Reiser
|
Copyright (c) 1996-2024 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-2023 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2024 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2023 Laszlo Molnar
|
Copyright (C) 1996-2024 Laszlo Molnar
|
||||||
Copyright (C) 2000-2023 John F. Reiser
|
Copyright (C) 2000-2024 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-2023 Markus Oberhumer, Laszlo Molnar & John Reiser
|
Copyright (c) 1996-2024 Markus Oberhumer, Laszlo Molnar & John Reiser
|
||||||
https://upx.github.io
|
https://upx.github.io
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
+5
-3
@@ -1,5 +1,6 @@
|
|||||||
#
|
#
|
||||||
# UPX doc Makefile - needs GNU make, pod2html, pod2man and pod2text
|
# UPX doc Makefile - needs GNU make, sed, pod2html, pod2man and pod2text
|
||||||
|
# Copyright (C) Markus Franz Xaver Johannes Oberhumer
|
||||||
#
|
#
|
||||||
|
|
||||||
BUILT_SOURCES = upx.1 upx-doc.html upx-doc.txt
|
BUILT_SOURCES = upx.1 upx-doc.html upx-doc.txt
|
||||||
@@ -24,6 +25,9 @@ DETAB2 := sed -e 's/$(tab)/ /g'
|
|||||||
#***********************************************************************
|
#***********************************************************************
|
||||||
|
|
||||||
.DEFAULT_GOAL = all
|
.DEFAULT_GOAL = all
|
||||||
|
.PHONY: PHONY
|
||||||
|
.SECONDEXPANSION:
|
||||||
|
.SUFFIXES:
|
||||||
|
|
||||||
all: $(BUILT_SOURCES) PHONY
|
all: $(BUILT_SOURCES) PHONY
|
||||||
|
|
||||||
@@ -34,7 +38,6 @@ mostlyclean clean distclean maintainer-clean: PHONY
|
|||||||
# rules
|
# rules
|
||||||
#***********************************************************************
|
#***********************************************************************
|
||||||
|
|
||||||
.SUFFIXES:
|
|
||||||
.SUFFIXES: .1 .html .man .pod .ps .tex .txt
|
.SUFFIXES: .1 .html .man .pod .ps .tex .txt
|
||||||
|
|
||||||
%.1 : %.pod
|
%.1 : %.pod
|
||||||
@@ -68,4 +71,3 @@ mostlyclean clean distclean maintainer-clean: PHONY
|
|||||||
|
|
||||||
$(BUILT_SOURCES): $(top_srcdir)/src/version.h $(MAKEFILE_LIST)
|
$(BUILT_SOURCES): $(top_srcdir)/src/version.h $(MAKEFILE_LIST)
|
||||||
.DELETE_ON_ERROR: $(BUILT_SOURCES)
|
.DELETE_ON_ERROR: $(BUILT_SOURCES)
|
||||||
.PHONY: PHONY
|
|
||||||
|
|||||||
+1
-1
@@ -8,7 +8,7 @@
|
|||||||
|
|
||||||
|
|
||||||
The Ultimate Packer for eXecutables
|
The Ultimate Packer for eXecutables
|
||||||
Copyright (c) 1996-2023 Markus Oberhumer, Laszlo Molnar & John Reiser
|
Copyright (c) 1996-2024 Markus Oberhumer, Laszlo Molnar & John Reiser
|
||||||
https://upx.github.io
|
https://upx.github.io
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
+46
-44
@@ -1,5 +1,5 @@
|
|||||||
Decompressing ELF Directly to Memory on Linux/x86
|
Decompressing ELF Directly to Memory on Linux/x86
|
||||||
Copyright (C) 2000-2023 John F. Reiser jreiser@BitWagon.com
|
Copyright (C) 2000-2024 John F. Reiser jreiser@BitWagon.com
|
||||||
|
|
||||||
References:
|
References:
|
||||||
<elf.h> definitions for the ELF file format
|
<elf.h> definitions for the ELF file format
|
||||||
@@ -15,7 +15,7 @@ the value that is manipulated by system call 45 (__NR_brk in
|
|||||||
there will be no execve() except for the execve() of the decompressor
|
there will be no execve() except for the execve() of the decompressor
|
||||||
program itself. So, the decompressor program (which contains the
|
program itself. So, the decompressor program (which contains the
|
||||||
compressed version of the original executable) must have the same
|
compressed version of the original executable) must have the same
|
||||||
brk() as the original executable. So, the second PT_LOAD
|
brk() as the original executable. So, the first PT_LOAD
|
||||||
ELF "segment" of the compressed program is used only to set the brk(0).
|
ELF "segment" of the compressed program is used only to set the brk(0).
|
||||||
See src/p_lx_elf.cpp, function PackLinuxElf32::generateElfHdr.
|
See src/p_lx_elf.cpp, function PackLinuxElf32::generateElfHdr.
|
||||||
All of the decompressor's code, and all of the compressed image
|
All of the decompressor's code, and all of the compressed image
|
||||||
@@ -25,35 +25,27 @@ decompressor program.
|
|||||||
The decompressor program stub is just under 2K bytes when linked.
|
The decompressor program stub is just under 2K bytes when linked.
|
||||||
After linking, the decompressor code is converted to an initialized
|
After linking, the decompressor code is converted to an initialized
|
||||||
array, and #included into the compilation of the compressor;
|
array, and #included into the compilation of the compressor;
|
||||||
see src/stub/l_le_n2b.h. To make self-contained compressed
|
see stub/i386-linux.elf-entry.h. To make self-contained compressed
|
||||||
executables even smaller, the compressor also compresses all but the
|
executables even smaller, the compressor also compresses all but the
|
||||||
startup and decompression subroutine of the decompressor itself,
|
startup and decompression subroutine of the decompressor itself,
|
||||||
saving a few hundred bytes. The startup code first decompresses the
|
saving a few hundred bytes. The startup code first decompresses the
|
||||||
rest of the decompressor, then jumps to it. A nonstandard linker
|
rest of the decompressor, then jumps to it. A nonstandard linker
|
||||||
script src/stub/l_lx_elf86.lds places both the .text and .data
|
script src/stub/src/i386-linux.elf-entry.lds arranges the SECTIONS
|
||||||
of the decompressor into the same PT_LOAD at 0x00401000. The
|
so that PackLinuxElf32x86::buildLoader() and buildLinuxLoader()
|
||||||
compressor includes the compressed bytes of the original executable
|
generate the desired stub code, which goes into PT_LOAD[1].
|
||||||
at the end of this first PT_LOAD.
|
|
||||||
|
|
||||||
At runtime, the decompressed stub lives at 0x00400000. In order for the
|
At runtime, the decompressed stub lives close beyond the brk().
|
||||||
decompressed stub to work properly at an address that is different
|
In order for the decompressed stub to work properly at an address
|
||||||
from its link-time address, the compiled code must contain no absolute
|
that is different from its link-time address, the compiled code must
|
||||||
addresses. So, the data items in l_lx_elf.c must be only parameters
|
contain no absolute addresses. So, the data items in stub code
|
||||||
and automatic (on-stack) local variables; no global data, no static data,
|
must be only parameters and automatic (on-stack) local variables;
|
||||||
and no string constants. Use "size l_le_n2b.o l_6e_n2b.o" to check
|
no global data, no static data, and no string constants. Also,
|
||||||
that both data and bss have length zero. Also, the '&' operator
|
the '&' operator may not be used to take the address of a function.
|
||||||
may not be used to take the address of a function.
|
|
||||||
|
|
||||||
The address 0x00400000 was chosen to be out of the way of the usual
|
|
||||||
load address 0x08048000, and to minimize fragmentation in kernel
|
|
||||||
page tables; one page of page tables covers 4 MiB. The address
|
|
||||||
0x00401000 was chosen as 1 page up from a 64 KiB boundary, to
|
|
||||||
make the startup code and its constants smaller.
|
|
||||||
|
|
||||||
Decompression of the executable begins by decompressing the Elf32_Ehdr
|
Decompression of the executable begins by decompressing the Elf32_Ehdr
|
||||||
and Elf32_Phdr, and then uses the Ehdr and Phdrs to control decompression
|
and Elf32_Phdr, and then uses those Ehdr and Phdrs to control decompression
|
||||||
of the PT_LOAD segments.
|
of the PT_LOAD segments. Subroutine do_xmap() of src/stub/src/
|
||||||
Subroutine do_xmap() of src/stub/l_lx_elf.c performs the
|
i386-linux.elf-main.c performs the
|
||||||
"virtual execve()" using the compressed data as source, and stores
|
"virtual execve()" using the compressed data as source, and stores
|
||||||
the decompressed bytes directly into the appropriate virtual addresses.
|
the decompressed bytes directly into the appropriate virtual addresses.
|
||||||
|
|
||||||
@@ -74,22 +66,17 @@ expanding $ORIGIN in -rpath, or for application code that relies on
|
|||||||
--unmap-all-pages to achieve that effect at run time. Upx-3.04
|
--unmap-all-pages to achieve that effect at run time. Upx-3.04
|
||||||
and previous versions did this by default with no option. However,
|
and previous versions did this by default with no option. However,
|
||||||
too much other software erroneously assumes that /proc/self/exe
|
too much other software erroneously assumes that /proc/self/exe
|
||||||
always exists.
|
always exists. upx-4.3.0 made /proc/self/exe optional so that
|
||||||
|
chroot() and related environments can work.
|
||||||
|
For Elf formats, UPX adds an environment variable named " " [three
|
||||||
|
spaces] which saves the results of readlink("/proc/self/exe",,)
|
||||||
|
If /proc/self/exe is ENOENT, then the variable has the same value
|
||||||
|
as its name "/proc/self/exe".
|
||||||
|
|
||||||
On arm*-linux-elf there is no good address at which to retain one
|
All of the above documentation refers to ET_EXEC main programs,
|
||||||
page of the compressed executable. Pages below the usual .p_vaddr
|
which always use the same virtual addresses. An ET_DYN executable
|
||||||
0x8000 (32KiB) are rejected by the kernel. Using a page above the
|
(main program or shared library) follows much the same scheme,
|
||||||
original uncompressed brk(0) would require placing the entire initial
|
re-using the address space that the kernel chose originally.
|
||||||
compressed program above uncompressed brk(0), which would significantly
|
|
||||||
increase the running brk(0); but too many programs break if brk(0)
|
|
||||||
moves. Thus on arm*-linux-elf the compressed executable begins
|
|
||||||
with 0x8000==.p_vaddr, all pages mapped by execve() that are also
|
|
||||||
occupied by decompressed bytes are removed before overwriting, and
|
|
||||||
/proc/self/exe becomes a "(deleted)" symlink. It might be possible
|
|
||||||
to preserve /proc/self/exe if the original uncompressed executable
|
|
||||||
were created with 0x9000==.p_vaddr (one page higher than the usual
|
|
||||||
0x8000) so that the compressed page mapped at 0x8000 would linger.
|
|
||||||
[This has not been tested.]
|
|
||||||
|
|
||||||
Linux stores the pathname argument that was specified to execve()
|
Linux stores the pathname argument that was specified to execve()
|
||||||
immediately after the '\0' which terminates the character string of the
|
immediately after the '\0' which terminates the character string of the
|
||||||
@@ -99,9 +86,24 @@ records a pointer to that character string in Elf32_auxv[AT_EXECFN].
|
|||||||
The pathname is not "bound" to the file as strongly as /proc/self/exe
|
The pathname is not "bound" to the file as strongly as /proc/self/exe
|
||||||
(the file may be changed without affecting the pathname), but the
|
(the file may be changed without affecting the pathname), but the
|
||||||
pathname does provide some information. The pathname may be relative
|
pathname does provide some information. The pathname may be relative
|
||||||
to the working directory, so look before any chdir().
|
to the working directory, so look before performing any chdir().
|
||||||
|
|
||||||
The Elf formats for Linux add an environment variable named " " [three
|
On any page, then SELinux in strictest enforcing mode prohibits
|
||||||
spaces] which saves the results of readlink("/proc/self/exe",,) before
|
simultaneous PROT_EXEC and PROT_WRITE, and also prohibits adding
|
||||||
the runtime stub unmaps all its pages. As of 2006-10-03 this works
|
PROT_EXEC if the kernel VMA struct (Virtual Memory Area struct)
|
||||||
for linux/elf386 and linux/ElfAMD.
|
that manages that page ever has had PROT_WRITE. This implies that
|
||||||
|
the only way to get PROT_EXEC is to map the page directly from a file.
|
||||||
|
Therefore, in late 2023 the various decompression stubs are being
|
||||||
|
rewritten to "bounce" the decompressed data through pages in a
|
||||||
|
memory-resident file created by the memfd_create() system call,
|
||||||
|
and subsequently mapped PROT_EXEC. Actual copying of the pages
|
||||||
|
can be avoided by careful sequence mmap() modes, but the overhead
|
||||||
|
of an additional system call is required.
|
||||||
|
|
||||||
|
The not-as-strict "targeted enforcing" mode of
|
||||||
|
SELinux seems not to demand this extra work, except for executables
|
||||||
|
that run with elevated privileges, such as various system daemons.
|
||||||
|
So "ordinary" user-mode apps can run in current "targeted enforcing"
|
||||||
|
mode. But because the actual runtime mode of SELinux is unknown
|
||||||
|
at compression time, then the memfd_create method should be used
|
||||||
|
all the time.
|
||||||
|
|||||||
Generated
+5
-5
@@ -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-2023 Markus Oberhumer, Laszlo Molnar & John Reiser
|
Copyright (c) 1996-2024 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>
|
||||||
@@ -785,13 +785,13 @@ Jens Medoch <jssg@users.sourceforge.net></code></pre>
|
|||||||
|
|
||||||
<h1 id="COPYRIGHT">COPYRIGHT</h1>
|
<h1 id="COPYRIGHT">COPYRIGHT</h1>
|
||||||
|
|
||||||
<p>Copyright (C) 1996-2023 Markus Franz Xaver Johannes Oberhumer</p>
|
<p>Copyright (C) 1996-2024 Markus Franz Xaver Johannes Oberhumer</p>
|
||||||
|
|
||||||
<p>Copyright (C) 1996-2023 Laszlo Molnar</p>
|
<p>Copyright (C) 1996-2024 Laszlo Molnar</p>
|
||||||
|
|
||||||
<p>Copyright (C) 2000-2023 John F. Reiser</p>
|
<p>Copyright (C) 2000-2024 John F. Reiser</p>
|
||||||
|
|
||||||
<p>Copyright (C) 2002-2023 Jens Medoch</p>
|
<p>Copyright (C) 2002-2024 Jens Medoch</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
+5
-5
@@ -6,7 +6,7 @@ SYNOPSIS
|
|||||||
|
|
||||||
ABSTRACT
|
ABSTRACT
|
||||||
The Ultimate Packer for eXecutables
|
The Ultimate Packer for eXecutables
|
||||||
Copyright (c) 1996-2023 Markus Oberhumer, Laszlo Molnar & John Reiser
|
Copyright (c) 1996-2024 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
|
||||||
@@ -818,13 +818,13 @@ AUTHORS
|
|||||||
Jens Medoch <jssg@users.sourceforge.net>
|
Jens Medoch <jssg@users.sourceforge.net>
|
||||||
|
|
||||||
COPYRIGHT
|
COPYRIGHT
|
||||||
Copyright (C) 1996-2023 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2024 Markus Franz Xaver Johannes Oberhumer
|
||||||
|
|
||||||
Copyright (C) 1996-2023 Laszlo Molnar
|
Copyright (C) 1996-2024 Laszlo Molnar
|
||||||
|
|
||||||
Copyright (C) 2000-2023 John F. Reiser
|
Copyright (C) 2000-2024 John F. Reiser
|
||||||
|
|
||||||
Copyright (C) 2002-2023 Jens Medoch
|
Copyright (C) 2002-2024 Jens Medoch
|
||||||
|
|
||||||
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
|
||||||
|
|||||||
@@ -133,7 +133,7 @@
|
|||||||
.\" ========================================================================
|
.\" ========================================================================
|
||||||
.\"
|
.\"
|
||||||
.IX Title "UPX 1"
|
.IX Title "UPX 1"
|
||||||
.TH UPX 1 "2023-10-26" "upx 4.2.0" " "
|
.TH UPX 1 "2024-03-27" "upx 4.2.3" " "
|
||||||
.\" 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
|
||||||
@@ -147,7 +147,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\-2023 Markus Oberhumer, Laszlo Molnar & John Reiser
|
\& Copyright (c) 1996\-2024 Markus Oberhumer, Laszlo Molnar & John Reiser
|
||||||
\& https://upx.github.io
|
\& https://upx.github.io
|
||||||
.Ve
|
.Ve
|
||||||
.PP
|
.PP
|
||||||
@@ -1019,13 +1019,13 @@ Please report all bugs immediately to the authors.
|
|||||||
.Ve
|
.Ve
|
||||||
.SH "COPYRIGHT"
|
.SH "COPYRIGHT"
|
||||||
.IX Header "COPYRIGHT"
|
.IX Header "COPYRIGHT"
|
||||||
Copyright (C) 1996\-2023 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996\-2024 Markus Franz Xaver Johannes Oberhumer
|
||||||
.PP
|
.PP
|
||||||
Copyright (C) 1996\-2023 Laszlo Molnar
|
Copyright (C) 1996\-2024 Laszlo Molnar
|
||||||
.PP
|
.PP
|
||||||
Copyright (C) 2000\-2023 John F. Reiser
|
Copyright (C) 2000\-2024 John F. Reiser
|
||||||
.PP
|
.PP
|
||||||
Copyright (C) 2002\-2023 Jens Medoch
|
Copyright (C) 2002\-2024 Jens Medoch
|
||||||
.PP
|
.PP
|
||||||
\&\fB\s-1UPX\s0\fR is distributed with full source code under the terms of the
|
\&\fB\s-1UPX\s0\fR is distributed with full source code under the terms of the
|
||||||
\&\s-1GNU\s0 General Public License v2+; either under the pure GPLv2+ (see
|
\&\s-1GNU\s0 General Public License v2+; either under the pure GPLv2+ (see
|
||||||
|
|||||||
+5
-5
@@ -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-2023 Markus Oberhumer, Laszlo Molnar & John Reiser
|
Copyright (c) 1996-2024 Markus Oberhumer, Laszlo Molnar & John Reiser
|
||||||
https://upx.github.io
|
https://upx.github.io
|
||||||
|
|
||||||
|
|
||||||
@@ -932,13 +932,13 @@ Please report all bugs immediately to the authors.
|
|||||||
|
|
||||||
=head1 COPYRIGHT
|
=head1 COPYRIGHT
|
||||||
|
|
||||||
Copyright (C) 1996-2023 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2024 Markus Franz Xaver Johannes Oberhumer
|
||||||
|
|
||||||
Copyright (C) 1996-2023 Laszlo Molnar
|
Copyright (C) 1996-2024 Laszlo Molnar
|
||||||
|
|
||||||
Copyright (C) 2000-2023 John F. Reiser
|
Copyright (C) 2000-2024 John F. Reiser
|
||||||
|
|
||||||
Copyright (C) 2002-2023 Jens Medoch
|
Copyright (C) 2002-2024 Jens Medoch
|
||||||
|
|
||||||
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
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
# for clang-tidy-16 from https://clang.llvm.org/extra/clang-tidy/
|
# for clang-tidy from https://clang.llvm.org/extra/clang-tidy/
|
||||||
---
|
---
|
||||||
Checks: >
|
Checks: >
|
||||||
-*,
|
-*,
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
# for clang-tidy-16 from https://clang.llvm.org/extra/clang-tidy/
|
# for clang-tidy from https://clang.llvm.org/extra/clang-tidy/
|
||||||
---
|
---
|
||||||
Checks: >
|
Checks: >
|
||||||
-*,
|
-*,
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
# for clang-tidy-16 from https://clang.llvm.org/extra/clang-tidy/
|
# for clang-tidy from https://clang.llvm.org/extra/clang-tidy/
|
||||||
---
|
---
|
||||||
Checks: >
|
Checks: >
|
||||||
-*,
|
-*,
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
# for clang-tidy-16 from https://clang.llvm.org/extra/clang-tidy/
|
# for clang-tidy from https://clang.llvm.org/extra/clang-tidy/
|
||||||
---
|
---
|
||||||
Checks: >
|
Checks: >
|
||||||
-*,
|
-*,
|
||||||
|
|||||||
@@ -257,7 +257,7 @@ def main():
|
|||||||
parser.add_argument(
|
parser.add_argument(
|
||||||
"-allow-enabling-alpha-checkers",
|
"-allow-enabling-alpha-checkers",
|
||||||
action="store_true",
|
action="store_true",
|
||||||
help="allow alpha checkers from " "clang-analyzer.",
|
help="allow alpha checkers from clang-analyzer.",
|
||||||
)
|
)
|
||||||
parser.add_argument(
|
parser.add_argument(
|
||||||
"-clang-tidy-binary", metavar="PATH", help="path to clang-tidy binary"
|
"-clang-tidy-binary", metavar="PATH", help="path to clang-tidy binary"
|
||||||
@@ -270,7 +270,7 @@ def main():
|
|||||||
parser.add_argument(
|
parser.add_argument(
|
||||||
"-checks",
|
"-checks",
|
||||||
default=None,
|
default=None,
|
||||||
help="checks filter, when not specified, use clang-tidy " "default",
|
help="checks filter, when not specified, use clang-tidy default",
|
||||||
)
|
)
|
||||||
config_group = parser.add_mutually_exclusive_group()
|
config_group = parser.add_mutually_exclusive_group()
|
||||||
config_group.add_argument(
|
config_group.add_argument(
|
||||||
@@ -303,7 +303,7 @@ def main():
|
|||||||
parser.add_argument(
|
parser.add_argument(
|
||||||
"-line-filter",
|
"-line-filter",
|
||||||
default=None,
|
default=None,
|
||||||
help="List of files with line ranges to filter the" "warnings.",
|
help="List of files with line ranges to filter the warnings.",
|
||||||
)
|
)
|
||||||
if yaml:
|
if yaml:
|
||||||
parser.add_argument(
|
parser.add_argument(
|
||||||
@@ -335,12 +335,12 @@ def main():
|
|||||||
)
|
)
|
||||||
parser.add_argument("-fix", action="store_true", help="apply fix-its")
|
parser.add_argument("-fix", action="store_true", help="apply fix-its")
|
||||||
parser.add_argument(
|
parser.add_argument(
|
||||||
"-format", action="store_true", help="Reformat code " "after applying fixes"
|
"-format", action="store_true", help="Reformat code after applying fixes"
|
||||||
)
|
)
|
||||||
parser.add_argument(
|
parser.add_argument(
|
||||||
"-style",
|
"-style",
|
||||||
default="file",
|
default="file",
|
||||||
help="The style of reformat " "code after applying fixes",
|
help="The style of reformat code after applying fixes",
|
||||||
)
|
)
|
||||||
parser.add_argument(
|
parser.add_argument(
|
||||||
"-use-color",
|
"-use-color",
|
||||||
@@ -359,14 +359,14 @@ def main():
|
|||||||
dest="extra_arg",
|
dest="extra_arg",
|
||||||
action="append",
|
action="append",
|
||||||
default=[],
|
default=[],
|
||||||
help="Additional argument to append to the compiler " "command line.",
|
help="Additional argument to append to the compiler command line.",
|
||||||
)
|
)
|
||||||
parser.add_argument(
|
parser.add_argument(
|
||||||
"-extra-arg-before",
|
"-extra-arg-before",
|
||||||
dest="extra_arg_before",
|
dest="extra_arg_before",
|
||||||
action="append",
|
action="append",
|
||||||
default=[],
|
default=[],
|
||||||
help="Additional argument to prepend to the compiler " "command line.",
|
help="Additional argument to prepend to the compiler command line.",
|
||||||
)
|
)
|
||||||
parser.add_argument(
|
parser.add_argument(
|
||||||
"-quiet", action="store_true", help="Run clang-tidy in quiet mode"
|
"-quiet", action="store_true", help="Run clang-tidy in quiet mode"
|
||||||
@@ -381,7 +381,7 @@ def main():
|
|||||||
parser.add_argument(
|
parser.add_argument(
|
||||||
"-warnings-as-errors",
|
"-warnings-as-errors",
|
||||||
default=None,
|
default=None,
|
||||||
help="Upgrades warnings to errors. Same format as " "'-checks'",
|
help="Upgrades warnings to errors. Same format as '-checks'",
|
||||||
)
|
)
|
||||||
args = parser.parse_args()
|
args = parser.parse_args()
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,316 @@
|
|||||||
|
#
|
||||||
|
# UPX "CMake" build file; see https://cmake.org/
|
||||||
|
# Copyright (C) Markus Franz Xaver Johannes Oberhumer
|
||||||
|
#
|
||||||
|
|
||||||
|
#***********************************************************************
|
||||||
|
# macros
|
||||||
|
#***********************************************************************
|
||||||
|
|
||||||
|
# support config hooks; developer convenience
|
||||||
|
macro(upx_cmake_include_hook section)
|
||||||
|
include("${CMAKE_CURRENT_SOURCE_DIR}/misc/cmake/hooks/CMakeLists.${section}.txt" OPTIONAL)
|
||||||
|
include("${CMAKE_CURRENT_SOURCE_DIR}/maint/make/CMakeLists.${section}.txt" OPTIONAL)
|
||||||
|
endmacro()
|
||||||
|
|
||||||
|
# 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.
|
||||||
|
macro(upx_disallow_in_source_build)
|
||||||
|
set(CMAKE_DISABLE_IN_SOURCE_BUILD ON)
|
||||||
|
set(CMAKE_DISABLE_SOURCE_CHANGES ON)
|
||||||
|
if(",${CMAKE_CURRENT_SOURCE_DIR}," STREQUAL ",${CMAKE_CURRENT_BINARY_DIR},")
|
||||||
|
# try to clean up (does not work)
|
||||||
|
#file(REMOVE "${CMAKE_CURRENT_BINARY_DIR}/CMakeCache.txt")
|
||||||
|
#file(REMOVE "${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/cmake.check_cache")
|
||||||
|
message(FATAL_ERROR "ERROR: In-source builds are not allowed, please use an extra build dir.")
|
||||||
|
endif()
|
||||||
|
endmacro()
|
||||||
|
|
||||||
|
# set the default build type; must be called before project() cmake init
|
||||||
|
macro(upx_set_default_build_type type)
|
||||||
|
set(upx_global_default_build_type "${type}")
|
||||||
|
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)
|
||||||
|
set(CMAKE_BUILD_TYPE "${upx_global_default_build_type}" CACHE STRING "Choose the type of build." FORCE)
|
||||||
|
endif()
|
||||||
|
endmacro()
|
||||||
|
|
||||||
|
# set the default multi-config build type; must be called after project() cmake init
|
||||||
|
macro(upx_apply_build_type)
|
||||||
|
if(upx_global_is_multi_config)
|
||||||
|
set(c "${CMAKE_CONFIGURATION_TYPES}")
|
||||||
|
list(INSERT c 0 "${upx_global_default_build_type}")
|
||||||
|
if(CMAKE_BUILD_TYPE)
|
||||||
|
list(INSERT c 0 "${CMAKE_BUILD_TYPE}")
|
||||||
|
endif()
|
||||||
|
list(REMOVE_DUPLICATES c)
|
||||||
|
set(CMAKE_CONFIGURATION_TYPES "${c}" CACHE STRING "List of supported configuration types." FORCE)
|
||||||
|
endif()
|
||||||
|
# now also set the build type for use in try_compile()
|
||||||
|
if(NOT CMAKE_TRY_COMPILE_CONFIGURATION)
|
||||||
|
if(CMAKE_BUILD_TYPE)
|
||||||
|
set(CMAKE_TRY_COMPILE_CONFIGURATION "${CMAKE_BUILD_TYPE}")
|
||||||
|
else()
|
||||||
|
set(CMAKE_TRY_COMPILE_CONFIGURATION "${upx_global_default_build_type}")
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
endmacro()
|
||||||
|
|
||||||
|
#***********************************************************************
|
||||||
|
# util
|
||||||
|
#***********************************************************************
|
||||||
|
|
||||||
|
function(upx_print_var) # ARGV
|
||||||
|
foreach(var_name ${ARGV})
|
||||||
|
if(DEFINED ${var_name})
|
||||||
|
if(NOT ",${${var_name}}," STREQUAL ",,")
|
||||||
|
if(${var_name})
|
||||||
|
message(STATUS "${var_name} = ${${var_name}}")
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
endforeach()
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
function(upx_print_env_var) # ARGV
|
||||||
|
foreach(var_name ${ARGV})
|
||||||
|
if(DEFINED ENV{${var_name}})
|
||||||
|
if(NOT ",$ENV{${var_name}}," STREQUAL ",,")
|
||||||
|
message(STATUS "ENV{${var_name}} = $ENV{${var_name}}")
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
endforeach()
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
function(upx_print_have_symbol) # ARGV; needs include(CheckSymbolExists)
|
||||||
|
foreach(symbol ${ARGV})
|
||||||
|
set(cache_var_name "HAVE_symbol_${symbol}")
|
||||||
|
check_symbol_exists(${symbol} "limits.h;stddef.h;stdint.h" ${cache_var_name})
|
||||||
|
if(${cache_var_name})
|
||||||
|
message(STATUS "HAVE ${symbol}")
|
||||||
|
endif()
|
||||||
|
endforeach()
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
# examine MinGW/Cygwin compiler configuration
|
||||||
|
function(upx_print_mingw_symbols)
|
||||||
|
if(WIN32 OR MINGW OR CYGWIN)
|
||||||
|
if(CMAKE_C_COMPILER_ID MATCHES "(Clang|GNU)")
|
||||||
|
# runtime library: msvcrt vs ucrt vs cygwin
|
||||||
|
upx_print_have_symbol(__CRTDLL__ __CYGWIN__ __CYGWIN32__ __CYGWIN64__ __MINGW32__ __MINGW64__ __MINGW64_VERSION_MAJOR __MSVCRT__ __MSVCRT_VERSION__ _UCRT _WIN32 _WIN64)
|
||||||
|
# exception handing: SJLJ (setjmp/longjmp) vs DWARF vs SEH
|
||||||
|
upx_print_have_symbol(__GCC_HAVE_DWARF2_CFI_ASM __SEH__ __USING_SJLJ_EXCEPTIONS__)
|
||||||
|
# threads: win32 vs posix/pthread/winpthreads vs mcfgthread
|
||||||
|
upx_print_have_symbol(_REENTRANT __USING_MCFGTHREAD__)
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
# add wildcard expansions to a variable
|
||||||
|
function(upx_add_glob_files) # ARGV
|
||||||
|
set(var_name ${ARGV0})
|
||||||
|
list(REMOVE_AT ARGV 0)
|
||||||
|
file(GLOB files ${ARGV})
|
||||||
|
set(result "")
|
||||||
|
if(DEFINED ${var_name})
|
||||||
|
set(result "${${var_name}}")
|
||||||
|
endif()
|
||||||
|
list(APPEND result "${files}")
|
||||||
|
list(SORT result)
|
||||||
|
list(REMOVE_DUPLICATES result)
|
||||||
|
#message(STATUS "upx_add_glob_files: ${var_name} = ${result}")
|
||||||
|
set(${var_name} "${result}" PARENT_SCOPE) # return value
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
# remove wildcard expansions from a variable
|
||||||
|
function(upx_remove_glob_files) # ARGV
|
||||||
|
set(var_name ${ARGV0})
|
||||||
|
list(REMOVE_AT ARGV 0)
|
||||||
|
file(GLOB files ${ARGV})
|
||||||
|
set(result "")
|
||||||
|
if(DEFINED ${var_name})
|
||||||
|
set(result "${${var_name}}")
|
||||||
|
foreach(file ${files})
|
||||||
|
list(REMOVE_ITEM result "${file}")
|
||||||
|
endforeach()
|
||||||
|
list(SORT result)
|
||||||
|
list(REMOVE_DUPLICATES result)
|
||||||
|
endif()
|
||||||
|
#message(STATUS "upx_remove_glob_files: ${var_name} = ${result}")
|
||||||
|
set(${var_name} "${result}" PARENT_SCOPE) # return value
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
# useful for CI jobs: allow settings via environment and cache result
|
||||||
|
function(upx_cache_bool_vars) # ARGV
|
||||||
|
set(default_value "${ARGV0}")
|
||||||
|
list(REMOVE_AT ARGV 0)
|
||||||
|
foreach(var_name ${ARGV})
|
||||||
|
set(value ${default_value})
|
||||||
|
if(DEFINED UPX_CACHE_VALUE_${var_name}) # check cache
|
||||||
|
set(value "${UPX_CACHE_VALUE_${var_name}}")
|
||||||
|
elseif(DEFINED ${var_name}) # defined via "cmake -DXXX=YYY"
|
||||||
|
set(value "${${var_name}}")
|
||||||
|
elseif(DEFINED ENV{${var_name}}) # check environment
|
||||||
|
if("$ENV{${var_name}}" MATCHES "^(0|1|OFF|ON|FALSE|TRUE)$")
|
||||||
|
set(value "$ENV{${var_name}}")
|
||||||
|
set(UPX_CACHE_ORIGIN_FROM_ENV_${var_name} TRUE CACHE INTERNAL "" FORCE) # for status message below
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
# convert to bool
|
||||||
|
if(value)
|
||||||
|
set(value ON)
|
||||||
|
else()
|
||||||
|
set(value OFF)
|
||||||
|
endif()
|
||||||
|
# store result
|
||||||
|
if(UPX_CACHE_ORIGIN_FROM_ENV_${var_name})
|
||||||
|
message(STATUS "setting from environment: ${var_name} = ${value}")
|
||||||
|
endif()
|
||||||
|
set(${var_name} "${value}" PARENT_SCOPE) # store result
|
||||||
|
set(UPX_CACHE_VALUE_${var_name} "${value}" CACHE INTERNAL "" FORCE) # and store in cache
|
||||||
|
endforeach()
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
function(upx_platform_check_mismatch var_name_1 var_name_2)
|
||||||
|
if(DEFINED ${var_name_1} OR DEFINED ${var_name_2})
|
||||||
|
if(NOT ",${${var_name_1}}," STREQUAL ",${${var_name_2}},")
|
||||||
|
if(UPX_CONFIG_DISABLE_WERROR)
|
||||||
|
message(WARNING "WARNING: '${var_name_1}' '${var_name_2}' mismatch")
|
||||||
|
else()
|
||||||
|
message(FATAL_ERROR "FATAL ERROR: '${var_name_1}' '${var_name_2}' mismatch")
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
#***********************************************************************
|
||||||
|
# compilation flags
|
||||||
|
#***********************************************************************
|
||||||
|
|
||||||
|
function(upx_internal_add_definitions_with_prefix) # ARGV; needs include(CheckCCompilerFlag)
|
||||||
|
set(flag_prefix "${ARGV0}")
|
||||||
|
if(flag_prefix MATCHES "^empty$") # need "empty" to work around bug in old CMake versions
|
||||||
|
set(flag_prefix "")
|
||||||
|
endif()
|
||||||
|
list(REMOVE_AT ARGV 0)
|
||||||
|
set(failed "")
|
||||||
|
foreach(f ${ARGV})
|
||||||
|
set(flag "${flag_prefix}${f}")
|
||||||
|
string(REGEX REPLACE "[^0-9a-zA-Z_]" "_" cache_var_name "HAVE_CFLAG_${flag}")
|
||||||
|
check_c_compiler_flag("${flag}" ${cache_var_name})
|
||||||
|
if(${cache_var_name})
|
||||||
|
#message(STATUS "add_definitions: ${flag}")
|
||||||
|
add_definitions("${flag}")
|
||||||
|
else()
|
||||||
|
list(APPEND failed "${f}")
|
||||||
|
endif()
|
||||||
|
endforeach()
|
||||||
|
set(failed_flags "${failed}" PARENT_SCOPE) # return value
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
function(upx_add_definitions) # ARGV; needs include(CheckCCompilerFlag)
|
||||||
|
set(failed_flags "")
|
||||||
|
if(MSVC_FRONTEND AND CMAKE_C_COMPILER_ID MATCHES "Clang")
|
||||||
|
# for clang-cl try "-clang:" flag prefix first
|
||||||
|
upx_internal_add_definitions_with_prefix("-clang:" ${ARGV})
|
||||||
|
upx_internal_add_definitions_with_prefix("empty" ${failed_flags})
|
||||||
|
else()
|
||||||
|
upx_internal_add_definitions_with_prefix("empty" ${ARGV})
|
||||||
|
endif()
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
# useful for CI jobs: allow target extra compile options
|
||||||
|
function(upx_add_target_extra_compile_options) # ARGV
|
||||||
|
set(t "${ARGV0}")
|
||||||
|
list(REMOVE_AT ARGV 0)
|
||||||
|
foreach(var_name ${ARGV})
|
||||||
|
if(NOT DEFINED ${var_name})
|
||||||
|
elseif(",${${var_name}}," STREQUAL ",,")
|
||||||
|
else()
|
||||||
|
set(flags "${${var_name}}")
|
||||||
|
if(NOT flags MATCHES ";") # NOTE: split into list from string only if not already a list
|
||||||
|
if(${CMAKE_VERSION} VERSION_GREATER "3.8.99")
|
||||||
|
separate_arguments(flags NATIVE_COMMAND "${flags}")
|
||||||
|
else()
|
||||||
|
separate_arguments(flags)
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
target_compile_options(${t} PRIVATE "${flags}")
|
||||||
|
endif()
|
||||||
|
endforeach()
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
# compile a target with -O2 optimization even in Debug build
|
||||||
|
function(upx_compile_target_debug_with_O2) # ARGV
|
||||||
|
foreach(t ${ARGV})
|
||||||
|
if(MSVC_FRONTEND)
|
||||||
|
# MSVC uses some Debug compilation options like -RTC1 that are incompatible with -O2
|
||||||
|
else()
|
||||||
|
target_compile_options(${t} PRIVATE $<$<CONFIG:Debug>:-O2>)
|
||||||
|
endif()
|
||||||
|
endforeach()
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
# compile a source file with -O2 optimization even in Debug build; messy because of CMake limitations
|
||||||
|
function(upx_compile_source_debug_with_O2) # ARGV
|
||||||
|
set(flags "$<$<CONFIG:Debug>:-O2>")
|
||||||
|
if(${CMAKE_VERSION} VERSION_LESS "3.8")
|
||||||
|
# 3.8: The COMPILE_FLAGS source file property learned to support generator expressions
|
||||||
|
if(upx_global_is_multi_config OR NOT CMAKE_BUILD_TYPE MATCHES "^Debug$")
|
||||||
|
return()
|
||||||
|
endif()
|
||||||
|
set(flags "-O2")
|
||||||
|
endif()
|
||||||
|
if(CMAKE_GENERATOR MATCHES "Xcode") # multi-config
|
||||||
|
# NOTE: Xcode does not support per-config per-source COMPILE_FLAGS (as of CMake 3.27.7)
|
||||||
|
return()
|
||||||
|
endif()
|
||||||
|
foreach(source ${ARGV})
|
||||||
|
if(MSVC_FRONTEND)
|
||||||
|
# MSVC uses some Debug compilation options like -RTC1 that are incompatible with -O2
|
||||||
|
else()
|
||||||
|
get_source_file_property(prop "${source}" COMPILE_FLAGS)
|
||||||
|
if(prop MATCHES "^(NOTFOUND)?$")
|
||||||
|
set_source_files_properties("${source}" PROPERTIES COMPILE_FLAGS "${flags}")
|
||||||
|
else()
|
||||||
|
set_source_files_properties("${source}" PROPERTIES COMPILE_FLAGS "${prop} ${flags}")
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
endforeach()
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
# sanitize a target; note that this may require special run-time support libs from your toolchain
|
||||||
|
function(upx_sanitize_target) # ARGV
|
||||||
|
foreach(t ${ARGV})
|
||||||
|
if(UPX_CONFIG_DISABLE_SANITIZE)
|
||||||
|
# no-op
|
||||||
|
elseif(MSVC_FRONTEND)
|
||||||
|
# MSVC uses -GS (similar to -fstack-protector) by default
|
||||||
|
elseif(MINGW OR CYGWIN)
|
||||||
|
# avoid link errors with current MinGW-w64 versions
|
||||||
|
# see https://www.mingw-w64.org/contribute/#sanitizers-asan-tsan-usan
|
||||||
|
elseif(CMAKE_C_COMPILER_ID MATCHES "^GNU" AND CMAKE_C_COMPILER_VERSION VERSION_LESS "8.0")
|
||||||
|
# unsupported compiler; unreliable/broken sanitize implementation
|
||||||
|
else()
|
||||||
|
# default sanitizer for Debug builds
|
||||||
|
target_compile_options(${t} PRIVATE $<$<CONFIG:Debug>:-fsanitize=undefined -fsanitize-undefined-trap-on-error -fstack-protector-all>)
|
||||||
|
# default sanitizer for Release builds
|
||||||
|
target_compile_options(${t} PRIVATE $<$<CONFIG:MinSizeRel>:-fstack-protector>)
|
||||||
|
target_compile_options(${t} PRIVATE $<$<CONFIG:Release>:-fstack-protector>)
|
||||||
|
target_compile_options(${t} PRIVATE $<$<CONFIG:RelWithDebInfo>:-fstack-protector>)
|
||||||
|
endif()
|
||||||
|
endforeach()
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
#***********************************************************************
|
||||||
|
# test
|
||||||
|
#***********************************************************************
|
||||||
|
|
||||||
|
function(upx_add_serial_test) # ARGV
|
||||||
|
set(name "${ARGV0}")
|
||||||
|
list(REMOVE_AT ARGV 0)
|
||||||
|
add_test(NAME "${name}" COMMAND ${ARGV})
|
||||||
|
set_tests_properties("${name}" PROPERTIES RUN_SERIAL TRUE) # run these tests sequentially
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
# vim:set ft=cmake ts=4 sw=4 tw=0 et:
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
// Copyright (C) Markus Franz Xaver Johannes Oberhumer
|
||||||
|
|
||||||
|
#include <mutex>
|
||||||
|
|
||||||
|
static std::mutex lock_mutex;
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
std::lock_guard<std::mutex> lock(lock_mutex);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
+113
-31
@@ -3,6 +3,31 @@
|
|||||||
# Copyright (C) Markus Franz Xaver Johannes Oberhumer
|
# Copyright (C) Markus Franz Xaver Johannes Oberhumer
|
||||||
#
|
#
|
||||||
|
|
||||||
|
ifeq ($(UPX_MAKEFILE_EXTRA_MK_INCLUDED),)
|
||||||
|
override UPX_MAKEFILE_EXTRA_MK_INCLUDED := 1
|
||||||
|
|
||||||
|
override check_defined = $(foreach 1,$1,$(if $(filter undefined,$(origin $1)),$(error ERROR: variable '$1' is not defined),))
|
||||||
|
override check_undefined = $(foreach 1,$1,$(if $(filter undefined,$(origin $1)),,$(error ERROR: variable '$1' is already defined)))
|
||||||
|
$(call check_defined,run_config run_build)
|
||||||
|
$(call check_undefined,run_config_and_build)
|
||||||
|
|
||||||
|
#***********************************************************************
|
||||||
|
# build and test
|
||||||
|
#***********************************************************************
|
||||||
|
|
||||||
|
CTEST = ctest
|
||||||
|
|
||||||
|
build/debug+test: $$(dir $$@)debug PHONY; cd "$(dir $@)debug" && $(CTEST)
|
||||||
|
build/%/debug+test: $$(dir $$@)debug PHONY; cd "$(dir $@)debug" && $(CTEST)
|
||||||
|
build/release+test: $$(dir $$@)release PHONY; cd "$(dir $@)release" && $(CTEST)
|
||||||
|
build/%/release+test: $$(dir $$@)release PHONY; cd "$(dir $@)release" && $(CTEST)
|
||||||
|
build/%/all+test: $$(dir $$@)debug+test $$(dir $$@)release+test PHONY ;
|
||||||
|
|
||||||
|
# shortcuts
|
||||||
|
debug+test: build/debug+test PHONY
|
||||||
|
release+test: build/release+test PHONY
|
||||||
|
all+test build/all+test: build/debug+test build/release+test PHONY
|
||||||
|
|
||||||
#***********************************************************************
|
#***********************************************************************
|
||||||
# extra builds: some pre-defined build configurations
|
# extra builds: some pre-defined build configurations
|
||||||
#***********************************************************************
|
#***********************************************************************
|
||||||
@@ -21,37 +46,43 @@ build/extra/clang/%: export CXX = clang++
|
|||||||
# force building with clang/clang++ -m32
|
# force building with clang/clang++ -m32
|
||||||
build/extra/clang-m32/debug: PHONY; $(call run_config_and_build,$@,Debug)
|
build/extra/clang-m32/debug: PHONY; $(call run_config_and_build,$@,Debug)
|
||||||
build/extra/clang-m32/release: PHONY; $(call run_config_and_build,$@,Release)
|
build/extra/clang-m32/release: PHONY; $(call run_config_and_build,$@,Release)
|
||||||
build/extra/clang-m32/%: export CC = clang -m32
|
build/extra/clang-m32/%: export CC = clang -m32
|
||||||
build/extra/clang-m32/%: export CXX = clang++ -m32
|
build/extra/clang-m32/%: export CXX = clang++ -m32
|
||||||
|
|
||||||
# force building with clang/clang++ -mx32
|
# force building with clang/clang++ -mx32
|
||||||
build/extra/clang-mx32/debug: PHONY; $(call run_config_and_build,$@,Debug)
|
build/extra/clang-mx32/debug: PHONY; $(call run_config_and_build,$@,Debug)
|
||||||
build/extra/clang-mx32/release: PHONY; $(call run_config_and_build,$@,Release)
|
build/extra/clang-mx32/release: PHONY; $(call run_config_and_build,$@,Release)
|
||||||
build/extra/clang-mx32/%: export CC = clang -mx32
|
build/extra/clang-mx32/%: export CC = clang -mx32
|
||||||
build/extra/clang-mx32/%: export CXX = clang++ -mx32
|
build/extra/clang-mx32/%: export CXX = clang++ -mx32
|
||||||
|
|
||||||
# force building with clang/clang++ -m64
|
# force building with clang/clang++ -m64
|
||||||
build/extra/clang-m64/debug: PHONY; $(call run_config_and_build,$@,Debug)
|
build/extra/clang-m64/debug: PHONY; $(call run_config_and_build,$@,Debug)
|
||||||
build/extra/clang-m64/release: PHONY; $(call run_config_and_build,$@,Release)
|
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++ -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
|
||||||
|
|
||||||
|
# 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/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 CXX = clang++ -static-pie -fPIE -Wno-unused-command-line-argument
|
||||||
|
|
||||||
# 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
|
||||||
|
|
||||||
# force building with clang/clang++ C17/C++20
|
# force building with clang/clang++ C17/C++20
|
||||||
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
|
||||||
@@ -59,7 +90,7 @@ 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++ C23/C++23
|
||||||
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
|
||||||
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
|
||||||
@@ -94,6 +125,12 @@ 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
|
||||||
|
|
||||||
|
# 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/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 CXX = g++ -static-pie -fPIE
|
||||||
|
|
||||||
# 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)
|
||||||
@@ -112,7 +149,7 @@ build/extra/gcc-std-cxx20/%: export UPX_CONFIG_DISABLE_CXX_STANDARD=ON
|
|||||||
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++23
|
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
|
||||||
|
|
||||||
@@ -121,36 +158,50 @@ build/extra/cross-linux-gnu-aarch64/debug: PHONY; $(call run_config_and_build,
|
|||||||
build/extra/cross-linux-gnu-aarch64/release: PHONY; $(call run_config_and_build,$@,Release)
|
build/extra/cross-linux-gnu-aarch64/release: PHONY; $(call run_config_and_build,$@,Release)
|
||||||
build/extra/cross-linux-gnu-aarch64/%: export CC = aarch64-linux-gnu-gcc
|
build/extra/cross-linux-gnu-aarch64/%: export CC = aarch64-linux-gnu-gcc
|
||||||
build/extra/cross-linux-gnu-aarch64/%: export CXX = aarch64-linux-gnu-g++
|
build/extra/cross-linux-gnu-aarch64/%: export CXX = aarch64-linux-gnu-g++
|
||||||
|
build/extra/cross-linux-gnu-aarch64/%: CMAKE_SYSTEM_NAME ?= Linux
|
||||||
|
build/extra/cross-linux-gnu-aarch64/%: CMAKE_CROSSCOMPILING_EMULATOR ?= qemu-aarch64
|
||||||
|
|
||||||
# cross compiler: Linux glibc arm-linux-gnueabihf
|
# cross compiler: Linux glibc arm-linux-gnueabihf
|
||||||
build/extra/cross-linux-gnu-arm-eabihf/debug: PHONY; $(call run_config_and_build,$@,Debug)
|
build/extra/cross-linux-gnu-arm-eabihf/debug: PHONY; $(call run_config_and_build,$@,Debug)
|
||||||
build/extra/cross-linux-gnu-arm-eabihf/release: PHONY; $(call run_config_and_build,$@,Release)
|
build/extra/cross-linux-gnu-arm-eabihf/release: PHONY; $(call run_config_and_build,$@,Release)
|
||||||
build/extra/cross-linux-gnu-arm-eabihf/%: export CC = arm-linux-gnueabihf-gcc
|
build/extra/cross-linux-gnu-arm-eabihf/%: export CC = arm-linux-gnueabihf-gcc
|
||||||
build/extra/cross-linux-gnu-arm-eabihf/%: export CXX = arm-linux-gnueabihf-g++ -Wno-psabi
|
build/extra/cross-linux-gnu-arm-eabihf/%: export CXX = arm-linux-gnueabihf-g++ -Wno-psabi
|
||||||
|
build/extra/cross-linux-gnu-arm-eabihf/%: CMAKE_SYSTEM_NAME ?= Linux
|
||||||
|
build/extra/cross-linux-gnu-arm-eabihf/%: CMAKE_CROSSCOMPILING_EMULATOR ?= qemu-arm
|
||||||
|
|
||||||
# cross compiler: Windows x86 win32 MinGW (i386)
|
# cross compiler: Windows x86 win32 MinGW (i386)
|
||||||
build/extra/cross-windows-mingw32/debug: PHONY; $(call run_config_and_build,$@,Debug)
|
build/extra/cross-windows-mingw32/debug: PHONY; $(call run_config_and_build,$@,Debug)
|
||||||
build/extra/cross-windows-mingw32/release: PHONY; $(call run_config_and_build,$@,Release)
|
build/extra/cross-windows-mingw32/release: PHONY; $(call run_config_and_build,$@,Release)
|
||||||
build/extra/cross-windows-mingw32/%: export CC = i686-w64-mingw32-gcc -static
|
build/extra/cross-windows-mingw32/%: export CC = i686-w64-mingw32-gcc -static -D_WIN32_WINNT=0x0501
|
||||||
build/extra/cross-windows-mingw32/%: export CXX = i686-w64-mingw32-g++ -static
|
build/extra/cross-windows-mingw32/%: export CXX = i686-w64-mingw32-g++ -static -D_WIN32_WINNT=0x0501
|
||||||
|
build/extra/cross-windows-mingw32/%: CMAKE_SYSTEM_NAME ?= Windows
|
||||||
|
build/extra/cross-windows-mingw32/%: CMAKE_SYSTEM_PROCESSOR ?= X86
|
||||||
|
build/extra/cross-windows-mingw32/%: CMAKE_CROSSCOMPILING_EMULATOR ?= wine
|
||||||
|
|
||||||
# cross compiler: Windows x64 win64 MinGW (amd64)
|
# cross compiler: Windows x64 win64 MinGW (amd64)
|
||||||
build/extra/cross-windows-mingw64/debug: PHONY; $(call run_config_and_build,$@,Debug)
|
build/extra/cross-windows-mingw64/debug: PHONY; $(call run_config_and_build,$@,Debug)
|
||||||
build/extra/cross-windows-mingw64/release: PHONY; $(call run_config_and_build,$@,Release)
|
build/extra/cross-windows-mingw64/release: PHONY; $(call run_config_and_build,$@,Release)
|
||||||
build/extra/cross-windows-mingw64/%: export CC = x86_64-w64-mingw32-gcc -static
|
build/extra/cross-windows-mingw64/%: export CC = x86_64-w64-mingw32-gcc -static -D_WIN32_WINNT=0x0501
|
||||||
build/extra/cross-windows-mingw64/%: export CXX = x86_64-w64-mingw32-g++ -static
|
build/extra/cross-windows-mingw64/%: export CXX = x86_64-w64-mingw32-g++ -static -D_WIN32_WINNT=0x0501
|
||||||
|
build/extra/cross-windows-mingw64/%: CMAKE_SYSTEM_NAME ?= Windows
|
||||||
|
build/extra/cross-windows-mingw64/%: CMAKE_SYSTEM_PROCESSOR ?= AMD64
|
||||||
|
build/extra/cross-windows-mingw64/%: CMAKE_CROSSCOMPILING_EMULATOR ?= wine64
|
||||||
|
|
||||||
# cross compiler: macOS arm64 (aarch64)
|
# cross compiler: macOS arm64 (aarch64)
|
||||||
build/extra/cross-darwin-arm64/debug: PHONY; $(call run_config_and_build,$@,Debug)
|
build/extra/cross-darwin-arm64/debug: PHONY; $(call run_config_and_build,$@,Debug)
|
||||||
build/extra/cross-darwin-arm64/release: PHONY; $(call run_config_and_build,$@,Release)
|
build/extra/cross-darwin-arm64/release: PHONY; $(call run_config_and_build,$@,Release)
|
||||||
build/extra/cross-darwin-arm64/%: export CC = clang -target arm64-apple-darwin
|
build/extra/cross-darwin-arm64/%: export CC = clang -target arm64-apple-darwin
|
||||||
build/extra/cross-darwin-arm64/%: export CXX = clang++ -target arm64-apple-darwin
|
build/extra/cross-darwin-arm64/%: export CXX = clang++ -target arm64-apple-darwin
|
||||||
|
build/extra/cross-darwin-arm64/%: CMAKE_SYSTEM_NAME ?= Darwin
|
||||||
|
build/extra/cross-darwin-arm64/%: CMAKE_SYSTEM_PROCESSOR ?= arm64
|
||||||
|
|
||||||
# cross compiler: macOS x86_64 (amd64)
|
# cross compiler: macOS x86_64 (amd64)
|
||||||
build/extra/cross-darwin-x86_64/debug: PHONY; $(call run_config_and_build,$@,Debug)
|
build/extra/cross-darwin-x86_64/debug: PHONY; $(call run_config_and_build,$@,Debug)
|
||||||
build/extra/cross-darwin-x86_64/release: PHONY; $(call run_config_and_build,$@,Release)
|
build/extra/cross-darwin-x86_64/release: PHONY; $(call run_config_and_build,$@,Release)
|
||||||
build/extra/cross-darwin-x86_64/%: export CC = clang -target x86_64-apple-darwin
|
build/extra/cross-darwin-x86_64/%: export CC = clang -target x86_64-apple-darwin
|
||||||
build/extra/cross-darwin-x86_64/%: export CXX = clang++ -target x86_64-apple-darwin
|
build/extra/cross-darwin-x86_64/%: export CXX = clang++ -target x86_64-apple-darwin
|
||||||
|
build/extra/cross-darwin-x86_64/%: CMAKE_SYSTEM_NAME ?= Darwin
|
||||||
|
build/extra/cross-darwin-x86_64/%: CMAKE_SYSTEM_PROCESSOR ?= x86_64
|
||||||
|
|
||||||
#***********************************************************************
|
#***********************************************************************
|
||||||
# C/C++ static analyzers
|
# C/C++ static analyzers
|
||||||
@@ -189,7 +240,7 @@ build/extra/scan-build/debug: build/analyze/clang-analyzer/debug
|
|||||||
build/extra/scan-build/release: build/analyze/clang-analyzer/release
|
build/extra/scan-build/release: build/analyze/clang-analyzer/release
|
||||||
|
|
||||||
#***********************************************************************
|
#***********************************************************************
|
||||||
# advanced: generic extra target
|
# advanced: generic eXtra target
|
||||||
#***********************************************************************
|
#***********************************************************************
|
||||||
|
|
||||||
# usage:
|
# usage:
|
||||||
@@ -201,16 +252,19 @@ ifneq ($(CC),)
|
|||||||
ifneq ($(CXX),)
|
ifneq ($(CXX),)
|
||||||
|
|
||||||
UPX_XTARGET := $(UPX_XTARGET)
|
UPX_XTARGET := $(UPX_XTARGET)
|
||||||
build/xtarget/$(UPX_XTARGET)/debug: PHONY; $(call run_config_and_build,$@,Debug)
|
build/$(UPX_XTARGET)/debug: PHONY; $(call run_config_and_build,$@,Debug)
|
||||||
build/xtarget/$(UPX_XTARGET)/release: PHONY; $(call run_config_and_build,$@,Release)
|
build/$(UPX_XTARGET)/release: PHONY; $(call run_config_and_build,$@,Release)
|
||||||
build/xtarget/$(UPX_XTARGET)/%: export CC
|
build/$(UPX_XTARGET)/%: export CC := $(CC)
|
||||||
build/xtarget/$(UPX_XTARGET)/%: export CXX
|
build/$(UPX_XTARGET)/%: export CXX := $(CXX)
|
||||||
# shortcuts
|
# shortcuts
|
||||||
xtarget/all: xtarget/debug xtarget/release
|
xtarget/all: xtarget/debug xtarget/release PHONY
|
||||||
xtarget/debug: build/xtarget/$(UPX_XTARGET)/debug
|
xtarget/debug: build/$(UPX_XTARGET)/debug PHONY
|
||||||
xtarget/release: build/xtarget/$(UPX_XTARGET)/release
|
xtarget/release: build/$(UPX_XTARGET)/release PHONY
|
||||||
|
xtarget/all+test: xtarget/debug+test xtarget/release+test PHONY
|
||||||
|
xtarget/debug+test: build/$(UPX_XTARGET)/debug+test PHONY
|
||||||
|
xtarget/release+test: build/$(UPX_XTARGET)/release+test PHONY
|
||||||
# set new default
|
# set new default
|
||||||
.DEFAULT_GOAL = xtarget/release
|
.DEFAULT_GOAL := build/$(UPX_XTARGET)/release
|
||||||
|
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
@@ -218,28 +272,54 @@ endif
|
|||||||
|
|
||||||
#***********************************************************************
|
#***********************************************************************
|
||||||
# assemble cmake config flags; useful for CI jobs
|
# assemble cmake config flags; useful for CI jobs
|
||||||
#***********************************************************************
|
#
|
||||||
|
|
||||||
ifneq ($(origin UPX_CMAKE_CONFIG_FLAGS),command line) # needed to work around a GNU make bug
|
|
||||||
|
|
||||||
# info: by default CMake only honors the CC and CXX environment variables; make
|
# info: by default CMake only honors the CC and CXX environment variables; make
|
||||||
# it easy to set other variables like CMAKE_AR or CMAKE_RANLIB
|
# it easy to set other variables like CMAKE_AR or CMAKE_RANLIB
|
||||||
|
#***********************************************************************
|
||||||
|
|
||||||
|
ifneq ($(origin UPX_CMAKE_CONFIG_FLAGS),command line) # GNU make bug work-around
|
||||||
|
# GNU make bug, see https://savannah.gnu.org/bugs/index.php?64822
|
||||||
|
# and commit https://git.savannah.gnu.org/cgit/make.git/commit/?id=07187db947ba25e6c59b55f10660a04f8e9c5229
|
||||||
|
|
||||||
|
$(call check_undefined,__add_cmake_config)
|
||||||
__add_cmake_config = $(and $($1),-D$1="$($1)")
|
__add_cmake_config = $(and $($1),-D$1="$($1)")
|
||||||
# pass common CMake settings from environment/make to cmake
|
# pass common CMake settings from environment/make to cmake
|
||||||
|
build/%: UPX_CMAKE_CONFIG_FLAGS += $(call __add_cmake_config,CMAKE_VERBOSE_MAKEFILE)
|
||||||
|
# pass common CMake toolchain settings from environment/make to cmake
|
||||||
|
build/%: UPX_CMAKE_CONFIG_FLAGS += $(call __add_cmake_config,CMAKE_ADDR2LINE)
|
||||||
build/%: UPX_CMAKE_CONFIG_FLAGS += $(call __add_cmake_config,CMAKE_AR)
|
build/%: UPX_CMAKE_CONFIG_FLAGS += $(call __add_cmake_config,CMAKE_AR)
|
||||||
|
build/%: UPX_CMAKE_CONFIG_FLAGS += $(call __add_cmake_config,CMAKE_DLLTOOL)
|
||||||
|
build/%: UPX_CMAKE_CONFIG_FLAGS += $(call __add_cmake_config,CMAKE_LINKER)
|
||||||
build/%: UPX_CMAKE_CONFIG_FLAGS += $(call __add_cmake_config,CMAKE_NM)
|
build/%: UPX_CMAKE_CONFIG_FLAGS += $(call __add_cmake_config,CMAKE_NM)
|
||||||
build/%: UPX_CMAKE_CONFIG_FLAGS += $(call __add_cmake_config,CMAKE_RANLIB)
|
|
||||||
build/%: UPX_CMAKE_CONFIG_FLAGS += $(call __add_cmake_config,CMAKE_OBJCOPY)
|
build/%: UPX_CMAKE_CONFIG_FLAGS += $(call __add_cmake_config,CMAKE_OBJCOPY)
|
||||||
build/%: UPX_CMAKE_CONFIG_FLAGS += $(call __add_cmake_config,CMAKE_OBJDUMP)
|
build/%: UPX_CMAKE_CONFIG_FLAGS += $(call __add_cmake_config,CMAKE_OBJDUMP)
|
||||||
|
build/%: UPX_CMAKE_CONFIG_FLAGS += $(call __add_cmake_config,CMAKE_RANLIB)
|
||||||
|
build/%: UPX_CMAKE_CONFIG_FLAGS += $(call __add_cmake_config,CMAKE_READELF)
|
||||||
build/%: UPX_CMAKE_CONFIG_FLAGS += $(call __add_cmake_config,CMAKE_STRIP)
|
build/%: UPX_CMAKE_CONFIG_FLAGS += $(call __add_cmake_config,CMAKE_STRIP)
|
||||||
|
build/%: UPX_CMAKE_CONFIG_FLAGS += $(call __add_cmake_config,CMAKE_TAPI)
|
||||||
|
# pass common CMake LTO toolchain settings from environment/make to cmake (for use with "-flto")
|
||||||
|
build/%: UPX_CMAKE_CONFIG_FLAGS += $(call __add_cmake_config,CMAKE_C_COMPILER_AR)
|
||||||
|
build/%: UPX_CMAKE_CONFIG_FLAGS += $(call __add_cmake_config,CMAKE_C_COMPILER_RANLIB)
|
||||||
|
build/%: UPX_CMAKE_CONFIG_FLAGS += $(call __add_cmake_config,CMAKE_CXX_COMPILER_AR)
|
||||||
|
build/%: UPX_CMAKE_CONFIG_FLAGS += $(call __add_cmake_config,CMAKE_CXX_COMPILER_RANLIB)
|
||||||
|
# pass common CMake cross compilation settings from environment/make to cmake
|
||||||
|
build/%: UPX_CMAKE_CONFIG_FLAGS += $(call __add_cmake_config,CMAKE_SYSTEM_NAME)
|
||||||
|
build/%: UPX_CMAKE_CONFIG_FLAGS += $(call __add_cmake_config,CMAKE_SYSTEM_PROCESSOR)
|
||||||
|
build/%: UPX_CMAKE_CONFIG_FLAGS += $(call __add_cmake_config,CMAKE_CROSSCOMPILING_EMULATOR)
|
||||||
# pass UPX config options from environment/make to cmake; see CMakeLists.txt
|
# pass UPX config options from environment/make to cmake; see CMakeLists.txt
|
||||||
build/%: UPX_CMAKE_CONFIG_FLAGS += $(call __add_cmake_config,UPX_CONFIG_DISABLE_GITREV)
|
build/%: UPX_CMAKE_CONFIG_FLAGS += $(call __add_cmake_config,UPX_CONFIG_DISABLE_GITREV)
|
||||||
build/%: UPX_CMAKE_CONFIG_FLAGS += $(call __add_cmake_config,UPX_CONFIG_DISABLE_SANITIZE)
|
build/%: UPX_CMAKE_CONFIG_FLAGS += $(call __add_cmake_config,UPX_CONFIG_DISABLE_SANITIZE)
|
||||||
build/%: UPX_CMAKE_CONFIG_FLAGS += $(call __add_cmake_config,UPX_CONFIG_DISABLE_WSTRICT)
|
build/%: UPX_CMAKE_CONFIG_FLAGS += $(call __add_cmake_config,UPX_CONFIG_DISABLE_WSTRICT)
|
||||||
build/%: UPX_CMAKE_CONFIG_FLAGS += $(call __add_cmake_config,UPX_CONFIG_DISABLE_WERROR)
|
build/%: UPX_CMAKE_CONFIG_FLAGS += $(call __add_cmake_config,UPX_CONFIG_DISABLE_WERROR)
|
||||||
build/%: UPX_CMAKE_CONFIG_FLAGS += $(call __add_cmake_config,UPX_CONFIG_DISABLE_SELF_PACK_TEST)
|
build/%: UPX_CMAKE_CONFIG_FLAGS += $(call __add_cmake_config,UPX_CONFIG_DISABLE_SELF_PACK_TEST)
|
||||||
|
# pass UPX extra compile options from environment/make to cmake; see CMakeLists.txt
|
||||||
|
build/%: UPX_CMAKE_CONFIG_FLAGS += $(call __add_cmake_config,UPX_CONFIG_EXTRA_COMPILE_OPTIONS_BZIP2)
|
||||||
|
build/%: UPX_CMAKE_CONFIG_FLAGS += $(call __add_cmake_config,UPX_CONFIG_EXTRA_COMPILE_OPTIONS_UCL)
|
||||||
|
build/%: UPX_CMAKE_CONFIG_FLAGS += $(call __add_cmake_config,UPX_CONFIG_EXTRA_COMPILE_OPTIONS_UPX)
|
||||||
|
build/%: UPX_CMAKE_CONFIG_FLAGS += $(call __add_cmake_config,UPX_CONFIG_EXTRA_COMPILE_OPTIONS_ZLIB)
|
||||||
|
build/%: UPX_CMAKE_CONFIG_FLAGS += $(call __add_cmake_config,UPX_CONFIG_EXTRA_COMPILE_OPTIONS_ZSTD)
|
||||||
|
|
||||||
endif # bug work-around
|
endif # GNU make bug work-around
|
||||||
|
|
||||||
#***********************************************************************
|
#***********************************************************************
|
||||||
# check git submodules
|
# check git submodules
|
||||||
@@ -247,5 +327,7 @@ endif # bug work-around
|
|||||||
|
|
||||||
SUBMODULES = doctest lzma-sdk ucl valgrind zlib
|
SUBMODULES = doctest lzma-sdk ucl valgrind zlib
|
||||||
|
|
||||||
dummy := $(foreach m,$(SUBMODULES),$(if $(wildcard vendor/$m/[CL]*),$m,\
|
$(foreach 1,$(SUBMODULES),$(if $(wildcard vendor/$1/[CL]*),,\
|
||||||
$(error ERROR: missing git submodule '$m'; run 'git submodule update --init')))
|
$(error ERROR: missing git submodule '$1'; run 'git submodule update --init')))
|
||||||
|
|
||||||
|
endif # UPX_MAKEFILE_EXTRA_MK_INCLUDED
|
||||||
|
|||||||
@@ -1,19 +0,0 @@
|
|||||||
#! /usr/bin/env bash
|
|
||||||
## vim:set ts=4 sw=4 et:
|
|
||||||
set -e; set -o pipefail
|
|
||||||
argv0=$0; argv0abs="$(readlink -fn "$argv0")"; argv0dir="$(dirname "$argv0abs")"
|
|
||||||
|
|
||||||
# create the image from Dockerfile
|
|
||||||
# using a rootless Podman container
|
|
||||||
|
|
||||||
# NOTE: this image is based on rebuild-stubs/upx-stubtools-20221212-v6,
|
|
||||||
# so you have to create that image first
|
|
||||||
# WARNING: we install many packages, so the resulting image needs A LOT of disk space!
|
|
||||||
image=upx-cross-compile-ubuntu2204-20230721-v1
|
|
||||||
[[ $1 == --print-image ]] && echo "$image" && exit 0
|
|
||||||
|
|
||||||
podman build -t "$image" -f "$argv0dir/Dockerfile" "$argv0dir"
|
|
||||||
|
|
||||||
podman image list "$image"
|
|
||||||
echo
|
|
||||||
podman image tree "$image"
|
|
||||||
@@ -1,40 +0,0 @@
|
|||||||
#! /usr/bin/env bash
|
|
||||||
## vim:set ts=4 sw=4 et:
|
|
||||||
set -e; set -o pipefail
|
|
||||||
argv0=$0; argv0abs="$(readlink -fn "$argv0")"; argv0dir="$(dirname "$argv0abs")"
|
|
||||||
|
|
||||||
# list all system packages that are installed in the image
|
|
||||||
# using a rootless Podman container
|
|
||||||
|
|
||||||
image="$("$argv0dir/10-create-image.sh" --print-image)"
|
|
||||||
|
|
||||||
podman image list "$image"
|
|
||||||
echo
|
|
||||||
podman image tree "$image"
|
|
||||||
|
|
||||||
echo 'Packages:'
|
|
||||||
flags=( --read-only --rm --pull=never )
|
|
||||||
flags+=( --cap-drop=all ) # drop all capabilities
|
|
||||||
flags+=( --network=none ) # no network needed
|
|
||||||
podman run "${flags[@]}" "$image" bash -c $'dpkg -l | sed \'s/ *$//\' | LC_ALL=C sort'
|
|
||||||
|
|
||||||
echo
|
|
||||||
echo 'Packages sorted by Installed-Size:'
|
|
||||||
podman run "${flags[@]}" "$image" bash -c $'awk \'
|
|
||||||
BEGIN {
|
|
||||||
arch = "UNKNOWN"; size = 0; package = "UNKNOWN";
|
|
||||||
}
|
|
||||||
{
|
|
||||||
if ($1 == "Architecture:") arch = $2;
|
|
||||||
if ($1 == "Installed-Size:") size = $2;
|
|
||||||
if ($1 == "Package:") package = $2;
|
|
||||||
if ($1 == "") {
|
|
||||||
printf("%9d %-40s %s\\n", size, package, arch);
|
|
||||||
count += 1; total += size;
|
|
||||||
arch = "UNKNOWN"; size = 0; package = "UNKNOWN";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
END {
|
|
||||||
printf("%9d ===== TOTAL (%d packages)\\n", total, count);
|
|
||||||
}
|
|
||||||
\' /var/lib/dpkg/status | LC_ALL=C sort -rn'
|
|
||||||
@@ -1,60 +0,0 @@
|
|||||||
#! /usr/bin/env bash
|
|
||||||
## vim:set ts=4 sw=4 et:
|
|
||||||
set -e; set -o pipefail
|
|
||||||
argv0=$0; argv0abs="$(readlink -fn "$argv0")"; argv0dir="$(dirname "$argv0abs")"
|
|
||||||
|
|
||||||
# run an interactive shell in the image
|
|
||||||
# using a rootless Podman container
|
|
||||||
|
|
||||||
image="$("$argv0dir/10-create-image.sh" --print-image)"
|
|
||||||
|
|
||||||
flags=( --read-only --rm --pull=never )
|
|
||||||
flags+=( --cap-drop=all ) # drop all capabilities
|
|
||||||
flags+=( --network=none ) # no network needed
|
|
||||||
flags+=( -ti -e TERM="$TERM" ) # allocate an interactive pseudo-tty and pass $TERM
|
|
||||||
if [[ 1 == 1 ]]; then
|
|
||||||
# run as user upx 2000:2000
|
|
||||||
flags+=( --user 2000 )
|
|
||||||
# map container users 0..999 to subuid-users 1..1000, and map container user 2000 to current host user
|
|
||||||
flags+=( --uidmap=0:1:1000 --uidmap=2000:0:1 )
|
|
||||||
# map container groups 0..999 to subgid-groups 1..1000, and map container group 2000 to current host group
|
|
||||||
flags+=( --gidmap=0:1:1000 --gidmap=2000:0:1 )
|
|
||||||
# NOTE: we mount the upx top-level directory read-write under /home/upx/src/upx
|
|
||||||
# INFO: SELinux users *may* have to add ":z" to the volume mount flags; check the docs!
|
|
||||||
flags+=( -v "${argv0dir}/../../..:/home/upx/src/upx" )
|
|
||||||
flags+=( -w /home/upx/src/upx ) # set working directory
|
|
||||||
flags+=( --tmpfs /home/upx/.cache:rw,exec ) # mount a writeable tmpfs
|
|
||||||
flags+=( --tmpfs /home/upx/.local:rw,exec ) # mount a writeable tmpfs
|
|
||||||
else
|
|
||||||
# run as user root 0:0
|
|
||||||
# ONLY FOR DEBUGGING THE IMAGE
|
|
||||||
# map container user/group 0 to current host user/group
|
|
||||||
flags+=( --user 0 )
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ $# == 0 ]]; then
|
|
||||||
podman run "${flags[@]}" "$image" bash -l
|
|
||||||
else
|
|
||||||
podman run "${flags[@]}" "$image" "$@"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# now we can cross-compile UPX for Windows:
|
|
||||||
# cd /home/upx/src/upx
|
|
||||||
# rm -rf ./build/extra/cross-windows-mingw64/release
|
|
||||||
# make build/extra/cross-windows-mingw64/release
|
|
||||||
|
|
||||||
# and we can run the clang Static Analyzer (scan-build)
|
|
||||||
# cd /home/upx/src/upx
|
|
||||||
# rm -rf ./build/extra/scan-build/release
|
|
||||||
# make build/extra/scan-build/release
|
|
||||||
|
|
||||||
# and lots of other cross-compilers are installed; see "ls /usr/bin/*g++*"
|
|
||||||
|
|
||||||
# and finally see
|
|
||||||
# ./misc/podman/cross-compile-upx-ubuntu/build-all-inside-container.sh
|
|
||||||
# after running that script we can do cool things like:
|
|
||||||
# cd /home/upx/src/upx/build/cross-compile-upx-ubuntu2204/alpha-linux-gnu/debug
|
|
||||||
# qemu-alpha -L /usr/alpha-linux-gnu ./upx --version
|
|
||||||
# cd /home/upx/src/upx/build/cross-compile-upx-ubuntu2204/hppa-linux-gnu/debug
|
|
||||||
# qemu-hppa -L /usr/hppa-linux-gnu ./upx --version
|
|
||||||
# (similar for many other architectures/builds)
|
|
||||||
@@ -1,54 +0,0 @@
|
|||||||
# NOTE: this image is based on rebuild-stubs/upx-stubtools-20221212-v6,
|
|
||||||
# so you have to create that image first
|
|
||||||
# WARNING: we install many packages, so the resulting image needs A LOT of disk space!
|
|
||||||
FROM localhost/upx-stubtools-20221212-v6
|
|
||||||
ENV UPX_CONTAINER_IMAGE_NAME=upx-cross-compile-ubuntu2204-20230721-v1
|
|
||||||
ARG DEBIAN_FRONTEND=noninteractive
|
|
||||||
|
|
||||||
USER root
|
|
||||||
|
|
||||||
# Ubuntu 22.04
|
|
||||||
RUN apt-get update && apt-get upgrade -y \
|
|
||||||
&& apt-get install -y \
|
|
||||||
# Linux glibc cross compilers
|
|
||||||
g++-aarch64-linux-gnu \
|
|
||||||
g++-alpha-linux-gnu \
|
|
||||||
g++-arm-linux-gnueabi \
|
|
||||||
g++-arm-linux-gnueabihf \
|
|
||||||
g++-hppa-linux-gnu \
|
|
||||||
g++-i686-linux-gnu \
|
|
||||||
g++-m68k-linux-gnu \
|
|
||||||
g++-mips-linux-gnu \
|
|
||||||
g++-mipsel-linux-gnu \
|
|
||||||
g++-mips64-linux-gnuabi64 \
|
|
||||||
g++-mips64el-linux-gnuabi64 \
|
|
||||||
g++-powerpc-linux-gnu \
|
|
||||||
g++-powerpc64-linux-gnu \
|
|
||||||
g++-powerpc64le-linux-gnu \
|
|
||||||
g++-riscv64-linux-gnu \
|
|
||||||
g++-s390x-linux-gnu \
|
|
||||||
g++-sh4-linux-gnu \
|
|
||||||
g++-sparc64-linux-gnu \
|
|
||||||
# Linux glibc cross compilers - ILP32 on 64-bit CPUs
|
|
||||||
g++-x86-64-linux-gnux32 \
|
|
||||||
# Windows cross compilers
|
|
||||||
g++-mingw-w64-i686 \
|
|
||||||
g++-mingw-w64-x86-64 \
|
|
||||||
&& true
|
|
||||||
RUN apt-get install -y \
|
|
||||||
# clang-14 and tools
|
|
||||||
clang-14 clang-format-14 clang-tidy-14 clang-tools-14 lldb-14 llvm-14 \
|
|
||||||
# QEMU and Wine
|
|
||||||
qemu-system qemu-user wine wine32:i386 wine64 \
|
|
||||||
# misc
|
|
||||||
gdb lsb-release valgrind \
|
|
||||||
&& true
|
|
||||||
RUN cd /usr/bin \
|
|
||||||
# create unversioned clang symlinks in /usr/local/bin
|
|
||||||
&& for f in clang*-14 llvm-*-14 scan-*-14; do ln -s -v ../../bin/$f /usr/local/bin/${f%-14}; done \
|
|
||||||
&& ln -s -v ../../bin/obj2yaml-14 /usr/local/bin/llvm-obj2yaml \
|
|
||||||
&& ln -s -v ../../bin/yaml2obj-14 /usr/local/bin/llvm-yaml2obj \
|
|
||||||
&& true
|
|
||||||
|
|
||||||
# switch back to default user upx:upx 2000:2000
|
|
||||||
USER upx
|
|
||||||
@@ -1,99 +0,0 @@
|
|||||||
#! /usr/bin/env bash
|
|
||||||
## vim:set ts=4 sw=4 et:
|
|
||||||
set -e; set -o pipefail
|
|
||||||
argv0=$0; argv0abs="$(readlink -fn "$argv0")"; argv0dir="$(dirname "$argv0abs")"
|
|
||||||
|
|
||||||
# build UPX for 21 targets; must be run inside the container!
|
|
||||||
# using a rootless Podman container
|
|
||||||
|
|
||||||
# simple sanity check that we are indeed running inside the container
|
|
||||||
if [[ $UPX_CONTAINER_IMAGE_NAME != upx-cross-compile-* ]]; then
|
|
||||||
echo "$argv0: NOTE: please run this script *inside* the container"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# go to upx top-level directory
|
|
||||||
cd "$argv0dir/../../.." || exit 1
|
|
||||||
pwd
|
|
||||||
test -f doc/upx.pod || exit 1 # sanity check
|
|
||||||
test -f src/version.h || exit 1 # sanity check
|
|
||||||
|
|
||||||
function run_config_and_build {
|
|
||||||
# requires: AR CC CXX RANLIB
|
|
||||||
local toolchain=$1
|
|
||||||
local cmake_config_flags build_type bdir
|
|
||||||
# cmake flags
|
|
||||||
cmake_config_flags=
|
|
||||||
case $toolchain in
|
|
||||||
# these old architectures do not support sanitize
|
|
||||||
alpha-linux-gnu) cmake_config_flags=-DUPX_CONFIG_DISABLE_SANITIZE=ON ;;
|
|
||||||
hppa-linux-gnu) cmake_config_flags=-DUPX_CONFIG_DISABLE_SANITIZE=ON ;;
|
|
||||||
# avoid sanitize link errors with current MinGW-w64 versions; link libstdc++ statically
|
|
||||||
i686-w64-mingw32)
|
|
||||||
cmake_config_flags=-DUPX_CONFIG_DISABLE_SANITIZE=ON
|
|
||||||
CC="$CC -static"; CXX="$CXX -static" ;;
|
|
||||||
x86_64-w64-mingw32)
|
|
||||||
cmake_config_flags=-DUPX_CONFIG_DISABLE_SANITIZE=ON
|
|
||||||
CC="$CC -static"; CXX="$CXX -static" ;;
|
|
||||||
# avoid warnings about arm libstdc++ ABI change in gcc-7
|
|
||||||
arm-linux-*) CXX="$CXX -Wno-psabi" ;;
|
|
||||||
esac
|
|
||||||
if [[ 1 == 1 ]]; then
|
|
||||||
# prefer building with Ninja (ninja-build)
|
|
||||||
cmake_config_flags="$cmake_config_flags -G Ninja -DUPX_CONFIG_CMAKE_DISABLE_INSTALL=ON"
|
|
||||||
fi
|
|
||||||
# for all build types
|
|
||||||
for build_type in Debug Release; do
|
|
||||||
bdir="build/cross-compile-upx-ubuntu2204/$toolchain/${build_type,,}"
|
|
||||||
mkdir -p "$bdir"
|
|
||||||
# run_config
|
|
||||||
if [[ ! -f $bdir/CMakeCache.txt ]]; then
|
|
||||||
export CMAKE_REQUIRED_QUIET=OFF
|
|
||||||
cmake -S . -B "$bdir" -DCMAKE_BUILD_TYPE=$build_type -DCMAKE_AR="$AR" -DCMAKE_RANLIB="$RANLIB" $cmake_config_flags
|
|
||||||
fi
|
|
||||||
# run_build
|
|
||||||
cmake --build "$bdir" --config $build_type --parallel
|
|
||||||
done
|
|
||||||
}
|
|
||||||
|
|
||||||
# see Dockerfile for packages
|
|
||||||
for package in \
|
|
||||||
g++-aarch64-linux-gnu \
|
|
||||||
g++-alpha-linux-gnu \
|
|
||||||
g++-arm-linux-gnueabi \
|
|
||||||
g++-arm-linux-gnueabihf \
|
|
||||||
g++-hppa-linux-gnu \
|
|
||||||
g++-i686-linux-gnu \
|
|
||||||
g++-m68k-linux-gnu \
|
|
||||||
g++-mips-linux-gnu \
|
|
||||||
g++-mipsel-linux-gnu \
|
|
||||||
g++-mips64-linux-gnuabi64 \
|
|
||||||
g++-mips64el-linux-gnuabi64 \
|
|
||||||
g++-powerpc-linux-gnu \
|
|
||||||
g++-powerpc64-linux-gnu \
|
|
||||||
g++-powerpc64le-linux-gnu \
|
|
||||||
g++-riscv64-linux-gnu \
|
|
||||||
g++-s390x-linux-gnu \
|
|
||||||
g++-sh4-linux-gnu \
|
|
||||||
g++-sparc64-linux-gnu \
|
|
||||||
g++-x86-64-linux-gnux32 \
|
|
||||||
g++-mingw-w64-i686 \
|
|
||||||
g++-mingw-w64-x86-64
|
|
||||||
do
|
|
||||||
# setup toolchain and environment variables
|
|
||||||
toolchain=$package
|
|
||||||
toolchain=${toolchain/-x86-64/-x86_64}
|
|
||||||
toolchain=${toolchain/g++-/}
|
|
||||||
case $toolchain in
|
|
||||||
mingw-w64-i686) toolchain=i686-w64-mingw32 ;;
|
|
||||||
mingw-w64-x86_64) toolchain=x86_64-w64-mingw32 ;;
|
|
||||||
esac
|
|
||||||
echo "========== $toolchain"
|
|
||||||
export AR=/usr/bin/${toolchain}-ar
|
|
||||||
export CC=/usr/bin/${toolchain}-gcc
|
|
||||||
export CXX=/usr/bin/${toolchain}-g++
|
|
||||||
export RANLIB=/usr/bin/${toolchain}-ranlib
|
|
||||||
ls -l "$AR" "$CC" "$CXX" "$RANLIB"
|
|
||||||
run_config_and_build $toolchain
|
|
||||||
unset AR CC CXX RANLIB
|
|
||||||
done
|
|
||||||
-2451
File diff suppressed because it is too large
Load Diff
@@ -6,7 +6,7 @@ argv0=$0; argv0abs="$(readlink -fn "$argv0")"; argv0dir="$(dirname "$argv0abs")"
|
|||||||
# create the image from Dockerfile
|
# create the image from Dockerfile
|
||||||
# using a rootless Podman container
|
# using a rootless Podman container
|
||||||
|
|
||||||
image=upx-stubtools-20221212-v6
|
image=upx-stubtools-20221212-v7
|
||||||
[[ $1 == --print-image ]] && echo "$image" && exit 0
|
[[ $1 == --print-image ]] && echo "$image" && exit 0
|
||||||
|
|
||||||
podman build -t "$image" -f "$argv0dir/Dockerfile" "$argv0dir"
|
podman build -t "$image" -f "$argv0dir/Dockerfile" "$argv0dir"
|
||||||
|
|||||||
@@ -15,10 +15,10 @@ RUN dpkg --add-architecture i386 \
|
|||||||
# the full UPX binary inside the container via CMake:
|
# the full UPX binary inside the container via CMake:
|
||||||
7zip bfs busybox bzip2 cabextract ccache chrpath cmake cpio curl elfutils fd-find file fzf \
|
7zip bfs busybox bzip2 cabextract ccache chrpath cmake cpio curl elfutils fd-find file fzf \
|
||||||
g++ gawk gdb gojq ht htop hyperfine jq libzstd-dev lsb-release lz4 lzip lzop \
|
g++ gawk gdb gojq ht htop hyperfine jq libzstd-dev lsb-release lz4 lzip lzop \
|
||||||
mksh moreutils ninja-build p7zip parallel patch patchelf pax-utils paxctl \
|
mksh moreutils ninja-build p7zip parallel patch patchelf patchutils pax-utils paxctl \
|
||||||
python3 python3-pyasn1 python3-pycryptodome python3-zstd \
|
python3 python3-pyasn1 python3-pycryptodome python3-zstd \
|
||||||
re2c ripgrep rsync screen universal-ctags unzip vim yash zip zlib1g-dev zsh zstd \
|
re2c ripgrep rsync screen universal-ctags unzip vim yash zip zlib1g-dev zsh zstd \
|
||||||
# extra packages for compiling with "gcc -m32" and and "gcc -mx32":
|
# extra packages for compiling with "gcc -m32" and "gcc -mx32":
|
||||||
g++-multilib gcc-multilib \
|
g++-multilib gcc-multilib \
|
||||||
&& true
|
&& true
|
||||||
|
|
||||||
@@ -45,9 +45,10 @@ 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 \
|
&& wget -q https://github.com/upx/upx/releases/download/v3.91/upx-3.91-amd64_linux.tar.bz2 \
|
||||||
&& for v in 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; do wget -q https://github.com/upx/upx/releases/download/v${v}/upx-${v}-amd64_linux.tar.xz; done \
|
&& xzlist="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" \
|
||||||
|
&& for v in $xzlist; do wget -q 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 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; do d=upx-${v}-amd64_linux; ./$d/upx -qq -d $d/upx -o /usr/local/bin/upx-${v}; done \
|
&& for v in 3.91 $xzlist; 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 \
|
||||||
&& true
|
&& true
|
||||||
|
|
||||||
|
|||||||
Generated
+106
-104
@@ -3,16 +3,16 @@ Packages:
|
|||||||
Desired=Unknown/Install/Remove/Purge/Hold
|
Desired=Unknown/Install/Remove/Purge/Hold
|
||||||
ii 7zip 21.07+dfsg-4 amd64 7-Zip file archiver with a high compression ratio
|
ii 7zip 21.07+dfsg-4 amd64 7-Zip file archiver with a high compression ratio
|
||||||
ii adduser 3.118ubuntu5 all add and remove users and groups
|
ii adduser 3.118ubuntu5 all add and remove users and groups
|
||||||
ii apt 2.4.10 amd64 commandline package manager
|
ii apt 2.4.11 amd64 commandline package manager
|
||||||
ii aria2 1.36.0-1 amd64 High speed download utility
|
ii aria2 1.36.0-1 amd64 High speed download utility
|
||||||
ii base-files 12ubuntu4.4 amd64 Debian base system miscellaneous files
|
ii base-files 12ubuntu4.6 amd64 Debian base system miscellaneous files
|
||||||
ii base-passwd 3.5.52build1 amd64 Debian base system master password and group files
|
ii base-passwd 3.5.52build1 amd64 Debian base system master password and group files
|
||||||
ii bash 5.1-6ubuntu1 amd64 GNU Bourne Again SHell
|
ii bash 5.1-6ubuntu1 amd64 GNU Bourne Again SHell
|
||||||
ii bash-completion 1:2.11-5ubuntu1 all programmable completion for the bash shell
|
ii bash-completion 1:2.11-5ubuntu1 all programmable completion for the bash shell
|
||||||
ii bfs 2.3.1-1 amd64 Breadth-first version of find(1)
|
ii bfs 2.3.1-1 amd64 Breadth-first version of find(1)
|
||||||
ii binutils 2.38-4ubuntu2.3 amd64 GNU assembler, linker and binary utilities
|
ii binutils 2.38-4ubuntu2.6 amd64 GNU assembler, linker and binary utilities
|
||||||
ii binutils-common:amd64 2.38-4ubuntu2.3 amd64 Common files for the GNU assembler, linker and binary utilities
|
ii binutils-common:amd64 2.38-4ubuntu2.6 amd64 Common files for the GNU assembler, linker and binary utilities
|
||||||
ii binutils-x86-64-linux-gnu 2.38-4ubuntu2.3 amd64 GNU binary utilities, for x86-64-linux-gnu target
|
ii binutils-x86-64-linux-gnu 2.38-4ubuntu2.6 amd64 GNU binary utilities, for x86-64-linux-gnu target
|
||||||
ii bsdutils 1:2.37.2-4ubuntu3 amd64 basic utilities from 4.4BSD-Lite
|
ii bsdutils 1:2.37.2-4ubuntu3 amd64 basic utilities from 4.4BSD-Lite
|
||||||
ii busybox 1:1.30.1-7ubuntu3 amd64 Tiny utilities for small and embedded systems
|
ii busybox 1:1.30.1-7ubuntu3 amd64 Tiny utilities for small and embedded systems
|
||||||
ii bzip2 1.0.8-5build1 amd64 high-quality block-sorting file compressor - utilities
|
ii bzip2 1.0.8-5build1 amd64 high-quality block-sorting file compressor - utilities
|
||||||
@@ -20,20 +20,20 @@ ii ca-certificates 20230311ubuntu0.22.04.1 all
|
|||||||
ii cabextract 1.9-3 amd64 Microsoft Cabinet file unpacker
|
ii cabextract 1.9-3 amd64 Microsoft Cabinet file unpacker
|
||||||
ii ccache 4.5.1-1 amd64 Compiler cache for fast recompilation of C/C++ code
|
ii ccache 4.5.1-1 amd64 Compiler cache for fast recompilation of C/C++ code
|
||||||
ii chrpath 0.16-2 amd64 Tool to edit the rpath in ELF binaries
|
ii chrpath 0.16-2 amd64 Tool to edit the rpath in ELF binaries
|
||||||
ii cmake 3.22.1-1ubuntu1.22.04.1 amd64 cross-platform, open-source make system
|
ii cmake 3.22.1-1ubuntu1.22.04.2 amd64 cross-platform, open-source make system
|
||||||
ii cmake-data 3.22.1-1ubuntu1.22.04.1 all CMake data files (modules, templates and documentation)
|
ii cmake-data 3.22.1-1ubuntu1.22.04.2 all CMake data files (modules, templates and documentation)
|
||||||
ii coreutils 8.32-4.1ubuntu1 amd64 GNU core utilities
|
ii coreutils 8.32-4.1ubuntu1.1 amd64 GNU core utilities
|
||||||
ii cpio 2.13+dfsg-7 amd64 GNU cpio -- a program to manage archives of files
|
ii cpio 2.13+dfsg-7 amd64 GNU cpio -- a program to manage archives of files
|
||||||
ii cpp 4:11.2.0-1ubuntu1 amd64 GNU C preprocessor (cpp)
|
ii cpp 4:11.2.0-1ubuntu1 amd64 GNU C preprocessor (cpp)
|
||||||
ii cpp-11 11.4.0-1ubuntu1~22.04 amd64 GNU C preprocessor
|
ii cpp-11 11.4.0-1ubuntu1~22.04 amd64 GNU C preprocessor
|
||||||
ii curl 7.81.0-1ubuntu1.14 amd64 command line tool for transferring data with URL syntax
|
ii curl 7.81.0-1ubuntu1.15 amd64 command line tool for transferring data with URL syntax
|
||||||
ii dash 0.5.11+git20210903+057cd650a4ed-3build1 amd64 POSIX-compliant shell
|
ii dash 0.5.11+git20210903+057cd650a4ed-3build1 amd64 POSIX-compliant shell
|
||||||
ii debconf 1.5.79ubuntu1 all Debian configuration management system
|
ii debconf 1.5.79ubuntu1 all Debian configuration management system
|
||||||
ii debianutils 5.5-1ubuntu2 amd64 Miscellaneous utilities specific to Debian
|
ii debianutils 5.5-1ubuntu2 amd64 Miscellaneous utilities specific to Debian
|
||||||
ii dh-elpa-helper 2.0.9ubuntu1 all helper package for emacs lisp extensions
|
ii dh-elpa-helper 2.0.9ubuntu1 all helper package for emacs lisp extensions
|
||||||
ii diffutils 1:3.8-0ubuntu2 amd64 File comparison utilities
|
ii diffutils 1:3.8-0ubuntu2 amd64 File comparison utilities
|
||||||
ii distro-info-data 0.52ubuntu0.4 all information about the distributions' releases (data files)
|
ii distro-info-data 0.52ubuntu0.6 all information about the distributions' releases (data files)
|
||||||
ii dpkg 1.21.1ubuntu2.2 amd64 Debian package management system
|
ii dpkg 1.21.1ubuntu2.3 amd64 Debian package management system
|
||||||
ii e2fsprogs 1.46.5-2ubuntu1.1 amd64 ext2/ext3/ext4 file system utilities
|
ii e2fsprogs 1.46.5-2ubuntu1.1 amd64 ext2/ext3/ext4 file system utilities
|
||||||
ii elfutils 0.186-1build1 amd64 collection of utilities to handle ELF objects
|
ii elfutils 0.186-1build1 amd64 collection of utilities to handle ELF objects
|
||||||
ii emacsen-common 3.0.4 all Common facilities for all emacsen
|
ii emacsen-common 3.0.4 all Common facilities for all emacsen
|
||||||
@@ -66,7 +66,7 @@ ii htop 3.0.5-7build2 amd64
|
|||||||
ii hyperfine 1.12.0-3ubuntu0.1 amd64 Command-line benchmarking tool
|
ii hyperfine 1.12.0-3ubuntu0.1 amd64 Command-line benchmarking tool
|
||||||
ii init-system-helpers 1.62 all helper tools for all init systems
|
ii init-system-helpers 1.62 all helper tools for all init systems
|
||||||
ii jq 1.6-2.1ubuntu3 amd64 lightweight and flexible command-line JSON processor
|
ii jq 1.6-2.1ubuntu3 amd64 lightweight and flexible command-line JSON processor
|
||||||
ii less 590-1ubuntu0.22.04.1 amd64 pager program similar to more
|
ii less 590-1ubuntu0.22.04.2 amd64 pager program similar to more
|
||||||
ii lib32asan6 11.4.0-1ubuntu1~22.04 amd64 AddressSanitizer -- a fast memory error detector (32bit)
|
ii lib32asan6 11.4.0-1ubuntu1~22.04 amd64 AddressSanitizer -- a fast memory error detector (32bit)
|
||||||
ii lib32atomic1 12.3.0-1ubuntu1~22.04 amd64 support library providing __atomic built-in functions (32bit)
|
ii lib32atomic1 12.3.0-1ubuntu1~22.04 amd64 support library providing __atomic built-in functions (32bit)
|
||||||
ii lib32gcc-11-dev 11.4.0-1ubuntu1~22.04 amd64 GCC support library (32 bit development files)
|
ii lib32gcc-11-dev 11.4.0-1ubuntu1~22.04 amd64 GCC support library (32 bit development files)
|
||||||
@@ -78,7 +78,7 @@ ii lib32stdc++-11-dev 11.4.0-1ubuntu1~22.04 amd64
|
|||||||
ii lib32stdc++6 12.3.0-1ubuntu1~22.04 amd64 GNU Standard C++ Library v3 (32 bit Version)
|
ii lib32stdc++6 12.3.0-1ubuntu1~22.04 amd64 GNU Standard C++ Library v3 (32 bit Version)
|
||||||
ii lib32ubsan1 12.3.0-1ubuntu1~22.04 amd64 UBSan -- undefined behaviour sanitizer (32bit)
|
ii lib32ubsan1 12.3.0-1ubuntu1~22.04 amd64 UBSan -- undefined behaviour sanitizer (32bit)
|
||||||
ii libacl1:amd64 2.3.1-1 amd64 access control list - shared library
|
ii libacl1:amd64 2.3.1-1 amd64 access control list - shared library
|
||||||
ii libapt-pkg6.0:amd64 2.4.10 amd64 package management runtime library
|
ii libapt-pkg6.0:amd64 2.4.11 amd64 package management runtime library
|
||||||
ii libarchive13:amd64 3.6.0-1ubuntu1 amd64 Multi-format archive and compression library (shared library)
|
ii libarchive13:amd64 3.6.0-1ubuntu1 amd64 Multi-format archive and compression library (shared library)
|
||||||
ii libaria2-0:amd64 1.36.0-1 amd64 C++ library interface to aria2
|
ii libaria2-0:amd64 1.36.0-1 amd64 C++ library interface to aria2
|
||||||
ii libasan6:amd64 11.4.0-1ubuntu1~22.04 amd64 AddressSanitizer -- a fast memory error detector
|
ii libasan6:amd64 11.4.0-1ubuntu1~22.04 amd64 AddressSanitizer -- a fast memory error detector
|
||||||
@@ -88,22 +88,22 @@ ii libattr1:amd64 1:2.5.1-1build1 amd64
|
|||||||
ii libaudit-common 1:3.0.7-1build1 all Dynamic library for security auditing - common files
|
ii libaudit-common 1:3.0.7-1build1 all Dynamic library for security auditing - common files
|
||||||
ii libaudit1:amd64 1:3.0.7-1build1 amd64 Dynamic library for security auditing
|
ii libaudit1:amd64 1:3.0.7-1build1 amd64 Dynamic library for security auditing
|
||||||
ii libbabeltrace1:amd64 1.5.8-2build1 amd64 Babeltrace conversion libraries
|
ii libbabeltrace1:amd64 1.5.8-2build1 amd64 Babeltrace conversion libraries
|
||||||
ii libbinutils:amd64 2.38-4ubuntu2.3 amd64 GNU binary utilities (private shared library)
|
ii libbinutils:amd64 2.38-4ubuntu2.6 amd64 GNU binary utilities (private shared library)
|
||||||
ii libblkid1:amd64 2.37.2-4ubuntu3 amd64 block device ID library
|
ii libblkid1:amd64 2.37.2-4ubuntu3 amd64 block device ID library
|
||||||
ii libboost-regex1.74.0:amd64 1.74.0-14ubuntu3 amd64 regular expression library for C++
|
ii libboost-regex1.74.0:amd64 1.74.0-14ubuntu3 amd64 regular expression library for C++
|
||||||
ii libbrotli1:amd64 1.0.9-2build6 amd64 library implementing brotli encoder and decoder (shared libraries)
|
ii libbrotli1:amd64 1.0.9-2build6 amd64 library implementing brotli encoder and decoder (shared libraries)
|
||||||
ii libbsd0:amd64 0.11.5-1 amd64 utility functions from BSD systems - shared library
|
ii libbsd0:amd64 0.11.5-1 amd64 utility functions from BSD systems - shared library
|
||||||
ii libbz2-1.0:amd64 1.0.8-5build1 amd64 high-quality block-sorting file compressor library - runtime
|
ii libbz2-1.0:amd64 1.0.8-5build1 amd64 high-quality block-sorting file compressor library - runtime
|
||||||
ii libc-ares2:amd64 1.18.1-1ubuntu0.22.04.2 amd64 asynchronous name resolver
|
ii libc-ares2:amd64 1.18.1-1ubuntu0.22.04.3 amd64 asynchronous name resolver
|
||||||
ii libc-bin 2.35-0ubuntu3.4 amd64 GNU C Library: Binaries
|
ii libc-bin 2.35-0ubuntu3.6 amd64 GNU C Library: Binaries
|
||||||
ii libc-dev-bin 2.35-0ubuntu3.4 amd64 GNU C Library: Development binaries
|
ii libc-dev-bin 2.35-0ubuntu3.6 amd64 GNU C Library: Development binaries
|
||||||
ii libc6-dev-i386 2.35-0ubuntu3.4 amd64 GNU C Library: 32-bit development libraries for AMD64
|
ii libc6-dev-i386 2.35-0ubuntu3.6 amd64 GNU C Library: 32-bit development libraries for AMD64
|
||||||
ii libc6-dev-x32 2.35-0ubuntu3.4 amd64 GNU C Library: X32 ABI Development Libraries for AMD64
|
ii libc6-dev-x32 2.35-0ubuntu3.6 amd64 GNU C Library: X32 ABI Development Libraries for AMD64
|
||||||
ii libc6-dev:amd64 2.35-0ubuntu3.4 amd64 GNU C Library: Development Libraries and Header Files
|
ii libc6-dev:amd64 2.35-0ubuntu3.6 amd64 GNU C Library: Development Libraries and Header Files
|
||||||
ii libc6-i386 2.35-0ubuntu3.4 amd64 GNU C Library: 32-bit shared libraries for AMD64
|
ii libc6-i386 2.35-0ubuntu3.6 amd64 GNU C Library: 32-bit shared libraries for AMD64
|
||||||
ii libc6-x32 2.35-0ubuntu3.4 amd64 GNU C Library: X32 ABI Shared libraries for AMD64
|
ii libc6-x32 2.35-0ubuntu3.6 amd64 GNU C Library: X32 ABI Shared libraries for AMD64
|
||||||
ii libc6:amd64 2.35-0ubuntu3.4 amd64 GNU C Library: Shared libraries
|
ii libc6:amd64 2.35-0ubuntu3.6 amd64 GNU C Library: Shared libraries
|
||||||
ii libc6:i386 2.35-0ubuntu3.4 i386 GNU C Library: Shared libraries
|
ii libc6:i386 2.35-0ubuntu3.6 i386 GNU C Library: Shared libraries
|
||||||
ii libcap-ng0:amd64 0.7.9-2.2build3 amd64 An alternate POSIX capabilities library
|
ii libcap-ng0:amd64 0.7.9-2.2build3 amd64 An alternate POSIX capabilities library
|
||||||
ii libcap2:amd64 1:2.44-1ubuntu0.22.04.1 amd64 POSIX 1003.1e capabilities (library)
|
ii libcap2:amd64 1:2.44-1ubuntu0.22.04.1 amd64 POSIX 1003.1e capabilities (library)
|
||||||
ii libcc1-0:amd64 12.3.0-1ubuntu1~22.04 amd64 GCC cc1 plugin for GDB
|
ii libcc1-0:amd64 12.3.0-1ubuntu1~22.04 amd64 GCC cc1 plugin for GDB
|
||||||
@@ -111,10 +111,10 @@ ii libcom-err2:amd64 1.46.5-2ubuntu1.1 amd64
|
|||||||
ii libcrypt-dev:amd64 1:4.4.27-1 amd64 libcrypt development files
|
ii libcrypt-dev:amd64 1:4.4.27-1 amd64 libcrypt development files
|
||||||
ii libcrypt1:amd64 1:4.4.27-1 amd64 libcrypt shared library
|
ii libcrypt1:amd64 1:4.4.27-1 amd64 libcrypt shared library
|
||||||
ii libcrypt1:i386 1:4.4.27-1 i386 libcrypt shared library
|
ii libcrypt1:i386 1:4.4.27-1 i386 libcrypt shared library
|
||||||
ii libctf-nobfd0:amd64 2.38-4ubuntu2.3 amd64 Compact C Type Format library (runtime, no BFD dependency)
|
ii libctf-nobfd0:amd64 2.38-4ubuntu2.6 amd64 Compact C Type Format library (runtime, no BFD dependency)
|
||||||
ii libctf0:amd64 2.38-4ubuntu2.3 amd64 Compact C Type Format library (runtime, BFD dependency)
|
ii libctf0:amd64 2.38-4ubuntu2.6 amd64 Compact C Type Format library (runtime, BFD dependency)
|
||||||
ii libcurl3-gnutls:amd64 7.81.0-1ubuntu1.14 amd64 easy-to-use client-side URL transfer library (GnuTLS flavour)
|
ii libcurl3-gnutls:amd64 7.81.0-1ubuntu1.15 amd64 easy-to-use client-side URL transfer library (GnuTLS flavour)
|
||||||
ii libcurl4:amd64 7.81.0-1ubuntu1.14 amd64 easy-to-use client-side URL transfer library (OpenSSL flavour)
|
ii libcurl4:amd64 7.81.0-1ubuntu1.15 amd64 easy-to-use client-side URL transfer library (OpenSSL flavour)
|
||||||
ii libdb5.3:amd64 5.3.28+dfsg1-0.8ubuntu3 amd64 Berkeley v5.3 Database Libraries [runtime]
|
ii libdb5.3:amd64 5.3.28+dfsg1-0.8ubuntu3 amd64 Berkeley v5.3 Database Libraries [runtime]
|
||||||
ii libdebconfclient0:amd64 0.261ubuntu1 amd64 Debian Configuration Management System (C-implementation library)
|
ii libdebconfclient0:amd64 0.261ubuntu1 amd64 Debian Configuration Management System (C-implementation library)
|
||||||
ii libdebuginfod-common 0.186-1build1 all configuration to enable the Debian debug info server
|
ii libdebuginfod-common 0.186-1build1 all configuration to enable the Debian debug info server
|
||||||
@@ -122,7 +122,7 @@ ii libdebuginfod1:amd64 0.186-1build1 amd64
|
|||||||
ii libdw1:amd64 0.186-1build1 amd64 library that provides access to the DWARF debug information
|
ii libdw1:amd64 0.186-1build1 amd64 library that provides access to the DWARF debug information
|
||||||
ii libelf1:amd64 0.186-1build1 amd64 library to read and write ELF files
|
ii libelf1:amd64 0.186-1build1 amd64 library to read and write ELF files
|
||||||
ii liberror-perl 0.17029-1 all Perl module for error/exception handling in an OO-ish way
|
ii liberror-perl 0.17029-1 all Perl module for error/exception handling in an OO-ish way
|
||||||
ii libexpat1:amd64 2.4.7-1ubuntu0.2 amd64 XML parsing C library - runtime library
|
ii libexpat1:amd64 2.4.7-1ubuntu0.3 amd64 XML parsing C library - runtime library
|
||||||
ii libext2fs2:amd64 1.46.5-2ubuntu1.1 amd64 ext2/ext3/ext4 file system libraries
|
ii libext2fs2:amd64 1.46.5-2ubuntu1.1 amd64 ext2/ext3/ext4 file system libraries
|
||||||
ii libffi8:amd64 3.4.2-4 amd64 Foreign Function Interface library runtime
|
ii libffi8:amd64 3.4.2-4 amd64 Foreign Function Interface library runtime
|
||||||
ii libgcc-11-dev:amd64 11.4.0-1ubuntu1~22.04 amd64 GCC support library (development files)
|
ii libgcc-11-dev:amd64 11.4.0-1ubuntu1~22.04 amd64 GCC support library (development files)
|
||||||
@@ -133,11 +133,11 @@ ii libgdbm-compat4:amd64 1.23-1 amd64
|
|||||||
ii libgdbm6:amd64 1.23-1 amd64 GNU dbm database routines (runtime version)
|
ii libgdbm6:amd64 1.23-1 amd64 GNU dbm database routines (runtime version)
|
||||||
ii libglib2.0-0:amd64 2.72.4-0ubuntu2.2 amd64 GLib library of C routines
|
ii libglib2.0-0:amd64 2.72.4-0ubuntu2.2 amd64 GLib library of C routines
|
||||||
ii libgmp10:amd64 2:6.2.1+dfsg-3ubuntu1 amd64 Multiprecision arithmetic library
|
ii libgmp10:amd64 2:6.2.1+dfsg-3ubuntu1 amd64 Multiprecision arithmetic library
|
||||||
ii libgnutls30:amd64 3.7.3-4ubuntu1.2 amd64 GNU TLS library - main runtime library
|
ii libgnutls30:amd64 3.7.3-4ubuntu1.4 amd64 GNU TLS library - main runtime library
|
||||||
ii libgomp1:amd64 12.3.0-1ubuntu1~22.04 amd64 GCC OpenMP (GOMP) support library
|
ii libgomp1:amd64 12.3.0-1ubuntu1~22.04 amd64 GCC OpenMP (GOMP) support library
|
||||||
ii libgpg-error0:amd64 1.43-3 amd64 GnuPG development runtime library
|
ii libgpg-error0:amd64 1.43-3 amd64 GnuPG development runtime library
|
||||||
ii libgpm2:amd64 1.20.7-10build1 amd64 General Purpose Mouse - shared library
|
ii libgpm2:amd64 1.20.7-10build1 amd64 General Purpose Mouse - shared library
|
||||||
ii libgssapi-krb5-2:amd64 1.19.2-2ubuntu0.2 amd64 MIT Kerberos runtime libraries - krb5 GSS-API Mechanism
|
ii libgssapi-krb5-2:amd64 1.19.2-2ubuntu0.3 amd64 MIT Kerberos runtime libraries - krb5 GSS-API Mechanism
|
||||||
ii libhiredis0.14:amd64 0.14.1-2 amd64 minimalistic C client library for Redis
|
ii libhiredis0.14:amd64 0.14.1-2 amd64 minimalistic C client library for Redis
|
||||||
ii libhogweed6:amd64 3.7.3-1build2 amd64 low level cryptographic library (public-key cryptos)
|
ii libhogweed6:amd64 3.7.3-1build2 amd64 low level cryptographic library (public-key cryptos)
|
||||||
ii libicu70:amd64 70.1-2 amd64 International Components for Unicode
|
ii libicu70:amd64 70.1-2 amd64 International Components for Unicode
|
||||||
@@ -150,11 +150,11 @@ ii libitm1:amd64 12.3.0-1ubuntu1~22.04 amd64
|
|||||||
ii libjansson4:amd64 2.13.1-1.1build3 amd64 C library for encoding, decoding and manipulating JSON data
|
ii libjansson4:amd64 2.13.1-1.1build3 amd64 C library for encoding, decoding and manipulating JSON data
|
||||||
ii libjq1:amd64 1.6-2.1ubuntu3 amd64 lightweight and flexible command-line JSON processor - shared library
|
ii libjq1:amd64 1.6-2.1ubuntu3 amd64 lightweight and flexible command-line JSON processor - shared library
|
||||||
ii libjsoncpp25:amd64 1.9.5-3 amd64 library for reading and writing JSON for C++
|
ii libjsoncpp25:amd64 1.9.5-3 amd64 library for reading and writing JSON for C++
|
||||||
ii libk5crypto3:amd64 1.19.2-2ubuntu0.2 amd64 MIT Kerberos runtime libraries - Crypto Library
|
ii libk5crypto3:amd64 1.19.2-2ubuntu0.3 amd64 MIT Kerberos runtime libraries - Crypto Library
|
||||||
ii libkeyutils1:amd64 1.6.1-2ubuntu3 amd64 Linux Key Management Utilities (library)
|
ii libkeyutils1:amd64 1.6.1-2ubuntu3 amd64 Linux Key Management Utilities (library)
|
||||||
ii libkrb5-3:amd64 1.19.2-2ubuntu0.2 amd64 MIT Kerberos runtime libraries
|
ii libkrb5-3:amd64 1.19.2-2ubuntu0.3 amd64 MIT Kerberos runtime libraries
|
||||||
ii libkrb5support0:amd64 1.19.2-2ubuntu0.2 amd64 MIT Kerberos runtime libraries - Support library
|
ii libkrb5support0:amd64 1.19.2-2ubuntu0.3 amd64 MIT Kerberos runtime libraries - Support library
|
||||||
ii libldap-2.5-0:amd64 2.5.16+dfsg-0ubuntu0.22.04.1 amd64 OpenLDAP libraries
|
ii libldap-2.5-0:amd64 2.5.17+dfsg-0ubuntu0.22.04.1 amd64 OpenLDAP libraries
|
||||||
ii liblsan0:amd64 12.3.0-1ubuntu1~22.04 amd64 LeakSanitizer -- a memory leak detector (runtime)
|
ii liblsan0:amd64 12.3.0-1ubuntu1~22.04 amd64 LeakSanitizer -- a memory leak detector (runtime)
|
||||||
ii liblz4-1:amd64 1.9.3-2build2 amd64 Fast LZ compression algorithm library - runtime
|
ii liblz4-1:amd64 1.9.3-2build2 amd64 Fast LZ compression algorithm library - runtime
|
||||||
ii liblzma5:amd64 5.2.5-2ubuntu1 amd64 XZ-format compression library
|
ii liblzma5:amd64 5.2.5-2ubuntu1 amd64 XZ-format compression library
|
||||||
@@ -171,28 +171,28 @@ ii libncurses5:amd64 6.3-2ubuntu0.1 amd64
|
|||||||
ii libncurses6:amd64 6.3-2ubuntu0.1 amd64 shared libraries for terminal handling
|
ii libncurses6:amd64 6.3-2ubuntu0.1 amd64 shared libraries for terminal handling
|
||||||
ii libncursesw6:amd64 6.3-2ubuntu0.1 amd64 shared libraries for terminal handling (wide character support)
|
ii libncursesw6:amd64 6.3-2ubuntu0.1 amd64 shared libraries for terminal handling (wide character support)
|
||||||
ii libnettle8:amd64 3.7.3-1build2 amd64 low level cryptographic library (symmetric and one-way cryptos)
|
ii libnettle8:amd64 3.7.3-1build2 amd64 low level cryptographic library (symmetric and one-way cryptos)
|
||||||
ii libnghttp2-14:amd64 1.43.0-1build3 amd64 library implementing HTTP/2 protocol (shared library)
|
ii libnghttp2-14:amd64 1.43.0-1ubuntu0.1 amd64 library implementing HTTP/2 protocol (shared library)
|
||||||
ii libnl-3-200:amd64 3.5.0-0.1 amd64 library for dealing with netlink sockets
|
ii libnl-3-200:amd64 3.5.0-0.1 amd64 library for dealing with netlink sockets
|
||||||
ii libnl-genl-3-200:amd64 3.5.0-0.1 amd64 library for dealing with netlink sockets - generic netlink
|
ii libnl-genl-3-200:amd64 3.5.0-0.1 amd64 library for dealing with netlink sockets - generic netlink
|
||||||
ii libnsl-dev:amd64 1.3.0-2build2 amd64 libnsl development files
|
ii libnsl-dev:amd64 1.3.0-2build2 amd64 libnsl development files
|
||||||
ii libnsl2:amd64 1.3.0-2build2 amd64 Public client interface for NIS(YP) and NIS+
|
ii libnsl2:amd64 1.3.0-2build2 amd64 Public client interface for NIS(YP) and NIS+
|
||||||
ii libonig5:amd64 6.9.7.1-2build1 amd64 regular expressions library
|
ii libonig5:amd64 6.9.7.1-2build1 amd64 regular expressions library
|
||||||
ii libp11-kit0:amd64 0.24.0-6build1 amd64 library for loading and coordinating access to PKCS#11 modules - runtime
|
ii libp11-kit0:amd64 0.24.0-6build1 amd64 library for loading and coordinating access to PKCS#11 modules - runtime
|
||||||
ii libpam-modules-bin 1.4.0-11ubuntu2.3 amd64 Pluggable Authentication Modules for PAM - helper binaries
|
ii libpam-modules-bin 1.4.0-11ubuntu2.4 amd64 Pluggable Authentication Modules for PAM - helper binaries
|
||||||
ii libpam-modules:amd64 1.4.0-11ubuntu2.3 amd64 Pluggable Authentication Modules for PAM
|
ii libpam-modules:amd64 1.4.0-11ubuntu2.4 amd64 Pluggable Authentication Modules for PAM
|
||||||
ii libpam-runtime 1.4.0-11ubuntu2.3 all Runtime support for the PAM library
|
ii libpam-runtime 1.4.0-11ubuntu2.4 all Runtime support for the PAM library
|
||||||
ii libpam0g:amd64 1.4.0-11ubuntu2.3 amd64 Pluggable Authentication Modules library
|
ii libpam0g:amd64 1.4.0-11ubuntu2.4 amd64 Pluggable Authentication Modules library
|
||||||
ii libpcre2-8-0:amd64 10.39-3ubuntu0.1 amd64 New Perl Compatible Regular Expression Library- 8 bit runtime files
|
ii libpcre2-8-0:amd64 10.39-3ubuntu0.1 amd64 New Perl Compatible Regular Expression Library- 8 bit runtime files
|
||||||
ii libpcre3:amd64 2:8.39-13ubuntu0.22.04.1 amd64 Old Perl 5 Compatible Regular Expression Library - runtime files
|
ii libpcre3:amd64 2:8.39-13ubuntu0.22.04.1 amd64 Old Perl 5 Compatible Regular Expression Library - runtime files
|
||||||
ii libperl5.34:amd64 5.34.0-3ubuntu1.2 amd64 shared Perl library
|
ii libperl5.34:amd64 5.34.0-3ubuntu1.3 amd64 shared Perl library
|
||||||
ii libpopt0:amd64 1.18-3build1 amd64 lib for parsing cmdline parameters
|
ii libpopt0:amd64 1.18-3build1 amd64 lib for parsing cmdline parameters
|
||||||
ii libprocps8:amd64 2:3.3.17-6ubuntu2 amd64 library for accessing process information from /proc
|
ii libprocps8:amd64 2:3.3.17-6ubuntu2.1 amd64 library for accessing process information from /proc
|
||||||
ii libpsl5:amd64 0.21.0-1.2build2 amd64 Library for Public Suffix List (shared libraries)
|
ii libpsl5:amd64 0.21.0-1.2build2 amd64 Library for Public Suffix List (shared libraries)
|
||||||
ii libpython2.7-minimal:amd64 2.7.18-13ubuntu1.1 amd64 Minimal subset of the Python language (version 2.7)
|
ii libpython2.7-minimal:amd64 2.7.18-13ubuntu1.2 amd64 Minimal subset of the Python language (version 2.7)
|
||||||
ii libpython3-stdlib:amd64 3.10.6-1~22.04 amd64 interactive high-level object-oriented language (default python3 version)
|
ii libpython3-stdlib:amd64 3.10.6-1~22.04 amd64 interactive high-level object-oriented language (default python3 version)
|
||||||
ii libpython3.10-minimal:amd64 3.10.12-1~22.04.2 amd64 Minimal subset of the Python language (version 3.10)
|
ii libpython3.10-minimal:amd64 3.10.12-1~22.04.3 amd64 Minimal subset of the Python language (version 3.10)
|
||||||
ii libpython3.10-stdlib:amd64 3.10.12-1~22.04.2 amd64 Interactive high-level object-oriented language (standard library, version 3.10)
|
ii libpython3.10-stdlib:amd64 3.10.12-1~22.04.3 amd64 Interactive high-level object-oriented language (standard library, version 3.10)
|
||||||
ii libpython3.10:amd64 3.10.12-1~22.04.2 amd64 Shared Python runtime library (version 3.10)
|
ii libpython3.10:amd64 3.10.12-1~22.04.3 amd64 Shared Python runtime library (version 3.10)
|
||||||
ii libquadmath0:amd64 12.3.0-1ubuntu1~22.04 amd64 GCC Quad-Precision Math Library
|
ii libquadmath0:amd64 12.3.0-1ubuntu1~22.04 amd64 GCC Quad-Precision Math Library
|
||||||
ii libreadline8:amd64 8.1.2-1 amd64 GNU readline and history libraries, run-time libraries
|
ii libreadline8:amd64 8.1.2-1 amd64 GNU readline and history libraries, run-time libraries
|
||||||
ii librhash0:amd64 1.4.2-1ubuntu1 amd64 shared library for hash functions computing
|
ii librhash0:amd64 1.4.2-1ubuntu1 amd64 shared library for hash functions computing
|
||||||
@@ -211,14 +211,14 @@ ii libsmartcols1:amd64 2.37.2-4ubuntu3 amd64
|
|||||||
ii libsodium23:amd64 1.0.18-1build2 amd64 Network communication, cryptography and signaturing library
|
ii libsodium23:amd64 1.0.18-1build2 amd64 Network communication, cryptography and signaturing library
|
||||||
ii libsource-highlight-common 3.1.9-4.1build2 all architecture-independent files for source highlighting library
|
ii libsource-highlight-common 3.1.9-4.1build2 all architecture-independent files for source highlighting library
|
||||||
ii libsource-highlight4v5 3.1.9-4.1build2 amd64 source highlighting library
|
ii libsource-highlight4v5 3.1.9-4.1build2 amd64 source highlighting library
|
||||||
ii libsqlite3-0:amd64 3.37.2-2ubuntu0.1 amd64 SQLite 3 shared library
|
ii libsqlite3-0:amd64 3.37.2-2ubuntu0.3 amd64 SQLite 3 shared library
|
||||||
ii libss2:amd64 1.46.5-2ubuntu1.1 amd64 command-line interface parsing library
|
ii libss2:amd64 1.46.5-2ubuntu1.1 amd64 command-line interface parsing library
|
||||||
ii libssh-4:amd64 0.9.6-2ubuntu0.22.04.1 amd64 tiny C SSH library (OpenSSL flavor)
|
ii libssh-4:amd64 0.9.6-2ubuntu0.22.04.3 amd64 tiny C SSH library (OpenSSL flavor)
|
||||||
ii libssh2-1:amd64 1.10.0-3 amd64 SSH2 client-side library
|
ii libssh2-1:amd64 1.10.0-3 amd64 SSH2 client-side library
|
||||||
ii libssl3:amd64 3.0.2-0ubuntu1.10 amd64 Secure Sockets Layer toolkit - shared libraries
|
ii libssl3:amd64 3.0.2-0ubuntu1.15 amd64 Secure Sockets Layer toolkit - shared libraries
|
||||||
ii libstdc++-11-dev:amd64 11.4.0-1ubuntu1~22.04 amd64 GNU Standard C++ Library v3 (development files)
|
ii libstdc++-11-dev:amd64 11.4.0-1ubuntu1~22.04 amd64 GNU Standard C++ Library v3 (development files)
|
||||||
ii libstdc++6:amd64 12.3.0-1ubuntu1~22.04 amd64 GNU Standard C++ Library v3
|
ii libstdc++6:amd64 12.3.0-1ubuntu1~22.04 amd64 GNU Standard C++ Library v3
|
||||||
ii libsystemd0:amd64 249.11-0ubuntu3.10 amd64 systemd utility library
|
ii libsystemd0:amd64 249.11-0ubuntu3.12 amd64 systemd utility library
|
||||||
ii libtasn1-6:amd64 4.18.0-4build1 amd64 Manage ASN.1 structures (runtime)
|
ii libtasn1-6:amd64 4.18.0-4build1 amd64 Manage ASN.1 structures (runtime)
|
||||||
ii libtime-duration-perl 1.21-1 all module for rounded or exact English expression of durations
|
ii libtime-duration-perl 1.21-1 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
|
||||||
@@ -229,11 +229,11 @@ ii libtirpc-dev:amd64 1.3.2-2ubuntu0.1 amd64
|
|||||||
ii libtirpc3:amd64 1.3.2-2ubuntu0.1 amd64 transport-independent RPC library
|
ii libtirpc3:amd64 1.3.2-2ubuntu0.1 amd64 transport-independent RPC library
|
||||||
ii libtsan0:amd64 11.4.0-1ubuntu1~22.04 amd64 ThreadSanitizer -- a Valgrind-based detector of data races (runtime)
|
ii libtsan0:amd64 11.4.0-1ubuntu1~22.04 amd64 ThreadSanitizer -- a Valgrind-based detector of data races (runtime)
|
||||||
ii libubsan1:amd64 12.3.0-1ubuntu1~22.04 amd64 UBSan -- undefined behaviour sanitizer (runtime)
|
ii libubsan1:amd64 12.3.0-1ubuntu1~22.04 amd64 UBSan -- undefined behaviour sanitizer (runtime)
|
||||||
ii libudev1:amd64 249.11-0ubuntu3.10 amd64 libudev shared library
|
ii libudev1:amd64 249.11-0ubuntu3.12 amd64 libudev shared library
|
||||||
ii libunistring2:amd64 1.0-1 amd64 Unicode string library for C
|
ii libunistring2:amd64 1.0-1 amd64 Unicode string library for C
|
||||||
ii libutempter0:amd64 1.2.1-2build2 amd64 privileged helper for utmp/wtmp updates (runtime)
|
ii libutempter0:amd64 1.2.1-2build2 amd64 privileged helper for utmp/wtmp updates (runtime)
|
||||||
ii libuuid1:amd64 2.37.2-4ubuntu3 amd64 Universally Unique ID library
|
ii libuuid1:amd64 2.37.2-4ubuntu3 amd64 Universally Unique ID library
|
||||||
ii libuv1:amd64 1.43.0-1 amd64 asynchronous event notification library - runtime library
|
ii libuv1:amd64 1.43.0-1ubuntu0.1 amd64 asynchronous event notification library - runtime library
|
||||||
ii libx11-6:amd64 2:1.7.5-1ubuntu0.3 amd64 X11 client-side library
|
ii libx11-6:amd64 2:1.7.5-1ubuntu0.3 amd64 X11 client-side library
|
||||||
ii libx11-data 2:1.7.5-1ubuntu0.3 all X11 client-side library
|
ii libx11-data 2:1.7.5-1ubuntu0.3 all X11 client-side library
|
||||||
ii libx32asan6 11.4.0-1ubuntu1~22.04 amd64 AddressSanitizer -- a fast memory error detector (x32)
|
ii libx32asan6 11.4.0-1ubuntu1~22.04 amd64 AddressSanitizer -- a fast memory error detector (x32)
|
||||||
@@ -249,13 +249,13 @@ ii libx32ubsan1 12.3.0-1ubuntu1~22.04 amd64
|
|||||||
ii libxau6:amd64 1:1.0.9-1build5 amd64 X11 authorisation library
|
ii libxau6:amd64 1:1.0.9-1build5 amd64 X11 authorisation library
|
||||||
ii libxcb1:amd64 1.14-3ubuntu3 amd64 X C Binding
|
ii libxcb1:amd64 1.14-3ubuntu3 amd64 X C Binding
|
||||||
ii libxdmcp6:amd64 1:1.1.3-0ubuntu5 amd64 X11 Display Manager Control Protocol library
|
ii libxdmcp6:amd64 1:1.1.3-0ubuntu5 amd64 X11 Display Manager Control Protocol library
|
||||||
ii libxml2:amd64 2.9.13+dfsg-1ubuntu0.3 amd64 GNOME XML library
|
ii libxml2:amd64 2.9.13+dfsg-1ubuntu0.4 amd64 GNOME XML library
|
||||||
ii libxxhash0:amd64 0.8.1-1 amd64 shared library for xxhash
|
ii libxxhash0:amd64 0.8.1-1 amd64 shared library for xxhash
|
||||||
ii libyaml-0-2:amd64 0.2.2-1build2 amd64 Fast YAML 1.1 parser and emitter library
|
ii libyaml-0-2:amd64 0.2.2-1build2 amd64 Fast YAML 1.1 parser and emitter library
|
||||||
ii libzstd-dev:amd64 1.4.8+dfsg-3build1 amd64 fast lossless compression algorithm -- development files
|
ii libzstd-dev:amd64 1.4.8+dfsg-3build1 amd64 fast lossless compression algorithm -- development files
|
||||||
ii libzstd1:amd64 1.4.8+dfsg-3build1 amd64 fast lossless compression algorithm
|
ii libzstd1:amd64 1.4.8+dfsg-3build1 amd64 fast lossless compression algorithm
|
||||||
ii linux-libc-dev:amd64 5.15.0-87.97 amd64 Linux Kernel Headers for development
|
ii linux-libc-dev:amd64 5.15.0-100.110 amd64 Linux Kernel Headers for development
|
||||||
ii login 1:4.8.1-2ubuntu2.1 amd64 system login tools
|
ii login 1:4.8.1-2ubuntu2.2 amd64 system login tools
|
||||||
ii logsave 1.46.5-2ubuntu1.1 amd64 save the output of a command in a log file
|
ii logsave 1.46.5-2ubuntu1.1 amd64 save the output of a command in a log file
|
||||||
ii lsb-base 11.1.0ubuntu4 all Linux Standard Base init script functionality
|
ii lsb-base 11.1.0ubuntu4 all Linux Standard Base init script functionality
|
||||||
ii lsb-release 11.1.0ubuntu4 all Linux Standard Base version reporting utility
|
ii lsb-release 11.1.0ubuntu4 all Linux Standard Base version reporting utility
|
||||||
@@ -272,27 +272,28 @@ ii ncurses-base 6.3-2ubuntu0.1 all
|
|||||||
ii ncurses-bin 6.3-2ubuntu0.1 amd64 terminal-related programs and man pages
|
ii ncurses-bin 6.3-2ubuntu0.1 amd64 terminal-related programs and man pages
|
||||||
ii ncurses-term 6.3-2ubuntu0.1 all additional terminal type definitions
|
ii ncurses-term 6.3-2ubuntu0.1 all additional terminal type definitions
|
||||||
ii ninja-build 1.10.1-1 amd64 small build system closest in spirit to Make
|
ii ninja-build 1.10.1-1 amd64 small build system closest in spirit to Make
|
||||||
ii openssl 3.0.2-0ubuntu1.10 amd64 Secure Sockets Layer toolkit - cryptographic utility
|
ii openssl 3.0.2-0ubuntu1.15 amd64 Secure Sockets Layer toolkit - cryptographic utility
|
||||||
ii p7zip 16.02+dfsg-8 amd64 7zr file archiver with high compression ratio
|
ii p7zip 16.02+dfsg-8 amd64 7zr file archiver with high compression ratio
|
||||||
ii parallel 20210822+ds-2 all build and execute command lines from standard input in parallel
|
ii parallel 20210822+ds-2 all build and execute command lines from standard input in parallel
|
||||||
ii passwd 1:4.8.1-2ubuntu2.1 amd64 change and administer password and group data
|
ii passwd 1:4.8.1-2ubuntu2.2 amd64 change and administer password and group data
|
||||||
ii patch 2.7.6-7build2 amd64 Apply a diff file to an original
|
ii patch 2.7.6-7build2 amd64 Apply a diff file to an original
|
||||||
ii patchelf 0.14.3-1 amd64 modify properties of ELF executables
|
ii patchelf 0.14.3-1 amd64 modify properties of ELF executables
|
||||||
|
ii patchutils 0.4.2-1build2 amd64 Utilities to work with patches
|
||||||
ii pax-utils 1.2.9-1 amd64 Security-focused ELF files checking tool
|
ii pax-utils 1.2.9-1 amd64 Security-focused ELF files checking tool
|
||||||
ii paxctl 0.9-1build1 amd64 new PaX control program for using the PT_PAX_FLAGS marking
|
ii paxctl 0.9-1build1 amd64 new PaX control program for using the PT_PAX_FLAGS marking
|
||||||
ii perl 5.34.0-3ubuntu1.2 amd64 Larry Wall's Practical Extraction and Report Language
|
ii perl 5.34.0-3ubuntu1.3 amd64 Larry Wall's Practical Extraction and Report Language
|
||||||
ii perl-base 5.34.0-3ubuntu1.2 amd64 minimal Perl system
|
ii perl-base 5.34.0-3ubuntu1.3 amd64 minimal Perl system
|
||||||
ii perl-modules-5.34 5.34.0-3ubuntu1.2 all Core Perl modules
|
ii perl-modules-5.34 5.34.0-3ubuntu1.3 all Core Perl modules
|
||||||
ii procps 2:3.3.17-6ubuntu2 amd64 /proc file system utilities
|
ii procps 2:3.3.17-6ubuntu2.1 amd64 /proc file system utilities
|
||||||
ii python2-minimal 2.7.18-3 amd64 minimal subset of the Python2 language
|
ii python2-minimal 2.7.18-3 amd64 minimal subset of the Python2 language
|
||||||
ii python2.7-minimal 2.7.18-13ubuntu1.1 amd64 Minimal subset of the Python language (version 2.7)
|
ii python2.7-minimal 2.7.18-13ubuntu1.2 amd64 Minimal subset of the Python language (version 2.7)
|
||||||
ii python3 3.10.6-1~22.04 amd64 interactive high-level object-oriented language (default python3 version)
|
ii python3 3.10.6-1~22.04 amd64 interactive high-level object-oriented language (default python3 version)
|
||||||
ii python3-minimal 3.10.6-1~22.04 amd64 minimal subset of the Python language (default python3 version)
|
ii python3-minimal 3.10.6-1~22.04 amd64 minimal subset of the Python language (default python3 version)
|
||||||
ii python3-pyasn1 0.4.8-1 all ASN.1 library for Python (Python 3 module)
|
ii python3-pyasn1 0.4.8-1 all ASN.1 library for Python (Python 3 module)
|
||||||
ii python3-pycryptodome 3.11.0+dfsg1-3build1 amd64 cryptographic Python library (Python 3)
|
ii python3-pycryptodome 3.11.0+dfsg1-3ubuntu0.1 amd64 cryptographic Python library (Python 3)
|
||||||
ii python3-zstd 1.5.0.2-1build1 amd64 python bindings to Yann Collet ZSTD compression library
|
ii python3-zstd 1.5.0.2-1build1 amd64 python bindings to Yann Collet ZSTD compression library
|
||||||
ii python3.10 3.10.12-1~22.04.2 amd64 Interactive high-level object-oriented language (version 3.10)
|
ii python3.10 3.10.12-1~22.04.3 amd64 Interactive high-level object-oriented language (version 3.10)
|
||||||
ii python3.10-minimal 3.10.12-1~22.04.2 amd64 Minimal subset of the Python language (version 3.10)
|
ii python3.10-minimal 3.10.12-1~22.04.3 amd64 Minimal subset of the Python language (version 3.10)
|
||||||
ii re2c 3.0-1 amd64 lexer generator for C, C++, Go and Rust
|
ii re2c 3.0-1 amd64 lexer generator for C, C++, Go and Rust
|
||||||
ii readline-common 8.1.2-1 all GNU readline and history libraries, common files
|
ii readline-common 8.1.2-1 all GNU readline and history libraries, common files
|
||||||
ii ripgrep 13.0.0-2ubuntu0.1 amd64 Recursively searches directories for a regex pattern
|
ii ripgrep 13.0.0-2ubuntu0.1 amd64 Recursively searches directories for a regex pattern
|
||||||
@@ -303,19 +304,19 @@ ii sed 4.8-1ubuntu2 amd64
|
|||||||
ii sensible-utils 0.0.17 all Utilities for sensible alternative selection
|
ii sensible-utils 0.0.17 all Utilities for sensible alternative selection
|
||||||
ii sysstat 12.5.2-2ubuntu0.2 amd64 system performance tools for Linux
|
ii sysstat 12.5.2-2ubuntu0.2 amd64 system performance tools for Linux
|
||||||
ii sysvinit-utils 3.01-1ubuntu1 amd64 System-V-like utilities
|
ii sysvinit-utils 3.01-1ubuntu1 amd64 System-V-like utilities
|
||||||
ii tar 1.34+dfsg-1ubuntu0.1.22.04.1 amd64 GNU version of the tar archiving utility
|
ii tar 1.34+dfsg-1ubuntu0.1.22.04.2 amd64 GNU version of the tar archiving utility
|
||||||
ii time 1.9-0.1build2 amd64 GNU time program for measuring CPU resource usage
|
ii time 1.9-0.1build2 amd64 GNU time program for measuring CPU resource usage
|
||||||
ii ubuntu-keyring 2021.03.26 all GnuPG keys of the Ubuntu archive
|
ii ubuntu-keyring 2021.03.26 all GnuPG keys of the Ubuntu archive
|
||||||
ii ucf 3.0043 all Update Configuration File(s): preserve user changes to config files
|
ii ucf 3.0043 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-26ubuntu3.1 amd64 De-archiver for .zip files
|
ii unzip 6.0-26ubuntu3.2 amd64 De-archiver for .zip files
|
||||||
ii usrmerge 25ubuntu2 all Convert the system to the merged /usr directories scheme
|
ii usrmerge 25ubuntu2 all Convert the system to the merged /usr directories scheme
|
||||||
ii util-linux 2.37.2-4ubuntu3 amd64 miscellaneous system utilities
|
ii util-linux 2.37.2-4ubuntu3 amd64 miscellaneous system utilities
|
||||||
ii vim 2:8.2.3995-1ubuntu2.12 amd64 Vi IMproved - enhanced vi editor
|
ii vim 2:8.2.3995-1ubuntu2.15 amd64 Vi IMproved - enhanced vi editor
|
||||||
ii vim-common 2:8.2.3995-1ubuntu2.12 all Vi IMproved - Common files
|
ii vim-common 2:8.2.3995-1ubuntu2.15 all Vi IMproved - Common files
|
||||||
ii vim-runtime 2:8.2.3995-1ubuntu2.12 all Vi IMproved - Runtime files
|
ii vim-runtime 2:8.2.3995-1ubuntu2.15 all Vi IMproved - Runtime files
|
||||||
ii wget 1.21.2-2ubuntu1 amd64 retrieves files from the web
|
ii wget 1.21.2-2ubuntu1 amd64 retrieves files from the web
|
||||||
ii xxd 2:8.2.3995-1ubuntu2.12 amd64 tool to make (or reverse) a hex dump
|
ii xxd 2:8.2.3995-1ubuntu2.15 amd64 tool to make (or reverse) a hex dump
|
||||||
ii xz-utils 5.2.5-2ubuntu1 amd64 XZ-format compression utilities
|
ii xz-utils 5.2.5-2ubuntu1 amd64 XZ-format compression utilities
|
||||||
ii yash 2.51-1 amd64 yet another shell
|
ii yash 2.51-1 amd64 yet another shell
|
||||||
ii zip 3.0-12build2 amd64 Archiver for .zip files
|
ii zip 3.0-12build2 amd64 Archiver for .zip files
|
||||||
@@ -330,12 +331,12 @@ ii zstd 1.4.8+dfsg-3build1 amd64
|
|||||||
||/ Name Version Architecture Description
|
||/ Name Version Architecture Description
|
||||||
|
|
||||||
Packages sorted by Installed-Size:
|
Packages sorted by Installed-Size:
|
||||||
754072 ===== TOTAL (324 packages)
|
754392 ===== TOTAL (325 packages)
|
||||||
52747 gcc-11 amd64
|
52747 gcc-11 amd64
|
||||||
34444 libicu70 amd64
|
34444 libicu70 amd64
|
||||||
32781 vim-runtime all
|
32783 vim-runtime all
|
||||||
28891 g++-11 amd64
|
28891 g++-11 amd64
|
||||||
28441 libperl5.34 amd64
|
28445 libperl5.34 amd64
|
||||||
26284 cpp-11 amd64
|
26284 cpp-11 amd64
|
||||||
20742 cmake amd64
|
20742 cmake amd64
|
||||||
18759 libstdc++-11-dev amd64
|
18759 libstdc++-11-dev amd64
|
||||||
@@ -343,47 +344,47 @@ Packages sorted by Installed-Size:
|
|||||||
17671 perl-modules-5.34 all
|
17671 perl-modules-5.34 all
|
||||||
15293 zsh-common all
|
15293 zsh-common all
|
||||||
13895 libgcc-11-dev amd64
|
13895 libgcc-11-dev amd64
|
||||||
13592 libc6 amd64
|
13597 libc6 amd64
|
||||||
13037 libc6-dev amd64
|
13038 libc6-dev amd64
|
||||||
12561 libc6-x32 amd64
|
12562 libc6-x32 amd64
|
||||||
12479 libc6 i386
|
12480 libc6 i386
|
||||||
12200 libc6-i386 amd64
|
12201 libc6-i386 amd64
|
||||||
11311 gdb amd64
|
11311 gdb amd64
|
||||||
10877 lib32stdc++-11-dev amd64
|
10877 lib32stdc++-11-dev amd64
|
||||||
10439 binutils-x86-64-linux-gnu amd64
|
10431 binutils-x86-64-linux-gnu amd64
|
||||||
10390 libx32stdc++-11-dev amd64
|
10390 libx32stdc++-11-dev amd64
|
||||||
9866 cmake-data all
|
9866 cmake-data all
|
||||||
8248 libc6-dev-x32 amd64
|
8250 libc6-dev-x32 amd64
|
||||||
8119 libpython3.10-stdlib amd64
|
8119 libpython3.10-stdlib amd64
|
||||||
7948 lib32gcc-11-dev amd64
|
7948 lib32gcc-11-dev amd64
|
||||||
7730 perl-base amd64
|
7734 perl-base amd64
|
||||||
7518 libasan6 amd64
|
7518 libasan6 amd64
|
||||||
7262 libc6-dev-i386 amd64
|
7263 libc6-dev-i386 amd64
|
||||||
7255 libtsan0 amd64
|
7255 libtsan0 amd64
|
||||||
7128 libmagic-mgc amd64
|
7128 libmagic-mgc amd64
|
||||||
7112 coreutils amd64
|
7104 coreutils amd64
|
||||||
6988 libx32gcc-11-dev amd64
|
6988 libx32gcc-11-dev amd64
|
||||||
6795 linux-libc-dev amd64
|
6858 linux-libc-dev amd64
|
||||||
6733 dpkg amd64
|
6733 dpkg amd64
|
||||||
6667 lib32asan6 amd64
|
6667 lib32asan6 amd64
|
||||||
6570 libx32asan6 amd64
|
6570 libx32asan6 amd64
|
||||||
5905 python3.10-minimal amd64
|
5898 python3.10-minimal amd64
|
||||||
5824 libssl3 amd64
|
5833 libssl3 amd64
|
||||||
5768 libpython3.10 amd64
|
5768 libpython3.10 amd64
|
||||||
5103 libpython3.10-minimal amd64
|
5106 libpython3.10-minimal amd64
|
||||||
4249 ncurses-term all
|
4249 ncurses-term all
|
||||||
4156 apt amd64
|
|
||||||
4147 ripgrep amd64
|
4147 ripgrep amd64
|
||||||
|
4141 apt amd64
|
||||||
4082 libglib2.0-0 amd64
|
4082 libglib2.0-0 amd64
|
||||||
3925 vim amd64
|
3931 vim amd64
|
||||||
3643 python2.7-minimal amd64
|
3639 python2.7-minimal amd64
|
||||||
3542 python3-pycryptodome amd64
|
3552 python3-pycryptodome amd64
|
||||||
3506 re2c amd64
|
3506 re2c amd64
|
||||||
3487 gojq amd64
|
3487 gojq amd64
|
||||||
3405 libmpfr6 amd64
|
3405 libmpfr6 amd64
|
||||||
3399 util-linux amd64
|
3399 util-linux amd64
|
||||||
3347 libaria2-0 amd64
|
3347 libaria2-0 amd64
|
||||||
3181 libapt-pkg6.0 amd64
|
3198 libapt-pkg6.0 amd64
|
||||||
3013 libboost-regex1.74.0 amd64
|
3013 libboost-regex1.74.0 amd64
|
||||||
2961 liblsan0 amd64
|
2961 liblsan0 amd64
|
||||||
2943 parallel all
|
2943 parallel all
|
||||||
@@ -393,7 +394,7 @@ Packages sorted by Installed-Size:
|
|||||||
2755 libstdc++6 amd64
|
2755 libstdc++6 amd64
|
||||||
2676 libubsan1 amd64
|
2676 libubsan1 amd64
|
||||||
2662 lib32stdc++6 amd64
|
2662 lib32stdc++6 amd64
|
||||||
2537 libc-bin amd64
|
2538 libc-bin amd64
|
||||||
2518 libx32ubsan1 amd64
|
2518 libx32ubsan1 amd64
|
||||||
2510 fd-find amd64
|
2510 fd-find amd64
|
||||||
2499 lib32ubsan1 amd64
|
2499 lib32ubsan1 amd64
|
||||||
@@ -432,7 +433,7 @@ Packages sorted by Installed-Size:
|
|||||||
1138 libpam-modules amd64
|
1138 libpam-modules amd64
|
||||||
1052 libkrb5-3 amd64
|
1052 libkrb5-3 amd64
|
||||||
1005 screen amd64
|
1005 screen amd64
|
||||||
995 libsystemd0 amd64
|
996 libsystemd0 amd64
|
||||||
990 p7zip amd64
|
990 p7zip amd64
|
||||||
984 wget amd64
|
984 wget amd64
|
||||||
960 tar amd64
|
960 tar amd64
|
||||||
@@ -452,7 +453,7 @@ Packages sorted by Installed-Size:
|
|||||||
686 lib32quadmath0 amd64
|
686 lib32quadmath0 amd64
|
||||||
683 libpcre3 amd64
|
683 libpcre3 amd64
|
||||||
646 ncurses-bin amd64
|
646 ncurses-bin amd64
|
||||||
632 python3.10 amd64
|
633 python3.10 amd64
|
||||||
621 libpcre2-8-0 amd64
|
621 libpcre2-8-0 amd64
|
||||||
620 findutils amd64
|
620 findutils amd64
|
||||||
615 libonig5 amd64
|
615 libonig5 amd64
|
||||||
@@ -483,14 +484,14 @@ Packages sorted by Installed-Size:
|
|||||||
390 python3-pyasn1 all
|
390 python3-pyasn1 all
|
||||||
390 ca-certificates all
|
390 ca-certificates all
|
||||||
389 mount amd64
|
389 mount amd64
|
||||||
|
382 vim-common all
|
||||||
382 libmount1 amd64
|
382 libmount1 amd64
|
||||||
380 vim-common all
|
377 unzip amd64
|
||||||
376 unzip amd64
|
|
||||||
372 xz-utils amd64
|
372 xz-utils amd64
|
||||||
368 libssh2-1 amd64
|
368 libssh2-1 amd64
|
||||||
356 libnettle8 amd64
|
356 libnettle8 amd64
|
||||||
350 ninja-build amd64
|
350 ninja-build amd64
|
||||||
347 libudev1 amd64
|
348 libudev1 amd64
|
||||||
347 libnsl-dev amd64
|
347 libnsl-dev amd64
|
||||||
347 libjq1 amd64
|
347 libjq1 amd64
|
||||||
336 libhogweed6 amd64
|
336 libhogweed6 amd64
|
||||||
@@ -506,22 +507,22 @@ Packages sorted by Installed-Size:
|
|||||||
320 libgomp1 amd64
|
320 libgomp1 amd64
|
||||||
320 libcrypt-dev amd64
|
320 libcrypt-dev amd64
|
||||||
318 libncurses5 amd64
|
318 libncurses5 amd64
|
||||||
|
313 libctf-nobfd0 amd64
|
||||||
312 libpam-runtime all
|
312 libpam-runtime all
|
||||||
312 libctf-nobfd0 amd64
|
|
||||||
307 libsource-highlight-common all
|
307 libsource-highlight-common all
|
||||||
306 libx32gomp1 amd64
|
306 libx32gomp1 amd64
|
||||||
300 libsemanage2 amd64
|
300 libsemanage2 amd64
|
||||||
298 libc-dev-bin amd64
|
299 libc-dev-bin amd64
|
||||||
296 libquadmath0 amd64
|
296 libquadmath0 amd64
|
||||||
295 libx32quadmath0 amd64
|
295 libx32quadmath0 amd64
|
||||||
292 libk5crypto3 amd64
|
292 libk5crypto3 amd64
|
||||||
290 pax-utils amd64
|
290 pax-utils amd64
|
||||||
290 liblzma5 amd64
|
290 liblzma5 amd64
|
||||||
278 xxd amd64
|
280 xxd amd64
|
||||||
273 gcc-11-base amd64
|
273 gcc-11-base amd64
|
||||||
272 gcc-12-base i386
|
272 gcc-12-base i386
|
||||||
272 gcc-12-base amd64
|
272 gcc-12-base amd64
|
||||||
252 libuv1 amd64
|
253 libuv1 amd64
|
||||||
252 libipc-run-perl all
|
252 libipc-run-perl all
|
||||||
252 libcrypt1 i386
|
252 libcrypt1 i386
|
||||||
250 libmpdec3 amd64
|
250 libmpdec3 amd64
|
||||||
@@ -542,6 +543,7 @@ Packages sorted by Installed-Size:
|
|||||||
225 libcrypt1 amd64
|
225 libcrypt1 amd64
|
||||||
221 bfs amd64
|
221 bfs amd64
|
||||||
220 libidn2-0 amd64
|
220 libidn2-0 amd64
|
||||||
|
219 patchutils amd64
|
||||||
219 libtirpc3 amd64
|
219 libtirpc3 amd64
|
||||||
219 librhash0 amd64
|
219 librhash0 amd64
|
||||||
214 dash amd64
|
214 dash amd64
|
||||||
@@ -587,8 +589,8 @@ Packages sorted by Installed-Size:
|
|||||||
114 bzip2 amd64
|
114 bzip2 amd64
|
||||||
113 libss2 amd64
|
113 libss2 amd64
|
||||||
113 lib32itm1 amd64
|
113 lib32itm1 amd64
|
||||||
|
113 binutils amd64
|
||||||
112 libc-ares2 amd64
|
112 libc-ares2 amd64
|
||||||
112 binutils amd64
|
|
||||||
110 libio-pty-perl amd64
|
110 libio-pty-perl amd64
|
||||||
105 python2-minimal amd64
|
105 python2-minimal amd64
|
||||||
105 libx32itm1 amd64
|
105 libx32itm1 amd64
|
||||||
|
|||||||
@@ -1,134 +0,0 @@
|
|||||||
#! /bin/sh
|
|
||||||
## vim:set ts=4 sw=4 et:
|
|
||||||
set -e
|
|
||||||
|
|
||||||
#
|
|
||||||
# build UPX "by hand", using a POSIX-compliant shell and
|
|
||||||
# a minimal number of compilation flags
|
|
||||||
# Copyright (C) Markus Franz Xaver Johannes Oberhumer
|
|
||||||
#
|
|
||||||
|
|
||||||
# uses optional environment variables: AR, CC, CXX, OPTIMIZE, VERBOSE, top_srcdir
|
|
||||||
|
|
||||||
# shell init
|
|
||||||
### set -x # enable logging
|
|
||||||
DUALCASE=1; export DUALCASE # for MKS sh
|
|
||||||
test -n "${ZSH_VERSION+set}" && emulate sh # for zsh
|
|
||||||
my_argv0="$0"
|
|
||||||
|
|
||||||
# toolchain settings and compilation flags
|
|
||||||
AR="${AR:-ar}"
|
|
||||||
CC="${CC:-cc}"
|
|
||||||
CXX="${CXX:-c++ -std=gnu++17}"
|
|
||||||
# HINT: use "export AR=false" if "$AR rcs" does not work on your system; see below
|
|
||||||
if test "x$AR" = "x0" || test "x$AR" = "xfalse" || test "x$AR" = "x/bin/false"; then
|
|
||||||
AR="" # do not use $AR
|
|
||||||
fi
|
|
||||||
# protect against security threats caused by misguided compiler "optimizations"
|
|
||||||
mandatory_flags="-fno-strict-aliasing -fno-strict-overflow -funsigned-char"
|
|
||||||
# not mandatory but good practice when using <windows.h>:
|
|
||||||
mandatory_flags="$mandatory_flags -DWIN32_LEAN_AND_MEAN"
|
|
||||||
if test "x$OPTIMIZE" != "x" && test "x$OPTIMIZE" != "x0"; then
|
|
||||||
# not mandatory and not minimal, but usually a good idea:
|
|
||||||
mandatory_flags="-Wall -O2 $mandatory_flags"
|
|
||||||
fi
|
|
||||||
CC="$CC $mandatory_flags"
|
|
||||||
CXX="$CXX $mandatory_flags"
|
|
||||||
|
|
||||||
# go to upx top-level directory
|
|
||||||
# HINT: set "top_srcdir" manually if your system does not have "readlink"
|
|
||||||
if test "x$top_srcdir" = "x"; then
|
|
||||||
my_argv0abs="$(readlink -fn "$my_argv0")"
|
|
||||||
test "x$my_argv0abs" = "x" && exit 1
|
|
||||||
my_argv0dir="$(dirname "$my_argv0abs")"
|
|
||||||
test "x$my_argv0dir" = "x" && exit 1
|
|
||||||
cd "$my_argv0dir/../.." || exit 1
|
|
||||||
else
|
|
||||||
cd "$top_srcdir" || exit 1
|
|
||||||
fi
|
|
||||||
top_srcdir="$(pwd)" # absolute
|
|
||||||
rel_top_srcdir=. # relative top_srcdir
|
|
||||||
echo "# current directory: '$(pwd)'"
|
|
||||||
test -f doc/upx.pod || exit 1 # sanity check
|
|
||||||
test -f src/version.h || exit 1 # sanity check
|
|
||||||
rm -rf ./build/by-hand # WARNING: existing build-directory gets deleted!
|
|
||||||
|
|
||||||
# helper function
|
|
||||||
run() {
|
|
||||||
if test 0 = 1; then
|
|
||||||
# DEBUG dry-run: print command, but don't actually run unless $1 is "+"
|
|
||||||
if test "x$1" = "x+"; then
|
|
||||||
shift; echo "$@"; "$@"; return
|
|
||||||
fi
|
|
||||||
shift; echo "$@"; return
|
|
||||||
fi
|
|
||||||
# print short info and run command
|
|
||||||
test "x$1" != "x" && test "x$1" != "x+" && echo "$1"
|
|
||||||
shift
|
|
||||||
if test "x$VERBOSE" != "x" && test "x$VERBOSE" != "x0"; then
|
|
||||||
# print full command
|
|
||||||
echo " $@"
|
|
||||||
fi
|
|
||||||
"$@"
|
|
||||||
}
|
|
||||||
|
|
||||||
# helper function
|
|
||||||
check_submodule() {
|
|
||||||
#local ff # "local" seems unsupported by some versions of ksh
|
|
||||||
for ff in COPYING LICENSE LICENSE.txt; do
|
|
||||||
if test -f "$rel_top_srcdir/vendor/$1/$ff"; then
|
|
||||||
# create and enter build directory; updates global $rel_top_srcdir
|
|
||||||
run "+" cd "$rel_top_srcdir" || exit 1
|
|
||||||
rel_top_srcdir=.
|
|
||||||
echo "#==== build $1 ====="
|
|
||||||
run "+" mkdir "build/by-hand/$1"
|
|
||||||
run "+" cd "build/by-hand/$1" || exit 1
|
|
||||||
rel_top_srcdir=../../..
|
|
||||||
return 0
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
return 1
|
|
||||||
}
|
|
||||||
|
|
||||||
# build
|
|
||||||
run "+" mkdir -p "build/by-hand"
|
|
||||||
if check_submodule bzip2; then
|
|
||||||
for f in "$rel_top_srcdir"/vendor/bzip2/*.c; do
|
|
||||||
run "CC $f" $CC -c "$f"
|
|
||||||
done
|
|
||||||
fi
|
|
||||||
if check_submodule ucl; then
|
|
||||||
for f in "$rel_top_srcdir"/vendor/ucl/src/*.c; do
|
|
||||||
run "CC $f" $CC -I"$rel_top_srcdir"/vendor/ucl/include -I"$rel_top_srcdir"/vendor/ucl -c "$f"
|
|
||||||
done
|
|
||||||
fi
|
|
||||||
if check_submodule zlib; then
|
|
||||||
for f in "$rel_top_srcdir"/vendor/zlib/*.c; do
|
|
||||||
run "CC $f" $CC -DHAVE_UNISTD_H -DHAVE_VSNPRINTF -c "$f"
|
|
||||||
done
|
|
||||||
fi
|
|
||||||
if check_submodule zstd; then
|
|
||||||
for f in "$rel_top_srcdir"/vendor/zstd/lib/*/*.c; do
|
|
||||||
run "CC $f" $CC -DDYNAMIC_BMI2=0 -DZSTD_DISABLE_ASM -c "$f"
|
|
||||||
done
|
|
||||||
fi
|
|
||||||
run "+" cd "$rel_top_srcdir" || exit 1
|
|
||||||
rel_top_srcdir=.
|
|
||||||
echo "#==== build UPX ====="
|
|
||||||
run "+" cd "build/by-hand" || exit 1
|
|
||||||
rel_top_srcdir=../..
|
|
||||||
for f in "$rel_top_srcdir"/src/*.cpp "$rel_top_srcdir"/src/*/*.cpp; do
|
|
||||||
run "CXX $f" $CXX -I"$rel_top_srcdir"/vendor -c "$f"
|
|
||||||
done
|
|
||||||
# echo "#==== link UPX ====="
|
|
||||||
if test "x$AR" = "x"; then
|
|
||||||
# link without using $AR
|
|
||||||
run "CXX upx" $CXX -o upx *.o */*.o
|
|
||||||
else
|
|
||||||
run "AR libupx" $AR rcs libupx_submodules.a */*.o
|
|
||||||
run "CXX upx" $CXX -o upx *.o -L. -lupx_submodules
|
|
||||||
fi
|
|
||||||
echo "# current directory: '$(pwd)'"
|
|
||||||
ls -l upx*
|
|
||||||
|
|
||||||
echo "# All done."
|
|
||||||
Executable
+41
@@ -0,0 +1,41 @@
|
|||||||
|
#! /usr/bin/env bash
|
||||||
|
## vim:set ts=4 sw=4 et:
|
||||||
|
set -e; set -o pipefail
|
||||||
|
|
||||||
|
# Copyright (C) Markus Franz Xaver Johannes Oberhumer
|
||||||
|
# assemble cmake config flags; useful for CI jobs
|
||||||
|
# also see misc/make/Makefile-extra.mk
|
||||||
|
|
||||||
|
cmake_config_flags=()
|
||||||
|
|
||||||
|
__add_cmake_config() {
|
||||||
|
[[ -z "${!1}" ]] || cmake_config_flags+=( -D$1="${!1}" )
|
||||||
|
}
|
||||||
|
|
||||||
|
# pass common CMake settings from environment to cmake
|
||||||
|
for v in CMAKE_VERBOSE_MAKEFILE; do
|
||||||
|
__add_cmake_config $v
|
||||||
|
done
|
||||||
|
# pass common CMake toolchain settings from environment to cmake
|
||||||
|
for v in CMAKE_ADDR2LINE CMAKE_AR CMAKE_DLLTOOL CMAKE_LINKER CMAKE_NM CMAKE_OBJCOPY CMAKE_OBJDUMP CMAKE_RANLIB CMAKE_READELF CMAKE_STRIP CMAKE_TAPI; do
|
||||||
|
__add_cmake_config $v
|
||||||
|
done
|
||||||
|
# pass common CMake LTO toolchain settings from environment to cmake (for use with "-flto")
|
||||||
|
for v in CMAKE_C_COMPILER_AR CMAKE_C_COMPILER_RANLIB CMAKE_CXX_COMPILER_AR CMAKE_CXX_COMPILER_RANLIB; do
|
||||||
|
__add_cmake_config $v
|
||||||
|
done
|
||||||
|
# pass common CMake cross compilation settings from environment to cmake
|
||||||
|
for v in CMAKE_SYSTEM_NAME CMAKE_SYSTEM_PROCESSOR CMAKE_CROSSCOMPILING_EMULATOR; do
|
||||||
|
__add_cmake_config $v
|
||||||
|
done
|
||||||
|
# pass UPX config options from environment to cmake; see CMakeLists.txt
|
||||||
|
for v in UPX_CONFIG_DISABLE_GITREV UPX_CONFIG_DISABLE_SANITIZE UPX_CONFIG_DISABLE_WSTRICT UPX_CONFIG_DISABLE_WERROR UPX_CONFIG_DISABLE_SELF_PACK_TEST; do
|
||||||
|
__add_cmake_config $v
|
||||||
|
done
|
||||||
|
# pass UPX extra compile options from environment to cmake; see CMakeLists.txt
|
||||||
|
for v in UPX_CONFIG_EXTRA_COMPILE_OPTIONS_BZIP2 UPX_CONFIG_EXTRA_COMPILE_OPTIONS_UCL UPX_CONFIG_EXTRA_COMPILE_OPTIONS_UPX UPX_CONFIG_EXTRA_COMPILE_OPTIONS_ZLIB UPX_CONFIG_EXTRA_COMPILE_OPTIONS_ZSTD; do
|
||||||
|
__add_cmake_config $v
|
||||||
|
done
|
||||||
|
|
||||||
|
exec "${CMAKE:-cmake}" $UPX_CMAKE_CONFIG_FLAGS "${cmake_config_flags[@]}" "$@"
|
||||||
|
exit 99
|
||||||
@@ -2,21 +2,23 @@
|
|||||||
## vim:set ts=4 sw=4 et:
|
## vim:set ts=4 sw=4 et:
|
||||||
set -e; set -o pipefail
|
set -e; set -o pipefail
|
||||||
|
|
||||||
|
# Copyright (C) Markus Franz Xaver Johannes Oberhumer
|
||||||
|
#
|
||||||
# "Gofmt's style is nobody's favourite, but gofmt is everybody's favourite." --Rob Pike
|
# "Gofmt's style is nobody's favourite, but gofmt is everybody's favourite." --Rob Pike
|
||||||
|
#
|
||||||
# NOTE: we are using clang-format-15.0.6 from upx-stubtools
|
# NOTE: we are using clang-format-15.0.6 from upx-stubtools
|
||||||
# see https://github.com/upx/upx-stubtools/releases
|
# see https://github.com/upx/upx-stubtools/releases
|
||||||
|
#
|
||||||
# NOTE: we use .clang-format config from upx.git/.clang-format
|
# NOTE: we use .clang-format config from upx.git/.clang-format
|
||||||
|
|
||||||
if [[ ! -f $UPX_CLANG_FORMAT ]]; then
|
if [[ ! -f $UPX_CLANG_FORMAT ]]; then
|
||||||
UPX_CLANG_FORMAT="$HOME/local/bin/bin-upx/clang-format-15.0.6"
|
UPX_CLANG_FORMAT="$HOME/local/bin/bin-upx/clang-format-15.0.6"
|
||||||
fi
|
fi
|
||||||
if [[ ! -f $UPX_CLANG_FORMAT ]]; then
|
if [[ ! -f $UPX_CLANG_FORMAT ]]; then
|
||||||
UPX_CLANG_FORMAT="$HOME/.local/bin/bin-upx/clang-format-15.0.6"
|
UPX_CLANG_FORMAT="$HOME/.local/bin/bin-upx/clang-format-15.0.6"
|
||||||
fi
|
fi
|
||||||
if [[ ! -f $UPX_CLANG_FORMAT ]]; then
|
if [[ ! -f $UPX_CLANG_FORMAT ]]; then
|
||||||
UPX_CLANG_FORMAT="$HOME/bin/bin-upx/clang-format-15.0.6"
|
UPX_CLANG_FORMAT="$HOME/bin/bin-upx/clang-format-15.0.6"
|
||||||
fi
|
fi
|
||||||
if [[ ! -f $UPX_CLANG_FORMAT ]]; then
|
if [[ ! -f $UPX_CLANG_FORMAT ]]; then
|
||||||
echo "ERROR: $0: cannot find clang-format-15.0.6"
|
echo "ERROR: $0: cannot find clang-format-15.0.6"
|
||||||
@@ -29,4 +31,4 @@ ulimit -v 1048576 || true
|
|||||||
|
|
||||||
#echo $UPX_CLANG_FORMAT
|
#echo $UPX_CLANG_FORMAT
|
||||||
exec "$UPX_CLANG_FORMAT" -style=file "$@"
|
exec "$UPX_CLANG_FORMAT" -style=file "$@"
|
||||||
exit 1
|
exit 99
|
||||||
|
|||||||
Executable
+80
@@ -0,0 +1,80 @@
|
|||||||
|
#! /usr/bin/env bash
|
||||||
|
## vim:set ts=4 sw=4 et:
|
||||||
|
set -e; set -o pipefail
|
||||||
|
argv0=$0; argv0abs=$(readlink -fn "$argv0"); argv0dir=$(dirname "$argv0abs")
|
||||||
|
|
||||||
|
#
|
||||||
|
# Copyright (C) Markus Franz Xaver Johannes Oberhumer
|
||||||
|
#
|
||||||
|
# mimic running "ctest", i.e. the "test" section of CMakeLists.txt; does not redirect stdout
|
||||||
|
#
|
||||||
|
# requires:
|
||||||
|
# $upx_exe (required, but with convenience fallback "./upx")
|
||||||
|
# optional settings:
|
||||||
|
# $upx_exe_runner (e.g. "qemu-x86_64 -cpu Nehalem" or "valgrind")
|
||||||
|
#
|
||||||
|
|
||||||
|
#***********************************************************************
|
||||||
|
# init & checks
|
||||||
|
#***********************************************************************
|
||||||
|
|
||||||
|
# upx_exe
|
||||||
|
[[ -z $upx_exe && -f ./upx && -x ./upx ]] && upx_exe=./upx # convenience fallback
|
||||||
|
if [[ -z $upx_exe ]]; then echo "UPX-ERROR: please set \$upx_exe"; exit 1; fi
|
||||||
|
if [[ ! -f $upx_exe ]]; then echo "UPX-ERROR: file '$upx_exe' does not exist"; exit 1; fi
|
||||||
|
upx_exe=$(readlink -fn "$upx_exe") # make absolute
|
||||||
|
[[ -f $upx_exe ]] || exit 1
|
||||||
|
upx_run=()
|
||||||
|
if [[ -n $upx_exe_runner ]]; then
|
||||||
|
# usage examples:
|
||||||
|
# export upx_exe_runner="qemu-x86_64 -cpu Nehalem"
|
||||||
|
# export upx_exe_runner="valgrind --leak-check=no --error-exitcode=1 --quiet"
|
||||||
|
# export upx_exe_runner="wine"
|
||||||
|
IFS=' ' read -r -a upx_run <<< "$upx_exe_runner" # split at spaces into array
|
||||||
|
elif [[ -n $CMAKE_CROSSCOMPILING_EMULATOR ]]; then
|
||||||
|
IFS=';' read -r -a upx_run <<< "$CMAKE_CROSSCOMPILING_EMULATOR" # split at semicolons into array
|
||||||
|
fi
|
||||||
|
upx_runner=( "${upx_run[@]}" )
|
||||||
|
upx_run+=( "$upx_exe" )
|
||||||
|
echo "upx_run='${upx_run[*]}'"
|
||||||
|
|
||||||
|
# upx_run sanity check
|
||||||
|
if ! "${upx_run[@]}" --version-short >/dev/null; then echo "UPX-ERROR: FATAL: upx --version-short FAILED"; exit 1; fi
|
||||||
|
if ! "${upx_run[@]}" -L >/dev/null 2>&1; then echo "UPX-ERROR: FATAL: upx -L FAILED"; exit 1; fi
|
||||||
|
if ! "${upx_run[@]}" --help >/dev/null; then echo "UPX-ERROR: FATAL: upx --help FAILED"; exit 1; fi
|
||||||
|
|
||||||
|
#***********************************************************************
|
||||||
|
# see CMakeLists.txt
|
||||||
|
#***********************************************************************
|
||||||
|
|
||||||
|
export UPX="--no-color --no-progress"
|
||||||
|
|
||||||
|
"${upx_run[@]}" --version
|
||||||
|
"${upx_run[@]}" --help
|
||||||
|
"${upx_run[@]}" --sysinfo -v
|
||||||
|
|
||||||
|
case "$UPX_CONFIG_DISABLE_SELF_PACK_TEST" in
|
||||||
|
"" | "0" | "FALSE" | "OFF") ;;
|
||||||
|
*) echo "Self-pack test disabled. All done."; exit 0 ;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
exe=".out"
|
||||||
|
upx_self_exe=$upx_exe
|
||||||
|
fo="--force-overwrite"
|
||||||
|
|
||||||
|
"${upx_run[@]}" -3 "${upx_self_exe}" ${fo} -o upx-packed${exe}
|
||||||
|
"${upx_run[@]}" -3 --nrv2b "${upx_self_exe}" ${fo} -o upx-packed-n2b${exe}
|
||||||
|
"${upx_run[@]}" -3 --nrv2d "${upx_self_exe}" ${fo} -o upx-packed-n2d${exe}
|
||||||
|
"${upx_run[@]}" -3 --nrv2e "${upx_self_exe}" ${fo} -o upx-packed-n2e${exe}
|
||||||
|
"${upx_run[@]}" -1 --lzma "${upx_self_exe}" ${fo} -o upx-packed-lzma${exe}
|
||||||
|
|
||||||
|
"${upx_run[@]}" -l upx-packed${exe} upx-packed-n2b${exe} upx-packed-n2d${exe} upx-packed-n2e${exe} upx-packed-lzma${exe}
|
||||||
|
"${upx_run[@]}" --fileinfo upx-packed${exe} upx-packed-n2b${exe} upx-packed-n2d${exe} upx-packed-n2e${exe} upx-packed-lzma${exe}
|
||||||
|
"${upx_run[@]}" -t upx-packed${exe} upx-packed-n2b${exe} upx-packed-n2d${exe} upx-packed-n2e${exe} upx-packed-lzma${exe}
|
||||||
|
"${upx_run[@]}" -d upx-packed${exe} ${fo} -o upx-unpacked${exe}
|
||||||
|
|
||||||
|
set -x
|
||||||
|
"${upx_runner[@]}" ./upx-unpacked${exe} --version-short
|
||||||
|
"${upx_runner[@]}" ./upx-packed${exe} --version-short
|
||||||
|
|
||||||
|
echo "All done."
|
||||||
@@ -3,16 +3,26 @@
|
|||||||
set -e; set -o pipefail
|
set -e; set -o pipefail
|
||||||
argv0=$0; argv0abs=$(readlink -fn "$argv0"); argv0dir=$(dirname "$argv0abs")
|
argv0=$0; argv0abs=$(readlink -fn "$argv0"); argv0dir=$(dirname "$argv0abs")
|
||||||
|
|
||||||
# disable on macOS for now, see https://github.com/upx/upx/issues/612
|
#
|
||||||
if [[ "$(uname)" == Darwin ]]; then
|
# Copyright (C) Markus Franz Xaver Johannes Oberhumer
|
||||||
echo "$0: SKIPPED"
|
#
|
||||||
exit 0
|
# test file system behaviour with symlinks; requires:
|
||||||
fi
|
# $upx_exe (required, but with convenience fallback "./upx")
|
||||||
|
# optional settings:
|
||||||
|
# $upx_exe_runner (e.g. "qemu-x86_64 -cpu Nehalem" or "valgrind")
|
||||||
|
#
|
||||||
|
|
||||||
# IMPORTANT NOTE: do NOT run as user root!!
|
# IMPORTANT NOTE: do NOT run as user root!!
|
||||||
# IMPORTANT NOTE: this script only works on Unix!!
|
# IMPORTANT NOTE: this script only works on Unix!!
|
||||||
umask 0022
|
umask 0022
|
||||||
|
|
||||||
|
# disable on macOS for now, see https://github.com/upx/upx/issues/612
|
||||||
|
if [[ "$(uname)" == Darwin ]]; then
|
||||||
|
case "$UPX_DEBUG_FORCE_PACK_MACOS" in
|
||||||
|
"" | "0") echo "$0: SKIPPED"; exit 0 ;;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
|
||||||
id || true
|
id || true
|
||||||
echo "PWD='$PWD'"
|
echo "PWD='$PWD'"
|
||||||
if [[ $UID == 0 || $EUID == 0 ]]; then
|
if [[ $UID == 0 || $EUID == 0 ]]; then
|
||||||
@@ -20,11 +30,6 @@ if [[ $UID == 0 || $EUID == 0 ]]; then
|
|||||||
exit 91
|
exit 91
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# test file system behaviour with symlinks; requires:
|
|
||||||
# $upx_exe (required, but with convenience fallback "./upx")
|
|
||||||
# optional settings:
|
|
||||||
# $upx_exe_runner (e.g. "qemu-x86_64 -cpu Westmere" or "valgrind")
|
|
||||||
|
|
||||||
#***********************************************************************
|
#***********************************************************************
|
||||||
# init & checks
|
# init & checks
|
||||||
#***********************************************************************
|
#***********************************************************************
|
||||||
@@ -38,15 +43,17 @@ upx_exe=$(readlink -fn "$upx_exe") # make absolute
|
|||||||
upx_run=()
|
upx_run=()
|
||||||
if [[ -n $upx_exe_runner ]]; then
|
if [[ -n $upx_exe_runner ]]; then
|
||||||
# usage examples:
|
# usage examples:
|
||||||
# export upx_exe_runner="qemu-x86_64 -cpu Westmere"
|
# export upx_exe_runner="qemu-x86_64 -cpu Nehalem"
|
||||||
# export upx_exe_runner="valgrind --leak-check=no --error-exitcode=1 --quiet"
|
# export upx_exe_runner="valgrind --leak-check=no --error-exitcode=1 --quiet"
|
||||||
# export upx_exe_runner="wine"
|
# export upx_exe_runner="wine"
|
||||||
IFS=' ' read -r -a upx_run <<< "$upx_exe_runner" # split at spaces into array
|
IFS=' ' read -r -a upx_run <<< "$upx_exe_runner" # split at spaces into array
|
||||||
|
elif [[ -n $CMAKE_CROSSCOMPILING_EMULATOR ]]; then
|
||||||
|
IFS=';' read -r -a upx_run <<< "$CMAKE_CROSSCOMPILING_EMULATOR" # split at semicolons into array
|
||||||
fi
|
fi
|
||||||
upx_run+=( "$upx_exe" )
|
upx_run+=( "$upx_exe" )
|
||||||
echo "upx_run='${upx_run[*]}'"
|
echo "upx_run='${upx_run[*]}'"
|
||||||
|
|
||||||
# upx_run check
|
# upx_run sanity check
|
||||||
if ! "${upx_run[@]}" --version-short >/dev/null; then echo "UPX-ERROR: FATAL: upx --version-short FAILED"; exit 1; fi
|
if ! "${upx_run[@]}" --version-short >/dev/null; then echo "UPX-ERROR: FATAL: upx --version-short FAILED"; exit 1; fi
|
||||||
if ! "${upx_run[@]}" -L >/dev/null 2>&1; then echo "UPX-ERROR: FATAL: upx -L FAILED"; exit 1; fi
|
if ! "${upx_run[@]}" -L >/dev/null 2>&1; then echo "UPX-ERROR: FATAL: upx -L FAILED"; exit 1; fi
|
||||||
if ! "${upx_run[@]}" --help >/dev/null; then echo "UPX-ERROR: FATAL: upx --help FAILED"; exit 1; fi
|
if ! "${upx_run[@]}" --help >/dev/null; then echo "UPX-ERROR: FATAL: upx --help FAILED"; exit 1; fi
|
||||||
|
|||||||
+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="\
|
||||||
fb458e6e7718ffd3f060fca911d069a024df8da7c75e34a0aea820a15ca03551 *amd64-linux.elf/upx-3.91
|
afd8b4ec4379b013887e2dbb9cb07ed8e19942c6c5b72bd42fa20d2d43e35d52 *amd64-linux.elf/upx-3.91
|
||||||
8988a2556bff2da1a5de9a5a4c909a53ae99a825fcdc7699d4c504bc697f60df *amd64-linux.elf/upx-3.95
|
320f5819d96f575ea4abad04c5a1bac53274a5d4704ff530ee778acfa261376c *amd64-linux.elf/upx-3.95
|
||||||
b8bf6a29177bc7e9595d1c2a200f2c6431e12eee1ca2c8a64064a52c792b7b65 *amd64-win64.pe/upx-3.95.exe
|
a8804bce00be8e2f9d3874c8fc884e69c19efc2f0fd07272e7d0749efd36f381 *amd64-win64.pe/upx-3.95.exe
|
||||||
02c17f49a54f50a9ed453227b600feb4ba5574514552d1cb344b1b012265afb2 *arm-linux.elf/upx-3.95
|
80ff4e72220302cdccbdce753981d9a36596941ffcd9231317c5cb53f988ac72 *arm-linux.elf/upx-3.95
|
||||||
0006e29a124430722e691a05afab0a381d332c2ffe53c7f6a2cdf4cdea5349ce *arm-wince.pe/upx-3.91.exe
|
4e3db49fb086c4293b8a5809c166546d3a33f731b6ef5565cc0566d491f91cf2 *arm-wince.pe/upx-3.91.exe
|
||||||
94a60c5859fc98db7671828decfb456e670a402a676d97cd4d66b5406c062f1f *arm64-linux.elf/upx-3.95
|
71a27b41a763fab594ed953f3bf543489554b509bce488e7c5533e312c953e30 *arm64-linux.elf/upx-3.95
|
||||||
654a4e4cb325caddcf150ca90f2729c748bb0a3e99e703c6aad6a9dbc7d6d6e1 *armeb-linux.elf/upx-3.91
|
8a84b2161d83358c824de200ed480e9cb9cb7557138d710808ec44a19165c898 *armeb-linux.elf/upx-3.91
|
||||||
c68172e589871dc76cc7dff5464c87cd83a8cf9178d3b340e166912bcf6c9a0a *armeb-linux.elf/upx-3.95
|
09b92d07b30b16321301aa2faf46576da2587c1334e7a842742fed36aadef5fa *armeb-linux.elf/upx-3.95
|
||||||
ecc834183718c481c724754356977f4d63a58a07a2a308b9d2d669cf4d859b10 *i386-dos32.djgpp2.coff/upx-3.91.exe
|
a418a4df498f55e86a7f2788c6e0fe0324d60a9032d4841569c7e4e2694410df *i386-dos32.djgpp2.coff/upx-3.91.exe
|
||||||
879bdb9fc4c2ff76688250b429281a0a196c3723aabb40657f61a256d271b407 *i386-dos32.djgpp2.coff/upx-3.95.exe
|
0aecdd97242054dcd390317e97a539a2e35f53a28a71d0148b703141d21345b0 *i386-dos32.djgpp2.coff/upx-3.95.exe
|
||||||
582e7d54ba02aa4133a82ed423fce85376a3e2435468c2275e6500895f80b62d *i386-linux.elf/upx-3.91
|
09a748c65d2a26975a5c829dd3d9f36e96607b1d9728d64068731815d8b82c36 *i386-linux.elf/upx-3.91
|
||||||
00501788b58d4523faad8e0d0a9832d1f743e33739f8190be19094e2aa002c77 *i386-linux.elf/upx-3.95
|
5189d860ddc1edc7e9b524aa09bd9677548d83efb788627cdbac27941f509262 *i386-linux.elf/upx-3.95
|
||||||
9b9c922a6ddd48cf92af8aaa99452c101d69eb65f83e5fed6870bfe5450ca66c *i386-win32.pe/upx-3.91.exe
|
0b51fd861dd2b574bfed6ab3998b01333ae173fd76b7fd0d30187e75b09ab316 *i386-win32.pe/upx-3.91.exe
|
||||||
85a21b38b2c0ddf94bfd41b28c6a7af74accfa2246cb7f6c5881a0525cbbcdd0 *i386-win32.pe/upx-3.95.exe
|
05568f9b47da0c8949080f66437f7a8d08c3c11f3ee5fb9e5d20a1324f2ab829 *i386-win32.pe/upx-3.95.exe
|
||||||
993eb24cdacd30fd0ad915c88ea523f19748e4f4b3c4f7302dc233ceec67501e *m68k-atari.tos/upx-3.91.ttp
|
f6fb2f10a4f2b2d327c9868bb06241c3143771b0371ca564b8dfaeb180026298 *m68k-atari.tos/upx-3.91.ttp
|
||||||
b48802d429cb7edab4d945a658a7f2aa65f67e48085ee9f40999e63cd164089b *mips-linux.elf/upx-3.95
|
196fb37ba72d7b0e081386a8110cf193678934ae1a0f16cd9d071b18c034a3f2 *mips-linux.elf/upx-3.95
|
||||||
aac26e3324c3a07d0cb41ee68dddc29891334e13ccd60bfb9138729a2f27742d *mipsel-linux.elf/upx-3.91
|
e528a2c33b2ab882c6e18fab4662d612ffc71c0261c367fa9c0282b23ad53b3c *mipsel-linux.elf/upx-3.91
|
||||||
85803d12a0262bb424c95efff414e7882dc1104164c245ab90dff27ee5bd41db *mipsel-linux.elf/upx-3.95
|
4b44c1b60f8eea0f40bcd2cdbc1e7217afee6d1cb054856e2791339aa7c31a78 *mipsel-linux.elf/upx-3.95
|
||||||
e1ec8a1d392e0493c9fd60f3327d85aec108815100ab01ae65210cd26c917888 *powerpc-linux.elf/upx-3.91
|
ae73bba4db8413a7a287b2a61dc9829ee3a66f9d93940ad7f08aa93b09770f4f *powerpc-linux.elf/upx-3.91
|
||||||
845aad9ec6cba72b3a83c9958e9718938fdfd3d18ac76170d81f57c1c86987a0 *powerpc-linux.elf/upx-3.95
|
c7a8bba27dbd09c8f73ae2cd11d893187b15b298dd7d857cbd2c676670ff0a80 *powerpc-linux.elf/upx-3.95
|
||||||
149efbda7f68c354d48771d838aca07cbdda503746bb83497ec8ab226dea4792 *powerpc64le-linux.elf/upx-3.95
|
6075bc28ac64f865d0e93cb16629c02331fb4abbea8da931288a60a6350cf635 *powerpc64le-linux.elf/upx-3.95
|
||||||
"
|
"
|
||||||
expected_sha256sums__t120_compress_ucl_nrv2d_3_no_filter="\
|
expected_sha256sums__t120_compress_ucl_nrv2d_3_no_filter="\
|
||||||
3f1d7ad512df7cc6f1fa4fe4a37f21d92709764fc385e307504e12208c090df4 *amd64-linux.elf/upx-3.91
|
f23ea1c7cea84e5edf136b2b3a0a8740e9d6bf3552ef1f460aa4508c2f27df6d *amd64-linux.elf/upx-3.91
|
||||||
a9291e95bc5c59193ae318c4bf13341ade909b8a6b42694c33cb3a9d1a084637 *amd64-linux.elf/upx-3.95
|
e725f00542f605851cfe03aee2042fbccf04e0a01bbf5a4aaecd04ad59c80077 *amd64-linux.elf/upx-3.95
|
||||||
968c6c681b99c6ad21f3100527da0d2f0ccc510885d6a23b1db613207aedc739 *amd64-win64.pe/upx-3.95.exe
|
57af8f45cef9e5c9f63387a15b8cf1b96426ab8dc73c303bd4caaa95b093bf92 *amd64-win64.pe/upx-3.95.exe
|
||||||
e06b57cd0013db94ba298bef4b30d904ad8eadafb7db6b4b4964de65f9fae0ad *arm-linux.elf/upx-3.95
|
a01ad023431e05287be77f160ea1a491489416e34de0d5ce194665e99f12e483 *arm-linux.elf/upx-3.95
|
||||||
bf6c7ba2a464f7dfcdff230462a23f9bcfafaebddb7746f0021367076ede58ac *arm-wince.pe/upx-3.91.exe
|
a711a73bfd20ccc012507c3f07ed98ee025f55e441156efb5fdbaa1815640c63 *arm-wince.pe/upx-3.91.exe
|
||||||
053c60a4a376ddf3e5ac9b91933e483b86f184f02369c1df204b32acda2d72f7 *arm64-linux.elf/upx-3.95
|
4a341330a44845a10521d5acaa91eda3b7602367b1c77f6a5cf0731b528e478f *arm64-linux.elf/upx-3.95
|
||||||
63bbc0b63ec9504650869e0b51a6941c9d8f6d472463e9f602e26e6a21c493fc *armeb-linux.elf/upx-3.91
|
d4a8653134f16f91b8fcdb0ed0d71ae3a31199af2ec42bf5dbe97e3344eceb74 *armeb-linux.elf/upx-3.91
|
||||||
f0b78117ac4a4671470cbff4b10907024d3811ee4197dcaa5cad0a84c98c8693 *armeb-linux.elf/upx-3.95
|
a7da82c93f93a842a2876a54bba85cbb380eb7c79fc123ff30f31d99be3eca5c *armeb-linux.elf/upx-3.95
|
||||||
86888d40e8b17fd59a1ed78264e075e1b04b57ca020c43768b37f916beb11649 *i386-dos32.djgpp2.coff/upx-3.91.exe
|
f1caf28b7500b14ca1405b31b8e18a226bf682c619982ea2712b5631cc61d0d8 *i386-dos32.djgpp2.coff/upx-3.91.exe
|
||||||
57f916c1f0fb33746de4c65f232258fb48acb2aa266b59ffdeac0c654bc650ca *i386-dos32.djgpp2.coff/upx-3.95.exe
|
2c5ab68a6a23d460fab8def92a4cd32a54f084811584c1472c07dbe9429a503a *i386-dos32.djgpp2.coff/upx-3.95.exe
|
||||||
efc046cd508c647651fa6574b171fb44ebf2bf785d7bd9ec3fcc6b24b01db96b *i386-linux.elf/upx-3.91
|
8f227074f8bc7682fd8e71bf96c60cb42fba7d3038acb8e500c6b075df50b732 *i386-linux.elf/upx-3.91
|
||||||
279325e2cac136e24ec928eba687849c3359ab9ce76ad9502a64d3883029ee5c *i386-linux.elf/upx-3.95
|
3df0f160a7d58a1f1368450c9db2d6911818e00b11ab819edbc56afeb84e3fb8 *i386-linux.elf/upx-3.95
|
||||||
8b7aba7c9e733bb72844d797cb9f6a7225b4ce79ee62e38a9e424b4c5cc63ade *i386-win32.pe/upx-3.91.exe
|
31aaff6332ea65bb4c386de0bb75553cae77becd9a587dcbb51e38719c8a3b7a *i386-win32.pe/upx-3.91.exe
|
||||||
e966278db2d69913989bcfddf998e8f5b35fd8045c55b1e45065fc121c2452a0 *i386-win32.pe/upx-3.95.exe
|
221a2c5c07d6c0a0127b3ce27d924fc36ee4b5af52fc4f47bc172e60ef0b244a *i386-win32.pe/upx-3.95.exe
|
||||||
475777e4b8284a57e61cec9fa61549b06b761f6fe77ffdf24e23997eefd87036 *m68k-atari.tos/upx-3.91.ttp
|
9b280a1d2b82185339a4aea0c9338d9ae6c34d1a68da84a4a173d9010d092feb *m68k-atari.tos/upx-3.91.ttp
|
||||||
fd726e5be8f899cea4ce147beb23e7697953220f680b54d9ad12ecbbf6764fd9 *mips-linux.elf/upx-3.95
|
410335b935535fab6852d4b9677a24d016a9fb47d1b71d5a7967e99d1300ac15 *mips-linux.elf/upx-3.95
|
||||||
36e40ec2e07cf2a095f6d1c58d5d454a486d24fa1406890ccc3dcaf3223b1ed3 *mipsel-linux.elf/upx-3.91
|
52746060c4c7971a4e786ba618896eebe9592f1b443c0d217d4e2cdb8b34fa8d *mipsel-linux.elf/upx-3.91
|
||||||
97a0b1e3744f4168905c6423778f9fef887a467e9f382677f1da785f2f3fd5ea *mipsel-linux.elf/upx-3.95
|
7367c89786c15b2d8305f41980b84addfddff69f2dae0f0572a88ffee6abe884 *mipsel-linux.elf/upx-3.95
|
||||||
1576fcc71df7ac816aa3b322b9c399df017f05e99b843b98ce02be15e5ef9148 *powerpc-linux.elf/upx-3.91
|
4504c03dcc84be9f5ffc2279c4638c47a435a70c4748f1e25a738af33dc20720 *powerpc-linux.elf/upx-3.91
|
||||||
768a206b9dac7816bd9b1b5c86fbfdf1f5a6920fa2cbc35e50b19d58779b219e *powerpc-linux.elf/upx-3.95
|
ef410a9cbd01c7c046f888417cb451aad8ebe4288aeb98319f689a030517d181 *powerpc-linux.elf/upx-3.95
|
||||||
287d53686422057d5c7ddad5c30ad2a3342424153b162f3769fe8fe717b48b91 *powerpc64le-linux.elf/upx-3.95
|
da073cf9edf9d6efd0495d3f09101972541cdccd9df3c5a07df97e47ce1f77c3 *powerpc64le-linux.elf/upx-3.95
|
||||||
"
|
"
|
||||||
expected_sha256sums__t130_compress_ucl_nrv2e_3_no_filter="\
|
expected_sha256sums__t130_compress_ucl_nrv2e_3_no_filter="\
|
||||||
3f04cc82752ee6c573e6ed22a44943caa1126503ad898def7452e25df14709ec *amd64-linux.elf/upx-3.91
|
1777841250f6b34fe7b75e2931b5154918abea5e7c47047f523ab15ed59e0658 *amd64-linux.elf/upx-3.91
|
||||||
7a3103783fb6c1e34b476e2cbeb7a5992c635dcd643d1ff37e5aeaf57f70f268 *amd64-linux.elf/upx-3.95
|
9fefd378d92d1e370c450dd8d3f826248594ca7234aa6fccc83d20aa37694cdd *amd64-linux.elf/upx-3.95
|
||||||
509be220b15f12853a26207f8c2fe361feed50203adb3af4e2bb03aab3467221 *amd64-win64.pe/upx-3.95.exe
|
b5a9eee9a774712899148a339cb8326e51a120355cb0dbb5a59f07ef4a149562 *amd64-win64.pe/upx-3.95.exe
|
||||||
e2e4dfb92a85a1e8d06d2d28778f63c3efec484b91c58236ce9df02cfe3e012e *arm-linux.elf/upx-3.95
|
e56b71096f08c30448f560ccd60e5bffcb1f14d5b84948005d9d707600e50311 *arm-linux.elf/upx-3.95
|
||||||
18bf698a9ea039a0c3f1de9cab845dc1b51ad881e96daba4b7389adca830ecec *arm-wince.pe/upx-3.91.exe
|
9e1c47059e892f73a4fa118a6b435d455613e4ff4b4ab3fb432dd45adcc06809 *arm-wince.pe/upx-3.91.exe
|
||||||
b2155656ba70f468cc21fe0125dd2a2a9b0bf4b5d802eb399565c15b2997f1f8 *arm64-linux.elf/upx-3.95
|
615437bd5f987fae39502999fc1fd6a8857cdbffa4001cba1b485a8ddd0dbd14 *arm64-linux.elf/upx-3.95
|
||||||
4dab150e1309d643583ded5262dea6f5ffa82ef7e3533515d10ef3c95dc11ea5 *armeb-linux.elf/upx-3.91
|
37dec03e64c74da1e194fb129231c5e87fb3398f4a4f1d269de9bc2487068a6a *armeb-linux.elf/upx-3.91
|
||||||
25b072a5a86ead3bd9ddc539c3f29d5fd2c9cceb010657ace5eec827f73cec93 *armeb-linux.elf/upx-3.95
|
e45e09fca25c28cbd458c636ac1d060bc08bab37a6571880b6f32a6e26ecaff8 *armeb-linux.elf/upx-3.95
|
||||||
d7d0d5c45297d81cf4de9256c43ebbe236d1a839daeb16c900ebb5c1503659f0 *i386-dos32.djgpp2.coff/upx-3.91.exe
|
b941187968c86db8a01f106098996f2c0cd227da66003856c19e8b24438f446a *i386-dos32.djgpp2.coff/upx-3.91.exe
|
||||||
262fa423a8cdd765156b9385f4f1fe2fc8bba4b7e9904281f6f99a7a867ecdd1 *i386-dos32.djgpp2.coff/upx-3.95.exe
|
8194a6a0de66019d8aa7f49504ec7303f155a2dbcf29489300428fb1bb5d1b4a *i386-dos32.djgpp2.coff/upx-3.95.exe
|
||||||
a74811a5f2b2bf26b1d64ff8e5ac5d9111bbc3022bea77b5389a2253a059c6e9 *i386-linux.elf/upx-3.91
|
4380ef64efadd605bc0908ac2d56ee7597e665850d2291f40f5acd978f4ecbf8 *i386-linux.elf/upx-3.91
|
||||||
b4c9632a18ac07b7351ea3a24e112ee32cba67eec194dc822f5211d793665d63 *i386-linux.elf/upx-3.95
|
f9bacd9bf3a1f84455f0c647f615827606fba5608996cbae65c07a06b7b9ef42 *i386-linux.elf/upx-3.95
|
||||||
b35b94f6f14e0795a3e30d04aa6cb9cb1fca6dc15a45cf99f9ce66646b438d74 *i386-win32.pe/upx-3.91.exe
|
71b7880ee783da6182fa1dcc5cc8662eb15b82c2e96ea827f2dca3c83d4040c2 *i386-win32.pe/upx-3.91.exe
|
||||||
11505bfed2b91ff3df360c3fcf5e701bce6c536f79f4743eff367bf4e16a686b *i386-win32.pe/upx-3.95.exe
|
629624e02dfa11c295e22989a09d5938c415ab2d32b7b4fdb009d3cc50c63933 *i386-win32.pe/upx-3.95.exe
|
||||||
ac45ed125aa0e5f002556e9410d32e4007cb905cf71354df20e38785a90e0ea0 *m68k-atari.tos/upx-3.91.ttp
|
5215eb51b80d7d0f428da49c3249eb2b5e937f8b3487f2e59eb31e7f1b9155ee *m68k-atari.tos/upx-3.91.ttp
|
||||||
773e144b638f23cfa2640e5c6760d6f847d477efa0c64c158e24be7efbdb765d *mips-linux.elf/upx-3.95
|
e393bb54cb21d93d1b4ade1048204e4a9ed1bb0ca0517e54f42fddf8dc09a89d *mips-linux.elf/upx-3.95
|
||||||
bd53867507b9449dc8c12007d8ed16ef332b8c4d96b1749cbd8b731a61402215 *mipsel-linux.elf/upx-3.91
|
7fd4a440ffa128a455b6e4a7864f75953a16fb593b5dc1b890c1ed111e80b021 *mipsel-linux.elf/upx-3.91
|
||||||
a72cffc63f3415f5c913a504c2d2af30cd533f849cd7866b65a8b4c91301c475 *mipsel-linux.elf/upx-3.95
|
24357e6c79022919f181286d6ae5a8316078f30c01bbbb83169cd2794c7204ec *mipsel-linux.elf/upx-3.95
|
||||||
1c93b25a4846fce0d2242d753f0a6e662f018a8d63234236e88c7cf32e104d22 *powerpc-linux.elf/upx-3.91
|
e37070c89617e9d155507662ee98d9f97a7c506317fdbe22797769a5738e75c5 *powerpc-linux.elf/upx-3.91
|
||||||
263f4d184edab2716accbcdda2749a348a0b3d055d3096fa8c85d975c66a2342 *powerpc-linux.elf/upx-3.95
|
e2af43ea9cdc9f2e75de4c9a03ace0fabac9dcbfb54ea1b57031f2c860318663 *powerpc-linux.elf/upx-3.95
|
||||||
9b04dbab6863895dd3df5b0fe50086eff57e401d853a55fd9cdd06c0794e7ce7 *powerpc64le-linux.elf/upx-3.95
|
d7cf1e60f962094ce5b28e3e920ed4ba0b8b84daee896043f915ab036ed774c7 *powerpc64le-linux.elf/upx-3.95
|
||||||
"
|
"
|
||||||
expected_sha256sums__t140_compress_lzma_2_no_filter="\
|
expected_sha256sums__t140_compress_lzma_2_no_filter="\
|
||||||
68ea7e46654a94a1c125e039b9167ee8724edf0762f5522e81cfbb94005af8fd *amd64-linux.elf/upx-3.91
|
0744ab571ee5d8ca76d0be11d474611771e417a99598b051f1d8a3a791a91533 *amd64-linux.elf/upx-3.91
|
||||||
7adf842624efaa46a03b1861fee62dbc01c1e22387b29fa16f530d3c6aa4d295 *amd64-linux.elf/upx-3.95
|
90660071ddb63165bf77f9175d3f9862d8626c085d932af2c2d66459a73cf409 *amd64-linux.elf/upx-3.95
|
||||||
77aa80d55f83afdfb3796dfbe972b79a2195b37f84e9bb87ff7d11e497927021 *amd64-win64.pe/upx-3.95.exe
|
9781094badb6013e8fd29caad2d7f369e79f60d5a5f66b547c2260e98b1c7d92 *amd64-win64.pe/upx-3.95.exe
|
||||||
16916c440d76231df63ae5260bcf28c65476d06319d51e084f1730ab83d279bc *arm-linux.elf/upx-3.95
|
9224db1973129ab654bfa9154689e2f1e99c7e5118dad9f143fa7b3e49abcb82 *arm-linux.elf/upx-3.95
|
||||||
fae27479b40010e1d0794fe28fcc619c64a6ff21888221089fee429135658580 *arm-wince.pe/upx-3.91.exe
|
961d61207958be48cccb37e5c0a111d85ff3e5d8fb6d5e0ca92e8681320a6f4b *arm-wince.pe/upx-3.91.exe
|
||||||
c7630be0a014dbef80053609329faf5bb55ca5f3abf80df26674ca311d3943ae *arm64-linux.elf/upx-3.95
|
f044f8755d43dfd753327b6a5d1e69c8b73095fc12b3208be720ca2286a258c0 *arm64-linux.elf/upx-3.95
|
||||||
4efb05939371b23037e8a0b34a35ae181d2d101afac9d3e06457d191e59a5e76 *armeb-linux.elf/upx-3.91
|
85e460829c5bc3bad8a7a7c82b2dfcd64594980b443972de1e52d15f644225cb *armeb-linux.elf/upx-3.91
|
||||||
231d9a6e570615c2688befae04ad7ca88abe9655097e352e84cf0419190355db *armeb-linux.elf/upx-3.95
|
4829edc4b97d2011e789272a4b8ad254d7df573a476bae5a71832e9aecbf0e7b *armeb-linux.elf/upx-3.95
|
||||||
9df0142609a0a61595c500f1b9b40efab6d8c179f83068a5f4507df9a9c66d18 *i386-dos32.djgpp2.coff/upx-3.91.exe
|
902a9f177818e680042911e77d17de3f4bd3846fac210581ccaa7643dd1426f2 *i386-dos32.djgpp2.coff/upx-3.91.exe
|
||||||
6bdf60b30d916a9b706c7c2563907758994350b372351d7e9b1fa6427d75a01a *i386-dos32.djgpp2.coff/upx-3.95.exe
|
665d3c278bb9a8e0cb28cffdf6a17c3c920052a2bf7d05b74413186b043ede28 *i386-dos32.djgpp2.coff/upx-3.95.exe
|
||||||
a96cc162e2a2ce59c9199534ce3c067096b655ea426b8c1ce9c4d27f282481ef *i386-linux.elf/upx-3.91
|
5ffc9d683e2e2050a7f4d6e03332de3754bb48efaf800e3dcd96678fcff6d15a *i386-linux.elf/upx-3.91
|
||||||
25540046329ed7bb0b071a6686d301f5cd8d3722407088514a88044a7caddc3b *i386-linux.elf/upx-3.95
|
fbc487cf2343a2b277e5a1d469ea34b6b70ce609b2966ce6a372e004ae70a125 *i386-linux.elf/upx-3.95
|
||||||
93a6093dac3cb679e85900bfd60d7cf26319958245d4dc92425856c742aa95af *i386-win32.pe/upx-3.91.exe
|
9c35de99b53620cb09617061e7d01c31ff7a60f4bda7c4560b294ef18300c7f6 *i386-win32.pe/upx-3.91.exe
|
||||||
e1cb547f4c11a58b245de0bb71e9fbedffa4d9c6f97a57ce679abbae71e0c0b9 *i386-win32.pe/upx-3.95.exe
|
9430239c9d12e7d796fe2fa2de10bef21985841a0adf2357a4ca6b08cf08f989 *i386-win32.pe/upx-3.95.exe
|
||||||
31ba49ef577fb0031130e00198b69afec95ff9cc90806ab04d607be0627d0d1a *m68k-atari.tos/upx-3.91.ttp
|
e3d224960f13424eb4083a547eefd907e3384cfd2ebe6e8d6a8bd56181f5339b *m68k-atari.tos/upx-3.91.ttp
|
||||||
69d27ee81743163b3bd9a7a9721abec70606ee38716c72410dc82bf826e508ee *mips-linux.elf/upx-3.95
|
fa9c411562d1d580944274e744d5d63c2268b334ef754fef89a666938c8601ee *mips-linux.elf/upx-3.95
|
||||||
6ee9682486076ea670bdfa95c7b6dd98d0274e970f7dcc7bdabda8d07558abf5 *mipsel-linux.elf/upx-3.91
|
dd71cec3b4c14c462f58f26077193c8ec2a302aa37b4ae59a6c92ce2d493cccc *mipsel-linux.elf/upx-3.91
|
||||||
b817e57dca45c26d93d2f293d77bf0a9ffa2a4232141d9e4f1a20b369c0b3bbb *mipsel-linux.elf/upx-3.95
|
29c04c30ee8b3c2b4353d92b3e9ad5327af3d9f4439f2a93a08801bb456b7a2a *mipsel-linux.elf/upx-3.95
|
||||||
99337dd36736e46e2ae90fcb6990746577a135d4b465e69f7f421a218e245657 *powerpc-linux.elf/upx-3.91
|
2c109762689cf8691dcc6ad952f27863dd0fc79bfa74883702dc3a4601784aa5 *powerpc-linux.elf/upx-3.91
|
||||||
c1b63b66351e224cc53e33086daafefdeaf3c91a37b68426b08d2c709727f214 *powerpc-linux.elf/upx-3.95
|
2ad4441667860519efbd0cd60744ceadcce73e3019acd80e593917ce76b3cbf1 *powerpc-linux.elf/upx-3.95
|
||||||
9e28a8e6eb94549defc2a842ca24bc7a7496f581237378a118a0ee1792598ee1 *powerpc64le-linux.elf/upx-3.95
|
970fe74533bd7b7c3bd7ddb300f982cde77227f2b1a69155a8dfb30366574d76 *powerpc64le-linux.elf/upx-3.95
|
||||||
"
|
"
|
||||||
expected_sha256sums__t150_compress_ucl_2_all_filters="\
|
expected_sha256sums__t150_compress_ucl_2_all_filters="\
|
||||||
7b164c03af75a33c19dfa45767e9f44a754fd2fecd56239609fff37244030593 *amd64-linux.elf/upx-3.91
|
62e5a3fe8a9e2f7934194904ebfebd445e194b17fe3171c07d22017b3aa09419 *amd64-linux.elf/upx-3.91
|
||||||
f591bf4b34d2bdab707506ca9e7b2822b0d9bfa1dfd542b96512fcdfe18c77d3 *amd64-linux.elf/upx-3.95
|
351c778baa6826faf9661c7c5b8e8c0dd49a8aa5899f0107b2f5f7a4e3a69f3e *amd64-linux.elf/upx-3.95
|
||||||
a80f6756fb9acb5ac4be3f0609c37042922c769a285eca34734eb62547ce4479 *amd64-win64.pe/upx-3.95.exe
|
3b943c943fe91b948e159c5687db6ff1b22acae0552d1cbf50a181750873f8d4 *amd64-win64.pe/upx-3.95.exe
|
||||||
2c249c4fd65bc53376984bfbe352d7732f49d7c601dd01773a6034c127a03416 *arm-linux.elf/upx-3.95
|
cda2ba38e20f75623cea46cd75f604cd5466edd63cb9eafca64ea0fe765c69eb *arm-linux.elf/upx-3.95
|
||||||
f640a43f3e12d092a4a8e9f34d89cc02ca85d382b80e1efdeec4ecffb09aa680 *arm-wince.pe/upx-3.91.exe
|
dea0d13ec7b3f1208988d25c30e3bcd60bc013186a88cc82c998e86f320cad99 *arm-wince.pe/upx-3.91.exe
|
||||||
8d5df9081689113edd3cdd357535aa35e45df4339ad37479d496cbd6e873f38f *arm64-linux.elf/upx-3.95
|
b748ca51f52811112aeea21aba9d0e59b67512d98b1e01f71c22bf4fe755304d *arm64-linux.elf/upx-3.95
|
||||||
0756666adb390b4330cf3f50eee92f73cc1d0afdbcecedd7cdf94fad29bf2c71 *armeb-linux.elf/upx-3.91
|
57686ad3f48c7d950f866f534232693ecc3489f322bb8f1eaf78fbcbbc3bba4d *armeb-linux.elf/upx-3.91
|
||||||
7b8156540b234aec8f6bc4db8dcd9841afd0be1385d55b07bb6f918594dcde9d *armeb-linux.elf/upx-3.95
|
c50c2f015491e40a8b687ae91827cf502e46e47dff21382b19c8e626388e5fe3 *armeb-linux.elf/upx-3.95
|
||||||
23cc97a192c76ce849d17f5a902d178ed10918007b9667913395095db285b546 *i386-dos32.djgpp2.coff/upx-3.91.exe
|
d597d829ef4beca9759c51b135f3cfd1e17c17c1d7cda04e9cb453e76742c9dc *i386-dos32.djgpp2.coff/upx-3.91.exe
|
||||||
66ec810d94684cfa71980a1812ec158b4485b897aac52fa4617e097d69e4d10f *i386-dos32.djgpp2.coff/upx-3.95.exe
|
ac0cc4beea08af6a39ec037d0b2a4e77d0951776e0f9ac945e8b0033b227cc30 *i386-dos32.djgpp2.coff/upx-3.95.exe
|
||||||
9b004924ddc9e028e556c882366e10ed11cc8f69792f658e07b2d19d370bb102 *i386-linux.elf/upx-3.91
|
9204e3fabb4cca148a0d545f9ae3d7facd199edc570d4ce9b9794c4c7d8f46e3 *i386-linux.elf/upx-3.91
|
||||||
74453c23dba3e6f3818faf85f2dd34669839b34679da70201e071566a32df26c *i386-linux.elf/upx-3.95
|
7953f12209c9838707898a73a79962764c01d7106c9c743e7437d996042811b5 *i386-linux.elf/upx-3.95
|
||||||
e91a7748c9ebafe7987127431690ae1464d8f505267a8b3837edf5f17589534b *i386-win32.pe/upx-3.91.exe
|
2e6dbebbae2997ae689c616221f7eecf72117d148783025363b99580df79fdad *i386-win32.pe/upx-3.91.exe
|
||||||
ba4c9b76016431ff30f1ead43b77a6b4ecce9757a438d05647ae3efaa33288fa *i386-win32.pe/upx-3.95.exe
|
8d549e43950072ce5d271ecad25331e29a9886c4f034f150260af20f8a57feb9 *i386-win32.pe/upx-3.95.exe
|
||||||
e6b493dff57c763d4feb49490353dd843b15b1a1c78c000af8bf48472e11f5ae *m68k-atari.tos/upx-3.91.ttp
|
d4eabc9adebd7edd40483f34ceb4081157c7542cdcea0f6b4b4dec640084fc6f *m68k-atari.tos/upx-3.91.ttp
|
||||||
cdf64a07ffa09aab14f5f467da334c41b5b496b77f65034bfca94b8f917b71f6 *mips-linux.elf/upx-3.95
|
d03d5702382fd391c61736a3dda350737590c05de07837aa3ac0eb23ff9e6d7a *mips-linux.elf/upx-3.95
|
||||||
cf1e80d5575766df41fcc27e08e30e3aa2b3a318a0d9014e6a7241bed8fb1d75 *mipsel-linux.elf/upx-3.91
|
431e8d80da56f51339a914c5bc4cf00242a7a8afbc4a77837888c42fb4888c3b *mipsel-linux.elf/upx-3.91
|
||||||
5afd8fbe8bdb25a76dd4105dbb3e4695e4332ceec9837e0609a9850cebdc524a *mipsel-linux.elf/upx-3.95
|
8a9722f82e89c2d83437503765b9e0798854b960839d3fa57e6ccd2f581ed352 *mipsel-linux.elf/upx-3.95
|
||||||
c378615d5068a5c44cb751290c732a127f88d3534d47318be41f1827a43c41b5 *powerpc-linux.elf/upx-3.91
|
2bcf9a0b0245e807a4728f84ca134ab30371a91a2d247ed63ea80fbf4f6a44be *powerpc-linux.elf/upx-3.91
|
||||||
b4b3ebd20ee61a0ed47d481e7333cef42d1a23f832c5463aff6df640d5265e65 *powerpc-linux.elf/upx-3.95
|
37b3f5e0a7973ca5143dea5fc7d116d759f662780ee0b809357554b21fd4bbb0 *powerpc-linux.elf/upx-3.95
|
||||||
0283de59bd2bf8f9dc11e1b5ad69d666bfc7a2b2168585ae3874f758eb271336 *powerpc64le-linux.elf/upx-3.95
|
04c9a8dfb2bc25327894045cc5b5f8325fb7fe90d77473ad08c5491c58b28988 *powerpc64le-linux.elf/upx-3.95
|
||||||
"
|
"
|
||||||
expected_sha256sums__t160_compress_all_methods_1_no_filter="\
|
expected_sha256sums__t160_compress_all_methods_1_no_filter="\
|
||||||
d2ebb0a3e77b766446b0076008c63e910b3286b72ba7c4cce03782f36c0c7396 *amd64-linux.elf/upx-3.91
|
0c2dedc98ac535a39c4166db713ed6feb02680869d23cc734c40e4d4ee36c6b4 *amd64-linux.elf/upx-3.91
|
||||||
3de94645a9b15b723b21da216e26577f8e28d4d296ceb5b68eacf5ea4040525c *amd64-linux.elf/upx-3.95
|
dc87386b6afd2a36ab6ca67139399f9de6b3d29edb1741b523236e596c625043 *amd64-linux.elf/upx-3.95
|
||||||
4106f280f30fff3c39fe72b10cf450cc514d3aa9e6769255f54606c4c09bf646 *amd64-win64.pe/upx-3.95.exe
|
b75527ed6cfd8fa9b48a68e021545833790bc2817c2155cc5eeb97cb9d43cd5c *amd64-win64.pe/upx-3.95.exe
|
||||||
db5838a8816241e57f3271ee217cbd99b80d2c5ec15f9c71e0b1da1cced372a3 *arm-linux.elf/upx-3.95
|
56416fe7d9100ebb3dddee598ce0844d1abfc6f006178b5fa05fc6d1d15e9a8c *arm-linux.elf/upx-3.95
|
||||||
97a78c7aef6ab3eeb2807893c4edfb529565e36b27f9982456276dde46e34d90 *arm-wince.pe/upx-3.91.exe
|
3ea0a4cafa457a1bf86ddf659a57c5737c4fa79b4a0d161df1c55c7ff0fa5ad5 *arm-wince.pe/upx-3.91.exe
|
||||||
50c4a83017a143e386f8e8c4f1dc73827b059ffc4a94586ab949edd19f27d4b3 *arm64-linux.elf/upx-3.95
|
0fe74c52794dc63e8e92590413eea6aceb73a9cb9f34bed3eae9a8fc34aa5ef2 *arm64-linux.elf/upx-3.95
|
||||||
dbf432c12845fe8cebb131995cd57cc637dee8e21e8b083ed05052a2839373d8 *armeb-linux.elf/upx-3.91
|
5eb71685d564fdc4e99d939e5b2d58d8a8341288bcde5eac06f465c68a61a40a *armeb-linux.elf/upx-3.91
|
||||||
751ecfef4f02003f127d7dffe9fdf12af1a449bf4546e8a6dbc86d8885441746 *armeb-linux.elf/upx-3.95
|
08516cb6655f58965c4dea7c9227aac78e3bcffd8113062dd72118e074b3380e *armeb-linux.elf/upx-3.95
|
||||||
da261516dc443ac3a9dfbe9e3353313042b72e8c1fa3f7c17bf32e0ff4221a12 *i386-dos32.djgpp2.coff/upx-3.91.exe
|
2a98332d1e82db93f7025dcf792d0e8924caf38fa9b4c22963841ab5e86d22ce *i386-dos32.djgpp2.coff/upx-3.91.exe
|
||||||
a4eaa51e14b7bdecff560e4ed209888cda0fde955693a7005aca67361181c561 *i386-dos32.djgpp2.coff/upx-3.95.exe
|
6939a695082de59e8993886c8213aaff1ca2ed1d7687404dd242796e27275a42 *i386-dos32.djgpp2.coff/upx-3.95.exe
|
||||||
48c1959184334c5eeaddad5b2141103a0a5863a3c22f068d6d977e2fb0ed1711 *i386-linux.elf/upx-3.91
|
0a866faf423e2c134f26ec705916b7ded0cdcb4c11fcb4e3b1ff75291d0b9d71 *i386-linux.elf/upx-3.91
|
||||||
eeb2cf342f9dbb87440bd4aec0b81ea3218b300124f6348758ea4bf100318ec9 *i386-linux.elf/upx-3.95
|
523d569a0682728fa84312db03930d290b7f6ef71eb2222fd81ebeb4bcc16ffa *i386-linux.elf/upx-3.95
|
||||||
28c742067136d6023720208131a5052553cae9cd5fa1b86ffc9d7b1338ab6466 *i386-win32.pe/upx-3.91.exe
|
e1f8df77bb4591b1a68f7c110ed36ad778fef240ed52f9d3e511318a2d091e66 *i386-win32.pe/upx-3.91.exe
|
||||||
11646ac069761715b45a78c0ad769ca69f3b2e22ff70a7068bcda7118bfc82fd *i386-win32.pe/upx-3.95.exe
|
265f4c7045bae686897dd9981575a5ebeb99ab28233d66e9a8164789359f00d8 *i386-win32.pe/upx-3.95.exe
|
||||||
0e442a98a0e90716945ffe9addf9cb7079686e3cc0f968c5e557b52a36fe6ac8 *m68k-atari.tos/upx-3.91.ttp
|
55732af6251cc6aa7bbb9c52415424a8cc4074288004a6064d9311a2ee01fddb *m68k-atari.tos/upx-3.91.ttp
|
||||||
71abe63b1bfe35d8ff9bbaab18dcf41881a94f7bcd12bd0c010205ecbee94f33 *mips-linux.elf/upx-3.95
|
138f3f2798f0cac9235011f14910ef6b079b908746d570a2ec631bb62d0f5917 *mips-linux.elf/upx-3.95
|
||||||
acc0e3322b4f22aa8e5a79962cf92b1a8ad203755dfe5bab6d2a668d274e4aab *mipsel-linux.elf/upx-3.91
|
4f740937696b2d86a4bd89ec61d52338db4c739c71a8dde5cc6ff67f675304c6 *mipsel-linux.elf/upx-3.91
|
||||||
e875572d1be9999b9292122d2094ae54142b268d7fda4ab12544507aaf673fe3 *mipsel-linux.elf/upx-3.95
|
18b3320462c479420723407cc3aea2b07911a4c725b0c334e1d9585a51c86bf0 *mipsel-linux.elf/upx-3.95
|
||||||
62414bff8849020ea0e93c10595fbe10e30c5effa87d25fa8b67c77bc810ccb7 *powerpc-linux.elf/upx-3.91
|
c8f8974ebc401286910894d6751b0a13cd908d09b51e186e49e0c309ace3d282 *powerpc-linux.elf/upx-3.91
|
||||||
5c59c4dc481c71a9b02dd39f8ac6e3aec24f6ca2864ad3ff1c7cc54ab567af9e *powerpc-linux.elf/upx-3.95
|
ad08eb6c4339cd8ec63c12dd8551ef10851dcce66be27d0f9fbb251003ef0f4b *powerpc-linux.elf/upx-3.95
|
||||||
71863da15c4bd482c7ad6123895b555db86610b3cc35e7ab99897d7c9dbfcc9a *powerpc64le-linux.elf/upx-3.95
|
fb0fa7d60c542653e7d3448f2aa69e7c2ed5aaebf3845d5aa5f10c5bff2ee279 *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="\
|
||||||
6880572cb1b05e8b43af2cc0a56937ad4dc3fb32260092a1649164155b5e39de *amd64-linux.elf/upx-3.91
|
3a5098207aa95f40fd8a62a6a79f416837f69bf0a1ac729264fbee72d1fae0f6 *amd64-linux.elf/upx-3.91
|
||||||
d6133ca17edfc370015f37182f5a6531830cefc688c127dbe0d45a7212838f0f *amd64-linux.elf/upx-3.95
|
4748b6f0bb08e1417dc62cff1c049eb2ee993717be4f9f5359fc7454e736def2 *amd64-linux.elf/upx-3.95
|
||||||
027c3eb340c77f31bbc39bc05fb5ba56c2fc33529c445c288b6af26031172442 *amd64-win64.pe/upx-3.95.exe
|
9fc18a2ec177ff3b48b5d299828e3275be1585db6c205ec5652e3d13f4d91eda *amd64-win64.pe/upx-3.95.exe
|
||||||
7b9ef1fd569242b03ca8b4c6dabf880271cb3755cd00c08d15a77dc00bc05f83 *arm-linux.elf/upx-3.95
|
d90b9a2f71107025885e289633ef9e7942f494a7f8aa0e0597e79664b09ad034 *arm-linux.elf/upx-3.95
|
||||||
bbeb21e516bf50e7d35cffb364337c6f157a31ddcacc3d43a2b2dfda8b8da3be *arm-wince.pe/upx-3.91.exe
|
f03a3f07787765e499ad5a60f7c576598f433ba9a1f4d7158b0923f510929142 *arm-wince.pe/upx-3.91.exe
|
||||||
d8314cfd96fc2c9d83db69ea9746fdf5653fd3a6476f271d6c244976ab7ac9ff *arm64-linux.elf/upx-3.95
|
d01b573be7bb79257c3e0637f38a7fe8940e9302c7391fbc4a75664219a5522c *arm64-linux.elf/upx-3.95
|
||||||
40c5647b8dbbc287e5686d1dc81e5adf8c68d35438039edac1f201b7f939977c *armeb-linux.elf/upx-3.91
|
085600cfffbe1d9e0c1bc25a3e48bbf3130b023b49ccbca001db27b4881e6246 *armeb-linux.elf/upx-3.91
|
||||||
047f325e6b0d3c1b0179b9574441957a64601ea67c55d53cf29dc830e34d7578 *armeb-linux.elf/upx-3.95
|
a7923c6b78b9d3d58ee4f1bc42861476a57bb9935af47d2a15e048efb642f5d4 *armeb-linux.elf/upx-3.95
|
||||||
a1b89d28adae9b26d34d701acac3a32106fce77a380322ee0cbe4a852d692ce6 *i386-dos32.djgpp2.coff/upx-3.91.exe
|
0970d5a8ee6c819e11b2bd889c7ee908403af2adf3542f7670ed92eb51090485 *i386-dos32.djgpp2.coff/upx-3.91.exe
|
||||||
fd05d0899b87dd4019c10a01d04228aca83203b801c0f5ecd8c25c225a9ab9af *i386-dos32.djgpp2.coff/upx-3.95.exe
|
e2d6b3c8de85bdc7b0262f64c1a16c9d41695a92e6f374cc9f12e87ca78fd956 *i386-dos32.djgpp2.coff/upx-3.95.exe
|
||||||
58fa03662e605039f73ade85c00f8bc630623e6b10b304379b1c374f4a4330a1 *i386-linux.elf/upx-3.91
|
9e28e20b115e4a671b3f4006934b94fd59fcd48dc36311a479dda6bc1ccebe07 *i386-linux.elf/upx-3.91
|
||||||
87d151c5e091586add28d63e08369692836db3cd1988edbf216a21370e01f0b5 *i386-linux.elf/upx-3.95
|
910401db763c9a0bcb8e4d1b9cf1ee476c034b94b54a9350bcd303a5487085ef *i386-linux.elf/upx-3.95
|
||||||
4e8bf3046e35facf27e060277c7e577ea367d05f531ccee950c34c6e3a151d66 *i386-win32.pe/upx-3.91.exe
|
0a413298c461facb93048106cfd261d72192443e6d2d313f2b48dbdf6537b22a *i386-win32.pe/upx-3.91.exe
|
||||||
8f1209d612991ac464f534206b6ce5999c6e689213fc468b289dd990309c312b *i386-win32.pe/upx-3.95.exe
|
684a0e0309d062e3fb7a1fabbdb7b2be45d3bde6a9a030f8a45fcc369a066efa *i386-win32.pe/upx-3.95.exe
|
||||||
6e7513be318b8e4ce2bb48a23bd47f0961ef745fd7f1e25d4439435334e62264 *m68k-atari.tos/upx-3.91.ttp
|
3ea4fe59d58b92fe0b0e41662c15c40130d72ed30425871d572a8c06c3c27bbf *m68k-atari.tos/upx-3.91.ttp
|
||||||
ea1abe9b33a31c5e27896eabf62a7a22640e91f03af336fc22a64366af196d8f *mips-linux.elf/upx-3.95
|
e098036f912764f9dcef7377d17fe15b4f21439303306f9c84838d35fe655530 *mips-linux.elf/upx-3.95
|
||||||
f8ee354abac9eeb83c2d3a9101b35181bebbc2d9e9253960b7ccf96b6670d711 *mipsel-linux.elf/upx-3.91
|
df4106be954d5233644a3d761a9f899132f052741d16e1d793ae481aafd51caa *mipsel-linux.elf/upx-3.91
|
||||||
cfb11a2da4f598ad20f29a248ac8e28d45dea0a47984d47d075e24e63237ca07 *mipsel-linux.elf/upx-3.95
|
4c87f94f926aedbe17bf2d7ef72873506bbae75b8abf51a6775eb4b2e0ac0d96 *mipsel-linux.elf/upx-3.95
|
||||||
541188bdf23b4bf9513a6775ba186cf3d1cdf6a61a0c15177eb4111a51978397 *powerpc-linux.elf/upx-3.91
|
4c6b2ca8ed7bbe6b9705f02a26781e6d93ab2a1011c119283130a738df5e47eb *powerpc-linux.elf/upx-3.91
|
||||||
cc98a7992d9fee0af3a32c0408213198f8d2d407a44ae25d228057dfce0ef3dc *powerpc-linux.elf/upx-3.95
|
ccecc0acef4c430a8871704f93280a17bff518267499f05ba89a5290ba654a89 *powerpc-linux.elf/upx-3.95
|
||||||
20409135c1b03e9f2dcf50266db27a6b7a0259cc073d2bc47b4264c64342bf8c *powerpc64le-linux.elf/upx-3.95
|
86123a78b0ff91321acbc837874034c099443f77ff62848e338bb61c0888e1c6 *powerpc64le-linux.elf/upx-3.95
|
||||||
"
|
"
|
||||||
########## end .sha256sums.recreate
|
########## end .sha256sums.recreate
|
||||||
|
|||||||
@@ -3,17 +3,21 @@
|
|||||||
set -e; set -o pipefail
|
set -e; set -o pipefail
|
||||||
argv0=$0; argv0abs=$(readlink -fn "$argv0"); argv0dir=$(dirname "$argv0abs")
|
argv0=$0; argv0abs=$(readlink -fn "$argv0"); argv0dir=$(dirname "$argv0abs")
|
||||||
|
|
||||||
|
#
|
||||||
|
# Copyright (C) Markus Franz Xaver Johannes Oberhumer
|
||||||
|
#
|
||||||
# very first version of the upx-testsuite; requires:
|
# very first version of the upx-testsuite; requires:
|
||||||
# $upx_exe (required, but with convenience fallback "./upx")
|
# $upx_exe (required, but with convenience fallback "./upx")
|
||||||
# $upx_testsuite_SRCDIR (required, but with convenience fallback)
|
# $upx_testsuite_SRCDIR (required, but with convenience fallback)
|
||||||
# $upx_testsuite_BUILDDIR (optional)
|
# $upx_testsuite_BUILDDIR (optional)
|
||||||
#
|
#
|
||||||
# optional settings:
|
# optional settings:
|
||||||
# $upx_exe_runner (e.g. "qemu-x86_64 -cpu Westmere" or "valgrind")
|
# $upx_exe_runner (e.g. "qemu-x86_64 -cpu Nehalem" or "valgrind")
|
||||||
# $UPX_TESTSUITE_VERBOSE
|
# $UPX_TESTSUITE_VERBOSE
|
||||||
# $UPX_TESTSUITE_LEVEL
|
# $UPX_TESTSUITE_LEVEL
|
||||||
#
|
#
|
||||||
# see https://github.com/upx/upx-testsuite.git
|
# see https://github.com/upx/upx-testsuite.git
|
||||||
|
#
|
||||||
|
|
||||||
#***********************************************************************
|
#***********************************************************************
|
||||||
# init & checks
|
# init & checks
|
||||||
@@ -28,15 +32,17 @@ upx_exe=$(readlink -fn "$upx_exe") # make absolute
|
|||||||
upx_run=()
|
upx_run=()
|
||||||
if [[ -n $upx_exe_runner ]]; then
|
if [[ -n $upx_exe_runner ]]; then
|
||||||
# usage examples:
|
# usage examples:
|
||||||
# export upx_exe_runner="qemu-x86_64 -cpu Westmere"
|
# export upx_exe_runner="qemu-x86_64 -cpu Nehalem"
|
||||||
# export upx_exe_runner="valgrind --leak-check=no --error-exitcode=1 --quiet"
|
# export upx_exe_runner="valgrind --leak-check=no --error-exitcode=1 --quiet"
|
||||||
# export upx_exe_runner="wine"
|
# export upx_exe_runner="wine"
|
||||||
IFS=' ' read -r -a upx_run <<< "$upx_exe_runner" # split at spaces into array
|
IFS=' ' read -r -a upx_run <<< "$upx_exe_runner" # split at spaces into array
|
||||||
|
elif [[ -n $CMAKE_CROSSCOMPILING_EMULATOR ]]; then
|
||||||
|
IFS=';' read -r -a upx_run <<< "$CMAKE_CROSSCOMPILING_EMULATOR" # split at semicolons into array
|
||||||
fi
|
fi
|
||||||
upx_run+=( "$upx_exe" )
|
upx_run+=( "$upx_exe" )
|
||||||
echo "upx_run='${upx_run[*]}'"
|
echo "upx_run='${upx_run[*]}'"
|
||||||
|
|
||||||
# upx_run check, part1
|
# upx_run sanity check, part1
|
||||||
if ! "${upx_run[@]}" --version-short >/dev/null; then echo "UPX-ERROR: FATAL: upx --version-short FAILED"; exit 1; fi
|
if ! "${upx_run[@]}" --version-short >/dev/null; then echo "UPX-ERROR: FATAL: upx --version-short FAILED"; exit 1; fi
|
||||||
if ! "${upx_run[@]}" -L >/dev/null 2>&1; then echo "UPX-ERROR: FATAL: upx -L FAILED"; exit 1; fi
|
if ! "${upx_run[@]}" -L >/dev/null 2>&1; then echo "UPX-ERROR: FATAL: upx -L FAILED"; exit 1; fi
|
||||||
if ! "${upx_run[@]}" --help >/dev/null; then echo "UPX-ERROR: FATAL: upx --help FAILED"; exit 1; fi
|
if ! "${upx_run[@]}" --help >/dev/null; then echo "UPX-ERROR: FATAL: upx --help FAILED"; exit 1; fi
|
||||||
@@ -72,7 +78,7 @@ upx_testsuite_BUILDDIR=$(readlink -fn "$upx_testsuite_BUILDDIR") # make absolute
|
|||||||
cd / && cd "$upx_testsuite_BUILDDIR" || exit 1
|
cd / && cd "$upx_testsuite_BUILDDIR" || exit 1
|
||||||
: > ./.mfxnobackup
|
: > ./.mfxnobackup
|
||||||
|
|
||||||
# upx_run check, part2
|
# upx_run sanity check, part2
|
||||||
if ! "${upx_run[@]}" --version-short >/dev/null; then
|
if ! "${upx_run[@]}" --version-short >/dev/null; then
|
||||||
echo "UPX-ERROR: FATAL: upx --version-short FAILED"
|
echo "UPX-ERROR: FATAL: upx --version-short FAILED"
|
||||||
echo "please make sure that \$upx_exe contains ABSOLUTE file paths and can be run from any directory"
|
echo "please make sure that \$upx_exe contains ABSOLUTE file paths and can be run from any directory"
|
||||||
|
|||||||
@@ -0,0 +1,41 @@
|
|||||||
|
#
|
||||||
|
# valgrind suppressions for musl libc
|
||||||
|
# Copyright (C) Markus Franz Xaver Johannes Oberhumer
|
||||||
|
#
|
||||||
|
|
||||||
|
# musl malloc
|
||||||
|
{
|
||||||
|
musl-malloc-enframe
|
||||||
|
Memcheck:Cond
|
||||||
|
fun:enframe
|
||||||
|
}
|
||||||
|
|
||||||
|
# these are only needed for older musl versions
|
||||||
|
|
||||||
|
{
|
||||||
|
musl-malloc-mal0_clear
|
||||||
|
Memcheck:Cond
|
||||||
|
fun:mal0_clear
|
||||||
|
fun:calloc
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
musl-string-memchr
|
||||||
|
Memcheck:Cond
|
||||||
|
fun:memchr
|
||||||
|
}
|
||||||
|
{
|
||||||
|
musl-string-stpcpy
|
||||||
|
Memcheck:Cond
|
||||||
|
fun:stpcpy
|
||||||
|
}
|
||||||
|
{
|
||||||
|
musl-string-strchrnul
|
||||||
|
Memcheck:Cond
|
||||||
|
fun:strchrnul
|
||||||
|
}
|
||||||
|
{
|
||||||
|
musl-string-strlen
|
||||||
|
Memcheck:Cond
|
||||||
|
fun:strlen
|
||||||
|
}
|
||||||
+52
-46
@@ -3,9 +3,8 @@
|
|||||||
# Copyright (C) Markus Franz Xaver Johannes Oberhumer
|
# Copyright (C) Markus Franz Xaver Johannes Oberhumer
|
||||||
#
|
#
|
||||||
|
|
||||||
# NOTE: this Makefile is deprecated - please directly use the CMake build
|
# NOTE: this Makefile is deprecated - please directly use
|
||||||
# instead. And see the top-level Makefile for some pre-defined CMake
|
# the top-level CMake build instead.
|
||||||
# build configurations.
|
|
||||||
|
|
||||||
ifndef srcdir
|
ifndef srcdir
|
||||||
srcdir := $(patsubst %/,%,$(dir $(lastword $(MAKEFILE_LIST))))
|
srcdir := $(patsubst %/,%,$(dir $(lastword $(MAKEFILE_LIST))))
|
||||||
@@ -14,38 +13,36 @@ ifndef top_srcdir
|
|||||||
top_srcdir := $(srcdir)/..
|
top_srcdir := $(srcdir)/..
|
||||||
endif
|
endif
|
||||||
|
|
||||||
#
|
#***********************************************************************
|
||||||
# redirect to top-level CMake build
|
# redirect to top-level CMake build
|
||||||
#
|
#***********************************************************************
|
||||||
|
|
||||||
# NOTE that top-level Makefile .DEFAULT_GOAL is build/release
|
# NOTE that the top-level Makefile .DEFAULT_GOAL is build/release
|
||||||
.DEFAULT_GOAL = build/debug
|
.DEFAULT_GOAL = build/all
|
||||||
|
|
||||||
build/debug: $(top_srcdir)/build/debug/upx
|
|
||||||
build/release: $(top_srcdir)/build/release/upx
|
|
||||||
|
|
||||||
.NOTPARALLEL: # because the actual builds use "cmake --parallel"
|
.NOTPARALLEL: # because the actual builds use "cmake --parallel"
|
||||||
.PHONY: PHONY
|
.PHONY: PHONY
|
||||||
.SECONDEXPANSION:
|
.SECONDEXPANSION:
|
||||||
.SUFFIXES:
|
.SUFFIXES:
|
||||||
|
|
||||||
# shortcuts (all => debug + release)
|
build/debug build/release build/all: PHONY; $(MAKE) -C $(top_srcdir) $@
|
||||||
debug: build/debug
|
build/debug+test build/release+test build/all+test: PHONY; $(MAKE) -C $(top_srcdir) $@
|
||||||
release: build/release
|
# shortcuts
|
||||||
all build/all: build/debug build/release
|
debug release all: PHONY; $(MAKE) -C $(top_srcdir) $@
|
||||||
|
debug+test release+test all+test: PHONY; $(MAKE) -C $(top_srcdir) $@
|
||||||
|
|
||||||
$(top_srcdir)/build/debug/upx: PHONY
|
test:: build/all+test PHONY
|
||||||
$(MAKE) -C $(top_srcdir) build/debug
|
|
||||||
$(top_srcdir)/build/release/upx: PHONY
|
|
||||||
$(MAKE) -C $(top_srcdir) build/release
|
|
||||||
|
|
||||||
#
|
# OLD target names [deprecated]
|
||||||
# "make run-testsuite"
|
$(top_srcdir)/build/debug: build/debug PHONY
|
||||||
# see https://github.com/upx/upx-testsuite.git
|
$(top_srcdir)/build/release: build/release PHONY
|
||||||
#
|
|
||||||
|
|
||||||
# search for the UPX testsuite -- git clone https://github.com/upx/upx-testsuite.git
|
#***********************************************************************
|
||||||
# you also can override upx_testsuite_SRCDIR
|
# make run-testsuite
|
||||||
|
# git clone https://github.com/upx/upx-testsuite.git
|
||||||
|
#***********************************************************************
|
||||||
|
|
||||||
|
# search for the UPX testsuite; you can override by setting "upx_testsuite_SRCDIR"
|
||||||
ifndef upx_testsuite_SRCDIR
|
ifndef upx_testsuite_SRCDIR
|
||||||
# search standard locations below $(top_srcdir)
|
# search standard locations below $(top_srcdir)
|
||||||
ifneq ($(wildcard $(top_srcdir)/../upx--upx-testsuite.git/files/packed/.),)
|
ifneq ($(wildcard $(top_srcdir)/../upx--upx-testsuite.git/files/packed/.),)
|
||||||
@@ -59,47 +56,56 @@ endif
|
|||||||
|
|
||||||
# run the UPX testsuite
|
# run the UPX testsuite
|
||||||
# The expected (old) checksums are in $(top_srcdir)/misc/testsuite/upx_testsuite_1-expected_sha256sums.sh
|
# The expected (old) checksums are in $(top_srcdir)/misc/testsuite/upx_testsuite_1-expected_sha256sums.sh
|
||||||
# The actual (new) checksums are in ./tmp-upx-testsuite/testsuite_1/.sha256sums.recreate
|
# The actual (new) checksums are in ./tmp-upx-testsuite-*/testsuite_1/.sha256sums.recreate
|
||||||
ifneq ($(wildcard $(upx_testsuite_SRCDIR)/files/packed/.),)
|
ifneq ($(wildcard $(upx_testsuite_SRCDIR)/files/packed/.),)
|
||||||
ifneq ($(wildcard $(top_srcdir)/misc/testsuite/upx_testsuite_1.sh),)
|
ifneq ($(wildcard $(top_srcdir)/misc/testsuite/upx_testsuite_1.sh),)
|
||||||
run-testsuite: run-testsuite-release
|
run-testsuite: run-testsuite-release PHONY
|
||||||
run-testsuite-%: export upx_testsuite_SRCDIR := $(upx_testsuite_SRCDIR)
|
run-testsuite-%: export upx_testsuite_SRCDIR := $(upx_testsuite_SRCDIR)
|
||||||
run-testsuite-%: export upx_testsuite_BUILDDIR := ./tmp-upx-testsuite
|
run-testsuite-debug: export upx_testsuite_BUILDDIR := ./tmp-upx-testsuite-debug
|
||||||
run-testsuite-debug: export upx_exe := $(top_srcdir)/build/debug/upx
|
run-testsuite-debug: export upx_exe := $(top_srcdir)/build/debug/upx
|
||||||
run-testsuite-debug: PHONY $(top_srcdir)/build/debug/upx
|
run-testsuite-debug: build/debug PHONY
|
||||||
time -p bash $(top_srcdir)/misc/testsuite/upx_testsuite_1.sh
|
time -p bash $(top_srcdir)/misc/testsuite/upx_testsuite_1.sh
|
||||||
|
run-testsuite-release: export upx_testsuite_BUILDDIR := ./tmp-upx-testsuite-release
|
||||||
run-testsuite-release: export upx_exe := $(top_srcdir)/build/release/upx
|
run-testsuite-release: export upx_exe := $(top_srcdir)/build/release/upx
|
||||||
run-testsuite-release: PHONY $(top_srcdir)/build/release/upx
|
run-testsuite-release: build/release PHONY
|
||||||
time -p bash $(top_srcdir)/misc/testsuite/upx_testsuite_1.sh
|
time -p bash $(top_srcdir)/misc/testsuite/upx_testsuite_1.sh
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
|
|
||||||
#
|
#***********************************************************************
|
||||||
# "make check-whitespace"
|
# make check-whitespace
|
||||||
#
|
#***********************************************************************
|
||||||
|
|
||||||
ifneq ($(wildcard /usr/bin/env),) # needs bash, perl, xargs, etc.
|
ifneq ($(wildcard /usr/bin/env),) # need Unix utils like bash, perl, sed, xargs, etc.
|
||||||
CHECK_WHITESPACE = $(top_srcdir)/misc/scripts/check_whitespace.sh $(top_srcdir)
|
|
||||||
|
CHECK_WHITESPACE = bash $(top_srcdir)/misc/scripts/check_whitespace.sh $(top_srcdir)
|
||||||
ifneq ($(wildcard $(top_srcdir)/.git/.),)
|
ifneq ($(wildcard $(top_srcdir)/.git/.),)
|
||||||
CHECK_WHITESPACE = $(top_srcdir)/misc/scripts/check_whitespace_git.sh $(top_srcdir)
|
CHECK_WHITESPACE = bash $(top_srcdir)/misc/scripts/check_whitespace_git.sh $(top_srcdir)
|
||||||
endif
|
endif
|
||||||
check-whitespace: PHONY; $(CHECK_WHITESPACE)
|
check-whitespace: PHONY; $(CHECK_WHITESPACE)
|
||||||
endif
|
|
||||||
|
|
||||||
#
|
endif # /usr/bin/env
|
||||||
# "make clang-format"
|
|
||||||
#
|
#***********************************************************************
|
||||||
|
# make clang-format
|
||||||
|
#***********************************************************************
|
||||||
|
|
||||||
# automatically format some C++ source code files
|
# automatically format some C++ source code files
|
||||||
|
ifneq ($(wildcard /usr/bin/env),)
|
||||||
ifeq ($(shell uname),Linux)
|
ifeq ($(shell uname),Linux)
|
||||||
|
|
||||||
# Markus loves clang-format, but John hates it; find a compromise
|
# Markus loves clang-format, but John hates it; find a compromise
|
||||||
CLANG_FORMAT_EXCLUDE_FILES += conf.h miniacc.h stub/%.h
|
CLANG_FORMAT_EXCLUDE_FILES += stub/%.h util/miniacc.h
|
||||||
CLANG_FORMAT_EXCLUDE_FILES += p_elf.h p_elf_enum.h p_lx_% p_mach% p_unix% p_vmlin%
|
CLANG_FORMAT_EXCLUDE_FILES += p_lx_% p_mach% p_unix% p_vmlin%
|
||||||
CLANG_FORMAT_FILES := $(sort $(wildcard *.[ch]* ../maint/src/*.[ch]* */*.[ch]*))
|
CLANG_FORMAT_FILES := $(sort $(wildcard *.[ch]* ../maint/src/*.[ch]* */*.[ch]*))
|
||||||
CLANG_FORMAT_FILES := $(filter-out $(CLANG_FORMAT_EXCLUDE_FILES),$(CLANG_FORMAT_FILES))
|
CLANG_FORMAT_FILES += $(sort $(wildcard stub/tools/*/*.[ch]*))
|
||||||
clang-format: PHONY $(CLANG_FORMAT_FILES)
|
CLANG_FORMAT_FILES += $(sort $(wildcard ../misc/cmake/try_compile/*.[ch]*))
|
||||||
|
CLANG_FORMAT_FILES := $(sort $(filter-out $(CLANG_FORMAT_EXCLUDE_FILES),$(CLANG_FORMAT_FILES)))
|
||||||
|
clang-format: $(CLANG_FORMAT_FILES) PHONY
|
||||||
@echo "running upx-clang-format"
|
@echo "running upx-clang-format"
|
||||||
@$(top_srcdir)/misc/scripts/upx-clang-format.sh -i $(CLANG_FORMAT_FILES)
|
@bash $(top_srcdir)/misc/scripts/upx-clang-format.sh -i $(CLANG_FORMAT_FILES)
|
||||||
endif
|
|
||||||
|
endif # Linux
|
||||||
|
endif # /usr/bin/env
|
||||||
|
|
||||||
# vim:set ts=8 sw=8 noet:
|
# vim:set ts=8 sw=8 noet:
|
||||||
|
|||||||
+73
-41
@@ -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-2023 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2024 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2023 Laszlo Molnar
|
Copyright (C) 1996-2024 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
|
||||||
@@ -47,8 +47,9 @@
|
|||||||
// try to detect XX16 vs XX32 vs XX64 size mismatches
|
// try to detect XX16 vs XX32 vs XX64 size mismatches
|
||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
|
|
||||||
#if 0 // permissive version using "void *"
|
#if !(DEBUG)
|
||||||
|
|
||||||
|
// permissive version using "void *"
|
||||||
#define REQUIRE_XE16 /*empty*/
|
#define REQUIRE_XE16 /*empty*/
|
||||||
#define REQUIRE_XE24 /*empty*/
|
#define REQUIRE_XE24 /*empty*/
|
||||||
#define REQUIRE_XE32 /*empty*/
|
#define REQUIRE_XE32 /*empty*/
|
||||||
@@ -73,15 +74,15 @@ struct LE64;
|
|||||||
// char is explicitly allowed
|
// char is explicitly allowed
|
||||||
// byte is explicitly allowed
|
// byte is explicitly allowed
|
||||||
template <class T>
|
template <class T>
|
||||||
static inline constexpr bool is_xe16_type =
|
inline constexpr bool is_xe16_type =
|
||||||
upx::is_same_any_v<T, void, char, byte, upx_int16_t, upx_uint16_t, BE16, LE16>;
|
upx::is_same_any_v<T, void, char, byte, upx_int16_t, upx_uint16_t, BE16, LE16>;
|
||||||
template <class T>
|
template <class T>
|
||||||
static inline constexpr bool is_xe24_type = upx::is_same_any_v<T, void, char, byte>;
|
inline constexpr bool is_xe24_type = upx::is_same_any_v<T, void, char, byte>;
|
||||||
template <class T>
|
template <class T>
|
||||||
static inline constexpr bool is_xe32_type =
|
inline constexpr bool is_xe32_type =
|
||||||
upx::is_same_any_v<T, void, char, byte, upx_int32_t, upx_uint32_t, BE32, LE32>;
|
upx::is_same_any_v<T, void, char, byte, upx_int32_t, upx_uint32_t, BE32, LE32>;
|
||||||
template <class T>
|
template <class T>
|
||||||
static inline constexpr bool is_xe64_type =
|
inline constexpr bool is_xe64_type =
|
||||||
upx::is_same_any_v<T, void, char, byte, upx_int64_t, upx_uint64_t, BE64, LE64>;
|
upx::is_same_any_v<T, void, char, byte, upx_int64_t, upx_uint64_t, BE64, LE64>;
|
||||||
|
|
||||||
template <class T>
|
template <class T>
|
||||||
@@ -152,11 +153,15 @@ static forceinline void set_ne64(XE64 *p, upx_uint64_t vv) noexcept {
|
|||||||
ACC_COMPILE_TIME_ASSERT_HEADER(sizeof(long) == 4)
|
ACC_COMPILE_TIME_ASSERT_HEADER(sizeof(long) == 4)
|
||||||
|
|
||||||
// unfortunately *not* constexpr with current MSVC
|
// unfortunately *not* constexpr with current MSVC
|
||||||
static forceinline unsigned bswap16(unsigned v) noexcept {
|
static forceinline /*constexpr*/ unsigned bswap16(unsigned v) noexcept {
|
||||||
return (unsigned) _byteswap_ulong(v << 16);
|
return (unsigned) _byteswap_ulong(v << 16);
|
||||||
}
|
}
|
||||||
static forceinline unsigned bswap32(unsigned v) noexcept { return (unsigned) _byteswap_ulong(v); }
|
static forceinline /*constexpr*/ unsigned bswap32(unsigned v) noexcept {
|
||||||
static forceinline upx_uint64_t bswap64(upx_uint64_t v) noexcept { return _byteswap_uint64(v); }
|
return (unsigned) _byteswap_ulong(v);
|
||||||
|
}
|
||||||
|
static forceinline /*constexpr*/ upx_uint64_t bswap64(upx_uint64_t v) noexcept {
|
||||||
|
return _byteswap_uint64(v);
|
||||||
|
}
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
@@ -266,21 +271,27 @@ inline void set_le24(XE24 *p, unsigned v) noexcept {
|
|||||||
b[2] = ACC_ICONV(byte, (v >> 16) & 0xff);
|
b[2] = ACC_ICONV(byte, (v >> 16) & 0xff);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline unsigned get_le26(const void *p) noexcept { return get_le32(p) & 0x03ffffff; }
|
REQUIRE_XE32
|
||||||
inline unsigned get_le19_5(const void *p) noexcept { return (get_le32(p) >> 5) & 0x0007ffff; }
|
inline unsigned get_le26(const XE32 *p) noexcept { return get_le32(p) & 0x03ffffff; }
|
||||||
inline unsigned get_le14_5(const void *p) noexcept { return (get_le32(p) >> 5) & 0x00003fff; }
|
REQUIRE_XE32
|
||||||
|
inline unsigned get_le19_5(const XE32 *p) noexcept { return (get_le32(p) >> 5) & 0x0007ffff; }
|
||||||
|
REQUIRE_XE32
|
||||||
|
inline unsigned get_le14_5(const XE32 *p) noexcept { return (get_le32(p) >> 5) & 0x00003fff; }
|
||||||
|
|
||||||
inline void set_le26(void *p, unsigned v) noexcept {
|
REQUIRE_XE32
|
||||||
|
inline 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
|
||||||
set_ne32(p, (get_ne32(p) & ne32_to_le32(0xfc000000)) |
|
set_ne32(p, (get_ne32(p) & ne32_to_le32(0xfc000000)) |
|
||||||
(ne32_to_le32(v) & ne32_to_le32(0x03ffffff)));
|
(ne32_to_le32(v) & ne32_to_le32(0x03ffffff)));
|
||||||
}
|
}
|
||||||
inline void set_le19_5(void *p, unsigned v) noexcept {
|
REQUIRE_XE32
|
||||||
|
inline 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));
|
||||||
}
|
}
|
||||||
inline void set_le14_5(void *p, unsigned v) noexcept {
|
REQUIRE_XE32
|
||||||
|
inline 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));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -289,17 +300,21 @@ inline void set_le14_5(void *p, unsigned v) noexcept {
|
|||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
|
|
||||||
static forceinline constexpr int sign_extend(unsigned v, unsigned bits) noexcept {
|
static forceinline constexpr int sign_extend(unsigned v, unsigned bits) noexcept {
|
||||||
|
#if (ACC_ARCH_M68K) // no barrel shifter
|
||||||
const unsigned sign_bit = 1u << (bits - 1);
|
const unsigned sign_bit = 1u << (bits - 1);
|
||||||
v &= sign_bit | (sign_bit - 1);
|
return ACC_ICAST(int, (v & (sign_bit - 1)) - (v & sign_bit));
|
||||||
v |= 0u - (v & sign_bit);
|
#else
|
||||||
return ACC_ICAST(int, v);
|
return ACC_ICAST(int, v << (32 - bits)) >> (32 - bits);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
static forceinline constexpr upx_int64_t sign_extend(upx_uint64_t v, unsigned bits) noexcept {
|
static forceinline constexpr upx_int64_t sign_extend(upx_uint64_t v, unsigned bits) noexcept {
|
||||||
|
#if (ACC_ARCH_M68K) // no barrel shifter
|
||||||
const upx_uint64_t sign_bit = 1ull << (bits - 1);
|
const upx_uint64_t sign_bit = 1ull << (bits - 1);
|
||||||
v &= sign_bit | (sign_bit - 1);
|
return ACC_ICAST(upx_int64_t, (v & (sign_bit - 1)) - (v & sign_bit));
|
||||||
v |= 0ull - (v & sign_bit);
|
#else
|
||||||
return ACC_ICAST(upx_int64_t, v);
|
return ACC_ICAST(upx_int64_t, v << (64 - bits)) >> (64 - bits);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
REQUIRE_XE16
|
REQUIRE_XE16
|
||||||
@@ -714,10 +729,27 @@ T *operator+(T *ptr, const LE64 &v) noexcept DELETED_FUNCTION;
|
|||||||
template <class T>
|
template <class T>
|
||||||
T *operator-(T *ptr, const LE64 &v) noexcept DELETED_FUNCTION;
|
T *operator-(T *ptr, const LE64 &v) noexcept DELETED_FUNCTION;
|
||||||
|
|
||||||
|
#if !ALLOW_INT_PLUS_MEMBUFFER
|
||||||
|
template <class T>
|
||||||
|
T *operator+(const BE16 &v, T *ptr) noexcept DELETED_FUNCTION;
|
||||||
|
template <class T>
|
||||||
|
T *operator+(const BE32 &v, T *ptr) noexcept DELETED_FUNCTION;
|
||||||
|
template <class T>
|
||||||
|
T *operator+(const LE16 &v, T *ptr) noexcept DELETED_FUNCTION;
|
||||||
|
template <class T>
|
||||||
|
T *operator+(const LE32 &v, T *ptr) noexcept DELETED_FUNCTION;
|
||||||
|
#endif // ALLOW_INT_PLUS_MEMBUFFER
|
||||||
|
|
||||||
|
template <class T>
|
||||||
|
T *operator+(const BE64 &v, T *ptr) noexcept DELETED_FUNCTION;
|
||||||
|
template <class T>
|
||||||
|
T *operator+(const LE64 &v, T *ptr) noexcept DELETED_FUNCTION;
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
// global overloads
|
// global overloads
|
||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
|
|
||||||
|
// TODO later: move these to upx namespace in util/cxxlib.h; see conf.h
|
||||||
inline unsigned ALIGN_DOWN(unsigned a, const BE32 &b) { return ALIGN_DOWN(a, unsigned(b)); }
|
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_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(unsigned a, const BE32 &b) { return ALIGN_UP(a, unsigned(b)); }
|
||||||
@@ -728,7 +760,7 @@ inline unsigned ALIGN_DOWN(const LE32 &a, unsigned b) { return ALIGN_DOWN(unsign
|
|||||||
inline unsigned ALIGN_UP(unsigned a, const LE32 &b) { return ALIGN_UP(a, unsigned(b)); }
|
inline unsigned ALIGN_UP(unsigned a, const LE32 &b) { return ALIGN_UP(a, unsigned(b)); }
|
||||||
inline unsigned ALIGN_UP(const LE32 &a, unsigned b) { return ALIGN_UP(unsigned(a), b); }
|
inline unsigned ALIGN_UP(const LE32 &a, unsigned b) { return ALIGN_UP(unsigned(a), b); }
|
||||||
|
|
||||||
// TODO: introduce upx::umax() and upx::umin()
|
// TODO later: introduce upx::umax() and upx::umin()
|
||||||
inline unsigned UPX_MAX(unsigned a, const BE16 &b) { return UPX_MAX(a, unsigned(b)); }
|
inline unsigned UPX_MAX(unsigned a, const BE16 &b) { return UPX_MAX(a, unsigned(b)); }
|
||||||
inline unsigned UPX_MAX(const BE16 &a, unsigned b) { return UPX_MAX(unsigned(a), b); }
|
inline unsigned UPX_MAX(const BE16 &a, unsigned b) { return UPX_MAX(unsigned(a), b); }
|
||||||
inline unsigned UPX_MIN(unsigned a, const BE16 &b) { return UPX_MIN(a, unsigned(b)); }
|
inline unsigned UPX_MIN(unsigned a, const BE16 &b) { return UPX_MIN(a, unsigned(b)); }
|
||||||
@@ -753,6 +785,24 @@ inline unsigned UPX_MIN(const LE32 &a, unsigned b) { return UPX_MIN(unsigned(a),
|
|||||||
// misc support
|
// misc support
|
||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
|
|
||||||
|
// <type_traits> upx_is_integral; see conf.h
|
||||||
|
#define TT_UPX_IS_INTEGRAL(T) \
|
||||||
|
template <> \
|
||||||
|
struct upx_is_integral<T> : public std::true_type {}; \
|
||||||
|
template <> \
|
||||||
|
struct upx_is_integral<const T> : public std::true_type {}; \
|
||||||
|
template <> \
|
||||||
|
struct upx_is_integral<volatile T> : public std::true_type {}; \
|
||||||
|
template <> \
|
||||||
|
struct upx_is_integral<const volatile T> : public std::true_type {}
|
||||||
|
TT_UPX_IS_INTEGRAL(BE16);
|
||||||
|
TT_UPX_IS_INTEGRAL(BE32);
|
||||||
|
TT_UPX_IS_INTEGRAL(BE64);
|
||||||
|
TT_UPX_IS_INTEGRAL(LE16);
|
||||||
|
TT_UPX_IS_INTEGRAL(LE32);
|
||||||
|
TT_UPX_IS_INTEGRAL(LE64);
|
||||||
|
#undef TT_UPX_IS_INTEGRAL
|
||||||
|
|
||||||
// native types
|
// native types
|
||||||
#if (ACC_ABI_BIG_ENDIAN)
|
#if (ACC_ABI_BIG_ENDIAN)
|
||||||
typedef BE16 NE16;
|
typedef BE16 NE16;
|
||||||
@@ -776,24 +826,6 @@ typedef LE64 NE64;
|
|||||||
#define ne64_compare_signed le64_compare_signed
|
#define ne64_compare_signed le64_compare_signed
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// <type_traits> upx_is_integral
|
|
||||||
#define TT_IS_INTEGRAL(T) \
|
|
||||||
template <> \
|
|
||||||
struct upx_is_integral<T> : public std::true_type {}; \
|
|
||||||
template <> \
|
|
||||||
struct upx_is_integral<const T> : public std::true_type {}; \
|
|
||||||
template <> \
|
|
||||||
struct upx_is_integral<volatile T> : public std::true_type {}; \
|
|
||||||
template <> \
|
|
||||||
struct upx_is_integral<const volatile T> : public std::true_type {}
|
|
||||||
TT_IS_INTEGRAL(BE16);
|
|
||||||
TT_IS_INTEGRAL(BE32);
|
|
||||||
TT_IS_INTEGRAL(BE64);
|
|
||||||
TT_IS_INTEGRAL(LE16);
|
|
||||||
TT_IS_INTEGRAL(LE32);
|
|
||||||
TT_IS_INTEGRAL(LE64);
|
|
||||||
#undef TT_IS_INTEGRAL
|
|
||||||
|
|
||||||
// for use with qsort()
|
// for use with qsort()
|
||||||
extern "C" {
|
extern "C" {
|
||||||
int __acc_cdecl_qsort be16_compare(const void *, const void *);
|
int __acc_cdecl_qsort be16_compare(const void *, const void *);
|
||||||
|
|||||||
+21
-27
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2023 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2024 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2023 Laszlo Molnar
|
Copyright (C) 1996-2024 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,14 +33,16 @@
|
|||||||
|
|
||||||
#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
|
||||||
#define S static int __acc_cdecl_qsort
|
#define VV static forceinline_constexpr
|
||||||
#define C noexcept
|
#define S static int __acc_cdecl_qsort
|
||||||
|
#define C noexcept
|
||||||
#elif defined(BELE_RTP)
|
#elif defined(BELE_RTP)
|
||||||
// RTP - Run-Time Polymorphism (virtual functions)
|
// RTP - Run-Time Polymorphism (virtual functions)
|
||||||
#define V virtual
|
#define V virtual
|
||||||
#define S virtual int
|
#define VV virtual
|
||||||
#define C const noexcept
|
#define S virtual int
|
||||||
|
#define C const noexcept
|
||||||
#else
|
#else
|
||||||
#error
|
#error
|
||||||
#endif
|
#endif
|
||||||
@@ -79,12 +81,9 @@ struct AbstractPolicy {
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
// disable copy and move
|
// disable copy and move
|
||||||
AbstractPolicy(const AbstractPolicy &) DELETED_FUNCTION;
|
UPX_CXX_DISABLE_COPY_MOVE(AbstractPolicy)
|
||||||
AbstractPolicy &operator=(const AbstractPolicy &) DELETED_FUNCTION;
|
|
||||||
AbstractPolicy(AbstractPolicy &&) noexcept DELETED_FUNCTION;
|
|
||||||
AbstractPolicy &operator=(AbstractPolicy &&) noexcept DELETED_FUNCTION;
|
|
||||||
// disable dynamic allocation
|
// disable dynamic allocation
|
||||||
ACC_CXX_DISABLE_NEW_DELETE
|
UPX_CXX_DISABLE_NEW_DELETE(AbstractPolicy)
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -104,8 +103,8 @@ struct BEPolicy
|
|||||||
#elif defined(BELE_RTP)
|
#elif defined(BELE_RTP)
|
||||||
typedef N_BELE_CTP::BEPolicy CTP_Policy;
|
typedef N_BELE_CTP::BEPolicy CTP_Policy;
|
||||||
#endif
|
#endif
|
||||||
V bool isBE() C { return true; }
|
VV bool isBE() C { return true; }
|
||||||
V bool isLE() C { return false; }
|
VV bool isLE() C { return false; }
|
||||||
|
|
||||||
typedef BE16 U16;
|
typedef BE16 U16;
|
||||||
typedef BE32 U32;
|
typedef BE32 U32;
|
||||||
@@ -147,12 +146,9 @@ struct BEPolicy
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
// disable copy and move
|
// disable copy and move
|
||||||
BEPolicy(const BEPolicy &) DELETED_FUNCTION;
|
UPX_CXX_DISABLE_COPY_MOVE(BEPolicy)
|
||||||
BEPolicy &operator=(const BEPolicy &) DELETED_FUNCTION;
|
|
||||||
BEPolicy(BEPolicy &&) noexcept DELETED_FUNCTION;
|
|
||||||
BEPolicy &operator=(BEPolicy &&) noexcept DELETED_FUNCTION;
|
|
||||||
// disable dynamic allocation
|
// disable dynamic allocation
|
||||||
ACC_CXX_DISABLE_NEW_DELETE
|
UPX_CXX_DISABLE_NEW_DELETE(BEPolicy)
|
||||||
};
|
};
|
||||||
|
|
||||||
struct LEPolicy
|
struct LEPolicy
|
||||||
@@ -166,8 +162,8 @@ struct LEPolicy
|
|||||||
#elif defined(BELE_RTP)
|
#elif defined(BELE_RTP)
|
||||||
typedef N_BELE_CTP::LEPolicy CTP_Policy;
|
typedef N_BELE_CTP::LEPolicy CTP_Policy;
|
||||||
#endif
|
#endif
|
||||||
V bool isBE() C { return false; }
|
VV bool isBE() C { return false; }
|
||||||
V bool isLE() C { return true; }
|
VV bool isLE() C { return true; }
|
||||||
|
|
||||||
typedef LE16 U16;
|
typedef LE16 U16;
|
||||||
typedef LE32 U32;
|
typedef LE32 U32;
|
||||||
@@ -209,12 +205,9 @@ struct LEPolicy
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
// disable copy and move
|
// disable copy and move
|
||||||
LEPolicy(const LEPolicy &) DELETED_FUNCTION;
|
UPX_CXX_DISABLE_COPY_MOVE(LEPolicy)
|
||||||
LEPolicy &operator=(const LEPolicy &) DELETED_FUNCTION;
|
|
||||||
LEPolicy(LEPolicy &&) noexcept DELETED_FUNCTION;
|
|
||||||
LEPolicy &operator=(LEPolicy &&) noexcept DELETED_FUNCTION;
|
|
||||||
// disable dynamic allocation
|
// disable dynamic allocation
|
||||||
ACC_CXX_DISABLE_NEW_DELETE
|
UPX_CXX_DISABLE_NEW_DELETE(LEPolicy)
|
||||||
};
|
};
|
||||||
|
|
||||||
// Native Endianness policy (aka host policy)
|
// Native Endianness policy (aka host policy)
|
||||||
@@ -229,6 +222,7 @@ typedef LEPolicy HostPolicy;
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#undef V
|
#undef V
|
||||||
|
#undef VV
|
||||||
#undef S
|
#undef S
|
||||||
#undef C
|
#undef C
|
||||||
|
|
||||||
|
|||||||
+138
-13
@@ -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-2023 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2024 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
|
||||||
@@ -24,6 +24,8 @@
|
|||||||
<markus@oberhumer.com>
|
<markus@oberhumer.com>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include "../util/system_headers.h"
|
||||||
|
#include <cmath> // std::isinf std::isnan
|
||||||
#include "../conf.h"
|
#include "../conf.h"
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
@@ -42,10 +44,7 @@ int upx_doctest_check(int argc, char **argv) {
|
|||||||
UNUSED(argv);
|
UNUSED(argv);
|
||||||
return 0;
|
return 0;
|
||||||
#else
|
#else
|
||||||
const char *e = getenv("UPX_DEBUG_DOCTEST_DISABLE");
|
if (is_envvar_true("UPX_DEBUG_DOCTEST_DISABLE", "UPX_DEBUG_DISABLE_DOCTEST"))
|
||||||
if (!e)
|
|
||||||
e = getenv("UPX_DEBUG_DISABLE_DOCTEST"); // allow alternate spelling
|
|
||||||
if (e && e[0] && strcmp(e, "0") != 0)
|
|
||||||
return 0;
|
return 0;
|
||||||
bool minimal = true; // don't show summary
|
bool minimal = true; // don't show summary
|
||||||
bool duration = false; // don't show timings
|
bool duration = false; // don't show timings
|
||||||
@@ -54,7 +53,7 @@ int upx_doctest_check(int argc, char **argv) {
|
|||||||
// default for debug builds: do show the [doctest] summary
|
// default for debug builds: do show the [doctest] summary
|
||||||
minimal = false;
|
minimal = false;
|
||||||
#endif
|
#endif
|
||||||
e = getenv("UPX_DEBUG_DOCTEST_VERBOSE");
|
const char *e = getenv("UPX_DEBUG_DOCTEST_VERBOSE");
|
||||||
if (e && e[0]) {
|
if (e && e[0]) {
|
||||||
if (strcmp(e, "0") == 0) {
|
if (strcmp(e, "0") == 0) {
|
||||||
minimal = true;
|
minimal = true;
|
||||||
@@ -125,6 +124,8 @@ ACC_COMPILE_TIME_ASSERT_HEADER(sign_extend(0u + 257, 8) == 1)
|
|||||||
ACC_COMPILE_TIME_ASSERT_HEADER(sign_extend(0u + 383, 8) == 127)
|
ACC_COMPILE_TIME_ASSERT_HEADER(sign_extend(0u + 383, 8) == 127)
|
||||||
ACC_COMPILE_TIME_ASSERT_HEADER(sign_extend(0u + 384, 8) == -128)
|
ACC_COMPILE_TIME_ASSERT_HEADER(sign_extend(0u + 384, 8) == -128)
|
||||||
ACC_COMPILE_TIME_ASSERT_HEADER(sign_extend(0u + 511, 8) == -1)
|
ACC_COMPILE_TIME_ASSERT_HEADER(sign_extend(0u + 511, 8) == -1)
|
||||||
|
ACC_COMPILE_TIME_ASSERT_HEADER(sign_extend(0ull + 0, 1) == 0)
|
||||||
|
ACC_COMPILE_TIME_ASSERT_HEADER(sign_extend(0ull + 1, 1) == -1)
|
||||||
|
|
||||||
ACC_COMPILE_TIME_ASSERT_HEADER(CHAR_BIT == 8)
|
ACC_COMPILE_TIME_ASSERT_HEADER(CHAR_BIT == 8)
|
||||||
#if 0 // does not work with MSVC
|
#if 0 // does not work with MSVC
|
||||||
@@ -321,6 +322,10 @@ struct TestIntegerWrap {
|
|||||||
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(0) - x == x; }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
//
|
||||||
|
// basic exception handling checks to early catch toolchain/qemu/wine/etc problems
|
||||||
|
//
|
||||||
|
|
||||||
static noinline void throwSomeValue(int x) may_throw {
|
static noinline void throwSomeValue(int x) may_throw {
|
||||||
if (x < 0)
|
if (x < 0)
|
||||||
throw int(x);
|
throw int(x);
|
||||||
@@ -340,28 +345,97 @@ static noinline void check_basic_cxx_exception_handling(void (*func)(int)) noexc
|
|||||||
assert_noexcept(cxx_exception_handling_works);
|
assert_noexcept(cxx_exception_handling_works);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// basic floating point checks to early catch toolchain/qemu/wine/etc problems
|
||||||
|
//
|
||||||
|
|
||||||
|
static noinline float i64_f32_add_div(upx_int64_t a, upx_int64_t b) { return (a + b) / 1000000.0f; }
|
||||||
|
static noinline float u64_f32_add_div(upx_uint64_t a, upx_uint64_t b) {
|
||||||
|
return (a + b) / 1000000.0f;
|
||||||
|
}
|
||||||
|
static noinline float i64_f32_sub_div(upx_int64_t a, upx_int64_t b) { return (a - b) / 1000000.0f; }
|
||||||
|
static noinline float u64_f32_sub_div(upx_uint64_t a, upx_uint64_t b) {
|
||||||
|
return (a - b) / 1000000.0f;
|
||||||
|
}
|
||||||
|
|
||||||
|
static noinline double i64_f64_add_div(upx_int64_t a, upx_int64_t b) { return (a + b) / 1000000.0; }
|
||||||
|
static noinline double u64_f64_add_div(upx_uint64_t a, upx_uint64_t b) {
|
||||||
|
return (a + b) / 1000000.0;
|
||||||
|
}
|
||||||
|
static noinline double i64_f64_sub_div(upx_int64_t a, upx_int64_t b) { return (a - b) / 1000000.0; }
|
||||||
|
static noinline double u64_f64_sub_div(upx_uint64_t a, upx_uint64_t b) {
|
||||||
|
return (a - b) / 1000000.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class Int, class Float>
|
||||||
|
struct TestFloat {
|
||||||
|
static constexpr Int X = 1000000;
|
||||||
|
static noinline Float div(Int a, Float f) { return a / f; }
|
||||||
|
static noinline Float add_div(Int a, Int b, Float f) { return Float(a + b) / f; }
|
||||||
|
static noinline Float sub_div(Int a, Int b, Float f) { return Float(a - b) / f; }
|
||||||
|
static noinline Float add_div_x(Int a, Int b) { return Float(a + b) / Float(X); }
|
||||||
|
static noinline Float sub_div_x(Int a, Int b) { return Float(a - b) / Float(X); }
|
||||||
|
static noinline void check() noexcept {
|
||||||
|
assert_noexcept(add_div(X, X, Float(X)) == Float(2));
|
||||||
|
assert_noexcept(add_div_x(X, X) == Float(2));
|
||||||
|
assert_noexcept(sub_div(3 * X, X, Float(X)) == Float(2));
|
||||||
|
assert_noexcept(sub_div_x(3 * X, X) == Float(2));
|
||||||
|
// extra debugging; floating point edge cases cause portability problems in practice
|
||||||
|
if (is_envvar_true("UPX_DEBUG_TEST_FLOAT_DIVISION_BY_ZERO")) {
|
||||||
|
#if defined(__clang__) && defined(__FAST_MATH__) && defined(__INTEL_LLVM_COMPILER)
|
||||||
|
// warning: comparison with NaN always evaluates to false in fast floating point modes
|
||||||
|
fprintf(stderr, "upx: WARNING: ignoring UPX_DEBUG_TEST_FLOAT_DIVISION_BY_ZERO\n");
|
||||||
|
#elif defined(__clang__) && (__clang_major__ < 9) && defined(__SANITIZE_UNDEFINED_BEHAVIOR__)
|
||||||
|
// @COMPILER_BUG @CLANG_BUG
|
||||||
|
fprintf(stderr, "upx: WARNING: ignoring UPX_DEBUG_TEST_FLOAT_DIVISION_BY_ZERO\n");
|
||||||
|
#else
|
||||||
|
assert_noexcept(std::isnan(div(0, Float(0))));
|
||||||
|
assert_noexcept(std::isinf(div(1, Float(0))));
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
static noinline void check_basic_floating_point(void) noexcept {
|
||||||
|
assert_noexcept(i64_f32_add_div(1000000, 1000000) == 2.0f);
|
||||||
|
assert_noexcept(u64_f32_add_div(1000000, 1000000) == 2.0f);
|
||||||
|
assert_noexcept(i64_f32_sub_div(3000000, 1000000) == 2.0f);
|
||||||
|
assert_noexcept(u64_f32_sub_div(3000000, 1000000) == 2.0f);
|
||||||
|
assert_noexcept(i64_f64_add_div(1000000, 1000000) == 2.0);
|
||||||
|
assert_noexcept(u64_f64_add_div(1000000, 1000000) == 2.0);
|
||||||
|
assert_noexcept(i64_f64_sub_div(3000000, 1000000) == 2.0);
|
||||||
|
assert_noexcept(u64_f64_sub_div(3000000, 1000000) == 2.0);
|
||||||
|
TestFloat<upx_int32_t, float>::check();
|
||||||
|
TestFloat<upx_uint32_t, float>::check();
|
||||||
|
TestFloat<upx_int64_t, float>::check();
|
||||||
|
TestFloat<upx_uint64_t, float>::check();
|
||||||
|
TestFloat<upx_int32_t, double>::check();
|
||||||
|
TestFloat<upx_uint32_t, double>::check();
|
||||||
|
TestFloat<upx_int64_t, double>::check();
|
||||||
|
TestFloat<upx_uint64_t, double>::check();
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
#define ACC_WANT_ACC_CHK_CH 1
|
#define ACC_WANT_ACC_CHK_CH 1
|
||||||
#undef ACCCHK_ASSERT
|
#undef ACCCHK_ASSERT
|
||||||
#include "../miniacc.h"
|
#include "../util/miniacc.h"
|
||||||
|
|
||||||
void upx_compiler_sanity_check(void) noexcept {
|
void upx_compiler_sanity_check(void) noexcept {
|
||||||
const char *e = getenv("UPX_DEBUG_DOCTEST_DISABLE");
|
if (is_envvar_true("UPX_DEBUG_DOCTEST_DISABLE", "UPX_DEBUG_DISABLE_DOCTEST")) {
|
||||||
if (!e)
|
|
||||||
e = getenv("UPX_DEBUG_DISABLE_DOCTEST"); // allow alternate spelling
|
|
||||||
if (e && e[0] && strcmp(e, "0") != 0) {
|
|
||||||
// If UPX_DEBUG_DOCTEST_DISABLE is set then we don't want to throw any
|
// If UPX_DEBUG_DOCTEST_DISABLE is set then we don't want to throw any
|
||||||
// exceptions in order to improve debugging experience.
|
// exceptions in order to improve debugging experience.
|
||||||
} else {
|
} else {
|
||||||
// check working C++ exception handling to catch toolchain/qemu/wine/etc problems
|
// check working C++ exception handling to early catch toolchain/qemu/wine/etc problems
|
||||||
check_basic_cxx_exception_handling(throwSomeValue);
|
check_basic_cxx_exception_handling(throwSomeValue);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
check_basic_floating_point();
|
||||||
|
|
||||||
#define ACC_WANT_ACC_CHK_CH 1
|
#define ACC_WANT_ACC_CHK_CH 1
|
||||||
#undef ACCCHK_ASSERT
|
#undef ACCCHK_ASSERT
|
||||||
#define ACCCHK_ASSERT(expr) ACC_COMPILE_TIME_ASSERT(expr)
|
#define ACCCHK_ASSERT(expr) ACC_COMPILE_TIME_ASSERT(expr)
|
||||||
#include "../miniacc.h"
|
#include "../util/miniacc.h"
|
||||||
#undef ACCCHK_ASSERT
|
#undef ACCCHK_ASSERT
|
||||||
|
|
||||||
COMPILE_TIME_ASSERT(sizeof(char) == 1)
|
COMPILE_TIME_ASSERT(sizeof(char) == 1)
|
||||||
@@ -468,6 +542,38 @@ void upx_compiler_sanity_check(void) noexcept {
|
|||||||
assert_noexcept(get_be32_signed(d) == 2138996092);
|
assert_noexcept(get_be32_signed(d) == 2138996092);
|
||||||
assert_noexcept(get_be64_signed(d) == 9186918263483431288LL);
|
assert_noexcept(get_be64_signed(d) == 9186918263483431288LL);
|
||||||
}
|
}
|
||||||
|
#if DEBUG >= 1
|
||||||
|
{
|
||||||
|
for (int i = 0; i < 256; i++) {
|
||||||
|
{
|
||||||
|
const unsigned u = i;
|
||||||
|
assert_noexcept(sign_extend(u, 1) == ((i & 1) ? -1 : 0));
|
||||||
|
assert_noexcept(sign_extend(u, 2) == ((i & 2) ? -2 + (i & 1) : (i & 1)));
|
||||||
|
assert_noexcept(sign_extend(u, 3) == ((i & 4) ? -4 + (i & 3) : (i & 3)));
|
||||||
|
assert_noexcept(sign_extend(u, 4) == ((i & 8) ? -8 + (i & 7) : (i & 7)));
|
||||||
|
assert_noexcept(sign_extend(u, 5) == ((i & 16) ? -16 + (i & 15) : (i & 15)));
|
||||||
|
assert_noexcept(sign_extend(u, 6) == ((i & 32) ? -32 + (i & 31) : (i & 31)));
|
||||||
|
assert_noexcept(sign_extend(u, 7) == ((i & 64) ? -64 + (i & 63) : (i & 63)));
|
||||||
|
assert_noexcept(sign_extend(u, 8) == ((i & 128) ? -128 + (i & 127) : (i & 127)));
|
||||||
|
assert_noexcept(sign_extend(u, 32) == i);
|
||||||
|
assert_noexcept(sign_extend(0u - u, 32) == -i);
|
||||||
|
}
|
||||||
|
{
|
||||||
|
const upx_uint64_t u = i;
|
||||||
|
assert_noexcept(sign_extend(u, 1) == ((i & 1) ? -1 : 0));
|
||||||
|
assert_noexcept(sign_extend(u, 2) == ((i & 2) ? -2 + (i & 1) : (i & 1)));
|
||||||
|
assert_noexcept(sign_extend(u, 3) == ((i & 4) ? -4 + (i & 3) : (i & 3)));
|
||||||
|
assert_noexcept(sign_extend(u, 4) == ((i & 8) ? -8 + (i & 7) : (i & 7)));
|
||||||
|
assert_noexcept(sign_extend(u, 5) == ((i & 16) ? -16 + (i & 15) : (i & 15)));
|
||||||
|
assert_noexcept(sign_extend(u, 6) == ((i & 32) ? -32 + (i & 31) : (i & 31)));
|
||||||
|
assert_noexcept(sign_extend(u, 7) == ((i & 64) ? -64 + (i & 63) : (i & 63)));
|
||||||
|
assert_noexcept(sign_extend(u, 8) == ((i & 128) ? -128 + (i & 127) : (i & 127)));
|
||||||
|
assert_noexcept(sign_extend(u, 64) == i);
|
||||||
|
assert_noexcept(sign_extend(0ull - u, 64) == -i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
{
|
{
|
||||||
unsigned dd;
|
unsigned dd;
|
||||||
void *const d = ⅆ
|
void *const d = ⅆ
|
||||||
@@ -564,6 +670,17 @@ TEST_CASE("acc_vget") {
|
|||||||
CHECK_EQ(acc_vget_acc_hvoid_p(nullptr, 0), nullptr);
|
CHECK_EQ(acc_vget_acc_hvoid_p(nullptr, 0), nullptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST_CASE("ptr_invalidate_and_poison") {
|
||||||
|
int *ip = nullptr;
|
||||||
|
ptr_invalidate_and_poison(ip);
|
||||||
|
assert(ip != nullptr);
|
||||||
|
(void) ip;
|
||||||
|
double *dp; // not initialized
|
||||||
|
ptr_invalidate_and_poison(dp);
|
||||||
|
assert(dp != nullptr);
|
||||||
|
(void) dp;
|
||||||
|
}
|
||||||
|
|
||||||
TEST_CASE("working -fno-strict-aliasing") {
|
TEST_CASE("working -fno-strict-aliasing") {
|
||||||
bool ok;
|
bool ok;
|
||||||
long v = 0;
|
long v = 0;
|
||||||
@@ -624,6 +741,14 @@ TEST_CASE("libc snprintf") {
|
|||||||
CHECK_EQ(strcmp(buf, "-6.0.0.0.0.0.0.0.6.ffffffffffffffff"), 0);
|
CHECK_EQ(strcmp(buf, "-6.0.0.0.0.0.0.0.6.ffffffffffffffff"), 0);
|
||||||
snprintf(buf, sizeof(buf), "%d.%d.%d.%d.%d.%d.%d.%d.%d.%#jx", -7, 0, 0, 0, 0, 0, 0, 0, 7, um);
|
snprintf(buf, sizeof(buf), "%d.%d.%d.%d.%d.%d.%d.%d.%d.%#jx", -7, 0, 0, 0, 0, 0, 0, 0, 7, um);
|
||||||
CHECK_EQ(strcmp(buf, "-7.0.0.0.0.0.0.0.7.0xffffffffffffffff"), 0);
|
CHECK_EQ(strcmp(buf, "-7.0.0.0.0.0.0.0.7.0xffffffffffffffff"), 0);
|
||||||
|
snprintf(buf, sizeof(buf), "%#X %#lx %#llx", 26u, 27ul, 28ull);
|
||||||
|
CHECK_EQ(strcmp(buf, "0X1A 0x1b 0x1c"), 0);
|
||||||
|
snprintf(buf, sizeof(buf), "%#06x %#06lX %#06llx", 26u, 27ul, 28ull);
|
||||||
|
CHECK_EQ(strcmp(buf, "0x001a 0X001B 0x001c"), 0);
|
||||||
|
snprintf(buf, sizeof(buf), "%#6x %#6lx %#6llX", 26u, 27ul, 28ull);
|
||||||
|
CHECK_EQ(strcmp(buf, " 0x1a 0x1b 0X1C"), 0);
|
||||||
|
snprintf(buf, sizeof(buf), "%#-6X %#-6lx %#-6llx", 26u, 27ul, 28ull);
|
||||||
|
CHECK_EQ(strcmp(buf, "0X1A 0x1b 0x1c "), 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
|
|||||||
+331
-49
@@ -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-2023 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2024 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
|
||||||
@@ -24,6 +24,27 @@
|
|||||||
<markus@oberhumer.com>
|
<markus@oberhumer.com>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
// lots of tests (and probably quite a number of redundant tests)
|
||||||
|
// modern compilers will optimize away much of this code
|
||||||
|
|
||||||
|
#if 0 // TODO later
|
||||||
|
// libc++ hardenining
|
||||||
|
#if defined(__clang__) && defined(__clang_major__) && (__clang_major__ + 0 >= 18)
|
||||||
|
#if DEBUG
|
||||||
|
#define _LIBCPP_HARDENING_MODE _LIBCPP_HARDENING_MODE_DEBUG
|
||||||
|
#else
|
||||||
|
#define _LIBCPP_HARDENING_MODE _LIBCPP_HARDENING_MODE_EXTENSIVE
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#if defined(__clang__) && defined(__clang_major__) && (__clang_major__ + 0 < 18)
|
||||||
|
#if DEBUG
|
||||||
|
#define _LIBCPP_ENABLE_ASSERTIONS 1
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#endif // TODO later
|
||||||
|
|
||||||
|
#include "../util/system_headers.h"
|
||||||
|
#include <vector>
|
||||||
#include "../conf.h"
|
#include "../conf.h"
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
@@ -46,16 +67,32 @@ 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, char>) )
|
||||||
ACC_COMPILE_TIME_ASSERT_HEADER((!upx::is_same_any_v<int, char, long>) )
|
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(int) == sizeof(int))
|
||||||
ACC_COMPILE_TIME_ASSERT_HEADER(usizeof('a') == sizeof(char))
|
ACC_COMPILE_TIME_ASSERT_HEADER(usizeof('a') == sizeof(char))
|
||||||
ACC_COMPILE_TIME_ASSERT_HEADER(usizeof("") == 1)
|
ACC_COMPILE_TIME_ASSERT_HEADER(usizeof("") == 1)
|
||||||
ACC_COMPILE_TIME_ASSERT_HEADER(usizeof("a") == 2)
|
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(0) == sizeof(int))
|
||||||
ACC_COMPILE_TIME_ASSERT_HEADER(usizeof(0L) == sizeof(long))
|
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(0LL) == sizeof(long long))
|
||||||
ACC_COMPILE_TIME_ASSERT_HEADER(usizeof(nullptr) == sizeof(void *))
|
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(sizeof(0)) == sizeof(size_t))
|
||||||
ACC_COMPILE_TIME_ASSERT_HEADER(usizeof(usizeof(0)) == sizeof(unsigned))
|
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;
|
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("") == 0)
|
||||||
@@ -84,11 +121,223 @@ 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_ge("abc", "abz"))
|
||||||
ACC_COMPILE_TIME_ASSERT_HEADER(compile_time::string_le("abc", "abz"))
|
ACC_COMPILE_TIME_ASSERT_HEADER(compile_time::string_le("abc", "abz"))
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
//
|
||||||
|
**************************************************************************/
|
||||||
|
|
||||||
|
TEST_CASE("libc++") {
|
||||||
|
constexpr size_t N = 16;
|
||||||
|
std::vector<int> v(N);
|
||||||
|
CHECK(v.end() - v.begin() == N);
|
||||||
|
CHECK(&v[0] == &(*(v.begin())));
|
||||||
|
// CHECK(&v[0] + N == &(*(v.end()))); // TODO later: is this legal??
|
||||||
|
// TODO later: make sure that this throws
|
||||||
|
#if defined(_LIBCPP_HARDENING_MODE_DEBUG) && \
|
||||||
|
(_LIBCPP_HARDENING_MODE == _LIBCPP_HARDENING_MODE_DEBUG)
|
||||||
|
CHECK_THROWS((void) &v[N]);
|
||||||
|
#endif
|
||||||
|
UNUSED(v);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
// UPX_CXX_DISABLE_xxx
|
||||||
|
**************************************************************************/
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
template <class TA, class TB, int TC = 0>
|
||||||
|
struct MyType1 {
|
||||||
|
MyType1() noexcept {}
|
||||||
|
UPX_CXX_DISABLE_ADDRESS(MyType1)
|
||||||
|
UPX_CXX_DISABLE_COPY_MOVE(MyType1)
|
||||||
|
UPX_CXX_DISABLE_NEW_DELETE_NO_VIRTUAL(MyType1)
|
||||||
|
};
|
||||||
|
template <class TA, class TB, int TC = 0>
|
||||||
|
struct MyType2 {
|
||||||
|
MyType2() noexcept {}
|
||||||
|
UPX_CXX_DISABLE_COPY_MOVE(MyType2)
|
||||||
|
typedef MyType2<TA, TB, TC> Self;
|
||||||
|
UPX_CXX_DISABLE_ADDRESS(Self)
|
||||||
|
UPX_CXX_DISABLE_NEW_DELETE_NO_VIRTUAL(Self)
|
||||||
|
};
|
||||||
|
template <class TA, class TB, int TC = 0>
|
||||||
|
struct MyVType1 {
|
||||||
|
MyVType1() noexcept {}
|
||||||
|
virtual ~MyVType1() noexcept {}
|
||||||
|
UPX_CXX_DISABLE_ADDRESS(MyVType1)
|
||||||
|
UPX_CXX_DISABLE_COPY_MOVE(MyVType1)
|
||||||
|
UPX_CXX_DISABLE_NEW_DELETE(MyVType1)
|
||||||
|
};
|
||||||
|
template <class TA, class TB, int TC = 0>
|
||||||
|
struct MyVType2 {
|
||||||
|
MyVType2() noexcept {}
|
||||||
|
virtual ~MyVType2() noexcept {}
|
||||||
|
UPX_CXX_DISABLE_COPY_MOVE(MyVType2)
|
||||||
|
typedef MyVType2<TA, TB, TC> Self;
|
||||||
|
UPX_CXX_DISABLE_ADDRESS(Self)
|
||||||
|
UPX_CXX_DISABLE_NEW_DELETE(Self)
|
||||||
|
};
|
||||||
|
TEST_CASE("UPX_CXX_DISABLE_xxx") {
|
||||||
|
MyType1<char, int, 1> dummy1;
|
||||||
|
MyType2<char, int, 2> dummy2;
|
||||||
|
MyVType1<char, int, 1> vdummy1;
|
||||||
|
MyVType2<char, int, 2> vdummy2;
|
||||||
|
(void) dummy1;
|
||||||
|
(void) dummy2;
|
||||||
|
(void) vdummy1;
|
||||||
|
(void) vdummy2;
|
||||||
|
}
|
||||||
|
} // namespace
|
||||||
|
|
||||||
|
namespace test_disable_new_delete {
|
||||||
|
|
||||||
|
struct A1 {
|
||||||
|
int a;
|
||||||
|
};
|
||||||
|
struct A2 {
|
||||||
|
int a;
|
||||||
|
UPX_CXX_DISABLE_NEW_DELETE_NO_VIRTUAL(A2)
|
||||||
|
};
|
||||||
|
struct B1_A1 : public A1 {
|
||||||
|
int b;
|
||||||
|
};
|
||||||
|
struct B1_A2 : public A2 {
|
||||||
|
int b;
|
||||||
|
};
|
||||||
|
struct B2_A1 : public A1 {
|
||||||
|
int b;
|
||||||
|
UPX_CXX_DISABLE_NEW_DELETE_NO_VIRTUAL(B2_A1)
|
||||||
|
};
|
||||||
|
struct B2_A2 : public A2 {
|
||||||
|
int b;
|
||||||
|
UPX_CXX_DISABLE_NEW_DELETE_NO_VIRTUAL(B2_A2)
|
||||||
|
};
|
||||||
|
|
||||||
|
struct X1 {
|
||||||
|
virtual ~X1() noexcept {}
|
||||||
|
int x;
|
||||||
|
};
|
||||||
|
struct X2 {
|
||||||
|
virtual ~X2() noexcept {}
|
||||||
|
int x;
|
||||||
|
UPX_CXX_DISABLE_NEW_DELETE(X2)
|
||||||
|
};
|
||||||
|
struct Y1_X1 : public X1 {
|
||||||
|
int y;
|
||||||
|
};
|
||||||
|
struct Y1_X2 : public X2 {
|
||||||
|
int y;
|
||||||
|
};
|
||||||
|
struct Y2_X1 : public X1 {
|
||||||
|
int y;
|
||||||
|
UPX_CXX_DISABLE_NEW_DELETE(Y2_X1)
|
||||||
|
};
|
||||||
|
struct Y2_X2 : public X2 {
|
||||||
|
int y;
|
||||||
|
UPX_CXX_DISABLE_NEW_DELETE(Y2_X2)
|
||||||
|
};
|
||||||
|
struct Z1_X1 : public X1 {
|
||||||
|
virtual ~Z1_X1() noexcept {}
|
||||||
|
int z;
|
||||||
|
};
|
||||||
|
struct Z1_X2 : public X2 {
|
||||||
|
virtual ~Z1_X2() noexcept {}
|
||||||
|
int z;
|
||||||
|
};
|
||||||
|
struct Z2_X1 : public X1 {
|
||||||
|
virtual ~Z2_X1() noexcept {}
|
||||||
|
int z;
|
||||||
|
UPX_CXX_DISABLE_NEW_DELETE(Z2_X1)
|
||||||
|
};
|
||||||
|
struct Z2_X2 : public X2 {
|
||||||
|
virtual ~Z2_X2() noexcept {}
|
||||||
|
int z;
|
||||||
|
UPX_CXX_DISABLE_NEW_DELETE(Z2_X2)
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace test_disable_new_delete
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
// util
|
// util
|
||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
|
|
||||||
TEST_CASE("noncopyable") {
|
TEST_CASE("upx::ObjectDeleter 1") {
|
||||||
|
LE16 *o = nullptr; // object
|
||||||
|
LE32 *a = nullptr; // array
|
||||||
|
{
|
||||||
|
const upx::ObjectDeleter<LE16 **> o_deleter{&o, 1};
|
||||||
|
o = new LE16;
|
||||||
|
assert(o != nullptr);
|
||||||
|
const upx::ArrayDeleter<LE32 **> a_deleter{&a, 1};
|
||||||
|
a = New(LE32, 1);
|
||||||
|
assert(a != nullptr);
|
||||||
|
}
|
||||||
|
assert(o == nullptr);
|
||||||
|
assert(a == nullptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_CASE("upx::ObjectDeleter 2") {
|
||||||
|
constexpr size_t N = 2;
|
||||||
|
BE16 *o[N]; // multiple objects
|
||||||
|
BE32 *a[N]; // multiple arrays
|
||||||
|
{
|
||||||
|
upx::ObjectDeleter<BE16 **> o_deleter{o, 0};
|
||||||
|
upx::ArrayDeleter<BE32 **> a_deleter{a, 0};
|
||||||
|
for (size_t i = 0; i < N; i++) {
|
||||||
|
o[i] = new BE16;
|
||||||
|
assert(o[i] != nullptr);
|
||||||
|
o_deleter.count += 1;
|
||||||
|
a[i] = New(BE32, 1 + i);
|
||||||
|
assert(a[i] != nullptr);
|
||||||
|
a_deleter.count += 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (size_t i = 0; i < N; i++) {
|
||||||
|
assert(o[i] == nullptr);
|
||||||
|
assert(a[i] == nullptr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_CASE("upx::ptr_static_cast") {
|
||||||
|
// check that we don't 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::noncopyable") {
|
||||||
struct Test : private upx::noncopyable {
|
struct Test : private upx::noncopyable {
|
||||||
int v = 1;
|
int v = 1;
|
||||||
};
|
};
|
||||||
@@ -106,13 +355,13 @@ TEST_CASE("noncopyable") {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
// TriBool
|
// TriBool checks
|
||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
template <class T>
|
template <class T>
|
||||||
struct TestTriBool {
|
struct TestTriBool {
|
||||||
static void test(bool expect_true, int x) noexcept {
|
static 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);
|
||||||
static_assert(std::is_nothrow_destructible<T>::value);
|
static_assert(std::is_nothrow_destructible<T>::value);
|
||||||
@@ -126,6 +375,9 @@ struct TestTriBool {
|
|||||||
static_assert(sizeof(T) == sizeof(typename T::underlying_type));
|
static_assert(sizeof(T) == sizeof(typename T::underlying_type));
|
||||||
static_assert(alignof(T) == alignof(typename T::underlying_type));
|
static_assert(alignof(T) == alignof(typename T::underlying_type));
|
||||||
#endif
|
#endif
|
||||||
|
static_assert(!bool(T(false)));
|
||||||
|
static_assert(bool(T(true)));
|
||||||
|
static_assert(bool(T(T::Third)) == T::is_third_true);
|
||||||
static_assert(T(false) == T::False);
|
static_assert(T(false) == T::False);
|
||||||
static_assert(T(true) == T::True);
|
static_assert(T(true) == T::True);
|
||||||
static_assert(T(T::False) == T::False);
|
static_assert(T(T::False) == T::False);
|
||||||
@@ -145,63 +397,93 @@ struct TestTriBool {
|
|||||||
static_assert(array[2].isThird());
|
static_assert(array[2].isThird());
|
||||||
static_assert(sizeof(array) == 3 * sizeof(T));
|
static_assert(sizeof(array) == 3 * sizeof(T));
|
||||||
T a;
|
T a;
|
||||||
CHECK(!a);
|
assert(a.getValue() == T::False);
|
||||||
CHECK(a.isStrictFalse());
|
assert(!a);
|
||||||
CHECK(!a.isStrictTrue());
|
assert(!bool(a));
|
||||||
CHECK(a.isStrictBool());
|
assert((!a ? true : false));
|
||||||
CHECK(!a.isThird());
|
assert(a.isStrictFalse());
|
||||||
|
assert(!a.isStrictTrue());
|
||||||
|
assert(a.isStrictBool());
|
||||||
|
assert(!a.isThird());
|
||||||
a = false;
|
a = false;
|
||||||
CHECK(!a);
|
assert(a.getValue() == T::False);
|
||||||
CHECK(a.isStrictFalse());
|
assert(!a);
|
||||||
CHECK(!a.isStrictTrue());
|
assert(!bool(a));
|
||||||
CHECK(a.isStrictBool());
|
assert((!a ? true : false));
|
||||||
CHECK(!a.isThird());
|
assert(a.isStrictFalse());
|
||||||
|
assert(!a.isStrictTrue());
|
||||||
|
assert(a.isStrictBool());
|
||||||
|
assert(!a.isThird());
|
||||||
a = true;
|
a = true;
|
||||||
CHECK(a);
|
assert(a.getValue() == T::True);
|
||||||
CHECK(!a.isStrictFalse());
|
assert(a);
|
||||||
CHECK(a.isStrictTrue());
|
assert(bool(a));
|
||||||
CHECK(a.isStrictBool());
|
assert((a ? true : false));
|
||||||
CHECK(!a.isThird());
|
assert(!a.isStrictFalse());
|
||||||
|
assert(a.isStrictTrue());
|
||||||
|
assert(a.isStrictBool());
|
||||||
|
assert(!a.isThird());
|
||||||
a = T::Third;
|
a = T::Third;
|
||||||
if (expect_true)
|
assert(a.getValue() == T::Third);
|
||||||
CHECK(a);
|
assert(T::is_third_true == expect_true);
|
||||||
else
|
if (expect_true) {
|
||||||
CHECK(!a);
|
assert(a);
|
||||||
CHECK(!a.isStrictFalse());
|
assert(bool(a));
|
||||||
CHECK(!a.isStrictTrue());
|
assert((a ? true : false));
|
||||||
CHECK(!a.isStrictBool());
|
} else {
|
||||||
CHECK(a.isThird());
|
assert(!a);
|
||||||
a = x;
|
assert(!bool(a));
|
||||||
if (expect_true)
|
assert((!a ? true : false));
|
||||||
CHECK(a);
|
}
|
||||||
else
|
assert(!a.isStrictFalse());
|
||||||
CHECK(!a);
|
assert(!a.isStrictTrue());
|
||||||
CHECK(!a.isStrictFalse());
|
assert(!a.isStrictBool());
|
||||||
CHECK(!a.isStrictTrue());
|
assert(a.isThird());
|
||||||
CHECK(!a.isStrictBool());
|
a = 99;
|
||||||
CHECK(a.isThird());
|
assert(a.getValue() == T::Third);
|
||||||
|
if (expect_true) {
|
||||||
|
assert(a);
|
||||||
|
assert(bool(a));
|
||||||
|
assert((a ? true : false));
|
||||||
|
} else {
|
||||||
|
assert(!a);
|
||||||
|
assert(!bool(a));
|
||||||
|
assert((!a ? true : false));
|
||||||
|
}
|
||||||
|
assert(!a.isStrictFalse());
|
||||||
|
assert(!a.isStrictTrue());
|
||||||
|
assert(!a.isStrictBool());
|
||||||
|
assert(a.isThird());
|
||||||
mem_clear(&a);
|
mem_clear(&a);
|
||||||
CHECK(a.isStrictFalse());
|
assert(a.isStrictFalse());
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
TEST_CASE("TriBool") {
|
TEST_CASE("upx::TriBool") {
|
||||||
using upx::TriBool, upx::tribool;
|
using upx::TriBool, upx::tribool;
|
||||||
//
|
|
||||||
static_assert(!tribool(false));
|
static_assert(!tribool(false));
|
||||||
static_assert(tribool(true));
|
static_assert(tribool(true));
|
||||||
static_assert(!tribool(tribool::Third));
|
static_assert(!tribool(tribool::Third));
|
||||||
TestTriBool<tribool>::test(false, -1);
|
TestTriBool<tribool>::test(false);
|
||||||
//
|
#if DEBUG || 1
|
||||||
TestTriBool<TriBool<upx_int8_t> >::test(false, -1);
|
TestTriBool<TriBool<upx_int8_t> >::test(false);
|
||||||
TestTriBool<TriBool<upx_int64_t> >::test(false, -1);
|
TestTriBool<TriBool<upx_uint8_t> >::test(false);
|
||||||
//
|
TestTriBool<TriBool<upx_int16_t> >::test(false);
|
||||||
TestTriBool<TriBool<unsigned, 2> >::test(true, 2);
|
TestTriBool<TriBool<upx_uint16_t> >::test(false);
|
||||||
TestTriBool<TriBool<upx_int8_t, 2> >::test(true, 2);
|
TestTriBool<TriBool<upx_int32_t> >::test(false);
|
||||||
TestTriBool<TriBool<upx_uint8_t, 2> >::test(true, 2);
|
TestTriBool<TriBool<upx_uint32_t> >::test(false);
|
||||||
TestTriBool<TriBool<upx_int64_t, 2> >::test(true, 2);
|
TestTriBool<TriBool<upx_int64_t> >::test(false);
|
||||||
TestTriBool<TriBool<upx_uint64_t, 2> >::test(true, 2);
|
TestTriBool<TriBool<upx_uint64_t> >::test(false);
|
||||||
|
TestTriBool<TriBool<upx_int8_t, true> >::test(true);
|
||||||
|
TestTriBool<TriBool<upx_uint8_t, true> >::test(true);
|
||||||
|
TestTriBool<TriBool<upx_int16_t, true> >::test(true);
|
||||||
|
TestTriBool<TriBool<upx_uint16_t, true> >::test(true);
|
||||||
|
TestTriBool<TriBool<upx_int32_t, true> >::test(true);
|
||||||
|
TestTriBool<TriBool<upx_uint32_t, true> >::test(true);
|
||||||
|
TestTriBool<TriBool<upx_int64_t, true> >::test(true);
|
||||||
|
TestTriBool<TriBool<upx_uint64_t, true> >::test(true);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/* vim:set ts=4 sw=4 et: */
|
/* vim:set ts=4 sw=4 et: */
|
||||||
|
|||||||
+11
-3
@@ -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-2023 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2024 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
|
||||||
@@ -24,6 +24,9 @@
|
|||||||
<markus@oberhumer.com>
|
<markus@oberhumer.com>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include "../util/system_defs.h"
|
||||||
|
#include "../util/system_features.h"
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
// doctest support code implementation
|
// doctest support code implementation
|
||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
@@ -33,7 +36,10 @@
|
|||||||
|
|
||||||
#if !defined(DOCTEST_CONFIG_DISABLE)
|
#if !defined(DOCTEST_CONFIG_DISABLE)
|
||||||
|
|
||||||
#if defined(__i386__) && defined(__MSDOS__) && defined(__DJGPP__) && defined(__GNUC__)
|
#if defined(__wasi__)
|
||||||
|
#define DOCTEST_CONFIG_NO_MULTITHREADING
|
||||||
|
#define DOCTEST_CONFIG_NO_POSIX_SIGNALS
|
||||||
|
#elif defined(__i386__) && defined(__MSDOS__) && defined(__DJGPP__) && defined(__GNUC__)
|
||||||
#define DOCTEST_CONFIG_NO_MULTITHREADING
|
#define DOCTEST_CONFIG_NO_MULTITHREADING
|
||||||
#define DOCTEST_CONFIG_NO_POSIX_SIGNALS
|
#define DOCTEST_CONFIG_NO_POSIX_SIGNALS
|
||||||
#elif defined(__m68k__) && defined(__atarist__) && defined(__GNUC__)
|
#elif defined(__m68k__) && defined(__atarist__) && defined(__GNUC__)
|
||||||
@@ -43,9 +49,11 @@
|
|||||||
#pragma GCC diagnostic ignored "-Wshadow"
|
#pragma GCC diagnostic ignored "-Wshadow"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if !defined(UPX_DOCTEST_CONFIG_MULTITHREADING)
|
#if !defined(UPX_DOCTEST_CONFIG_MULTITHREADING) && !(WITH_THREADS)
|
||||||
|
#ifndef DOCTEST_CONFIG_NO_MULTITHREADING
|
||||||
#define DOCTEST_CONFIG_NO_MULTITHREADING
|
#define DOCTEST_CONFIG_NO_MULTITHREADING
|
||||||
#endif
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
#if defined(__clang__) && defined(__FAST_MATH__) && defined(__INTEL_LLVM_COMPILER)
|
#if defined(__clang__) && defined(__FAST_MATH__) && defined(__INTEL_LLVM_COMPILER)
|
||||||
// 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
|
||||||
|
|||||||
+33
-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) 1996-2023 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2024 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
|
||||||
@@ -241,6 +241,35 @@ TEST_CASE("basic xspan usage") {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST_CASE("xspan array access") {
|
||||||
|
const size_t N = 16;
|
||||||
|
char buf[N];
|
||||||
|
memset(buf, 0, sizeof(buf));
|
||||||
|
XSPAN_0_VAR(char, c0, buf, sizeof(buf));
|
||||||
|
XSPAN_P_VAR(char, cp, buf, sizeof(buf));
|
||||||
|
XSPAN_S_VAR(char, cs, buf, sizeof(buf));
|
||||||
|
for (size_t i = 0; i != N; ++i)
|
||||||
|
c0[i] += 1;
|
||||||
|
for (size_t i = 0; i != N; ++i)
|
||||||
|
cp[i] += 1;
|
||||||
|
for (size_t i = 0; i != N; ++i)
|
||||||
|
cs[i] += 1;
|
||||||
|
#if __cplusplus >= 201103L
|
||||||
|
for (auto ptr = c0; ptr != c0 + N; ++ptr)
|
||||||
|
*ptr += 1;
|
||||||
|
for (auto ptr = c0 + 0; ptr < c0 + N; ++ptr)
|
||||||
|
*ptr += 1;
|
||||||
|
for (auto ptr = cp; ptr != cp + N; ++ptr)
|
||||||
|
*ptr += 1;
|
||||||
|
for (auto ptr = cp + 0; ptr < cp + N; ++ptr)
|
||||||
|
*ptr += 1;
|
||||||
|
for (auto ptr = cs; ptr != cs + N; ++ptr)
|
||||||
|
*ptr += 1;
|
||||||
|
for (auto ptr = cs + 0; ptr < cs + N; ++ptr)
|
||||||
|
*ptr += 1;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
//
|
//
|
||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
@@ -658,6 +687,9 @@ TEST_CASE("Span subspan") {
|
|||||||
CHECK((as + 2).subspan(0, -2)[0] == 0);
|
CHECK((as + 2).subspan(0, -2)[0] == 0);
|
||||||
CHECK_THROWS(as.subspan(1, 0)[0]);
|
CHECK_THROWS(as.subspan(1, 0)[0]);
|
||||||
CHECK_THROWS(as.subspan(1, 1)[-1]);
|
CHECK_THROWS(as.subspan(1, 1)[-1]);
|
||||||
|
CHECK(as.subspan(1)[0] == 1);
|
||||||
|
CHECK(as.subspan(2)[0] == 2);
|
||||||
|
CHECK(as.subspan(3)[0] == 3);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_CASE("Span constness") {
|
TEST_CASE("Span constness") {
|
||||||
|
|||||||
@@ -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-2023 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2024 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
|
||||||
@@ -62,7 +62,7 @@ unsigned upx_crc32(const void *buf, unsigned len, unsigned crc)
|
|||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
|
|
||||||
int upx_compress(const upx_bytep src, unsigned src_len, upx_bytep dst, unsigned *dst_len,
|
int upx_compress(const upx_bytep src, unsigned src_len, upx_bytep dst, unsigned *dst_len,
|
||||||
upx_callback_p cb, int method, int level, const upx_compress_config_t *cconf,
|
upx_callback_t *cb, int method, int level, const upx_compress_config_t *cconf,
|
||||||
upx_compress_result_t *cresult) {
|
upx_compress_result_t *cresult) {
|
||||||
int r = UPX_E_ERROR;
|
int r = UPX_E_ERROR;
|
||||||
upx_compress_result_t cresult_buffer;
|
upx_compress_result_t cresult_buffer;
|
||||||
@@ -95,6 +95,10 @@ int upx_compress(const upx_bytep src, unsigned src_len, upx_bytep dst, unsigned
|
|||||||
const unsigned orig_dst_len = *dst_len;
|
const unsigned orig_dst_len = *dst_len;
|
||||||
if (__acc_cte(false)) {
|
if (__acc_cte(false)) {
|
||||||
}
|
}
|
||||||
|
#if (WITH_BZIP2)
|
||||||
|
else if (M_IS_BZIP2(method))
|
||||||
|
r = upx_bzip2_compress(src, src_len, dst, dst_len, cb, method, level, cconf, cresult);
|
||||||
|
#endif
|
||||||
#if (WITH_LZMA)
|
#if (WITH_LZMA)
|
||||||
else if (M_IS_LZMA(method))
|
else if (M_IS_LZMA(method))
|
||||||
r = upx_lzma_compress(src, src_len, dst, dst_len, cb, method, level, cconf, cresult);
|
r = upx_lzma_compress(src, src_len, dst, dst_len, cb, method, level, cconf, cresult);
|
||||||
@@ -112,7 +116,7 @@ int upx_compress(const upx_bytep src, unsigned src_len, upx_bytep dst, unsigned
|
|||||||
r = upx_zstd_compress(src, src_len, dst, dst_len, cb, method, level, cconf, cresult);
|
r = upx_zstd_compress(src, src_len, dst, dst_len, cb, method, level, cconf, cresult);
|
||||||
#endif
|
#endif
|
||||||
else {
|
else {
|
||||||
throwInternalError("unknown compression method");
|
throwInternalError("unknown compression method %d", method);
|
||||||
}
|
}
|
||||||
|
|
||||||
#if 1
|
#if 1
|
||||||
@@ -140,6 +144,10 @@ int upx_decompress(const upx_bytep src, unsigned src_len, upx_bytep dst, unsigne
|
|||||||
const unsigned orig_dst_len = *dst_len;
|
const unsigned orig_dst_len = *dst_len;
|
||||||
if (__acc_cte(false)) {
|
if (__acc_cte(false)) {
|
||||||
}
|
}
|
||||||
|
#if (WITH_BZIP2)
|
||||||
|
else if (M_IS_BZIP2(method))
|
||||||
|
r = upx_bzip2_decompress(src, src_len, dst, dst_len, method, cresult);
|
||||||
|
#endif
|
||||||
#if (WITH_LZMA)
|
#if (WITH_LZMA)
|
||||||
else if (M_IS_LZMA(method))
|
else if (M_IS_LZMA(method))
|
||||||
r = upx_lzma_decompress(src, src_len, dst, dst_len, method, cresult);
|
r = upx_lzma_decompress(src, src_len, dst, dst_len, method, cresult);
|
||||||
@@ -161,7 +169,7 @@ int upx_decompress(const upx_bytep src, unsigned src_len, upx_bytep dst, unsigne
|
|||||||
r = upx_zstd_decompress(src, src_len, dst, dst_len, method, cresult);
|
r = upx_zstd_decompress(src, src_len, dst, dst_len, method, cresult);
|
||||||
#endif
|
#endif
|
||||||
else {
|
else {
|
||||||
throwInternalError("unknown decompression method");
|
throwInternalError("unknown compression method %d", method);
|
||||||
}
|
}
|
||||||
|
|
||||||
assert_noexcept(*dst_len <= orig_dst_len);
|
assert_noexcept(*dst_len <= orig_dst_len);
|
||||||
@@ -187,6 +195,10 @@ int upx_test_overlap(const upx_bytep buf, const upx_bytep tbuf, unsigned src_off
|
|||||||
const unsigned orig_dst_len = *dst_len;
|
const unsigned orig_dst_len = *dst_len;
|
||||||
if (__acc_cte(false)) {
|
if (__acc_cte(false)) {
|
||||||
}
|
}
|
||||||
|
#if (WITH_BZIP2)
|
||||||
|
else if (M_IS_BZIP2(method))
|
||||||
|
r = upx_bzip2_test_overlap(buf, tbuf, src_off, src_len, dst_len, method, cresult);
|
||||||
|
#endif
|
||||||
#if (WITH_LZMA)
|
#if (WITH_LZMA)
|
||||||
else if (M_IS_LZMA(method))
|
else if (M_IS_LZMA(method))
|
||||||
r = upx_lzma_test_overlap(buf, tbuf, src_off, src_len, dst_len, method, cresult);
|
r = upx_lzma_test_overlap(buf, tbuf, src_off, src_len, dst_len, method, cresult);
|
||||||
@@ -204,7 +216,7 @@ int upx_test_overlap(const upx_bytep buf, const upx_bytep tbuf, unsigned src_off
|
|||||||
r = upx_zstd_test_overlap(buf, tbuf, src_off, src_len, dst_len, method, cresult);
|
r = upx_zstd_test_overlap(buf, tbuf, src_off, src_len, dst_len, method, cresult);
|
||||||
#endif
|
#endif
|
||||||
else {
|
else {
|
||||||
throwInternalError("unknown decompression method");
|
throwInternalError("unknown compression method %d", method);
|
||||||
}
|
}
|
||||||
|
|
||||||
assert_noexcept(*dst_len <= orig_dst_len);
|
assert_noexcept(*dst_len <= orig_dst_len);
|
||||||
|
|||||||
+25
-25
@@ -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-2023 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2024 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
|
||||||
@@ -36,19 +36,19 @@
|
|||||||
int upx_bzip2_init(void);
|
int upx_bzip2_init(void);
|
||||||
const char *upx_bzip2_version_string(void);
|
const char *upx_bzip2_version_string(void);
|
||||||
int upx_bzip2_compress ( const upx_bytep src, unsigned src_len,
|
int upx_bzip2_compress ( const upx_bytep src, unsigned src_len,
|
||||||
upx_bytep dst, unsigned* dst_len,
|
upx_bytep dst, unsigned *dst_len,
|
||||||
upx_callback_p cb,
|
upx_callback_t *cb,
|
||||||
int method, int level,
|
int method, int level,
|
||||||
const upx_compress_config_t *cconf,
|
const upx_compress_config_t *cconf,
|
||||||
upx_compress_result_t *cresult );
|
upx_compress_result_t *cresult );
|
||||||
int upx_bzip2_decompress ( const upx_bytep src, unsigned src_len,
|
int upx_bzip2_decompress ( const upx_bytep src, unsigned src_len,
|
||||||
upx_bytep dst, unsigned* dst_len,
|
upx_bytep dst, unsigned *dst_len,
|
||||||
int method,
|
int method,
|
||||||
const upx_compress_result_t *cresult );
|
const upx_compress_result_t *cresult );
|
||||||
int upx_bzip2_test_overlap ( const upx_bytep buf,
|
int upx_bzip2_test_overlap ( const upx_bytep buf,
|
||||||
const upx_bytep tbuf,
|
const upx_bytep tbuf,
|
||||||
unsigned src_off, unsigned src_len,
|
unsigned src_off, unsigned src_len,
|
||||||
unsigned* dst_len,
|
unsigned *dst_len,
|
||||||
int method,
|
int method,
|
||||||
const upx_compress_result_t *cresult );
|
const upx_compress_result_t *cresult );
|
||||||
#endif
|
#endif
|
||||||
@@ -57,19 +57,19 @@ int upx_bzip2_test_overlap ( const upx_bytep buf,
|
|||||||
int upx_lzma_init(void);
|
int upx_lzma_init(void);
|
||||||
const char *upx_lzma_version_string(void);
|
const char *upx_lzma_version_string(void);
|
||||||
int upx_lzma_compress ( const upx_bytep src, unsigned src_len,
|
int upx_lzma_compress ( const upx_bytep src, unsigned src_len,
|
||||||
upx_bytep dst, unsigned* dst_len,
|
upx_bytep dst, unsigned *dst_len,
|
||||||
upx_callback_p cb,
|
upx_callback_t *cb,
|
||||||
int method, int level,
|
int method, int level,
|
||||||
const upx_compress_config_t *cconf,
|
const upx_compress_config_t *cconf,
|
||||||
upx_compress_result_t *cresult );
|
upx_compress_result_t *cresult );
|
||||||
int upx_lzma_decompress ( const upx_bytep src, unsigned src_len,
|
int upx_lzma_decompress ( const upx_bytep src, unsigned src_len,
|
||||||
upx_bytep dst, unsigned* dst_len,
|
upx_bytep dst, unsigned *dst_len,
|
||||||
int method,
|
int method,
|
||||||
const upx_compress_result_t *cresult );
|
const upx_compress_result_t *cresult );
|
||||||
int upx_lzma_test_overlap ( const upx_bytep buf,
|
int upx_lzma_test_overlap ( const upx_bytep buf,
|
||||||
const upx_bytep tbuf,
|
const upx_bytep tbuf,
|
||||||
unsigned src_off, unsigned src_len,
|
unsigned src_off, unsigned src_len,
|
||||||
unsigned* dst_len,
|
unsigned *dst_len,
|
||||||
int method,
|
int method,
|
||||||
const upx_compress_result_t *cresult );
|
const upx_compress_result_t *cresult );
|
||||||
#endif
|
#endif
|
||||||
@@ -78,19 +78,19 @@ int upx_lzma_test_overlap ( const upx_bytep buf,
|
|||||||
int upx_nrv_init(void);
|
int upx_nrv_init(void);
|
||||||
const char *upx_nrv_version_string(void);
|
const char *upx_nrv_version_string(void);
|
||||||
int upx_nrv_compress ( const upx_bytep src, unsigned src_len,
|
int upx_nrv_compress ( const upx_bytep src, unsigned src_len,
|
||||||
upx_bytep dst, unsigned* dst_len,
|
upx_bytep dst, unsigned *dst_len,
|
||||||
upx_callback_p cb,
|
upx_callback_t *cb,
|
||||||
int method, int level,
|
int method, int level,
|
||||||
const upx_compress_config_t *cconf,
|
const upx_compress_config_t *cconf,
|
||||||
upx_compress_result_t *cresult );
|
upx_compress_result_t *cresult );
|
||||||
int upx_nrv_decompress ( const upx_bytep src, unsigned src_len,
|
int upx_nrv_decompress ( const upx_bytep src, unsigned src_len,
|
||||||
upx_bytep dst, unsigned* dst_len,
|
upx_bytep dst, unsigned *dst_len,
|
||||||
int method,
|
int method,
|
||||||
const upx_compress_result_t *cresult );
|
const upx_compress_result_t *cresult );
|
||||||
int upx_nrv_test_overlap ( const upx_bytep buf,
|
int upx_nrv_test_overlap ( const upx_bytep buf,
|
||||||
const upx_bytep tbuf,
|
const upx_bytep tbuf,
|
||||||
unsigned src_off, unsigned src_len,
|
unsigned src_off, unsigned src_len,
|
||||||
unsigned* dst_len,
|
unsigned *dst_len,
|
||||||
int method,
|
int method,
|
||||||
const upx_compress_result_t *cresult );
|
const upx_compress_result_t *cresult );
|
||||||
#endif
|
#endif
|
||||||
@@ -99,19 +99,19 @@ int upx_nrv_test_overlap ( const upx_bytep buf,
|
|||||||
int upx_ucl_init(void);
|
int upx_ucl_init(void);
|
||||||
const char *upx_ucl_version_string(void);
|
const char *upx_ucl_version_string(void);
|
||||||
int upx_ucl_compress ( const upx_bytep src, unsigned src_len,
|
int upx_ucl_compress ( const upx_bytep src, unsigned src_len,
|
||||||
upx_bytep dst, unsigned* dst_len,
|
upx_bytep dst, unsigned *dst_len,
|
||||||
upx_callback_p cb,
|
upx_callback_t *cb,
|
||||||
int method, int level,
|
int method, int level,
|
||||||
const upx_compress_config_t *cconf,
|
const upx_compress_config_t *cconf,
|
||||||
upx_compress_result_t *cresult );
|
upx_compress_result_t *cresult );
|
||||||
int upx_ucl_decompress ( const upx_bytep src, unsigned src_len,
|
int upx_ucl_decompress ( const upx_bytep src, unsigned src_len,
|
||||||
upx_bytep dst, unsigned* dst_len,
|
upx_bytep dst, unsigned *dst_len,
|
||||||
int method,
|
int method,
|
||||||
const upx_compress_result_t *cresult );
|
const upx_compress_result_t *cresult );
|
||||||
int upx_ucl_test_overlap ( const upx_bytep buf,
|
int upx_ucl_test_overlap ( const upx_bytep buf,
|
||||||
const upx_bytep tbuf,
|
const upx_bytep tbuf,
|
||||||
unsigned src_off, unsigned src_len,
|
unsigned src_off, unsigned src_len,
|
||||||
unsigned* dst_len,
|
unsigned *dst_len,
|
||||||
int method,
|
int method,
|
||||||
const upx_compress_result_t *cresult );
|
const upx_compress_result_t *cresult );
|
||||||
unsigned upx_ucl_adler32(const void *buf, unsigned len, unsigned adler);
|
unsigned upx_ucl_adler32(const void *buf, unsigned len, unsigned adler);
|
||||||
@@ -122,19 +122,19 @@ unsigned upx_ucl_crc32 (const void *buf, unsigned len, unsigned crc);
|
|||||||
int upx_zlib_init(void);
|
int upx_zlib_init(void);
|
||||||
const char *upx_zlib_version_string(void);
|
const char *upx_zlib_version_string(void);
|
||||||
int upx_zlib_compress ( const upx_bytep src, unsigned src_len,
|
int upx_zlib_compress ( const upx_bytep src, unsigned src_len,
|
||||||
upx_bytep dst, unsigned* dst_len,
|
upx_bytep dst, unsigned *dst_len,
|
||||||
upx_callback_p cb,
|
upx_callback_t *cb,
|
||||||
int method, int level,
|
int method, int level,
|
||||||
const upx_compress_config_t *cconf,
|
const upx_compress_config_t *cconf,
|
||||||
upx_compress_result_t *cresult );
|
upx_compress_result_t *cresult );
|
||||||
int upx_zlib_decompress ( const upx_bytep src, unsigned src_len,
|
int upx_zlib_decompress ( const upx_bytep src, unsigned src_len,
|
||||||
upx_bytep dst, unsigned* dst_len,
|
upx_bytep dst, unsigned *dst_len,
|
||||||
int method,
|
int method,
|
||||||
const upx_compress_result_t *cresult );
|
const upx_compress_result_t *cresult );
|
||||||
int upx_zlib_test_overlap ( const upx_bytep buf,
|
int upx_zlib_test_overlap ( const upx_bytep buf,
|
||||||
const upx_bytep tbuf,
|
const upx_bytep tbuf,
|
||||||
unsigned src_off, unsigned src_len,
|
unsigned src_off, unsigned src_len,
|
||||||
unsigned* dst_len,
|
unsigned *dst_len,
|
||||||
int method,
|
int method,
|
||||||
const upx_compress_result_t *cresult );
|
const upx_compress_result_t *cresult );
|
||||||
unsigned upx_zlib_adler32(const void *buf, unsigned len, unsigned adler);
|
unsigned upx_zlib_adler32(const void *buf, unsigned len, unsigned adler);
|
||||||
@@ -145,19 +145,19 @@ unsigned upx_zlib_crc32 (const void *buf, unsigned len, unsigned crc);
|
|||||||
int upx_zstd_init(void);
|
int upx_zstd_init(void);
|
||||||
const char *upx_zstd_version_string(void);
|
const char *upx_zstd_version_string(void);
|
||||||
int upx_zstd_compress ( const upx_bytep src, unsigned src_len,
|
int upx_zstd_compress ( const upx_bytep src, unsigned src_len,
|
||||||
upx_bytep dst, unsigned* dst_len,
|
upx_bytep dst, unsigned *dst_len,
|
||||||
upx_callback_p cb,
|
upx_callback_t *cb,
|
||||||
int method, int level,
|
int method, int level,
|
||||||
const upx_compress_config_t *cconf,
|
const upx_compress_config_t *cconf,
|
||||||
upx_compress_result_t *cresult );
|
upx_compress_result_t *cresult );
|
||||||
int upx_zstd_decompress ( const upx_bytep src, unsigned src_len,
|
int upx_zstd_decompress ( const upx_bytep src, unsigned src_len,
|
||||||
upx_bytep dst, unsigned* dst_len,
|
upx_bytep dst, unsigned *dst_len,
|
||||||
int method,
|
int method,
|
||||||
const upx_compress_result_t *cresult );
|
const upx_compress_result_t *cresult );
|
||||||
int upx_zstd_test_overlap ( const upx_bytep buf,
|
int upx_zstd_test_overlap ( const upx_bytep buf,
|
||||||
const upx_bytep tbuf,
|
const upx_bytep tbuf,
|
||||||
unsigned src_off, unsigned src_len,
|
unsigned src_off, unsigned src_len,
|
||||||
unsigned* dst_len,
|
unsigned *dst_len,
|
||||||
int method,
|
int method,
|
||||||
const upx_compress_result_t *cresult );
|
const upx_compress_result_t *cresult );
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -0,0 +1,211 @@
|
|||||||
|
/* compress_bzip2.cpp --
|
||||||
|
|
||||||
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
|
Copyright (C) 1996-2024 Markus Franz Xaver Johannes Oberhumer
|
||||||
|
All Rights Reserved.
|
||||||
|
|
||||||
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
|
and/or modify them under the terms of the GNU General Public License as
|
||||||
|
published by the Free Software Foundation; either version 2 of
|
||||||
|
the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program; see the file COPYING.
|
||||||
|
If not, write to the Free Software Foundation, Inc.,
|
||||||
|
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
|
Markus F.X.J. Oberhumer
|
||||||
|
<markus@oberhumer.com>
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "../util/system_headers.h"
|
||||||
|
#if WITH_BZIP2
|
||||||
|
#include <bzip2/bzlib.h>
|
||||||
|
#endif
|
||||||
|
#include "../conf.h"
|
||||||
|
|
||||||
|
void bzip2_compress_config_t::reset() noexcept { mem_clear(this); }
|
||||||
|
|
||||||
|
#if WITH_BZIP2
|
||||||
|
#include "compress.h"
|
||||||
|
#include "../util/membuffer.h"
|
||||||
|
|
||||||
|
#if defined(BZ_NO_STDIO) || 1
|
||||||
|
// we need to supply bz_internal_error() when building with BZ_NO_STDIO
|
||||||
|
extern "C" {
|
||||||
|
extern void bz_internal_error(int);
|
||||||
|
void bz_internal_error(int errcode) { throwInternalError("bz_internal_error %d", errcode); }
|
||||||
|
}
|
||||||
|
#endif // BZ_NO_STDIO
|
||||||
|
|
||||||
|
static int convert_errno_from_bzip2(int r) {
|
||||||
|
switch (r) {
|
||||||
|
case BZ_OK:
|
||||||
|
return UPX_E_OK;
|
||||||
|
case BZ_MEM_ERROR:
|
||||||
|
return UPX_E_OUT_OF_MEMORY;
|
||||||
|
// TODO later: convert to UPX_E_INPUT_OVERRUN, UPX_E_OUTPUT_OVERRUN
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return UPX_E_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
//
|
||||||
|
**************************************************************************/
|
||||||
|
|
||||||
|
int upx_bzip2_compress(const upx_bytep src, unsigned src_len, upx_bytep dst, unsigned *dst_len,
|
||||||
|
upx_callback_t *cb_parm, int method, int level,
|
||||||
|
const upx_compress_config_t *cconf_parm, upx_compress_result_t *cresult) {
|
||||||
|
assert(method == M_BZIP2);
|
||||||
|
assert(level > 0);
|
||||||
|
assert(cresult != nullptr);
|
||||||
|
UNUSED(cb_parm);
|
||||||
|
int r = UPX_E_ERROR;
|
||||||
|
const bzip2_compress_config_t *const lcconf = cconf_parm ? &cconf_parm->conf_bzip2 : nullptr;
|
||||||
|
bzip2_compress_result_t *const res = &cresult->result_bzip2;
|
||||||
|
res->reset();
|
||||||
|
|
||||||
|
int blockSize100k = (src_len + 100000 - 1) / 100000;
|
||||||
|
if (blockSize100k < 1)
|
||||||
|
blockSize100k = 1;
|
||||||
|
if (blockSize100k > 9)
|
||||||
|
blockSize100k = 9;
|
||||||
|
// idea for later: could enhance lcconf to allow setting blockSize100k
|
||||||
|
UNUSED(lcconf);
|
||||||
|
if (level <= 3 && blockSize100k > level)
|
||||||
|
blockSize100k = level;
|
||||||
|
|
||||||
|
char *dest = (char *) dst;
|
||||||
|
char *source = (char *) const_cast<byte *>(src);
|
||||||
|
r = BZ2_bzBuffToBuffCompress(dest, dst_len, source, src_len, blockSize100k, 0, 0);
|
||||||
|
return convert_errno_from_bzip2(r);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
//
|
||||||
|
**************************************************************************/
|
||||||
|
|
||||||
|
int upx_bzip2_decompress(const upx_bytep src, unsigned src_len, upx_bytep dst, unsigned *dst_len,
|
||||||
|
int method, const upx_compress_result_t *cresult) {
|
||||||
|
assert(method == M_BZIP2);
|
||||||
|
UNUSED(method);
|
||||||
|
UNUSED(cresult);
|
||||||
|
char *dest = (char *) dst;
|
||||||
|
char *source = (char *) const_cast<byte *>(src);
|
||||||
|
int small = 0;
|
||||||
|
int r = BZ2_bzBuffToBuffDecompress(dest, dst_len, source, src_len, small, 0);
|
||||||
|
return convert_errno_from_bzip2(r);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
// test_overlap - see <ucl/ucl.h> for semantics
|
||||||
|
**************************************************************************/
|
||||||
|
|
||||||
|
int upx_bzip2_test_overlap(const upx_bytep buf, const upx_bytep tbuf, unsigned src_off,
|
||||||
|
unsigned src_len, unsigned *dst_len, int method,
|
||||||
|
const upx_compress_result_t *cresult) {
|
||||||
|
assert(method == M_BZIP2);
|
||||||
|
|
||||||
|
MemBuffer b(src_off + src_len);
|
||||||
|
memcpy(b + src_off, buf + src_off, src_len);
|
||||||
|
unsigned saved_dst_len = *dst_len;
|
||||||
|
int r = upx_bzip2_decompress(raw_index_bytes(b, src_off, src_len), src_len,
|
||||||
|
raw_bytes(b, *dst_len), dst_len, method, cresult);
|
||||||
|
if (r != UPX_E_OK)
|
||||||
|
return r;
|
||||||
|
if (*dst_len != saved_dst_len)
|
||||||
|
return UPX_E_ERROR;
|
||||||
|
// NOTE: there is a very tiny possibility that decompression has
|
||||||
|
// succeeded but the data is not restored correctly because of
|
||||||
|
// in-place buffer overlapping, so we use an extra memcmp().
|
||||||
|
if (tbuf != nullptr && memcmp(tbuf, b, *dst_len) != 0)
|
||||||
|
return UPX_E_ERROR;
|
||||||
|
return UPX_E_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
// misc
|
||||||
|
**************************************************************************/
|
||||||
|
|
||||||
|
int upx_bzip2_init(void) { return 0; }
|
||||||
|
|
||||||
|
const char *upx_bzip2_version_string(void) { return BZ2_bzlibVersion(); }
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
// doctest checks
|
||||||
|
**************************************************************************/
|
||||||
|
|
||||||
|
#if DEBUG && !defined(DOCTEST_CONFIG_DISABLE) && 1
|
||||||
|
|
||||||
|
static bool check_bzip2(const int method, const int level, const unsigned expected_c_len) {
|
||||||
|
const unsigned u_len = 16384;
|
||||||
|
const unsigned c_extra = 4096;
|
||||||
|
MemBuffer u_buf, c_buf, d_buf;
|
||||||
|
unsigned c_len, d_len;
|
||||||
|
upx_compress_result_t cresult;
|
||||||
|
int r;
|
||||||
|
|
||||||
|
u_buf.alloc(u_len);
|
||||||
|
memset(u_buf, 0, u_len);
|
||||||
|
c_buf.allocForCompression(u_len, c_extra);
|
||||||
|
d_buf.allocForDecompression(u_len);
|
||||||
|
|
||||||
|
c_len = c_buf.getSize() - c_extra;
|
||||||
|
r = upx_bzip2_compress(raw_bytes(u_buf, u_len), u_len, raw_index_bytes(c_buf, c_extra, c_len),
|
||||||
|
&c_len, nullptr, method, level, NULL_cconf, &cresult);
|
||||||
|
if (r != 0 || c_len != expected_c_len)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
d_len = d_buf.getSize();
|
||||||
|
r = upx_bzip2_decompress(raw_index_bytes(c_buf, c_extra, c_len), c_len, raw_bytes(d_buf, d_len),
|
||||||
|
&d_len, method, nullptr);
|
||||||
|
if (r != 0 || d_len != u_len || memcmp(u_buf, d_buf, u_len) != 0)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
d_len = u_len - 1;
|
||||||
|
r = upx_bzip2_decompress(raw_index_bytes(c_buf, c_extra, c_len), c_len, raw_bytes(d_buf, d_len),
|
||||||
|
&d_len, method, nullptr);
|
||||||
|
if (r == 0)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
// TODO: rewrite Packer::findOverlapOverhead() so that we can test it here
|
||||||
|
// unsigned x_len = d_len;
|
||||||
|
// r = upx_bzip2_test_overlap(c_buf, u_buf, c_extra, c_len, &x_len, method, nullptr);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_CASE("compress_bzip2") { CHECK(check_bzip2(M_BZIP2, 9, 46)); }
|
||||||
|
|
||||||
|
#endif // DEBUG
|
||||||
|
|
||||||
|
TEST_CASE("upx_bzip2_decompress") {
|
||||||
|
#if 0 // TODO later, see above
|
||||||
|
const byte *c_data;
|
||||||
|
byte d_buf[32];
|
||||||
|
unsigned d_len;
|
||||||
|
int r;
|
||||||
|
|
||||||
|
c_data = (const byte *) "\x28\xb5\x2f\xfd\x20\x20\x3d\x00\x00\x08\xff\x01\x00\x34\x4e\x08";
|
||||||
|
d_len = 32;
|
||||||
|
r = upx_bzip2_decompress(c_data, 16, d_buf, &d_len, M_BZIP2, nullptr);
|
||||||
|
CHECK((r == 0 && d_len == 32));
|
||||||
|
r = upx_bzip2_decompress(c_data, 15, d_buf, &d_len, M_BZIP2, nullptr);
|
||||||
|
CHECK(r == UPX_E_INPUT_OVERRUN);
|
||||||
|
d_len = 31;
|
||||||
|
r = upx_bzip2_decompress(c_data, 16, d_buf, &d_len, M_BZIP2, nullptr);
|
||||||
|
CHECK(r == UPX_E_OUTPUT_OVERRUN);
|
||||||
|
UNUSED(r);
|
||||||
|
#endif // TODO
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // WITH_BZIP2
|
||||||
|
|
||||||
|
/* 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-2023 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2024 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
|
||||||
@@ -293,7 +293,7 @@ struct ProgressInfo final : public ICompressProgressInfo, public CMyUnknownImp {
|
|||||||
virtual ~ProgressInfo() {}
|
virtual ~ProgressInfo() {}
|
||||||
MY_UNKNOWN_IMP
|
MY_UNKNOWN_IMP
|
||||||
STDMETHOD(SetRatioInfo)(const UInt64 *inSize, const UInt64 *outSize) override;
|
STDMETHOD(SetRatioInfo)(const UInt64 *inSize, const UInt64 *outSize) override;
|
||||||
upx_callback_p cb = nullptr;
|
upx_callback_t *cb = nullptr;
|
||||||
};
|
};
|
||||||
|
|
||||||
STDMETHODIMP ProgressInfo::SetRatioInfo(const UInt64 *inSize, const UInt64 *outSize) {
|
STDMETHODIMP ProgressInfo::SetRatioInfo(const UInt64 *inSize, const UInt64 *outSize) {
|
||||||
@@ -317,7 +317,7 @@ STDMETHODIMP ProgressInfo::SetRatioInfo(const UInt64 *inSize, const UInt64 *outS
|
|||||||
#undef RC_NORMALIZE
|
#undef RC_NORMALIZE
|
||||||
|
|
||||||
int upx_lzma_compress(const upx_bytep src, unsigned src_len, upx_bytep dst, unsigned *dst_len,
|
int upx_lzma_compress(const upx_bytep src, unsigned src_len, upx_bytep dst, unsigned *dst_len,
|
||||||
upx_callback_p cb, int method, int level,
|
upx_callback_t *cb, int method, int level,
|
||||||
const upx_compress_config_t *cconf_parm, upx_compress_result_t *cresult) {
|
const upx_compress_config_t *cconf_parm, upx_compress_result_t *cresult) {
|
||||||
assert(M_IS_LZMA(method));
|
assert(M_IS_LZMA(method));
|
||||||
assert(level > 0);
|
assert(level > 0);
|
||||||
@@ -327,6 +327,7 @@ int upx_lzma_compress(const upx_bytep src, unsigned src_len, upx_bytep dst, unsi
|
|||||||
HRESULT rh;
|
HRESULT rh;
|
||||||
const lzma_compress_config_t *const lcconf = cconf_parm ? &cconf_parm->conf_lzma : nullptr;
|
const lzma_compress_config_t *const lcconf = cconf_parm ? &cconf_parm->conf_lzma : nullptr;
|
||||||
lzma_compress_result_t *const res = &cresult->result_lzma;
|
lzma_compress_result_t *const res = &cresult->result_lzma;
|
||||||
|
res->reset();
|
||||||
|
|
||||||
MyLzma::InStream is;
|
MyLzma::InStream is;
|
||||||
is.AddRef();
|
is.AddRef();
|
||||||
|
|||||||
@@ -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-2023 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2024 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
|
||||||
@@ -66,7 +66,7 @@ extern "C" {
|
|||||||
static void __UCL_CDECL wrap_nprogress_ucl(ucl_uint a, ucl_uint b, int state, ucl_voidp user) {
|
static void __UCL_CDECL wrap_nprogress_ucl(ucl_uint a, ucl_uint b, int state, ucl_voidp user) {
|
||||||
if (state != -1 && state != 3)
|
if (state != -1 && state != 3)
|
||||||
return;
|
return;
|
||||||
upx_callback_p cb = (upx_callback_p) user;
|
upx_callback_t *cb = (upx_callback_t *) user;
|
||||||
if (cb && cb->nprogress)
|
if (cb && cb->nprogress)
|
||||||
cb->nprogress(cb, a, b);
|
cb->nprogress(cb, a, b);
|
||||||
}
|
}
|
||||||
@@ -77,7 +77,7 @@ static void __UCL_CDECL wrap_nprogress_ucl(ucl_uint a, ucl_uint b, int state, uc
|
|||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
|
|
||||||
int upx_ucl_compress(const upx_bytep src, unsigned src_len, upx_bytep dst, unsigned *dst_len,
|
int upx_ucl_compress(const upx_bytep src, unsigned src_len, upx_bytep dst, unsigned *dst_len,
|
||||||
upx_callback_p cb_parm, int method, int level,
|
upx_callback_t *cb_parm, int method, int level,
|
||||||
const upx_compress_config_t *cconf_parm, upx_compress_result_t *cresult) {
|
const upx_compress_config_t *cconf_parm, upx_compress_result_t *cresult) {
|
||||||
int r;
|
int r;
|
||||||
assert(level > 0);
|
assert(level > 0);
|
||||||
|
|||||||
@@ -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-2023 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2024 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
|
||||||
@@ -75,7 +75,7 @@ static int convert_errno_from_zlib(int zr) {
|
|||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
|
|
||||||
int upx_zlib_compress(const upx_bytep src, unsigned src_len, upx_bytep dst, unsigned *dst_len,
|
int upx_zlib_compress(const upx_bytep src, unsigned src_len, upx_bytep dst, unsigned *dst_len,
|
||||||
upx_callback_p cb_parm, int method, int level,
|
upx_callback_t *cb_parm, int method, int level,
|
||||||
const upx_compress_config_t *cconf_parm, upx_compress_result_t *cresult) {
|
const upx_compress_config_t *cconf_parm, upx_compress_result_t *cresult) {
|
||||||
assert(method == M_DEFLATE);
|
assert(method == M_DEFLATE);
|
||||||
assert(level > 0);
|
assert(level > 0);
|
||||||
@@ -85,6 +85,7 @@ int upx_zlib_compress(const upx_bytep src, unsigned src_len, upx_bytep dst, unsi
|
|||||||
int zr;
|
int zr;
|
||||||
const zlib_compress_config_t *const lcconf = cconf_parm ? &cconf_parm->conf_zlib : nullptr;
|
const zlib_compress_config_t *const lcconf = cconf_parm ? &cconf_parm->conf_zlib : nullptr;
|
||||||
zlib_compress_result_t *const res = &cresult->result_zlib;
|
zlib_compress_result_t *const res = &cresult->result_zlib;
|
||||||
|
res->reset();
|
||||||
|
|
||||||
if (level == 10)
|
if (level == 10)
|
||||||
level = 9;
|
level = 9;
|
||||||
@@ -99,8 +100,6 @@ int upx_zlib_compress(const upx_bytep src, unsigned src_len, upx_bytep dst, unsi
|
|||||||
oassign(strategy, lcconf->strategy);
|
oassign(strategy, lcconf->strategy);
|
||||||
}
|
}
|
||||||
|
|
||||||
res->dummy = 0;
|
|
||||||
|
|
||||||
z_stream s;
|
z_stream s;
|
||||||
s.zalloc = (alloc_func) nullptr;
|
s.zalloc = (alloc_func) nullptr;
|
||||||
s.zfree = (free_func) nullptr;
|
s.zfree = (free_func) nullptr;
|
||||||
|
|||||||
@@ -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-2023 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2024 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
|
||||||
@@ -24,6 +24,12 @@
|
|||||||
<markus@oberhumer.com>
|
<markus@oberhumer.com>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include "../util/system_headers.h"
|
||||||
|
#if WITH_ZSTD
|
||||||
|
#include <zstd/lib/zstd.h>
|
||||||
|
#include <zstd/lib/zstd_errors.h>
|
||||||
|
#include <zstd/lib/compress/hist.h>
|
||||||
|
#endif
|
||||||
#include "../conf.h"
|
#include "../conf.h"
|
||||||
|
|
||||||
void zstd_compress_config_t::reset() noexcept { mem_clear(this); }
|
void zstd_compress_config_t::reset() noexcept { mem_clear(this); }
|
||||||
@@ -31,9 +37,6 @@ void zstd_compress_config_t::reset() noexcept { mem_clear(this); }
|
|||||||
#if WITH_ZSTD
|
#if WITH_ZSTD
|
||||||
#include "compress.h"
|
#include "compress.h"
|
||||||
#include "../util/membuffer.h"
|
#include "../util/membuffer.h"
|
||||||
#include <zstd/lib/zstd.h>
|
|
||||||
#include <zstd/lib/zstd_errors.h>
|
|
||||||
#include <zstd/lib/compress/hist.h>
|
|
||||||
|
|
||||||
static int convert_errno_from_zstd(size_t zr) {
|
static int convert_errno_from_zstd(size_t zr) {
|
||||||
const ZSTD_ErrorCode ze = ZSTD_getErrorCode(zr);
|
const ZSTD_ErrorCode ze = ZSTD_getErrorCode(zr);
|
||||||
@@ -55,7 +58,7 @@ static int convert_errno_from_zstd(size_t zr) {
|
|||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
|
|
||||||
int upx_zstd_compress(const upx_bytep src, unsigned src_len, upx_bytep dst, unsigned *dst_len,
|
int upx_zstd_compress(const upx_bytep src, unsigned src_len, upx_bytep dst, unsigned *dst_len,
|
||||||
upx_callback_p cb_parm, int method, int level,
|
upx_callback_t *cb_parm, int method, int level,
|
||||||
const upx_compress_config_t *cconf_parm, upx_compress_result_t *cresult) {
|
const upx_compress_config_t *cconf_parm, upx_compress_result_t *cresult) {
|
||||||
assert(method == M_ZSTD);
|
assert(method == M_ZSTD);
|
||||||
assert(level > 0);
|
assert(level > 0);
|
||||||
@@ -65,6 +68,7 @@ int upx_zstd_compress(const upx_bytep src, unsigned src_len, upx_bytep dst, unsi
|
|||||||
size_t zr;
|
size_t zr;
|
||||||
const zstd_compress_config_t *const lcconf = cconf_parm ? &cconf_parm->conf_zstd : nullptr;
|
const zstd_compress_config_t *const lcconf = cconf_parm ? &cconf_parm->conf_zstd : nullptr;
|
||||||
zstd_compress_result_t *const res = &cresult->result_zstd;
|
zstd_compress_result_t *const res = &cresult->result_zstd;
|
||||||
|
res->reset();
|
||||||
|
|
||||||
// TODO later: map level 1..10 to zstd-level 1..22
|
// TODO later: map level 1..10 to zstd-level 1..22
|
||||||
if (level == 10)
|
if (level == 10)
|
||||||
@@ -75,8 +79,6 @@ int upx_zstd_compress(const upx_bytep src, unsigned src_len, upx_bytep dst, unsi
|
|||||||
UNUSED(lcconf);
|
UNUSED(lcconf);
|
||||||
}
|
}
|
||||||
|
|
||||||
res->dummy = 0;
|
|
||||||
|
|
||||||
zr = ZSTD_compress(dst, *dst_len, src, src_len, level);
|
zr = ZSTD_compress(dst, *dst_len, src, src_len, level);
|
||||||
if (ZSTD_isError(zr)) {
|
if (ZSTD_isError(zr)) {
|
||||||
*dst_len = 0; // TODO ???
|
*dst_len = 0; // TODO ???
|
||||||
@@ -221,6 +223,7 @@ TEST_CASE("upx_zstd_decompress") {
|
|||||||
d_len = 31;
|
d_len = 31;
|
||||||
r = upx_zstd_decompress(c_data, 16, d_buf, &d_len, M_ZSTD, nullptr);
|
r = upx_zstd_decompress(c_data, 16, d_buf, &d_len, M_ZSTD, nullptr);
|
||||||
CHECK(r == UPX_E_OUTPUT_OVERRUN);
|
CHECK(r == UPX_E_OUTPUT_OVERRUN);
|
||||||
|
UNUSED(r);
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif // WITH_ZSTD
|
#endif // WITH_ZSTD
|
||||||
|
|||||||
+413
-345
File diff suppressed because it is too large
Load Diff
@@ -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-2023 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2024 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2023 Laszlo Molnar
|
Copyright (C) 1996-2024 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-2023 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2024 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2023 Laszlo Molnar
|
Copyright (C) 1996-2024 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-2023 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2024 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2023 Laszlo Molnar
|
Copyright (C) 1996-2024 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-2023 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2024 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2023 Laszlo Molnar
|
Copyright (C) 1996-2024 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-2023 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2024 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2023 Laszlo Molnar
|
Copyright (C) 1996-2024 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-2023 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2024 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2023 Laszlo Molnar
|
Copyright (C) 1996-2024 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-2023 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2024 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2023 Laszlo Molnar
|
Copyright (C) 1996-2024 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-2023 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2024 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2023 Laszlo Molnar
|
Copyright (C) 1996-2024 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-2023 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2024 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2023 Laszlo Molnar
|
Copyright (C) 1996-2024 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
|
||||||
@@ -25,6 +25,11 @@
|
|||||||
<markus@oberhumer.com> <ezerotven+github@gmail.com>
|
<markus@oberhumer.com> <ezerotven+github@gmail.com>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#define WANT_WINDOWS_LEAN_H 1
|
||||||
|
#include "../util/system_headers.h"
|
||||||
|
#if (HAVE_CONIO_H)
|
||||||
|
#include <conio.h>
|
||||||
|
#endif
|
||||||
#include "../conf.h"
|
#include "../conf.h"
|
||||||
|
|
||||||
#if (USE_SCREEN_WIN32)
|
#if (USE_SCREEN_WIN32)
|
||||||
@@ -33,11 +38,6 @@
|
|||||||
// direct screen access
|
// direct screen access
|
||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
|
|
||||||
#include "../util/windows_lean.h"
|
|
||||||
#if (HAVE_CONIO_H)
|
|
||||||
#include <conio.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "screen.h"
|
#include "screen.h"
|
||||||
|
|
||||||
#define this self
|
#define this self
|
||||||
|
|||||||
@@ -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-2023 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2024 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2023 Laszlo Molnar
|
Copyright (C) 1996-2024 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
-21
@@ -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-2023 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2024 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2023 Laszlo Molnar
|
Copyright (C) 1996-2024 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,39 +31,41 @@
|
|||||||
//
|
//
|
||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
|
|
||||||
/*static*/ upx_std_atomic(size_t) Throwable::debug_counter;
|
/*static*/ Throwable::Stats Throwable::stats;
|
||||||
|
|
||||||
Throwable::Throwable(const char *m, int e, bool w) noexcept : super(),
|
Throwable::Throwable(const char *m, int e, bool w) noexcept : super(),
|
||||||
msg(nullptr),
|
msg(nullptr),
|
||||||
err(e),
|
err(e),
|
||||||
is_warning(w) {
|
is_warning(w) {
|
||||||
if (m)
|
if (m != nullptr) {
|
||||||
msg = strdup(m);
|
msg = strdup(m);
|
||||||
#if 0
|
assert_noexcept(msg != nullptr);
|
||||||
fprintf(stderr, "construct exception: %s %zu\n", msg, debug_counter);
|
}
|
||||||
debug_counter += 1;
|
NO_fprintf(stderr, "construct exception: %zu %zu %s\n", size_t(stats.counter_current),
|
||||||
#endif
|
size_t(stats.counter_total), (const char *) msg);
|
||||||
|
stats.counter_current += 1;
|
||||||
|
stats.counter_total += 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
Throwable::Throwable(const Throwable &other) noexcept : super(other),
|
Throwable::Throwable(const Throwable &other) noexcept : super(other),
|
||||||
msg(nullptr),
|
msg(nullptr),
|
||||||
err(other.err),
|
err(other.err),
|
||||||
is_warning(other.is_warning) {
|
is_warning(other.is_warning) {
|
||||||
if (other.msg)
|
if (other.msg != nullptr) {
|
||||||
msg = strdup(other.msg);
|
msg = strdup(other.msg);
|
||||||
#if 0
|
assert_noexcept(msg != nullptr);
|
||||||
fprintf(stderr, "copy exception: %s %zu\n", msg, debug_counter);
|
}
|
||||||
debug_counter += 1;
|
NO_fprintf(stderr, "copy construct exception: %zu %zu %s\n", size_t(stats.counter_current),
|
||||||
#endif
|
size_t(stats.counter_total), (const char *) msg);
|
||||||
|
stats.counter_current += 1;
|
||||||
|
stats.counter_total += 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
Throwable::~Throwable() noexcept {
|
Throwable::~Throwable() noexcept {
|
||||||
#if 0
|
stats.counter_current -= 1;
|
||||||
debug_counter -= 1;
|
NO_fprintf(stderr, "destruct exception: %zu %zu %s\n", size_t(stats.counter_current),
|
||||||
fprintf(stderr, "destruct exception: %s %zu\n", msg, debug_counter);
|
size_t(stats.counter_total), (const char *) msg);
|
||||||
#endif
|
upx::owner_free(msg);
|
||||||
if (msg)
|
|
||||||
free(msg);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
@@ -150,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(msg, sizeof(msg), format, ap);
|
(void) upx_safe_vsnprintf_noexcept(msg, sizeof(msg), format, ap);
|
||||||
va_end(ap);
|
va_end(ap);
|
||||||
throwCantPack(msg);
|
throwCantPack(msg);
|
||||||
}
|
}
|
||||||
@@ -160,7 +162,17 @@ 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(msg, sizeof(msg), format, ap);
|
(void) upx_safe_vsnprintf_noexcept(msg, sizeof(msg), format, ap);
|
||||||
|
va_end(ap);
|
||||||
|
throwCantUnpack(msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <>
|
||||||
|
void throwInternalError(const char *format, ...) {
|
||||||
|
char msg[1024];
|
||||||
|
va_list ap;
|
||||||
|
va_start(ap, format);
|
||||||
|
(void) upx_safe_vsnprintf_noexcept(msg, sizeof(msg), format, ap);
|
||||||
va_end(ap);
|
va_end(ap);
|
||||||
throwCantUnpack(msg);
|
throwCantUnpack(msg);
|
||||||
}
|
}
|
||||||
|
|||||||
+38
-42
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2023 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2024 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2023 Laszlo Molnar
|
Copyright (C) 1996-2024 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
|
||||||
@@ -27,11 +27,6 @@
|
|||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
const char *prettyName(const char *n) noexcept;
|
|
||||||
|
|
||||||
noinline void assertFailed(const char *expr, const char *file, int line, const char *func) noexcept;
|
|
||||||
noinline void throwAssertFailed(const char *expr, const char *file, int line, const char *func);
|
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
// exceptions
|
// exceptions
|
||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
@@ -43,31 +38,35 @@ protected:
|
|||||||
Throwable(const char *m = nullptr, int e = 0, bool w = false) noexcept;
|
Throwable(const char *m = nullptr, int e = 0, bool w = false) noexcept;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
Throwable(const Throwable &) noexcept;
|
Throwable(const Throwable &) noexcept; // copy constructor
|
||||||
virtual ~Throwable() noexcept;
|
virtual ~Throwable() noexcept;
|
||||||
const char *getMsg() const noexcept { return msg; }
|
const char *getMsg() const noexcept { return msg; }
|
||||||
int getErrno() const noexcept { return err; }
|
int getErrno() const noexcept { return err; }
|
||||||
bool isWarning() const noexcept { return is_warning; }
|
bool isWarning() const noexcept { return is_warning; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
char *msg = nullptr;
|
OwningPointer(char) msg = nullptr;
|
||||||
int err = 0;
|
int err = 0;
|
||||||
protected:
|
protected:
|
||||||
bool is_warning = false; // can be set by subclasses
|
bool is_warning = false; // can be set by subclasses
|
||||||
|
|
||||||
private:
|
private:
|
||||||
// disable copy assignment and move
|
// disable copy assignment and move
|
||||||
Throwable &operator=(const Throwable &) DELETED_FUNCTION;
|
Throwable &operator=(const Throwable &) noexcept DELETED_FUNCTION; // copy assignment
|
||||||
Throwable(Throwable &&) noexcept DELETED_FUNCTION;
|
UPX_CXX_DISABLE_MOVE(Throwable)
|
||||||
Throwable &operator=(Throwable &&) noexcept DELETED_FUNCTION;
|
|
||||||
// disable dynamic allocation => force throwing by value
|
// disable dynamic allocation => force throwing by value
|
||||||
ACC_CXX_DISABLE_NEW_DELETE
|
UPX_CXX_DISABLE_NEW_DELETE(Throwable)
|
||||||
// disable taking the address => force passing by reference
|
// disable taking the address => force passing by reference
|
||||||
// [I'm not too sure about this design decision, but we can always allow it if needed]
|
// [I'm not too sure about this design decision, but we can always allow it if needed]
|
||||||
Throwable *operator&() const noexcept DELETED_FUNCTION;
|
UPX_CXX_DISABLE_ADDRESS(Throwable)
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static upx_std_atomic(size_t) debug_counter; // for debugging
|
// static debug stats
|
||||||
|
struct Stats {
|
||||||
|
upx_std_atomic(size_t) counter_total;
|
||||||
|
upx_std_atomic(size_t) counter_current;
|
||||||
|
};
|
||||||
|
static Stats stats;
|
||||||
};
|
};
|
||||||
|
|
||||||
// Exceptions can/should be caught
|
// Exceptions can/should be caught
|
||||||
@@ -85,7 +84,7 @@ public:
|
|||||||
};
|
};
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
// system exception
|
// system exceptions
|
||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
|
|
||||||
class OutOfMemoryException final : public Exception {
|
class OutOfMemoryException final : public Exception {
|
||||||
@@ -179,40 +178,37 @@ public:
|
|||||||
// util
|
// util
|
||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
|
|
||||||
#undef NORET
|
const char *prettyName(const char *n) noexcept;
|
||||||
#if 1 && defined(__GNUC__)
|
|
||||||
#define NORET noinline __attribute__((__noreturn__))
|
|
||||||
#else
|
|
||||||
#define NORET noinline
|
|
||||||
#endif
|
|
||||||
|
|
||||||
NORET void throwCantPack(const char *msg) may_throw;
|
noreturn void throwCantPack(const char *msg) may_throw;
|
||||||
NORET void throwCantPackExact() may_throw;
|
noreturn void throwCantPackExact() may_throw;
|
||||||
NORET void throwUnknownExecutableFormat(const char *msg = nullptr, bool warn = false) may_throw;
|
noreturn void throwUnknownExecutableFormat(const char *msg = nullptr, bool warn = false) may_throw;
|
||||||
NORET void throwNotCompressible(const char *msg = nullptr) may_throw;
|
noreturn void throwNotCompressible(const char *msg = nullptr) may_throw;
|
||||||
NORET void throwAlreadyPacked(const char *msg = nullptr) may_throw;
|
noreturn void throwAlreadyPacked(const char *msg = nullptr) may_throw;
|
||||||
NORET void throwAlreadyPackedByUPX(const char *msg = nullptr) may_throw;
|
noreturn void throwAlreadyPackedByUPX(const char *msg = nullptr) may_throw;
|
||||||
NORET void throwCantUnpack(const char *msg) may_throw;
|
noreturn void throwCantUnpack(const char *msg) may_throw;
|
||||||
NORET void throwNotPacked(const char *msg = nullptr) may_throw;
|
noreturn void throwNotPacked(const char *msg = nullptr) may_throw;
|
||||||
NORET void throwFilterException() may_throw;
|
noreturn void throwFilterException() may_throw;
|
||||||
NORET void throwBadLoader() may_throw;
|
noreturn void throwBadLoader() may_throw;
|
||||||
NORET void throwChecksumError() may_throw;
|
noreturn void throwChecksumError() may_throw;
|
||||||
NORET void throwCompressedDataViolation() may_throw;
|
noreturn void throwCompressedDataViolation() may_throw;
|
||||||
NORET void throwInternalError(const char *msg) may_throw;
|
noreturn void throwInternalError(const char *msg) may_throw;
|
||||||
NORET void throwOutOfMemoryException(const char *msg = nullptr) may_throw;
|
noreturn void throwOutOfMemoryException(const char *msg = nullptr) may_throw;
|
||||||
NORET void throwIOException(const char *msg = nullptr, int e = 0) may_throw;
|
noreturn void throwIOException(const char *msg = nullptr, int e = 0) may_throw;
|
||||||
NORET void throwEOFException(const char *msg = nullptr, int e = 0) may_throw;
|
noreturn void throwEOFException(const char *msg = nullptr, int e = 0) may_throw;
|
||||||
|
|
||||||
// some C++ template wizardry is needed to overload throwCantPack() for varargs
|
// some C++ template wizardry is needed to overload throwCantPack() for varargs
|
||||||
template <class T>
|
template <class T>
|
||||||
void throwCantPack(const T *, ...) DELETED_FUNCTION;
|
void throwCantPack(const T *, ...) DELETED_FUNCTION;
|
||||||
template <>
|
template <>
|
||||||
NORET void throwCantPack(const char *format, ...) may_throw attribute_format(1, 2);
|
noreturn void throwCantPack(const char *format, ...) may_throw attribute_format(1, 2);
|
||||||
template <class T>
|
template <class T>
|
||||||
void throwCantUnpack(const T *, ...) DELETED_FUNCTION;
|
void throwCantUnpack(const T *, ...) DELETED_FUNCTION;
|
||||||
template <>
|
template <>
|
||||||
NORET void throwCantUnpack(const char *format, ...) may_throw attribute_format(1, 2);
|
noreturn void throwCantUnpack(const char *format, ...) may_throw attribute_format(1, 2);
|
||||||
|
template <class T>
|
||||||
#undef NORET
|
void throwInternalError(const T *, ...) DELETED_FUNCTION;
|
||||||
|
template <>
|
||||||
|
noreturn void throwInternalError(const char *format, ...) may_throw attribute_format(1, 2);
|
||||||
|
|
||||||
/* vim:set ts=4 sw=4 et: */
|
/* vim:set ts=4 sw=4 et: */
|
||||||
|
|||||||
+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-2023 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2024 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2023 Laszlo Molnar
|
Copyright (C) 1996-2024 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-2023 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2024 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2023 Laszlo Molnar
|
Copyright (C) 1996-2024 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-2023 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2024 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2023 Laszlo Molnar
|
Copyright (C) 1996-2024 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-2023 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2024 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2023 Laszlo Molnar
|
Copyright (C) 1996-2024 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-2023 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2024 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2023 Laszlo Molnar
|
Copyright (C) 1996-2024 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-2023 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2024 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2023 Laszlo Molnar
|
Copyright (C) 1996-2024 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-2023 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2024 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2023 Laszlo Molnar
|
Copyright (C) 1996-2024 Laszlo Molnar
|
||||||
Copyright (C) 2000-2023 John F. Reiser
|
Copyright (C) 2000-2024 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
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user