mirror of
https://github.com/upx/upx
synced 2025-10-05 19:20:23 +08:00
Update Makefile and compiler checks so that users don't inadvertently
change mandatory compiler flags.
This commit is contained in:
parent
3781df9da2
commit
d60c46371d
76
src/Makefile
76
src/Makefile
|
@ -1,19 +1,18 @@
|
||||||
#
|
#
|
||||||
# UPX Makefile - needs GNU make 3.81 or better
|
# UPX Makefile - needs GNU make
|
||||||
#
|
#
|
||||||
# Copyright (C) 1996-2020 Markus Franz Xaver Johannes Oberhumer
|
# Copyright (C) 1996-2020 Markus Franz Xaver Johannes Oberhumer
|
||||||
#
|
#
|
||||||
|
|
||||||
|
MAKEFLAGS += -rR
|
||||||
|
.SUFFIXES:
|
||||||
|
export SHELL = /bin/sh
|
||||||
|
|
||||||
# build configuration options for this Makefile
|
# build configuration options for this Makefile
|
||||||
BUILD_TYPE_DEBUG ?= 0
|
BUILD_TYPE_DEBUG ?= 0
|
||||||
BUILD_TYPE_SANITIZE ?= 0
|
BUILD_TYPE_SANITIZE ?= 0
|
||||||
BUILD_USE_DEPEND ?= 1
|
BUILD_USE_DEPEND ?= 1
|
||||||
|
|
||||||
MAKEFLAGS += -r
|
|
||||||
.SUFFIXES:
|
|
||||||
export SHELL = /bin/sh
|
|
||||||
override ee = $($1) $(EXTRA_$1) $(upx_$1) $(upx_EXTRA_$1) $($(basename $(notdir $@)).$1)
|
|
||||||
|
|
||||||
ifndef srcdir
|
ifndef srcdir
|
||||||
srcdir := $(dir $(lastword $(MAKEFILE_LIST)))
|
srcdir := $(dir $(lastword $(MAKEFILE_LIST)))
|
||||||
srcdir := $(shell echo '$(srcdir)' | sed 's,/*$$,,' || echo 'ERROR')
|
srcdir := $(shell echo '$(srcdir)' | sed 's,/*$$,,' || echo 'ERROR')
|
||||||
|
@ -34,6 +33,14 @@ exeext ?= .out
|
||||||
libext ?= .a
|
libext ?= .a
|
||||||
objext ?= .o
|
objext ?= .o
|
||||||
|
|
||||||
|
# flags composition
|
||||||
|
override all_flags = $(mf.$1) $($1) $(EXTRA_$1) $(upx_$1) $(upx_EXTRA_$1) $($(basename $(notdir $@)).$1)
|
||||||
|
ALL_CPPFLAGS = $(strip $(call all_flags,CPPFLAGS))
|
||||||
|
ALL_CXXFLAGS = $(strip $(call all_flags,CXXFLAGS))
|
||||||
|
ALL_LDFLAGS = $(strip $(call all_flags,LDFLAGS))
|
||||||
|
ALL_LDADD = $(strip $(call all_flags,LDADD))
|
||||||
|
ALL_LIBS = $(strip $(call all_flags,LIBS))
|
||||||
|
|
||||||
upx_SOURCES := $(sort $(wildcard $(srcdir)/*.cpp))
|
upx_SOURCES := $(sort $(wildcard $(srcdir)/*.cpp))
|
||||||
upx_OBJECTS := $(notdir $(upx_SOURCES:.cpp=$(objext)))
|
upx_OBJECTS := $(notdir $(upx_SOURCES:.cpp=$(objext)))
|
||||||
|
|
||||||
|
@ -54,30 +61,32 @@ LIBS += -lucl -lz
|
||||||
# LZMA from https://github.com/upx/upx-lzma-sdk
|
# LZMA from https://github.com/upx/upx-lzma-sdk
|
||||||
include $(top_srcdir)/src/stub/src/c/Makevars.lzma
|
include $(top_srcdir)/src/stub/src/c/Makevars.lzma
|
||||||
|
|
||||||
CPPFLAGS += $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES)
|
# optional flags
|
||||||
CXXFLAGS += -std=c++14
|
|
||||||
ifeq ($(BUILD_TYPE_DEBUG),1)
|
ifeq ($(BUILD_TYPE_DEBUG),1)
|
||||||
CXXFLAGS_OPTIMIZE ?= -O0 -g
|
CXXFLAGS_OPTIMIZE ?= -O0 -g
|
||||||
else
|
else
|
||||||
CXXFLAGS_OPTIMIZE ?= -O2
|
CXXFLAGS_OPTIMIZE ?= -O2
|
||||||
endif
|
endif
|
||||||
CXXFLAGS += $(CXXFLAGS_OPTIMIZE)
|
|
||||||
# protect against security threats caused by misguided C++ compiler "optimizations"
|
|
||||||
ifeq ($(findstring clang,$(CXX)),)
|
|
||||||
CXXFLAGS += -fno-delete-null-pointer-checks
|
|
||||||
endif
|
|
||||||
CXXFLAGS += -fno-strict-aliasing -fwrapv
|
|
||||||
CXXFLAGS += -funsigned-char
|
|
||||||
CXXFLAGS += -Wall -W -Wcast-align -Wcast-qual -Wmissing-declarations -Wpointer-arith -Wshadow -Wsign-compare -Wvla -Wwrite-strings
|
|
||||||
CXXFLAGS_WERROR ?= -Werror
|
|
||||||
CXXFLAGS += $(CXXFLAGS_WERROR)
|
|
||||||
|
|
||||||
ifeq ($(BUILD_TYPE_SANITIZE),1)
|
ifeq ($(BUILD_TYPE_SANITIZE),1)
|
||||||
CXXFLAGS_SANITIZE ?= -fsanitize=address,undefined -fno-omit-frame-pointer -DACC_CFG_NO_UNALIGNED
|
CXXFLAGS_SANITIZE ?= -fsanitize=address,undefined -fno-omit-frame-pointer -DACC_CFG_NO_UNALIGNED
|
||||||
CXXFLAGS += $(CXXFLAGS_SANITIZE)
|
else
|
||||||
# these are the only 2 objects that are actually speed-sensitive
|
CXXFLAGS_SANITIZE ?= -fstack-protector-all
|
||||||
compress_lzma$(objext) filteri$(objext) : override CXXFLAGS_SANITIZE =
|
|
||||||
endif
|
endif
|
||||||
|
ifeq ($(findstring clang,$(CXX)),)
|
||||||
|
CXXFLAGS_NO_DELETE_NULL_POINTER_CHECKS ?= -fno-delete-null-pointer-checks
|
||||||
|
endif
|
||||||
|
CXXFLAGS_WERROR ?= -Werror
|
||||||
|
|
||||||
|
# Mandatory Flags - DO NOT CHANGE!
|
||||||
|
mf.CPPFLAGS += $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES)
|
||||||
|
mf.CXXFLAGS += $(CXXFLAGS_OPTIMIZE)
|
||||||
|
# protect against security threats caused by misguided C++ compiler "optimizations"
|
||||||
|
mf.CXXFLAGS += $(CXXFLAGS_NO_DELETE_NULL_POINTER_CHECKS)
|
||||||
|
mf.CXXFLAGS += -fno-strict-aliasing -fno-strict-overflow
|
||||||
|
mf.CXXFLAGS += -funsigned-char
|
||||||
|
mf.CXXFLAGS += $(CXXFLAGS_SANITIZE)
|
||||||
|
mf.CXXFLAGS += -Wall -W -Wcast-align -Wcast-qual -Wmissing-declarations -Wpointer-arith -Wshadow -Wvla -Wwrite-strings
|
||||||
|
mf.CXXFLAGS += $(CXXFLAGS_WERROR)
|
||||||
|
|
||||||
# rules
|
# rules
|
||||||
all: upx$(exeext) | ./.depend
|
all: upx$(exeext) | ./.depend
|
||||||
|
@ -85,20 +94,30 @@ all: upx$(exeext) | ./.depend
|
||||||
|
|
||||||
upx$(exeext): $(upx_OBJECTS) $(upx_DEPENDENCIES)
|
upx$(exeext): $(upx_OBJECTS) $(upx_DEPENDENCIES)
|
||||||
$($(notdir $@).PRE_LINK_STEP)
|
$($(notdir $@).PRE_LINK_STEP)
|
||||||
$(strip $(CXXLD) $(call ee,CXXFLAGS) $(call ee,LDFLAGS) -o $@ $(upx_OBJECTS) $(call ee,LDADD) $(call ee,LIBS))
|
$(strip $(CXXLD) $(ALL_CXXFLAGS) $(ALL_LDFLAGS) -o $@ $(upx_OBJECTS) $(ALL_LDADD) $(ALL_LIBS))
|
||||||
$($(notdir $@).POST_LINK_STEP)
|
$($(notdir $@).POST_LINK_STEP)
|
||||||
$(CHECK_WHITESPACE)
|
$(CHECK_WHITESPACE)
|
||||||
|
|
||||||
%.o : %.cpp | ./.depend
|
%.o : %.cpp | ./.depend
|
||||||
$(strip $(CXX) $(call ee,CPPFLAGS) $(call ee,CXXFLAGS) -o $@ -c $<)
|
$(strip $(CXX) $(ALL_CPPFLAGS) $(ALL_CXXFLAGS) -o $@ -c $<)
|
||||||
%.cpp.ii : %.cpp
|
%.cpp.ii : %.cpp
|
||||||
$(strip $(CXX) $(call ee,CPPFLAGS) $(call ee,CXXFLAGS) -o $@ -E $<)
|
$(strip $(CXX) $(ALL_CPPFLAGS) $(ALL_CXXFLAGS) -o $@ -E $<)
|
||||||
|
|
||||||
|
# object overrides
|
||||||
|
compress_lzma$(objext) : INCLUDES += -I$(UPX_LZMADIR)
|
||||||
|
# these are the only 2 objects that are actually speed-sensitive
|
||||||
|
compress_lzma$(objext) : override CXXFLAGS_SANITIZE =
|
||||||
|
filteri$(objext) : override CXXFLAGS_SANITIZE =
|
||||||
|
# disable some warnings
|
||||||
|
compress_lzma$(objext) : upx_CXXFLAGS += -Wno-shadow
|
||||||
|
p_mach$(objext) : upx_CXXFLAGS += -Wno-cast-align
|
||||||
|
|
||||||
ifeq ($(BUILD_USE_DEPEND),1)
|
ifeq ($(BUILD_USE_DEPEND),1)
|
||||||
./.depend: $(sort $(wildcard $(srcdir)/*.cpp $(srcdir)/*.h)) $(MAKEFILE_LIST)
|
./.depend: $(sort $(wildcard $(srcdir)/*.cpp $(srcdir)/*.h)) $(MAKEFILE_LIST)
|
||||||
@rm -f $@
|
@rm -f $@
|
||||||
@echo "Updating $@"
|
@echo "Updating $@"
|
||||||
@$(strip $(CXX) $(call ee,CPPFLAGS) $(call ee,CXXFLAGS) -MM) $(filter %.cpp,$^) > $@
|
@$(strip $(CXX) $(ALL_CPPFLAGS) $(ALL_CXXFLAGS) -MM) $(filter %.cpp,$^) > $@
|
||||||
|
./.depend : INCLUDES += -I$(UPX_LZMADIR)
|
||||||
else
|
else
|
||||||
./.depend:
|
./.depend:
|
||||||
.PHONY: ./.depend
|
.PHONY: ./.depend
|
||||||
|
@ -117,11 +136,6 @@ endif
|
||||||
mostlyclean clean distclean maintainer-clean:
|
mostlyclean clean distclean maintainer-clean:
|
||||||
rm -f *.d *.ii *.map *.o *.obj *.res ./.depend upx.exe upx.out upx.ttp upx$(exeext)
|
rm -f *.d *.ii *.map *.o *.obj *.res ./.depend upx.exe upx.out upx.ttp upx$(exeext)
|
||||||
|
|
||||||
./.depend compress_lzma$(objext) : INCLUDES += -I$(UPX_LZMADIR)
|
|
||||||
|
|
||||||
compress_lzma$(objext) : CXXFLAGS += -Wno-shadow
|
|
||||||
p_mach$(objext) : CXXFLAGS += -Wno-cast-align
|
|
||||||
|
|
||||||
.PHONY: all mostlyclean clean distclean maintainer-clean
|
.PHONY: all mostlyclean clean distclean maintainer-clean
|
||||||
|
|
||||||
ifeq ($(MAKECMDGOALS),mostlyclean)
|
ifeq ($(MAKECMDGOALS),mostlyclean)
|
||||||
|
|
|
@ -65,6 +65,8 @@
|
||||||
# error "UINT_MAX"
|
# error "UINT_MAX"
|
||||||
#endif
|
#endif
|
||||||
ACC_COMPILE_TIME_ASSERT_HEADER(sizeof(int) == 4)
|
ACC_COMPILE_TIME_ASSERT_HEADER(sizeof(int) == 4)
|
||||||
|
ACC_COMPILE_TIME_ASSERT_HEADER(sizeof(long long) == 8)
|
||||||
|
// check sane compiler mandatory flags
|
||||||
ACC_COMPILE_TIME_ASSERT_HEADER(-1 == ~0) // two's complement - see http://wg21.link/P0907R4
|
ACC_COMPILE_TIME_ASSERT_HEADER(-1 == ~0) // two's complement - see http://wg21.link/P0907R4
|
||||||
ACC_COMPILE_TIME_ASSERT_HEADER(0u-1 == ~0u) // two's complement - see http://wg21.link/P0907R4
|
ACC_COMPILE_TIME_ASSERT_HEADER(0u-1 == ~0u) // two's complement - see http://wg21.link/P0907R4
|
||||||
ACC_COMPILE_TIME_ASSERT_HEADER((1u << 31) << 1 == 0)
|
ACC_COMPILE_TIME_ASSERT_HEADER((1u << 31) << 1 == 0)
|
||||||
|
@ -179,7 +181,7 @@ typedef unsigned char upx_byte;
|
||||||
// see C 11 standard, Annex K
|
// see C 11 standard, Annex K
|
||||||
typedef size_t upx_rsize_t;
|
typedef size_t upx_rsize_t;
|
||||||
#define UPX_RSIZE_MAX UPX_RSIZE_MAX_MEM
|
#define UPX_RSIZE_MAX UPX_RSIZE_MAX_MEM
|
||||||
#define UPX_RSIZE_MAX_MEM (768 * 1024 * 1024) // DO NOT CHANGE
|
#define UPX_RSIZE_MAX_MEM (768 * 1024 * 1024) // DO NOT CHANGE !!!
|
||||||
#define UPX_RSIZE_MAX_STR (1024 * 1024)
|
#define UPX_RSIZE_MAX_STR (1024 * 1024)
|
||||||
|
|
||||||
|
|
||||||
|
@ -671,6 +673,7 @@ void e_exit(int ec) __attribute__((__noreturn__));
|
||||||
#else
|
#else
|
||||||
void e_exit(int ec);
|
void e_exit(int ec);
|
||||||
#endif
|
#endif
|
||||||
|
void upx_compiler_sanity_check(void);
|
||||||
|
|
||||||
|
|
||||||
// msg.cpp
|
// msg.cpp
|
||||||
|
|
27
src/main.cpp
27
src/main.cpp
|
@ -1289,12 +1289,22 @@ static bool test(void)
|
||||||
return true;
|
return true;
|
||||||
}};
|
}};
|
||||||
|
|
||||||
|
template <class A, class B> struct TestNoStrictAliasingStruct {
|
||||||
|
__acc_static_noinline bool test(A *a, B *b) { *a = 0; *b = (B)((B)0-1); return *a != 0; }
|
||||||
|
};
|
||||||
|
template <class A, class B> static inline bool testNoStrictAliasing(A *a, B *b) {
|
||||||
|
return TestNoStrictAliasingStruct<A,B>::test(a, b);
|
||||||
|
}
|
||||||
|
template <class T> struct TestIntegerWrap {
|
||||||
|
static inline bool inc(T x) { return x + 1 > x; }
|
||||||
|
static inline bool dec(T x) { return x - 1 < x; }
|
||||||
|
};
|
||||||
|
|
||||||
#define ACC_WANT_ACC_CHK_CH 1
|
#define ACC_WANT_ACC_CHK_CH 1
|
||||||
#undef ACCCHK_ASSERT
|
#undef ACCCHK_ASSERT
|
||||||
#include "miniacc.h"
|
#include "miniacc.h"
|
||||||
|
|
||||||
__acc_static_noinline void upx_sanity_check(void)
|
void upx_compiler_sanity_check(void)
|
||||||
{
|
{
|
||||||
#define ACC_WANT_ACC_CHK_CH 1
|
#define ACC_WANT_ACC_CHK_CH 1
|
||||||
#undef ACCCHK_ASSERT
|
#undef ACCCHK_ASSERT
|
||||||
|
@ -1340,6 +1350,7 @@ __acc_static_noinline void upx_sanity_check(void)
|
||||||
else { assert(revlen == 12 || revlen == 13); }
|
else { assert(revlen == 12 || revlen == 13); }
|
||||||
if (revlen == 6 || revlen == 13) { assert(gitrev[revlen-1] == '+'); }
|
if (revlen == 6 || revlen == 13) { assert(gitrev[revlen-1] == '+'); }
|
||||||
}
|
}
|
||||||
|
assert(UPX_RSIZE_MAX_MEM == 805306368);
|
||||||
|
|
||||||
#if 1
|
#if 1
|
||||||
assert(TestBELE<LE16>::test());
|
assert(TestBELE<LE16>::test());
|
||||||
|
@ -1396,6 +1407,18 @@ __acc_static_noinline void upx_sanity_check(void)
|
||||||
assert(get_be64_signed(d) == UPX_INT64_C(9186918263483431288));
|
assert(get_be64_signed(d) == UPX_INT64_C(9186918263483431288));
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
union { short v_short; int v_int; long v_long; } u;
|
||||||
|
assert(testNoStrictAliasing(&u.v_short, &u.v_long));
|
||||||
|
|
||||||
|
assert( TestIntegerWrap<int>::inc(0));
|
||||||
|
assert(!TestIntegerWrap<int>::inc(INT_MAX));
|
||||||
|
assert( TestIntegerWrap<int>::dec(0));
|
||||||
|
assert(!TestIntegerWrap<int>::dec(INT_MIN));
|
||||||
|
assert( TestIntegerWrap<unsigned>::inc(0));
|
||||||
|
assert(!TestIntegerWrap<unsigned>::inc(UINT_MAX));
|
||||||
|
assert( TestIntegerWrap<unsigned>::dec(1));
|
||||||
|
assert(!TestIntegerWrap<unsigned>::dec(0));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1427,7 +1450,7 @@ int __acc_cdecl_main main(int argc, char *argv[])
|
||||||
#endif
|
#endif
|
||||||
acc_wildargv(&argc, &argv);
|
acc_wildargv(&argc, &argv);
|
||||||
|
|
||||||
upx_sanity_check();
|
upx_compiler_sanity_check();
|
||||||
opt->reset();
|
opt->reset();
|
||||||
|
|
||||||
if (!argv[0] || !argv[0][0])
|
if (!argv[0] || !argv[0][0])
|
||||||
|
|
|
@ -255,6 +255,7 @@ static void unlink_ofile(char *oname) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void do_files(int i, int argc, char *argv[]) {
|
void do_files(int i, int argc, char *argv[]) {
|
||||||
|
upx_compiler_sanity_check();
|
||||||
if (opt->verbose >= 1) {
|
if (opt->verbose >= 1) {
|
||||||
show_head();
|
show_head();
|
||||||
UiPacker::uiHeader();
|
UiPacker::uiHeader();
|
||||||
|
|
Loading…
Reference in New Issue
Block a user