From 0013b7ea7d3da05a90f625659a653f71d43e79e8 Mon Sep 17 00:00:00 2001 From: Aleksandr Sakharov Date: Tue, 20 Jan 2026 19:57:04 +0300 Subject: [PATCH 1/5] Quich and lazy way to load and run cloak as dynamic library --- Makefile | 12 +++++++++++- cmd/ck-client/ck-client.go | 15 +++++++++++++++ cmd/ck-server/ck-server.go | 15 +++++++++++++++ 3 files changed, 41 insertions(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 6ebb163..2a806ec 100644 --- a/Makefile +++ b/Makefile @@ -16,10 +16,20 @@ server: go build -ldflags "-X main.version=${version}" ./cmd/ck-server mv ck-server* ./build +client-dynlib: + mkdir -p build + go build -ldflags "-X main.version=${version}" -buildmode=c-shared -o libck-client.so ./cmd/ck-client + mv libck-client* ./build + +server-dynlib: + mkdir -p build + go build -ldflags "-X main.version=${version}" -buildmode=c-shared -o libck-server.so ./cmd/ck-server + mv libck-server* ./build + install: mv build/ck-* /usr/local/bin -all: client server +all: client server client-dynlib server-dynlib clean: rm -rf ./build/ck-* diff --git a/cmd/ck-client/ck-client.go b/cmd/ck-client/ck-client.go index 1a43651..abe2d87 100644 --- a/cmd/ck-client/ck-client.go +++ b/cmd/ck-client/ck-client.go @@ -10,6 +10,8 @@ import ( "fmt" "net" "os" + "C" + "unsafe" "github.com/cbeuw/Cloak/internal/common" @@ -18,6 +20,19 @@ import ( log "github.com/sirupsen/logrus" ) +//export external_main +func external_main(argc C.int, argv **C.char) { + var offset = unsafe.Sizeof(uintptr(0)) + var go_argv []string + for i := 0; i < int(argc); i++ { + go_argv = append(go_argv, C.GoString(*argv)) + argv = (**C.char)(unsafe.Pointer(uintptr(unsafe.Pointer(argv)) + offset)) + } + + os.Args = go_argv + main() +} + var version string func main() { diff --git a/cmd/ck-server/ck-server.go b/cmd/ck-server/ck-server.go index b1c0bb0..c5645ba 100644 --- a/cmd/ck-server/ck-server.go +++ b/cmd/ck-server/ck-server.go @@ -9,6 +9,8 @@ import ( "os" "runtime" "strings" + "C" + "unsafe" "github.com/cbeuw/Cloak/internal/common" "github.com/cbeuw/Cloak/internal/server" @@ -68,6 +70,19 @@ func parseSSBindAddr(ssRemoteHost string, ssRemotePort string, ckBindAddr *[]net return nil } +//export external_main +func external_main(argc C.int, argv **C.char) { + var offset = unsafe.Sizeof(uintptr(0)) + var go_argv []string + for i := 0; i < int(argc); i++ { + go_argv = append(go_argv, C.GoString(*argv)) + argv = (**C.char)(unsafe.Pointer(uintptr(unsafe.Pointer(argv)) + offset)) + } + + os.Args = go_argv + main() +} + func main() { var config string From d0517dfe401230dedd037dd96f9229c80f2694aa Mon Sep 17 00:00:00 2001 From: Aleksandr Sakharov Date: Tue, 20 Jan 2026 21:10:52 +0300 Subject: [PATCH 2/5] Library mode (external main) now can be enabled with build flag --- Makefile | 4 ++-- cmd/ck-client/ck-client.go | 15 --------------- cmd/ck-client/external-main.go | 23 +++++++++++++++++++++++ cmd/ck-server/ck-server.go | 15 --------------- cmd/ck-server/external-main.go | 23 +++++++++++++++++++++++ 5 files changed, 48 insertions(+), 32 deletions(-) create mode 100644 cmd/ck-client/external-main.go create mode 100644 cmd/ck-server/external-main.go diff --git a/Makefile b/Makefile index 2a806ec..90d009d 100644 --- a/Makefile +++ b/Makefile @@ -18,12 +18,12 @@ server: client-dynlib: mkdir -p build - go build -ldflags "-X main.version=${version}" -buildmode=c-shared -o libck-client.so ./cmd/ck-client + go build -ldflags "-X main.version=${version}" -buildmode=c-shared -tags=external_main -o libck-client.so ./cmd/ck-client mv libck-client* ./build server-dynlib: mkdir -p build - go build -ldflags "-X main.version=${version}" -buildmode=c-shared -o libck-server.so ./cmd/ck-server + go build -ldflags "-X main.version=${version}" -buildmode=c-shared -tags=external_main -o libck-server.so ./cmd/ck-server mv libck-server* ./build install: diff --git a/cmd/ck-client/ck-client.go b/cmd/ck-client/ck-client.go index abe2d87..1a43651 100644 --- a/cmd/ck-client/ck-client.go +++ b/cmd/ck-client/ck-client.go @@ -10,8 +10,6 @@ import ( "fmt" "net" "os" - "C" - "unsafe" "github.com/cbeuw/Cloak/internal/common" @@ -20,19 +18,6 @@ import ( log "github.com/sirupsen/logrus" ) -//export external_main -func external_main(argc C.int, argv **C.char) { - var offset = unsafe.Sizeof(uintptr(0)) - var go_argv []string - for i := 0; i < int(argc); i++ { - go_argv = append(go_argv, C.GoString(*argv)) - argv = (**C.char)(unsafe.Pointer(uintptr(unsafe.Pointer(argv)) + offset)) - } - - os.Args = go_argv - main() -} - var version string func main() { diff --git a/cmd/ck-client/external-main.go b/cmd/ck-client/external-main.go new file mode 100644 index 0000000..f05c52f --- /dev/null +++ b/cmd/ck-client/external-main.go @@ -0,0 +1,23 @@ +//go:build external_main +// +build external_main + +package main + +import ( + "os" + "C" + "unsafe" +) + +//export external_main +func external_main(argc C.int, argv **C.char) { + var offset = unsafe.Sizeof(uintptr(0)) + var go_argv []string + for i := 0; i < int(argc); i++ { + go_argv = append(go_argv, C.GoString(*argv)) + argv = (**C.char)(unsafe.Pointer(uintptr(unsafe.Pointer(argv)) + offset)) + } + + os.Args = go_argv + main() +} diff --git a/cmd/ck-server/ck-server.go b/cmd/ck-server/ck-server.go index c5645ba..b1c0bb0 100644 --- a/cmd/ck-server/ck-server.go +++ b/cmd/ck-server/ck-server.go @@ -9,8 +9,6 @@ import ( "os" "runtime" "strings" - "C" - "unsafe" "github.com/cbeuw/Cloak/internal/common" "github.com/cbeuw/Cloak/internal/server" @@ -70,19 +68,6 @@ func parseSSBindAddr(ssRemoteHost string, ssRemotePort string, ckBindAddr *[]net return nil } -//export external_main -func external_main(argc C.int, argv **C.char) { - var offset = unsafe.Sizeof(uintptr(0)) - var go_argv []string - for i := 0; i < int(argc); i++ { - go_argv = append(go_argv, C.GoString(*argv)) - argv = (**C.char)(unsafe.Pointer(uintptr(unsafe.Pointer(argv)) + offset)) - } - - os.Args = go_argv - main() -} - func main() { var config string diff --git a/cmd/ck-server/external-main.go b/cmd/ck-server/external-main.go new file mode 100644 index 0000000..f05c52f --- /dev/null +++ b/cmd/ck-server/external-main.go @@ -0,0 +1,23 @@ +//go:build external_main +// +build external_main + +package main + +import ( + "os" + "C" + "unsafe" +) + +//export external_main +func external_main(argc C.int, argv **C.char) { + var offset = unsafe.Sizeof(uintptr(0)) + var go_argv []string + for i := 0; i < int(argc); i++ { + go_argv = append(go_argv, C.GoString(*argv)) + argv = (**C.char)(unsafe.Pointer(uintptr(unsafe.Pointer(argv)) + offset)) + } + + os.Args = go_argv + main() +} From 4e2ef402abb4990bd2910611f0a884adf4a2a3cf Mon Sep 17 00:00:00 2001 From: Aleksandr Sakharov Date: Tue, 20 Jan 2026 21:15:07 +0300 Subject: [PATCH 3/5] Fix tabs/spaces --- cmd/ck-client/external-main.go | 20 ++++++++++---------- cmd/ck-server/external-main.go | 20 ++++++++++---------- 2 files changed, 20 insertions(+), 20 deletions(-) diff --git a/cmd/ck-client/external-main.go b/cmd/ck-client/external-main.go index f05c52f..71f7448 100644 --- a/cmd/ck-client/external-main.go +++ b/cmd/ck-client/external-main.go @@ -5,19 +5,19 @@ package main import ( "os" - "C" - "unsafe" + "C" + "unsafe" ) //export external_main func external_main(argc C.int, argv **C.char) { - var offset = unsafe.Sizeof(uintptr(0)) - var go_argv []string - for i := 0; i < int(argc); i++ { - go_argv = append(go_argv, C.GoString(*argv)) - argv = (**C.char)(unsafe.Pointer(uintptr(unsafe.Pointer(argv)) + offset)) - } + var offset = unsafe.Sizeof(uintptr(0)) + var go_argv []string + for i := 0; i < int(argc); i++ { + go_argv = append(go_argv, C.GoString(*argv)) + argv = (**C.char)(unsafe.Pointer(uintptr(unsafe.Pointer(argv)) + offset)) + } - os.Args = go_argv - main() + os.Args = go_argv + main() } diff --git a/cmd/ck-server/external-main.go b/cmd/ck-server/external-main.go index f05c52f..71f7448 100644 --- a/cmd/ck-server/external-main.go +++ b/cmd/ck-server/external-main.go @@ -5,19 +5,19 @@ package main import ( "os" - "C" - "unsafe" + "C" + "unsafe" ) //export external_main func external_main(argc C.int, argv **C.char) { - var offset = unsafe.Sizeof(uintptr(0)) - var go_argv []string - for i := 0; i < int(argc); i++ { - go_argv = append(go_argv, C.GoString(*argv)) - argv = (**C.char)(unsafe.Pointer(uintptr(unsafe.Pointer(argv)) + offset)) - } + var offset = unsafe.Sizeof(uintptr(0)) + var go_argv []string + for i := 0; i < int(argc); i++ { + go_argv = append(go_argv, C.GoString(*argv)) + argv = (**C.char)(unsafe.Pointer(uintptr(unsafe.Pointer(argv)) + offset)) + } - os.Args = go_argv - main() + os.Args = go_argv + main() } From b72c2c3203e0e2a0d03d5be546c5ddb75583777d Mon Sep 17 00:00:00 2001 From: Aleksandr Sakharov Date: Tue, 20 Jan 2026 21:58:08 +0300 Subject: [PATCH 4/5] Move libs building code to separate script --- Makefile | 12 +----------- buildlibs.sh | 15 +++++++++++++++ 2 files changed, 16 insertions(+), 11 deletions(-) create mode 100755 buildlibs.sh diff --git a/Makefile b/Makefile index 90d009d..6ebb163 100644 --- a/Makefile +++ b/Makefile @@ -16,20 +16,10 @@ server: go build -ldflags "-X main.version=${version}" ./cmd/ck-server mv ck-server* ./build -client-dynlib: - mkdir -p build - go build -ldflags "-X main.version=${version}" -buildmode=c-shared -tags=external_main -o libck-client.so ./cmd/ck-client - mv libck-client* ./build - -server-dynlib: - mkdir -p build - go build -ldflags "-X main.version=${version}" -buildmode=c-shared -tags=external_main -o libck-server.so ./cmd/ck-server - mv libck-server* ./build - install: mv build/ck-* /usr/local/bin -all: client server client-dynlib server-dynlib +all: client server clean: rm -rf ./build/ck-* diff --git a/buildlibs.sh b/buildlibs.sh new file mode 100755 index 0000000..09cb7e8 --- /dev/null +++ b/buildlibs.sh @@ -0,0 +1,15 @@ +#!/usr/bin/sh + +if [ -z "$v" ]; then + echo "Version number cannot be null. Run with v=[version] $0" + exit 1 +fi + +mkdir -p build-lib + +CC=aarch64-linux-gnu-gcc CGO_ENABLED=1 GOOS="linux" GOARCH="arm64" go build -ldflags "-X main.version=${v}" -buildmode=c-shared -tags=external_main -o libck-client-arm64-linux.so ./cmd/ck-client +CC=arm-linux-gnueabi-gcc CGO_ENABLED=1 GOOS="linux" GOARCH="arm" go build -ldflags "-X main.version=${v}" -buildmode=c-shared -tags=external_main -o libck-client-arm-linux.so ./cmd/ck-client +CC=x86_64-linux-gnu-gcc CGO_ENABLED=1 GOOS="linux" GOARCH="amd64" go build -ldflags "-X main.version=${v}" -buildmode=c-shared -tags=external_main -o libck-client-amd64-linux.so ./cmd/ck-client +CC=x86_64-linux-gnu-gcc CGO_ENABLED=1 GOOS="linux" GOARCH="386" go build -ldflags "-X main.version=${v}" -buildmode=c-shared -tags=external_main -o libck-client-386-linux.so ./cmd/ck-client + +mv libck* build-lib From 2156217106ca28d6a6bc688298b07ee097835e63 Mon Sep 17 00:00:00 2001 From: Aleksandr Sakharov Date: Wed, 21 Jan 2026 06:26:29 +0300 Subject: [PATCH 5/5] Enable special android log system from default to special tag "android_log" --- cmd/ck-client/log.go | 4 ++-- cmd/ck-client/log_android.go | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/cmd/ck-client/log.go b/cmd/ck-client/log.go index e44b066..ec1d4d3 100644 --- a/cmd/ck-client/log.go +++ b/cmd/ck-client/log.go @@ -1,5 +1,5 @@ -//go:build !android -// +build !android +//go:build !log_android +// +build !log_android package main diff --git a/cmd/ck-client/log_android.go b/cmd/ck-client/log_android.go index 301b35e..4ff4ada 100644 --- a/cmd/ck-client/log_android.go +++ b/cmd/ck-client/log_android.go @@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -//go:build android -// +build android +//go:build log_android +// +build log_android package main