diff --git a/.github/typos_config.toml b/.github/typos_config.toml index 34b8b0ce..e5ba5d36 100644 --- a/.github/typos_config.toml +++ b/.github/typos_config.toml @@ -4,7 +4,7 @@ # tricky, so some false positives are fine [files] -extend-exclude = ["LICENSE"] +extend-exclude = ["LICENSE", "misc/*/packages.txt"] [default.extend-identifiers] # misc variable names & symbols @@ -12,6 +12,7 @@ acc_spawnve = "acc_spawnve" ba = "ba" fo = "fo" fof = "fof" +O_WRONLY = "O_WRONLY" sidelen = "sidelen" # assembly sources CArry = "CArry" @@ -22,6 +23,7 @@ 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 @@ -30,6 +32,8 @@ parm = "parm" # rela: ELF relocations RELA = "RELA" rela = "rela" +# siz is used for size +siz = "siz" # SEH: Structured Exception Handling SEH = "SEH" seh = "seh" diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 1e5a708d..5b4c3b72 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -20,11 +20,12 @@ jobs: - name: 'Install extra packages' run: | uname -a; pwd; id; umask + if ! test -e /usr/bin/python2; then + sudo apt-get update && sudo apt-get install -y --no-install-recommends python2-minimal + fi mkdir ../deps; cd ../deps; mkdir packages - # for ubuntu-22.04: install python2-minimal - ##sudo apt-get update && sudo apt-get install -y --no-install-recommends python2-minimal # manually install compat libs from Ubuntu 16.04 - wget -q 'http://archive.kernel.org/ubuntu-archive/ubuntu/pool/main/m/mpfr4/libmpfr4_3.1.6-1_amd64.deb' + wget -q 'https://archive.kernel.org/ubuntu-archive/ubuntu/pool/main/m/mpfr4/libmpfr4_3.1.6-1_amd64.deb' for f in ./*.deb; do dpkg -x $f ./packages; done sudo mv -v -n ./packages/usr/lib/x86_64-linux-gnu/lib* /usr/lib/x86_64-linux-gnu/ rm -rf ./*.deb ./packages @@ -385,8 +386,8 @@ jobs: - { zig_target: x86_64-macos.13-none } - { zig_target: x86_64-windows-gnu } env: - # 2023-06-08 - ZIG_DIST_VERSION: 0.11.0-dev.3384+00ff65357 + # 2023-06-11 + ZIG_DIST_VERSION: 0.11.0-dev.3395+1e7dcaa3a # for zig-cc wrapper scripts (see below): ZIG_CPPFLAGS: -DUPX_DOCTEST_CONFIG_MULTITHREADING ZIG_FLAGS: ${{ matrix.zig_flags }} diff --git a/CMakeLists.txt b/CMakeLists.txt index 1c245635..e4459998 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -190,6 +190,10 @@ else() add_definitions(-fno-strict-aliasing -fno-strict-overflow -funsigned-char) # disable overambitious auto-vectorization until this actually gains something add_definitions(-fno-tree-vectorize) + # disable annoying clang warnings which get added by the Apple Xcode cmake generator + if(CMAKE_C_COMPILER_ID MATCHES "Clang" AND CMAKE_GENERATOR STREQUAL "Xcode") + add_definitions(-Wno-shorten-64-to-32) + endif() endif() # compile a target with -O2 even in Debug build diff --git a/misc/cross-compile-upx-with-podman/11-list-packages.sh b/misc/cross-compile-upx-with-podman/11-list-packages.sh index f523edfb..55c8aa6c 100755 --- a/misc/cross-compile-upx-with-podman/11-list-packages.sh +++ b/misc/cross-compile-upx-with-podman/11-list-packages.sh @@ -17,3 +17,21 @@ 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 \' +{ + if ($1 == "Architecture:") arch = $2; + if ($1 == "Installed-Size:") size = $2; + if ($1 == "Package:") p = $2; + if ($1 == "") { + printf("%9d %-40s %s\\n", size, p, arch); + count += 1; total += size; + arch = ""; size = 0; p = ""; + } +} +END { + printf("%9d ===== TOTAL (%d packages)\\n", total, count); +} +\' /var/lib/dpkg/status | LC_ALL=C sort -rn' diff --git a/misc/rebuild-stubs-with-podman/11-list-packages.sh b/misc/rebuild-stubs-with-podman/11-list-packages.sh index 66505d9a..6a26046d 100755 --- a/misc/rebuild-stubs-with-podman/11-list-packages.sh +++ b/misc/rebuild-stubs-with-podman/11-list-packages.sh @@ -17,3 +17,21 @@ 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 \' +{ + if ($1 == "Architecture:") arch = $2; + if ($1 == "Installed-Size:") size = $2; + if ($1 == "Package:") p = $2; + if ($1 == "") { + printf("%9d %-40s %s\\n", size, p, arch); + count += 1; total += size; + arch = ""; size = 0; p = ""; + } +} +END { + printf("%9d ===== TOTAL (%d packages)\\n", total, count); +} +\' /var/lib/dpkg/status | LC_ALL=C sort -rn' diff --git a/src/bele.h b/src/bele.h index 23bb31dc..090bb937 100644 --- a/src/bele.h +++ b/src/bele.h @@ -169,8 +169,8 @@ inline void set_le24(void *p, unsigned v) noexcept { } inline unsigned get_le26(const void *p) noexcept { return get_le32(p) & 0x03ffffff; } -inline unsigned get_le19_5(const void *p) noexcept { return 0x7ffff & (get_le32(p) >> 5); } -inline unsigned get_le14_5(const void *p) noexcept { return 0x03fff & (get_le32(p) >> 5); } +inline unsigned get_le19_5(const void *p) noexcept { return 0x0007ffff & (get_le32(p) >> 5); } +inline unsigned get_le14_5(const void *p) noexcept { return 0x00003fff & (get_le32(p) >> 5); } inline void set_le26(void *p, unsigned v) noexcept { // preserve the top 6 bits @@ -180,10 +180,10 @@ inline void set_le26(void *p, unsigned v) noexcept { (ne32_to_le32(v) & ne32_to_le32(0x03ffffff))); } inline void set_le19_5(void *p, unsigned v) noexcept { - set_le32(p, (get_le32(p) & 0xff00001f) | ((v & 0x07ffff) << 5)); + set_le32(p, (get_le32(p) & 0xff00001f) | ((v & 0x0007ffff) << 5)); } inline void set_le14_5(void *p, unsigned v) noexcept { - set_le32(p, (get_le32(p) & 0xfff8001f) | ((v & 0x003fff) << 5)); + set_le32(p, (get_le32(p) & 0xfff8001f) | ((v & 0x00003fff) << 5)); } /************************************************************************* diff --git a/src/check/dt_xspan.cpp b/src/check/dt_xspan.cpp index b729c23b..9ed212b5 100644 --- a/src/check/dt_xspan.cpp +++ b/src/check/dt_xspan.cpp @@ -115,8 +115,6 @@ TEST_CASE("basic xspan usage") { } SUBCASE("XSPAN_x_VAR") { - XSPAN_0_VAR(char, a0, nullptr); - XSPAN_0_VAR(char, b0, buf); XSPAN_P_VAR(char, bp, buf); @@ -135,7 +133,6 @@ TEST_CASE("basic xspan usage") { XSPAN_0_VAR(const char, const z0p, yp); XSPAN_0_VAR(const char, const z0s, xs); - CHECK((a0 == nullptr)); CHECK(c0 == b0); CHECK(cp == bp); CHECK(cs == bp); @@ -144,9 +141,13 @@ TEST_CASE("basic xspan usage") { CHECK(x0 == z0p); CHECK(xp == z0s); +#if WITH_XSPAN >= 1 || __cplusplus >= 201103L + XSPAN_0_VAR(char, a0, nullptr); + CHECK((a0 == nullptr)); CHECK_NOTHROW(raw_bytes(a0, 0)); CHECK_THROWS(raw_bytes(a0, 1)); CHECK_THROWS(raw_index_bytes(a0, 0, 0)); +#endif CHECK(raw_bytes(b0, 0) == buf); CHECK(raw_bytes(bp, 0) == buf); diff --git a/src/conf.h b/src/conf.h index 91deeb05..18ee56fe 100644 --- a/src/conf.h +++ b/src/conf.h @@ -202,6 +202,11 @@ typedef upx_int64_t upx_off_t; # undef __unix__ #endif +#if defined(HAVE_DUP) && (HAVE_DUP + 0 == 0) +# undef dup +# define dup(x) (-1) +#endif + #ifndef STDIN_FILENO # define STDIN_FILENO (fileno(stdin)) #endif diff --git a/src/file.cpp b/src/file.cpp index 3548df43..3a94929a 100644 --- a/src/file.cpp +++ b/src/file.cpp @@ -33,7 +33,7 @@ **************************************************************************/ /*static*/ void FileBase::chmod(const char *name, int mode) { -#if (HAVE_CHMOD) +#if HAVE_CHMOD if (::chmod(name, mode) != 0) throwIOException(name, errno); #else diff --git a/src/linker.cpp b/src/linker.cpp index 5a6c3b55..2ab3c24e 100644 --- a/src/linker.cpp +++ b/src/linker.cpp @@ -799,12 +799,12 @@ void ElfLinkerPpc32::relocate1(const Relocation *rel, byte *location, upx_uint64 // Note that original (*location).displ is ignored. if (strcmp(type, "24") == 0) { if (3 & value) - internal_error("unaligned word diplacement"); + internal_error("unaligned word displacement"); // FIXME: displacement overflow? set_be32(location, (0xfc000003 & get_be32(location)) + (0x03fffffc & value)); } else if (strcmp(type, "14") == 0) { if (3 & value) - internal_error("unaligned word diplacement"); + internal_error("unaligned word displacement"); // FIXME: displacement overflow? set_be32(location, (0xffff0003 & get_be32(location)) + (0x0000fffc & value)); } else diff --git a/src/packer.cpp b/src/packer.cpp index 3e501f98..5fbe72f5 100644 --- a/src/packer.cpp +++ b/src/packer.cpp @@ -566,8 +566,7 @@ unsigned Packer::getRandomId() const { int fd = open("/dev/urandom", O_RDONLY | O_BINARY); if (fd < 0) fd = open("/dev/random", O_RDONLY | O_BINARY); - if (fd >= 0) - { + if (fd >= 0) { if (read(fd, &id, 4) != 4) id = 0; close(fd); @@ -583,7 +582,7 @@ unsigned Packer::getRandomId() const { id ^= (unsigned) tv.tv_sec; id ^= ((unsigned) tv.tv_usec) << 12; // shift into high-bits #endif -#if (HAVE_GETPID) +#if HAVE_GETPID id ^= (unsigned) getpid(); #endif id ^= (unsigned) fi->st.st_ino; diff --git a/src/packer_r.cpp b/src/packer_r.cpp index dfc8cb00..6d7aae4a 100644 --- a/src/packer_r.cpp +++ b/src/packer_r.cpp @@ -145,7 +145,7 @@ unsigned Packer::unoptimizeReloc(SPAN_S(const byte) & in, MemBuffer &out, SPAN_P } } in = fix + 1; // advance - assert(relocnum == ptr_udiff_bytes(relocs, out) / 4); + assert(relocnum == ptr_udiff_bytes(relocs, raw_bytes(out, 0)) / 4); return relocnum; } diff --git a/src/util/membuffer.h b/src/util/membuffer.h index 7ecb1e05..3741777c 100644 --- a/src/util/membuffer.h +++ b/src/util/membuffer.h @@ -124,9 +124,13 @@ inline typename MemBufferBase::pointer raw_index_bytes(const MemBufferBase typename std::enable_if::value, RType>::type #define C MemBufferBase #define XSPAN_FWD_C_IS_MEMBUFFER 1 +#if WITH_XSPAN >= 1 +#define D XSPAN_NS(Ptr) +#endif #include "xspan_fwd.h" #undef XSPAN_FWD_C_IS_MEMBUFFER #undef C +#undef D #undef XSPAN_REQUIRES_CONVERTIBLE_ANY_DIRECTION /************************************************************************* diff --git a/src/util/util.cpp b/src/util/util.cpp index 907f4331..e96df8ef 100644 --- a/src/util/util.cpp +++ b/src/util/util.cpp @@ -680,7 +680,7 @@ bool file_exists(const char *name) { return true; /* return true if we can lstat it */ -#if (HAVE_LSTAT) +#if HAVE_LSTAT // mem_clear(&st); r = lstat(name, &st); if (r != -1) diff --git a/src/util/xspan_impl_ptr.h b/src/util/xspan_impl_ptr.h index 07eb3d08..cc4ad3b2 100644 --- a/src/util/xspan_impl_ptr.h +++ b/src/util/xspan_impl_ptr.h @@ -224,8 +224,12 @@ XSPAN_NAMESPACE_END #if 1 #define C XSPAN_NS(Ptr) +template +class MemBufferBase; +#define D MemBufferBase #include "xspan_fwd.h" #undef C +#undef D #endif diff --git a/src/work.cpp b/src/work.cpp index 0dcb2b86..25871900 100644 --- a/src/work.cpp +++ b/src/work.cpp @@ -40,7 +40,7 @@ #define USE_FTIME 1 #elif ((ACC_OS_WIN32 || ACC_OS_WIN64) && (ACC_CC_INTELC || ACC_CC_MSC)) #define USE__FUTIME 1 -#elif (HAVE_UTIME) +#elif HAVE_UTIME #define USE_UTIME 1 #endif @@ -62,7 +62,7 @@ void do_one_file(const char *iname, char *oname) { int r; struct stat st; mem_clear(&st); -#if (HAVE_LSTAT) +#if HAVE_LSTAT r = lstat(iname, &st); #else r = stat(iname, &st); @@ -104,7 +104,7 @@ void do_one_file(const char *iname, char *oname) { fi.st = st; fi.sopen(iname, O_RDONLY | O_BINARY, SH_DENYWR); -#if (USE_FTIME) +#if USE_FTIME struct ftime fi_ftime; mem_clear(&fi_ftime); if (opt->preserve_timestamp) { @@ -124,7 +124,7 @@ void do_one_file(const char *iname, char *oname) { if (opt->output_name) { strcpy(tname, opt->output_name); if (opt->force_overwrite || opt->force >= 2) { -#if (HAVE_CHMOD) +#if HAVE_CHMOD r = chmod(tname, 0777); IGNORE_ERROR(r); #endif @@ -173,10 +173,10 @@ void do_one_file(const char *iname, char *oname) { // copy time stamp if (oname[0] && opt->preserve_timestamp && fo.isOpen()) { -#if (USE_FTIME) +#if USE_FTIME r = setftime(fo.getFd(), &fi_ftime); IGNORE_ERROR(r); -#elif (USE__FUTIME) +#elif USE__FUTIME struct _utimbuf u; u.actime = st.st_atime; u.modtime = st.st_mtime; @@ -197,7 +197,7 @@ void do_one_file(const char *iname, char *oname) { throwIOException("could not create a backup file name"); FileBase::rename(iname, bakname); } else { -#if (HAVE_CHMOD) +#if HAVE_CHMOD r = chmod(iname, 0777); IGNORE_ERROR(r); #endif @@ -211,7 +211,7 @@ void do_one_file(const char *iname, char *oname) { oname[0] = 0; // done with oname const char *name = opt->output_name ? opt->output_name : iname; UNUSED(name); -#if (USE_UTIME) +#if USE_UTIME // copy time stamp if (opt->preserve_timestamp) { struct utimbuf u; @@ -221,21 +221,21 @@ void do_one_file(const char *iname, char *oname) { IGNORE_ERROR(r); } #endif -#if (HAVE_CHOWN) +#if HAVE_CHOWN // copy the group ownership if (opt->preserve_ownership) { r = chown(name, -1, st.st_gid); IGNORE_ERROR(r); } #endif -#if (HAVE_CHMOD) +#if HAVE_CHMOD // copy permissions if (opt->preserve_mode) { r = chmod(name, st.st_mode); IGNORE_ERROR(r); } #endif -#if (HAVE_CHOWN) +#if HAVE_CHOWN // copy the user ownership if (opt->preserve_ownership) { r = chown(name, st.st_uid, -1); @@ -253,7 +253,7 @@ void do_one_file(const char *iname, char *oname) { static void unlink_ofile(char *oname) { if (oname && oname[0]) { -#if (HAVE_CHMOD) +#if HAVE_CHMOD int r; r = chmod(oname, 0777); IGNORE_ERROR(r);