From d66311a045021bfdf657f0a1e655a81130630c41 Mon Sep 17 00:00:00 2001 From: Vladimir Dubrovin <3proxy@3proxy.ru> Date: Wed, 27 May 2026 17:04:34 +0300 Subject: [PATCH] Support STATIC and LIBSTATIC in Makefile's, fix dockerfiles --- Dockerfile.busybox | 16 ++++++---------- Dockerfile.full | 18 +++++++----------- Dockerfile.minimal | 6 ++---- Makefile.FreeBSD | 21 +++++++++++++++------ Makefile.Linux | 30 ++++++++++++++++++++---------- Makefile.unix | 21 +++++++++++++++------ Makefile.win | 8 ++++---- 7 files changed, 69 insertions(+), 51 deletions(-) diff --git a/Dockerfile.busybox b/Dockerfile.busybox index 1081a29..8bff530 100644 --- a/Dockerfile.busybox +++ b/Dockerfile.busybox @@ -13,7 +13,7 @@ # use "log" without pathname in config to log to stdout. # plugins are located in /usr/local/3proxy/libexec (/libexec for chroot config) # symlinked as /lib and /lib64 in both root and chroot configurations, so no need -# to specify full path to plugin. SSLPlugin is supported. +# to specify full path to plugin. # # Since 0.9.6 image is distroless, no reason to use chroot, chroot # configuration is supported for compatibility only. @@ -23,7 +23,7 @@ FROM docker.io/gcc AS buildenv COPY . 3proxy RUN cd 3proxy &&\ apt --assume-yes update && apt --assume-yes install libssl-dev libpcre2-dev &&\ - make -f Makefile.Linux &&\ + make -f Makefile.Linux LIBSTATIC=true PAM_CHECK=false &&\ strip bin/3proxy &&\ strip bin/*so &&\ mkdir /dist &&\ @@ -41,14 +41,10 @@ RUN cd 3proxy &&\ RUN cd /dist &&\ ln -s /lib lib64 &&\ ln -s /lib usr/lib &&\ - ln -s /lib usr/lib64 &&\ - cp /lib64/ld-*.so.* /dist/usr/local/3proxy/libexec &&\ - cp "/lib/`gcc -dumpmachine`"/libdl.so.* /dist/usr/local/3proxy/libexec &&\ - cp "/lib/`gcc -dumpmachine`"/libcrypto.so.* /dist/usr/local/3proxy/libexec &&\ - cp "/lib/`gcc -dumpmachine`"/libssl.so.* /dist/usr/local/3proxy/libexec &&\ - cp "/lib/`gcc -dumpmachine`"/libpcre2-8.so.* /dist/usr/local/3proxy/libexec &&\ - cp "/lib/`gcc -dumpmachine`"/libz.so.* /dist/usr/local/3proxy/libexec &&\ - cp "/lib/`gcc -dumpmachine`"/libzstd.so.* /dist/usr/local/3proxy/libexec &&\ + ln -s /lib usr/lib64 +RUN cp /lib/ld-*.so.* /dist/usr/local/3proxy/libexec || true +RUN cp /lib64/ld-*.so.* /dist/usr/local/3proxy/libexec || true +RUN cp "/lib/`gcc -dumpmachine`"/libdl.so.* /dist/usr/local/3proxy/libexec &&\ ls -lR /dist FROM docker.io/busybox:glibc diff --git a/Dockerfile.full b/Dockerfile.full index 5fcc2f1..829aaa4 100644 --- a/Dockerfile.full +++ b/Dockerfile.full @@ -13,7 +13,7 @@ # use "log" without pathname in config to log to stdout. # plugins are located in /usr/local/3proxy/libexec (/libexec for chroot config) # symlinked as /lib and /lib64 in both root and chroot configurations, so no need -# to specify full path to plugin. SSLPlugin is supported. +# to specify full path to plugin. # # Since 0.9.6 image is distroless, no reason to use chroot, chroot # configuration is supported for compatibility only. @@ -23,7 +23,7 @@ FROM docker.io/gcc AS buildenv COPY . 3proxy RUN cd 3proxy &&\ apt --assume-yes update && apt --assume-yes install libssl-dev libpcre2-dev &&\ - make -f Makefile.Linux &&\ + make -f Makefile.Linux LIBSTATIC=true PAM_CHECK=false &&\ strip bin/3proxy &&\ mkdir /dist &&\ mkdir /dist/etc &&\ @@ -42,15 +42,11 @@ RUN cd /dist &&\ ln -s /usr/local/3proxy/libexec lib &&\ ln -s /usr/local/3proxy/libexec usr/lib &&\ ln -s /usr/local/3proxy/libexec usr/lib64 &&\ - ln -s /usr/local/3proxy/libexec /dist/usr/local/3proxy/libexec/`gcc -dumpmachine` &&\ - cp /lib64/ld-*.so.* /dist/usr/local/3proxy/libexec &&\ - cp "/lib/`gcc -dumpmachine`"/libc.so.* /dist/usr/local/3proxy/libexec &&\ - cp "/lib/`gcc -dumpmachine`"/libdl.so.* /dist/usr/local/3proxy/libexec &&\ - cp "/lib/`gcc -dumpmachine`"/libcrypto.so.* /dist/usr/local/3proxy/libexec &&\ - cp "/lib/`gcc -dumpmachine`"/libssl.so.* /dist/usr/local/3proxy/libexec &&\ - cp "/lib/`gcc -dumpmachine`"/libpcre2-8.so.* /dist/usr/local/3proxy/libexec &&\ - cp "/lib/`gcc -dumpmachine`"/libz.so.* /dist/usr/local/3proxy/libexec &&\ - cp "/lib/`gcc -dumpmachine`"/libzstd.so.* /dist/usr/local/3proxy/libexec + ln -s /usr/local/3proxy/libexec /dist/usr/local/3proxy/libexec/`gcc -dumpmachine` +RUN cp /lib/ld-*.so.* /dist/usr/local/3proxy/libexec || true +RUN cp /lib64/ld-*.so.* /dist/usr/local/3proxy/libexec || true +RUN cp "/lib/`gcc -dumpmachine`"/libc.so.* /dist/usr/local/3proxy/libexec &&\ + cp "/lib/`gcc -dumpmachine`"/libdl.so.* /dist/usr/local/3proxy/libexec RUN cd /dist/usr/local/3proxy/ &&\ ln -s libexec lib &&\ ln -s libexec lib64 &&\ diff --git a/Dockerfile.minimal b/Dockerfile.minimal index f3328c7..7c013a1 100644 --- a/Dockerfile.minimal +++ b/Dockerfile.minimal @@ -6,7 +6,7 @@ # This is busybox based docker with only 3proxy static executable. # # Limitations for minimal version: -# no support for plugins, IPv6, RADIUS, system resolver. +# no support for plugins and system resolver. # 'nserver' or 'fakeresolve' are mandatory in configuration. # # Build: @@ -28,9 +28,7 @@ FROM docker.io/gcc AS buildenv COPY . 3proxy RUN cd 3proxy &&\ - export "LDFLAGS=-static" &&\ - export "CFLAGS=-DNOPLUGINS -DNORADIUS -DNOIPV6 -DNOODBC -DNOCRYPT -DNOSTDRESOLVE" &&\ - make -f Makefile.Linux PLUGINS= LIBS= &&\ + make -f Makefile.Linux STATIC=true &&\ strip bin/3proxy FROM scratch diff --git a/Makefile.FreeBSD b/Makefile.FreeBSD index 034286e..e9c96cc 100644 --- a/Makefile.FreeBSD +++ b/Makefile.FreeBSD @@ -14,7 +14,7 @@ CFLAGS ?= -O3 -flto CFLAGS += -c -fno-strict-aliasing -DFD_SETSIZE=4096 -DWITH_POLL -DWITH_UN COUT = -o LN ?= ${CC} -LDFLAGS ?= -flto +LDFLAGS ?= -O3 -flto LDFLAGS += -pthread -fno-strict-aliasing # -lpthreads may be reuiured on some platforms instead of -pthreads # -ldl or -lld may be required for some platforms @@ -36,23 +36,32 @@ COMPATLIBS = MAKEFILE = Makefile.FreeBSD PLUGINS ?= StringsPlugin TrafficPlugin TransparentPlugin FilePlugin ifeq ($(STATIC), true) + LDFLAGS += -static + CFLAGS += -DNOPLUGINS -DNOSTDRESOLVE -DNOCRYPT + ZLIB = -lz -lzstd + PLUGINS = + PAM_CHECK = false +endif +ifeq ($(LIBSTATIC), true) STATIC_PREFIX = -Wl,-Bstatic STATIC_SUFFIX = -Wl,-Bdynamic - ZLIB = -lz + ZLIB = -lz -lzstd endif -OPENSSL_CHECK = $(shell echo "\#include \\n int main(){return 0;}" | tr -d \\\\ | $(CC) -x c $(CFLAGS) -o testssl.o - 2>/dev/null && $(CC) $(LDFLAGS) -otestssl testssl.o $(STATIC_PREFIX) -lcrypto -lssl $(ZLIB) $(STATIC_SUFFIX) 2>/dev/null && rm testssl testssl.o && echo true||echo false) +OPENSSL_CHECK ?= $(shell echo "\#include \\n int main(){return 0;}" | tr -d \\\\ | $(CC) -x c $(CFLAGS) -o testssl.o - 2>/dev/null && $(CC) $(LDFLAGS) -otestssl testssl.o $(STATIC_PREFIX) $(ZLIB) -lcrypto -lssl $(STATIC_SUFFIX) 2>/dev/null && rm testssl testssl.o && echo true||echo false) ifeq ($(OPENSSL_CHECK), true) - LIBS += $(STATIC_PREFIX) -l crypto -l ssl $(ZLIB) $(STATIC_SUFFIX) + LIBS += $(STATIC_PREFIX) $(ZLIB) -l crypto -l ssl $(STATIC_SUFFIX) CFLAGS += -DWITH_SSL SSL_OBJS = ssllib$(OBJSUFFICS) ssl$(OBJSUFFICS) +else + ZLIB := endif -PCRE_CHECK = $(shell echo "\#define PCRE2_CODE_UNIT_WIDTH 8\\n\#include \\n int main(){return 0;}" | tr -d \\\\ | $(CC) -x c $(CFLAGS) -o testpcre.o - 2>/dev/null && $(CC) -o testpcre testpcre.o $(LDFLAGS) -lpcre2-8 2>/dev/null && rm testpcre testpcre.o && echo true||echo false) +PCRE_CHECK ?= $(shell echo "\#define PCRE2_CODE_UNIT_WIDTH 8\\n\#include \\n int main(){return 0;}" | tr -d \\\\ | $(CC) -x c $(CFLAGS) -o testpcre.o - 2>/dev/null && $(CC) -o testpcre testpcre.o $(LDFLAGS) -lpcre2-8 2>/dev/null && rm testpcre testpcre.o && echo true||echo false) ifeq ($(PCRE_CHECK), true) CFLAGS += -DWITH_PCRE PCRE_OBJS = pcre$(OBJSUFFICS) PCRE_LIBS = $(STATIC_PREFIX) -lpcre2-8 $(STATIC_SUFFIX) endif -PAM_CHECK = $(shell echo "\#include \\n int main(){return 0;}" | tr -d \\\\ | $(CC) -x c $(CFLAGS) -o testpam.o - 2>/dev/null && $(CC) $(LDFLAGS) -o testpam testpam.o -lpam 2>/dev/null && rm testpam testpam.o && echo true||echo false) +PAM_CHECK ?= $(shell echo "\#include \\n int main(){return 0;}" | tr -d \\\\ | $(CC) -x c $(CFLAGS) -o testpam.o - 2>/dev/null && $(CC) $(LDFLAGS) -o testpam testpam.o -lpam 2>/dev/null && rm testpam testpam.o && echo true||echo false) ifeq ($(PAM_CHECK), true) PLUGINS += PamAuth endif diff --git a/Makefile.Linux b/Makefile.Linux index f4d6cd0..857ccb1 100644 --- a/Makefile.Linux +++ b/Makefile.Linux @@ -9,13 +9,13 @@ PREFIX ?= 3proxy_ CRYPT_PREFIX ?= $(PREFIX) CC ?= gcc -CFLAGS ?= -O3 -flto -CFLAGS += -fPIC -fno-strict-aliasing -c -pthread -DWITHSPLICE -D_GNU_SOURCE -DGETHOSTBYNAME_R -D_THREAD_SAFE -D_REENTRANT -DFD_SETSIZE=4096 -DWITH_POLL -DWITH_NETFILTER -D WITH_UN +CFLAGS ?= -O3 -flto -fPIC +CFLAGS += -fno-strict-aliasing -c -pthread -DWITHSPLICE -D_GNU_SOURCE -DGETHOSTBYNAME_R -D_THREAD_SAFE -D_REENTRANT -DFD_SETSIZE=4096 -DWITH_POLL -DWITH_NETFILTER -D WITH_UN COUT = -o LN ?= ${CC} DCFLAGS ?= -LDFLAGS ?= -flto -LDFLAGS += -fPIC -O3 -fno-strict-aliasing -pthread +LDFLAGS ?= -O3 -flto -fPIC +LDFLAGS += -fno-strict-aliasing -pthread DLFLAGS ?= -shared DLSUFFICS = .ld.so # -lpthreads may be reuqired on some platforms instead of -pthreads @@ -34,28 +34,38 @@ MAKEFILE = Makefile.Linux # PamAuth requires libpam, you may require pam-devel package to be installed # SSLPlugin requires -lcrypto -lssl #LIBS = -lcrypto -lssl -ldl -LIBS ?= -ldl #PLUGINS = SSLPlugin StringsPlugin TrafficPlugin PCREPlugin TransparentPlugin PamAuth PLUGINS ?= StringsPlugin TrafficPlugin TransparentPlugin FilePlugin ifeq ($(STATIC), true) + LDFLAGS += -static + CFLAGS += -DNOPLUGINS -DNOSTDRESOLVE -DNOCRYPT + ZLIB = -lz -lzstd + PLUGINS = + PAM_CHECK = false +else + LIBS += -ldl +endif +ifeq ($(LIBSTATIC), true) STATIC_PREFIX = -Wl,-Bstatic STATIC_SUFFIX = -Wl,-Bdynamic - ZLIB = -lz + ZLIB = -lz -lzstd endif -OPENSSL_CHECK = $(shell echo "\#include \\n int main(){return 0;}" | tr -d \\\\ | $(CC) -x c $(CFLAGS) -o testssl.o - 2>/dev/null && $(CC) $(LDFLAGS) -otestssl testssl.o $(STATIC_PREFIX) -lcrypto -lssl $(ZLIB) $(STATIC_SUFFIX) 2>/dev/null && rm testssl testssl.o && echo true||echo false) +OPENSSL_CHECK ?= $(shell echo "\#include \\n int main(){return 0;}" | tr -d \\\\ | $(CC) -x c $(CFLAGS) -o testssl.o - 2>/dev/null && $(CC) $(LDFLAGS) -otestssl testssl.o $(STATIC_PREFIX) $(ZLIB) -lcrypto -lssl $(STATIC_SUFFIX) 2>/dev/null && rm testssl testssl.o && echo true||echo false) ifeq ($(OPENSSL_CHECK), true) - LIBS += $(STATIC_PREFIX) -lcrypto -lssl $(ZLIB) $(STATIC_SUFFIX) + LIBS += $(STATIC_PREFIX) $(ZLIB) -lcrypto -lssl $(STATIC_SUFFIX) CFLAGS += -DWITH_SSL SSL_OBJS = ssllib$(OBJSUFFICS) ssl$(OBJSUFFICS) +else + ZLIB := endif -PCRE_CHECK = $(shell echo "\#define PCRE2_CODE_UNIT_WIDTH 8\\n\#include \\n int main(){return 0;}" | tr -d \\\\ | $(CC) -x c $(CFLAGS) -o testpcre.o - 2>/dev/null && $(CC) -o testpcre testpcre.o $(LDFLAGS) $(STATIC_PREFIX) -lpcre2-8 $(STATIC_SUFFIX) 2>/dev/null && rm testpcre testpcre.o && echo true||echo false) +PCRE_CHECK ?= $(shell echo "\#define PCRE2_CODE_UNIT_WIDTH 8\\n\#include \\n int main(){return 0;}" | tr -d \\\\ | $(CC) -x c $(CFLAGS) -o testpcre.o - 2>/dev/null && $(CC) -o testpcre testpcre.o $(LDFLAGS) $(STATIC_PREFIX) -lpcre2-8 $(STATIC_SUFFIX) 2>/dev/null && rm testpcre testpcre.o && echo true||echo false) ifeq ($(PCRE_CHECK), true) CFLAGS += -DWITH_PCRE PCRE_OBJS = pcre$(OBJSUFFICS) PCRE_LIBS = $(STATIC_PREFIX) -lpcre2-8 $(STATIC_SUFFIX) endif -PAM_CHECK = $(shell echo "\#include \\n int main(){return 0;}" | tr -d \\\\ | $(CC) -x c $(CFLAGS) -o testpam.o - 2>/dev/null && $(CC) $(LDFLAGS) -o testpam testpam.o -lpam 2>/dev/null && rm testpam testpam.o && echo true||echo false) +PAM_CHECK ?= $(shell echo "\#include \\n int main(){return 0;}" | tr -d \\\\ | $(CC) -x c $(CFLAGS) -o testpam.o - 2>/dev/null && $(CC) $(LDFLAGS) -o testpam testpam.o -lpam 2>/dev/null && rm testpam testpam.o && echo true||echo false) ifeq ($(PAM_CHECK), true) PLUGINS += PamAuth endif diff --git a/Makefile.unix b/Makefile.unix index 0cdf976..9fae45f 100644 --- a/Makefile.unix +++ b/Makefile.unix @@ -16,7 +16,7 @@ CFLAGS ?= -O3 -flto CFLAGS += -fno-strict-aliasing -c -pthread -D_THREAD_SAFE -D_REENTRANT -DFD_SETSIZE=4096 -DWITH_POLL -DWITH_UN COUT = -o LN ?= $(CC) -LDFLAGS ?= -flto +LDFLAGS ?= -O3 -flto LDFLAGS += -pthread -fno-strict-aliasing # -lpthreads may be reuqired on some platforms instead of -pthreads # -ldl or -lld may be required for some platforms @@ -38,23 +38,32 @@ COMPATLIBS = MAKEFILE = Makefile.unix PLUGINS ?= StringsPlugin TrafficPlugin TransparentPlugin FilePlugin ifeq ($(STATIC), true) + LDFLAGS += -static + CFLAGS += -DNOPLUGINS -DNOSTDRESOLVE -DNOCRYPT + ZLIB = -lz -lzstd + PLUGINS = + PAM_CHECK = false +endif +ifeq ($(LIBSTATIC), true) STATIC_PREFIX = -Wl,-Bstatic STATIC_SUFFIX = -Wl,-Bdynamic - ZLIB = -lz + ZLIB = -lz -lzstd endif -OPENSSL_CHECK = $(shell echo "\#include \\n int main(){return 0;}" | tr -d \\\\ | $(CC) -x c $(CFLAGS) -o testssl.o - 2>/dev/null && $(CC) $(LDFLAGS) -otestssl testssl.o $(STATIC_PREFIX) -lcrypto -lssl $(ZLIB) $(STATIC_SUFFIX) 2>/dev/null && rm testssl testssl.o && echo true||echo false) +OPENSSL_CHECK ?= $(shell echo "\#include \\n int main(){return 0;}" | tr -d \\\\ | $(CC) -x c $(CFLAGS) -o testssl.o - 2>/dev/null && $(CC) $(LDFLAGS) -otestssl testssl.o $(STATIC_PREFIX) $(ZLIB) -lcrypto -lssl $(STATIC_SUFFIX) 2>/dev/null && rm testssl testssl.o && echo true||echo false) ifeq ($(OPENSSL_CHECK), true) - LIBS += $(STATIC_PREFIX) -lcrypto -lssl $(ZLIB) $(STATIC_SUFFIX) + LIBS += $(STATIC_PREFIX) $(ZLIB) -lcrypto -lssl $(STATIC_SUFFIX) CFLAGS += -DWITH_SSL SSL_OBJS = ssllib$(OBJSUFFICS) ssl$(OBJSUFFICS) +else + ZLIB := endif -PCRE_CHECK = $(shell echo "\#define PCRE2_CODE_UNIT_WIDTH 8\\n\#include \\n int main(){return 0;}" | tr -d \\\\ | $(CC) -x c $(CFLAGS) -o testpcre.o - 2>/dev/null && $(CC) -o testpcre testpcre.o $(LDFLAGS) $(STATIC_PREFIX) -lpcre2-8 $(STATIC_SUFFIX) 2>/dev/null && rm testpcre testpcre.o && echo true||echo false) +PCRE_CHECK ?= $(shell echo "\#define PCRE2_CODE_UNIT_WIDTH 8\\n\#include \\n int main(){return 0;}" | tr -d \\\\ | $(CC) -x c $(CFLAGS) -o testpcre.o - 2>/dev/null && $(CC) -o testpcre testpcre.o $(LDFLAGS) $(STATIC_PREFIX) -lpcre2-8 $(STATIC_SUFFIX) 2>/dev/null && rm testpcre testpcre.o && echo true||echo false) ifeq ($(PCRE_CHECK), true) CFLAGS += -DWITH_PCRE PCRE_OBJS = pcre$(OBJSUFFICS) PCRE_LIBS = $(STATIC_PREFIX) -lpcre2-8 $(STATIC_SUFFIX) endif -PAM_CHECK = $(shell echo "\#include \\n int main(){return 0;}" | tr -d \\\\ | $(CC) -x c $(CFLAGS) -o testpam.o - 2>/dev/null && $(CC) $(LDFLAGS) -o testpam testpam.o -lpam 2>/dev/null && rm testpam testpam.o && echo true||echo false) +PAM_CHECK ?= $(shell echo "\#include \\n int main(){return 0;}" | tr -d \\\\ | $(CC) -x c $(CFLAGS) -o testpam.o - 2>/dev/null && $(CC) $(LDFLAGS) -o testpam testpam.o -lpam 2>/dev/null && rm testpam testpam.o && echo true||echo false) ifeq ($(PAM_CHECK), true) PLUGINS += PamAuth endif diff --git a/Makefile.win b/Makefile.win index 78e75e6..c2d4414 100644 --- a/Makefile.win +++ b/Makefile.win @@ -7,12 +7,12 @@ BUILDDIR = ../bin/ CC ?= gcc -CFLAGS ?= -O3 -flto -fno-strict-aliasing -CFLAGS += -c -mthreads -DWITH_WSAPOLL -DWITH_ODBC +CFLAGS ?= -O3 -flto +CFLAGS += -fno-strict-aliasing -c -mthreads -DWITH_WSAPOLL -DWITH_ODBC COUT = -o LN ?= $(CC) -LDFLAGS ?= -flto -fno-strict-aliasing -LDFLAGS += -mthreads +LDFLAGS ?= -O3 -flto +LDFLAGS += -fno-strict-aliasing -mthreads DLFLAGS ?= -shared DLSUFFICS = .dll LIBS += -lws2_32 -lodbc32 -ladvapi32 -luser32 -lbcrypt