[GH-ISSUE #1324] Linux ARM64 Build failed #525

Open
opened 2026-10-13 20:23:22 +00:00 by bsakaguchi · 13 comments
Owner

Originally created by @q4a on GitHub (Dec 29, 2024).
Original GitHub issue: https://github.com/amnezia-vpn/amnezia-client/issues/1324

There are already many single board computers like Raspberry Pi.
I tried to build from source on Rock 5B (ARM64, rk3588), but it didn't work. Here is the log:

$ uname -a
Linux rock-5b 6.12.1-edge-rockchip-rk3588 #1 SMP PREEMPT Fri Nov 22 14:30:26 UTC 2024 aarch64 aarch64 aarch64 GNU/Linux
$ cat /etc/lsb-release 
DISTRIB_ID=Ubuntu                                                                                                                                                                      
DISTRIB_RELEASE=24.10                                                                                                                                                                  
DISTRIB_CODENAME=oracular                                                                                                                                                              
DISTRIB_DESCRIPTION="Ubuntu 24.10"                                                                                                                                                     
$ echo $QT_BIN_DIR
/usr/lib/qt6/bin                                                                                                                                                                       
$ ./deploy/build_linux.sh 
Build script started ...                                                                                                                                                               
Project dir: /media/q/arm/git/amnezia-client                                                                                                                                           
Build dir: /media/q/arm/git/amnezia-client/deploy/build                                                                                                                                
Using Qt in /usr/lib/qt6/bin                                                                                                                                                           
cmake version 3.30.3                                                                                                                                                                   
                                                                                                                                                                                       
CMake suite maintained and supported by Kitware (kitware.com/cmake).
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/libexec/gcc/aarch64-linux-gnu/14/lto-wrapper
OFFLOAD_TARGET_NAMES=nvptx-none
OFFLOAD_TARGET_DEFAULT=1
Target: aarch64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu 14.2.0-4ubuntu2' --with-bugurl=file:///usr/share/doc/gcc-14/README.Bugs --enable-languages=c,ada,c++,go,d,fortran,objc,obj-c++,m2,rust --prefix=/usr --with-gcc-major-version-only --program-suffix=-14 --program-prefix=aarch64-linux-gnu- --enable-shared --enable-linker-build-id --libexecdir=/usr/libexec --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --enable-bootstrap --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-libstdcxx-backtrace --enable-gnu-unique-object --disable-libquadmath --disable-libquadmath-support --enable-plugin --enable-default-pie --with-system-zlib --enable-libphobos-checking=release --with-target-system-zlib=auto --enable-objc-gc=auto --enable-multiarch --enable-fix-cortex-a53-843419 --disable-werror --enable-offload-targets=nvptx-none=/build/gcc-14-T7YiXd/gcc-14-14.2.0/debian/tmp-nvptx/usr --enable-offload-defaulted --without-cuda-driver --enable-checking=release --build=aarch64-linux-gnu --host=aarch64-linux-gnu --target=aarch64-linux-gnu --with-build-config=bootstrap-lto-lean --enable-link-serialization=2
Thread model: posix
Supported LTO compression algorithms: zlib zstd
gcc version 14.2.0 (Ubuntu 14.2.0-4ubuntu2) 
Building App...
Client desktop build
-- Configuring done (3.7s)
-- Generating done (0.6s)
-- Build files have been written to: /media/q/arm/git/amnezia-client/deploy/build
[  0%] Built target messages
[  0%] Built target translations
[  0%] Built target qt6keychain_autogen_timestamp_deps
[  1%] Built target qt6keychain_autogen
[  9%] Built target qt6keychain
[ 10%] Built target AmneziaVPN_qmlimportscan
[ 10%] Built target SortFilterProxyModel_autogen_timestamp_deps
[ 10%] Built target SortFilterProxyModel_autogen
[ 24%] Built target SortFilterProxyModel
[ 24%] Built target AmneziaVPN_autogen_timestamp_deps
[ 24%] Built target AmneziaVPN_autogen
[ 25%] Linking CXX executable AmneziaVPN
/usr/bin/ld: /media/q/arm/git/amnezia-client/client/cmake/../3rd-prebuilt/3rd-prebuilt/libssh//linux/x86_64/libssh.a(auth.c.o): Relocations in generic ELF (EM: 62)
/usr/bin/ld: /media/q/arm/git/amnezia-client/client/cmake/../3rd-prebuilt/3rd-prebuilt/libssh//linux/x86_64/libssh.a(auth.c.o): Relocations in generic ELF (EM: 62)
/usr/bin/ld: /media/q/arm/git/amnezia-client/client/cmake/../3rd-prebuilt/3rd-prebuilt/libssh//linux/x86_64/libssh.a(auth.c.o): Relocations in generic ELF (EM: 62)
/usr/bin/ld: /media/q/arm/git/amnezia-client/client/cmake/../3rd-prebuilt/3rd-prebuilt/libssh//linux/x86_64/libssh.a: error adding symbols: file in wrong format
collect2: error: ld returned 1 exit status
gmake[2]: *** [client/CMakeFiles/AmneziaVPN.dir/build.make:19288: client/AmneziaVPN] Error 1
gmake[1]: *** [CMakeFiles/Makefile2:196: client/CMakeFiles/AmneziaVPN.dir/all] Error 2
gmake: *** [Makefile:136: all] Error 2

It looks like there is a problem with precompiled libraries. I hope that when github actions will add free ARM runners ( https://github.com/github/roadmap/issues/970 ), you will add a ARM Linux build.

Originally created by @q4a on GitHub (Dec 29, 2024). Original GitHub issue: https://github.com/amnezia-vpn/amnezia-client/issues/1324 There are already many single board computers like Raspberry Pi. I tried to build from source on Rock 5B (ARM64, rk3588), but it didn't work. Here is the log: ``` $ uname -a Linux rock-5b 6.12.1-edge-rockchip-rk3588 #1 SMP PREEMPT Fri Nov 22 14:30:26 UTC 2024 aarch64 aarch64 aarch64 GNU/Linux $ cat /etc/lsb-release DISTRIB_ID=Ubuntu DISTRIB_RELEASE=24.10 DISTRIB_CODENAME=oracular DISTRIB_DESCRIPTION="Ubuntu 24.10" $ echo $QT_BIN_DIR /usr/lib/qt6/bin $ ./deploy/build_linux.sh Build script started ... Project dir: /media/q/arm/git/amnezia-client Build dir: /media/q/arm/git/amnezia-client/deploy/build Using Qt in /usr/lib/qt6/bin cmake version 3.30.3 CMake suite maintained and supported by Kitware (kitware.com/cmake). Using built-in specs. COLLECT_GCC=gcc COLLECT_LTO_WRAPPER=/usr/libexec/gcc/aarch64-linux-gnu/14/lto-wrapper OFFLOAD_TARGET_NAMES=nvptx-none OFFLOAD_TARGET_DEFAULT=1 Target: aarch64-linux-gnu Configured with: ../src/configure -v --with-pkgversion='Ubuntu 14.2.0-4ubuntu2' --with-bugurl=file:///usr/share/doc/gcc-14/README.Bugs --enable-languages=c,ada,c++,go,d,fortran,objc,obj-c++,m2,rust --prefix=/usr --with-gcc-major-version-only --program-suffix=-14 --program-prefix=aarch64-linux-gnu- --enable-shared --enable-linker-build-id --libexecdir=/usr/libexec --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --enable-bootstrap --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-libstdcxx-backtrace --enable-gnu-unique-object --disable-libquadmath --disable-libquadmath-support --enable-plugin --enable-default-pie --with-system-zlib --enable-libphobos-checking=release --with-target-system-zlib=auto --enable-objc-gc=auto --enable-multiarch --enable-fix-cortex-a53-843419 --disable-werror --enable-offload-targets=nvptx-none=/build/gcc-14-T7YiXd/gcc-14-14.2.0/debian/tmp-nvptx/usr --enable-offload-defaulted --without-cuda-driver --enable-checking=release --build=aarch64-linux-gnu --host=aarch64-linux-gnu --target=aarch64-linux-gnu --with-build-config=bootstrap-lto-lean --enable-link-serialization=2 Thread model: posix Supported LTO compression algorithms: zlib zstd gcc version 14.2.0 (Ubuntu 14.2.0-4ubuntu2) Building App... Client desktop build -- Configuring done (3.7s) -- Generating done (0.6s) -- Build files have been written to: /media/q/arm/git/amnezia-client/deploy/build [ 0%] Built target messages [ 0%] Built target translations [ 0%] Built target qt6keychain_autogen_timestamp_deps [ 1%] Built target qt6keychain_autogen [ 9%] Built target qt6keychain [ 10%] Built target AmneziaVPN_qmlimportscan [ 10%] Built target SortFilterProxyModel_autogen_timestamp_deps [ 10%] Built target SortFilterProxyModel_autogen [ 24%] Built target SortFilterProxyModel [ 24%] Built target AmneziaVPN_autogen_timestamp_deps [ 24%] Built target AmneziaVPN_autogen [ 25%] Linking CXX executable AmneziaVPN /usr/bin/ld: /media/q/arm/git/amnezia-client/client/cmake/../3rd-prebuilt/3rd-prebuilt/libssh//linux/x86_64/libssh.a(auth.c.o): Relocations in generic ELF (EM: 62) /usr/bin/ld: /media/q/arm/git/amnezia-client/client/cmake/../3rd-prebuilt/3rd-prebuilt/libssh//linux/x86_64/libssh.a(auth.c.o): Relocations in generic ELF (EM: 62) /usr/bin/ld: /media/q/arm/git/amnezia-client/client/cmake/../3rd-prebuilt/3rd-prebuilt/libssh//linux/x86_64/libssh.a(auth.c.o): Relocations in generic ELF (EM: 62) /usr/bin/ld: /media/q/arm/git/amnezia-client/client/cmake/../3rd-prebuilt/3rd-prebuilt/libssh//linux/x86_64/libssh.a: error adding symbols: file in wrong format collect2: error: ld returned 1 exit status gmake[2]: *** [client/CMakeFiles/AmneziaVPN.dir/build.make:19288: client/AmneziaVPN] Error 1 gmake[1]: *** [CMakeFiles/Makefile2:196: client/CMakeFiles/AmneziaVPN.dir/all] Error 2 gmake: *** [Makefile:136: all] Error 2 ``` It looks like there is a problem with precompiled libraries. I hope that when github actions will add free ARM runners ( https://github.com/github/roadmap/issues/970 ), you will add a ARM Linux build.
Author
Owner

@RoarGi commented on GitHub (Jan 9, 2025):

I have same issue on linking stage with libssh.a

[ 74%] Linking CXX executable AmneziaVPN
/usr/bin/ld: cmake/../3rd-prebuilt/3rd-prebuilt/libssh//linux/x86_64/libssh.a(auth.c.o): Relocations in generic ELF (EM: 62)
/usr/bin/ld: cmake/../3rd-prebuilt/3rd-prebuilt/libssh//linux/x86_64/libssh.a(auth.c.o): Relocations in generic ELF (EM: 62)
/usr/bin/ld: cmake/../3rd-prebuilt/3rd-prebuilt/libssh//linux/x86_64/libssh.a(auth.c.o): Relocations in generic ELF (EM: 62)
/usr/bin/ld: cmake/../3rd-prebuilt/3rd-prebuilt/libssh//linux/x86_64/libssh.a: error adding symbols: file in wrong format
collect2: error: ld returned 1 exit status
make[2]: *** [client/CMakeFiles/AmneziaVPN.dir/build.make:20176: client/AmneziaVPN] Error 1
make[1]: *** [CMakeFiles/Makefile2:191: client/CMakeFiles/AmneziaVPN.dir/all] Error 2
make: *** [Makefile:136: all] Error 2
<!-- gh-comment-id:2579427502 --> @RoarGi commented on GitHub (Jan 9, 2025): I have same issue on linking stage with libssh.a ``` [ 74%] Linking CXX executable AmneziaVPN /usr/bin/ld: cmake/../3rd-prebuilt/3rd-prebuilt/libssh//linux/x86_64/libssh.a(auth.c.o): Relocations in generic ELF (EM: 62) /usr/bin/ld: cmake/../3rd-prebuilt/3rd-prebuilt/libssh//linux/x86_64/libssh.a(auth.c.o): Relocations in generic ELF (EM: 62) /usr/bin/ld: cmake/../3rd-prebuilt/3rd-prebuilt/libssh//linux/x86_64/libssh.a(auth.c.o): Relocations in generic ELF (EM: 62) /usr/bin/ld: cmake/../3rd-prebuilt/3rd-prebuilt/libssh//linux/x86_64/libssh.a: error adding symbols: file in wrong format collect2: error: ld returned 1 exit status make[2]: *** [client/CMakeFiles/AmneziaVPN.dir/build.make:20176: client/AmneziaVPN] Error 1 make[1]: *** [CMakeFiles/Makefile2:191: client/CMakeFiles/AmneziaVPN.dir/all] Error 2 make: *** [Makefile:136: all] Error 2 ```
Author
Owner

@dmatora commented on GitHub (Mar 29, 2025):

Was anyone able to get client working on ARM Linux?

<!-- gh-comment-id:2763673775 --> @dmatora commented on GitHub (Mar 29, 2025): Was anyone able to get client working on ARM Linux?
Author
Owner

@mmikel commented on GitHub (Sep 11, 2025):

Is it possible to provide builds for arm64? (raspberry pi os, armbian or dietpi)

<!-- gh-comment-id:3278331181 --> @mmikel commented on GitHub (Sep 11, 2025): Is it possible to provide builds for arm64? (raspberry pi os, armbian or dietpi)
Author
Owner

@g-metan commented on GitHub (Sep 30, 2025):

This file: amnezia-client/client/cmake/3rdparty.cmake
doesn't include necessary strings for aarch64 Linux
And this reffered folder amnezia-client/client/3rd-prebuilt
is empty
so I get build errors like these:

CMake Error at client/cmake/3rdparty.cmake:5 (add_subdirectory):
The source directory

/home/user/amnezia-client/client/3rd/SortFilterProxyModel

does not contain a CMakeLists.txt file.
Call Stack (most recent call first):
client/CMakeLists.txt:105 (include)

CMake Error at client/cmake/3rdparty.cmake:66 (file):
file COPY cannot find
"/home/user/amnezia-client/client/cmake/../3rd-prebuilt/3rd-prebuilt/openssl//linux/x86_64/libssl.a":
No such file or directory.
Call Stack (most recent call first):
client/CMakeLists.txt:105 (include)

CMake Error at client/cmake/3rdparty.cmake:85 (add_subdirectory):
The source directory

/home/user/amnezia-client/client/3rd/qtkeychain

does not contain a CMakeLists.txt file.
Call Stack (most recent call first):
client/CMakeLists.txt:105 (include)

<!-- gh-comment-id:3353453712 --> @g-metan commented on GitHub (Sep 30, 2025): This file: `amnezia-client/client/cmake/3rdparty.cmake` doesn't include necessary strings for aarch64 Linux And this reffered folder `amnezia-client/client/3rd-prebuilt` is empty so I get build errors like these: > CMake Error at client/cmake/3rdparty.cmake:5 (add_subdirectory): > The source directory > > /home/user/amnezia-client/client/3rd/SortFilterProxyModel > > does not contain a CMakeLists.txt file. > Call Stack (most recent call first): > client/CMakeLists.txt:105 (include) > > > CMake Error at client/cmake/3rdparty.cmake:66 (file): > file COPY cannot find > "/home/user/amnezia-client/client/cmake/../3rd-prebuilt/3rd-prebuilt/openssl//linux/x86_64/libssl.a": > No such file or directory. > Call Stack (most recent call first): > client/CMakeLists.txt:105 (include) > > > CMake Error at client/cmake/3rdparty.cmake:85 (add_subdirectory): > The source directory > > /home/user/amnezia-client/client/3rd/qtkeychain > > does not contain a CMakeLists.txt file. > Call Stack (most recent call first): > client/CMakeLists.txt:105 (include) >
Author
Owner

@Kracozebr commented on GitHub (Feb 12, 2026):

Same here. Need to build for arm rk3588, should I give a try?

<!-- gh-comment-id:3892854661 --> @Kracozebr commented on GitHub (Feb 12, 2026): Same here. Need to build for arm rk3588, should I give a try?
Author
Owner

@il2020 commented on GitHub (Apr 29, 2026):

Please build a client for Raspberry Pi.

<!-- gh-comment-id:4343330716 --> @il2020 commented on GitHub (Apr 29, 2026): Please build a client for Raspberry Pi.
Author
Owner

@Slach commented on GitHub (May 3, 2026):

same here, need annezia vpn for nvidia dgx spark =(

<!-- gh-comment-id:4366677476 --> @Slach commented on GitHub (May 3, 2026): same here, need annezia vpn for nvidia dgx spark =(
Author
Owner

@steals commented on GitHub (May 5, 2026):

There is an old closed PR with arm64 build fixes that wasn't merged https://github.com/amnezia-vpn/amnezia-client/pull/1903/changes
Did anyone tried to apply those changes and built locally?

<!-- gh-comment-id:4379112871 --> @steals commented on GitHub (May 5, 2026): There is an old closed PR with arm64 build fixes that wasn't merged https://github.com/amnezia-vpn/amnezia-client/pull/1903/changes Did anyone tried to apply those changes and built locally?
Author
Owner

@iv4nconnect commented on GitHub (Jul 6, 2026):

Amnezia on arm64 Linux is very much needed!

<!-- gh-comment-id:4894363221 --> @iv4nconnect commented on GitHub (Jul 6, 2026): Amnezia on arm64 Linux is very much needed!
Author
Owner

@Mezo-oz commented on GitHub (Jul 25, 2026):

AmneziaVPN builds on ARM64 Linux today. Verified end to end on a Raspberry Pi 5, Debian 12 bookworm, aarch64, against dev @ 0faf3e6d.

client/AmneziaVPN                  ELF AArch64   8.5M
service/server/AmneziaVPN-service  ELF AArch64    40M

0 errors. Both targets link.

The original premise of this issue no longer applies. The move to Conan removed the x86_64-only prebuilt binaries entirely, and Conan builds the whole native dependency graph from source for arch=armv8 with no changes required:

go/1.26.0                     openssl/3.6.1, 3.6.2      libssh/0.11.3@amnezia
awg-go/0.2.19                 openvpn/2.7.0             tun2socks/2.6.0
amnezia-xray-bindings/1.2.0   libcap-ng/0.9.2           libnl/3.9.0
zlib, lz4, lzo, m4, ninja, bison, flex, libtool, pkgconf

Everything that used to be missing for aarch64 (libssh, the xray bindings, AmneziaWG, openvpn, tun2socks) compiles cleanly.

Two things still stand between that and an out-of-the-box ARM64 build:

1. Conan recipes don't parse on Python < 3.12. Three recipes use PEP 701 f-string syntax, so conan install dies with a SyntaxError before resolving anything. Not ARM-specific: it breaks any host with Python 3.11, which includes Debian 12 and Raspberry Pi OS. It is invisible in CI because ubuntu-latest ships 3.12+. PR: https://github.com/amnezia-vpn/amnezia-client/pull/2870

2. Qt version. With Debian 12's Qt 6.4.2, configure fails at client/CMakeLists.txt:249:

CMake Error at Qt6QmlMacros.cmake:2959 (message):
  Unexpected arguments: OUTPUT_SCRIPT;QT_DEPLOY_SCRIPT;DEPLOY_TOOL_OPTIONS
  -> qt_generate_deploy_qml_app_script

OUTPUT_SCRIPT / NO_UNSUPPORTED_PLATFORM_ERROR / DEPLOY_TOOL_OPTIONS arrived in Qt 6.5-6.7. This bites harder on ARM64 than elsewhere, because Qt publishes no official aarch64 Linux desktop binaries, so you get whatever your distro ships or you build Qt yourself. Debian 12 has 6.4.2; Debian 13 has 6.8.2.

Qt 6.8.2 is sufficient in practice. The successful build above used Debian 13 (trixie) packages in a container on the same Pi, even though the README asks for 6.10+. If 6.8 is genuinely supported, relaxing the documented minimum would make ARM64 Linux reachable on a stock distro today.

One smaller thing: deploy/build.sh only discovers Qt in official-installer layouts ($QT_ROOT_PATH/gcc_64), so distro-packaged Qt needs CMAKE_PREFIX_PATH set manually. That is the normal case on ARM64, where the installer isn't an option.

Would an aarch64 Linux CI job be welcome? Happy to help, I have the hardware set up and can test whatever's useful.

<!-- gh-comment-id:5077314214 --> @Mezo-oz commented on GitHub (Jul 25, 2026): **AmneziaVPN builds on ARM64 Linux today.** Verified end to end on a Raspberry Pi 5, Debian 12 bookworm, aarch64, against `dev` @ `0faf3e6d`. ``` client/AmneziaVPN ELF AArch64 8.5M service/server/AmneziaVPN-service ELF AArch64 40M ``` 0 errors. Both targets link. **The original premise of this issue no longer applies.** The move to Conan removed the x86_64-only prebuilt binaries entirely, and Conan builds the whole native dependency graph from source for `arch=armv8` with no changes required: ``` go/1.26.0 openssl/3.6.1, 3.6.2 libssh/0.11.3@amnezia awg-go/0.2.19 openvpn/2.7.0 tun2socks/2.6.0 amnezia-xray-bindings/1.2.0 libcap-ng/0.9.2 libnl/3.9.0 zlib, lz4, lzo, m4, ninja, bison, flex, libtool, pkgconf ``` Everything that used to be missing for aarch64 (libssh, the xray bindings, AmneziaWG, openvpn, tun2socks) compiles cleanly. Two things still stand between that and an out-of-the-box ARM64 build: **1. Conan recipes don't parse on Python < 3.12.** Three recipes use PEP 701 f-string syntax, so `conan install` dies with a `SyntaxError` before resolving anything. Not ARM-specific: it breaks any host with Python 3.11, which includes Debian 12 and Raspberry Pi OS. It is invisible in CI because `ubuntu-latest` ships 3.12+. PR: https://github.com/amnezia-vpn/amnezia-client/pull/2870 **2. Qt version.** With Debian 12's Qt 6.4.2, configure fails at `client/CMakeLists.txt:249`: ``` CMake Error at Qt6QmlMacros.cmake:2959 (message): Unexpected arguments: OUTPUT_SCRIPT;QT_DEPLOY_SCRIPT;DEPLOY_TOOL_OPTIONS -> qt_generate_deploy_qml_app_script ``` `OUTPUT_SCRIPT` / `NO_UNSUPPORTED_PLATFORM_ERROR` / `DEPLOY_TOOL_OPTIONS` arrived in Qt 6.5-6.7. This bites harder on ARM64 than elsewhere, because Qt publishes no official aarch64 Linux desktop binaries, so you get whatever your distro ships or you build Qt yourself. Debian 12 has 6.4.2; Debian 13 has 6.8.2. **Qt 6.8.2 is sufficient in practice.** The successful build above used Debian 13 (trixie) packages in a container on the same Pi, even though the README asks for 6.10+. If 6.8 is genuinely supported, relaxing the documented minimum would make ARM64 Linux reachable on a stock distro today. One smaller thing: `deploy/build.sh` only discovers Qt in official-installer layouts (`$QT_ROOT_PATH/gcc_64`), so distro-packaged Qt needs `CMAKE_PREFIX_PATH` set manually. That is the normal case on ARM64, where the installer isn't an option. Would an aarch64 Linux CI job be welcome? Happy to help, I have the hardware set up and can test whatever's useful.
Author
Owner

@Mezo-oz commented on GitHub (Jul 26, 2026):

Building on Linux aarch64 (Raspberry Pi 5, Debian 12)

There are two independent blockers here. Only the first is a code problem.

1. Conan recipes fail to parse on Python < 3.12

Three recipes use PEP 701 f-string syntax (Python 3.12+). Debian 12 ships Python 3.11, so Conan raises SyntaxError before resolving a single dependency and the build never starts. Fix proposed in #2870.

2. Debian 12's Qt 6.4.2 is too old

qt_generate_deploy_qml_app_script rejects OUTPUT_SCRIPT and DEPLOY_TOOL_OPTIONS, both added in Qt 6.5–6.7. Qt 6.8.2 works. This one can't be fixed in-tree — Qt publishes no official aarch64 Linux desktop binaries, so it's distro Qt or a source build.

What worked was building inside a Debian 13 (trixie) container, leaving the host untouched:

sudo apt-get install -y podman uidmap slirp4netns fuse-overlayfs

podman run --rm -v ~/amnezia-client:/src -v ~/conan-trixie:/root/.conan2 \
  docker.io/library/debian:trixie bash -c '
    apt-get update -qq
    apt-get install -y --no-install-recommends build-essential cmake ninja-build \
      git curl ca-certificates pipx python3-venv pkg-config \
      qt6-base-dev qt6-base-dev-tools qt6-declarative-dev qt6-declarative-dev-tools \
      qt6-svg-dev qt6-5compat-dev qt6-remoteobjects-dev \
      qt6-tools-dev qt6-tools-dev-tools qt6-l10n-tools \
      libgl1-mesa-dev libssl-dev zlib1g-dev libsecret-1-dev libxkbcommon-dev
    export PATH=/root/.local/bin:$PATH
    pipx install conan && conan profile detect --force
    cd /src
    export QT_ROOT_PATH=/usr CMAKE_PREFIX_PATH=/usr/lib/aarch64-linux-gnu/cmake
    deploy/build.sh --force'

QT_ROOT_PATH and CMAKE_PREFIX_PATH are required because deploy/build.sh only looks for Qt in the official-installer layout ($QT_ROOT_PATH/gcc_64), which distro Qt doesn't have.

Two things that look like errors but aren't: qt-cmake doesn't exist on Debian (it ships only with Qt's own installer), and the Qt host tools (moc, rcc, uic, repc) live in /usr/lib/qt6/libexec/, off PATH by design. CMake finds them through the Qt6 config packages, so command -v will wrongly report them missing.

Result: client/AmneziaVPN and service/server/AmneziaVPN-service both build to completion, 0 errors, ELF 64-bit LSB PIE ARM aarch64.

Building is not the same as running. Binaries produced in the trixie container link against glibc 2.41 and Qt 6.8.2. Raspberry Pi OS bookworm has glibc 2.36 and Qt 6.4.2:

libc.so.6:       version `GLIBC_2.38' not found
libQt6Core.so.6: version `Qt_6.8'    not found

glibc symbol versioning is forward-compatible only, so a binary built against 2.41 will never load on 2.36. Running it on the same host needs a second, persistent container providing the Qt 6.8 runtime. With that in place the daemon starts cleanly on aarch64 — LinuxDaemon, WireguardUtilsLinux, DnsUtilsLinux and IPUtilsLinux all construct, and the IPC socket opens at /var/run/amneziavpn/daemon.socket.

Environment: Raspberry Pi 5, 8 GB, aarch64, Raspberry Pi OS bookworm (Debian 12), built against dev.


Сборка на Linux aarch64 (Raspberry Pi 5, Debian 12)

Здесь две независимые проблемы. К коду относится только первая.

1. Рецепты Conan не парсятся на Python < 3.12

Три рецепта используют синтаксис f-строк из PEP 701 (Python 3.12+). В Debian 12 поставляется Python 3.11, поэтому Conan падает с SyntaxError ещё до разрешения зависимостей и сборка вообще не начинается. Исправление предложено в #2870.

2. Qt 6.4.2 из Debian 12 слишком старый

qt_generate_deploy_qml_app_script не принимает OUTPUT_SCRIPT и DEPLOY_TOOL_OPTIONS — оба добавлены в Qt 6.5–6.7. Qt 6.8.2 работает. Это нельзя исправить в репозитории: Qt не публикует официальные десктопные сборки для aarch64 Linux, поэтому остаётся либо Qt из дистрибутива, либо сборка из исходников.

Рабочим оказался вариант со сборкой внутри контейнера Debian 13 (trixie), не затрагивая хост:

sudo apt-get install -y podman uidmap slirp4netns fuse-overlayfs

podman run --rm -v ~/amnezia-client:/src -v ~/conan-trixie:/root/.conan2 \
  docker.io/library/debian:trixie bash -c '
    apt-get update -qq
    apt-get install -y --no-install-recommends build-essential cmake ninja-build \
      git curl ca-certificates pipx python3-venv pkg-config \
      qt6-base-dev qt6-base-dev-tools qt6-declarative-dev qt6-declarative-dev-tools \
      qt6-svg-dev qt6-5compat-dev qt6-remoteobjects-dev \
      qt6-tools-dev qt6-tools-dev-tools qt6-l10n-tools \
      libgl1-mesa-dev libssl-dev zlib1g-dev libsecret-1-dev libxkbcommon-dev
    export PATH=/root/.local/bin:$PATH
    pipx install conan && conan profile detect --force
    cd /src
    export QT_ROOT_PATH=/usr CMAKE_PREFIX_PATH=/usr/lib/aarch64-linux-gnu/cmake
    deploy/build.sh --force'

QT_ROOT_PATH и CMAKE_PREFIX_PATH обязательны, потому что deploy/build.sh ищет Qt только в структуре официального установщика ($QT_ROOT_PATH/gcc_64), которой у Qt из дистрибутива нет.

Две вещи выглядят как ошибки, но ими не являются: qt-cmake в Debian отсутствует (он поставляется только с установщиком Qt), а хост-утилиты Qt (moc, rcc, uic, repc) лежат в /usr/lib/qt6/libexec/ и намеренно не входят в PATH. CMake находит их через конфигурационные пакеты Qt6, поэтому command -v ошибочно сообщает об их отсутствии.

Результат: client/AmneziaVPN и service/server/AmneziaVPN-service собираются полностью, 0 ошибок, ELF 64-bit LSB PIE ARM aarch64.

Собирается — не значит запускается. Бинарники, собранные в контейнере trixie, слинкованы с glibc 2.41 и Qt 6.8.2. В Raspberry Pi OS bookworm — glibc 2.36 и Qt 6.4.2:

libc.so.6:       version `GLIBC_2.38' not found
libQt6Core.so.6: version `Qt_6.8'    not found

Версионирование символов в glibc совместимо только вперёд, поэтому бинарник, собранный против 2.41, никогда не загрузится на 2.36. Чтобы запустить его на том же хосте, нужен второй, постоянный контейнер с рантаймом Qt 6.8. С ним демон на aarch64 стартует нормально: LinuxDaemon, WireguardUtilsLinux, DnsUtilsLinux и IPUtilsLinux создаются, IPC-сокет открывается в /var/run/amneziavpn/daemon.socket.

Окружение: Raspberry Pi 5, 8 ГБ, aarch64, Raspberry Pi OS bookworm (Debian 12), сборка из ветки dev.

<!-- gh-comment-id:5084717626 --> @Mezo-oz commented on GitHub (Jul 26, 2026): ### Building on Linux aarch64 (Raspberry Pi 5, Debian 12) There are two independent blockers here. Only the first is a code problem. **1. Conan recipes fail to parse on Python < 3.12** Three recipes use PEP 701 f-string syntax (Python 3.12+). Debian 12 ships Python 3.11, so Conan raises `SyntaxError` before resolving a single dependency and the build never starts. Fix proposed in #2870. **2. Debian 12's Qt 6.4.2 is too old** `qt_generate_deploy_qml_app_script` rejects `OUTPUT_SCRIPT` and `DEPLOY_TOOL_OPTIONS`, both added in Qt 6.5–6.7. Qt 6.8.2 works. This one can't be fixed in-tree — Qt publishes no official aarch64 Linux desktop binaries, so it's distro Qt or a source build. What worked was building inside a Debian 13 (trixie) container, leaving the host untouched: ```bash sudo apt-get install -y podman uidmap slirp4netns fuse-overlayfs podman run --rm -v ~/amnezia-client:/src -v ~/conan-trixie:/root/.conan2 \ docker.io/library/debian:trixie bash -c ' apt-get update -qq apt-get install -y --no-install-recommends build-essential cmake ninja-build \ git curl ca-certificates pipx python3-venv pkg-config \ qt6-base-dev qt6-base-dev-tools qt6-declarative-dev qt6-declarative-dev-tools \ qt6-svg-dev qt6-5compat-dev qt6-remoteobjects-dev \ qt6-tools-dev qt6-tools-dev-tools qt6-l10n-tools \ libgl1-mesa-dev libssl-dev zlib1g-dev libsecret-1-dev libxkbcommon-dev export PATH=/root/.local/bin:$PATH pipx install conan && conan profile detect --force cd /src export QT_ROOT_PATH=/usr CMAKE_PREFIX_PATH=/usr/lib/aarch64-linux-gnu/cmake deploy/build.sh --force' ``` `QT_ROOT_PATH` and `CMAKE_PREFIX_PATH` are required because `deploy/build.sh` only looks for Qt in the official-installer layout (`$QT_ROOT_PATH/gcc_64`), which distro Qt doesn't have. Two things that look like errors but aren't: `qt-cmake` doesn't exist on Debian (it ships only with Qt's own installer), and the Qt host tools (`moc`, `rcc`, `uic`, `repc`) live in `/usr/lib/qt6/libexec/`, off `PATH` by design. CMake finds them through the Qt6 config packages, so `command -v` will wrongly report them missing. Result: `client/AmneziaVPN` and `service/server/AmneziaVPN-service` both build to completion, 0 errors, ELF 64-bit LSB PIE ARM aarch64. **Building is not the same as running.** Binaries produced in the trixie container link against glibc 2.41 and Qt 6.8.2. Raspberry Pi OS bookworm has glibc 2.36 and Qt 6.4.2: ``` libc.so.6: version `GLIBC_2.38' not found libQt6Core.so.6: version `Qt_6.8' not found ``` glibc symbol versioning is forward-compatible only, so a binary built against 2.41 will never load on 2.36. Running it on the same host needs a second, persistent container providing the Qt 6.8 runtime. With that in place the daemon starts cleanly on aarch64 — `LinuxDaemon`, `WireguardUtilsLinux`, `DnsUtilsLinux` and `IPUtilsLinux` all construct, and the IPC socket opens at `/var/run/amneziavpn/daemon.socket`. Environment: Raspberry Pi 5, 8 GB, aarch64, Raspberry Pi OS bookworm (Debian 12), built against `dev`. --- ### Сборка на Linux aarch64 (Raspberry Pi 5, Debian 12) Здесь две независимые проблемы. К коду относится только первая. **1. Рецепты Conan не парсятся на Python < 3.12** Три рецепта используют синтаксис f-строк из PEP 701 (Python 3.12+). В Debian 12 поставляется Python 3.11, поэтому Conan падает с `SyntaxError` ещё до разрешения зависимостей и сборка вообще не начинается. Исправление предложено в #2870. **2. Qt 6.4.2 из Debian 12 слишком старый** `qt_generate_deploy_qml_app_script` не принимает `OUTPUT_SCRIPT` и `DEPLOY_TOOL_OPTIONS` — оба добавлены в Qt 6.5–6.7. Qt 6.8.2 работает. Это нельзя исправить в репозитории: Qt не публикует официальные десктопные сборки для aarch64 Linux, поэтому остаётся либо Qt из дистрибутива, либо сборка из исходников. Рабочим оказался вариант со сборкой внутри контейнера Debian 13 (trixie), не затрагивая хост: ```bash sudo apt-get install -y podman uidmap slirp4netns fuse-overlayfs podman run --rm -v ~/amnezia-client:/src -v ~/conan-trixie:/root/.conan2 \ docker.io/library/debian:trixie bash -c ' apt-get update -qq apt-get install -y --no-install-recommends build-essential cmake ninja-build \ git curl ca-certificates pipx python3-venv pkg-config \ qt6-base-dev qt6-base-dev-tools qt6-declarative-dev qt6-declarative-dev-tools \ qt6-svg-dev qt6-5compat-dev qt6-remoteobjects-dev \ qt6-tools-dev qt6-tools-dev-tools qt6-l10n-tools \ libgl1-mesa-dev libssl-dev zlib1g-dev libsecret-1-dev libxkbcommon-dev export PATH=/root/.local/bin:$PATH pipx install conan && conan profile detect --force cd /src export QT_ROOT_PATH=/usr CMAKE_PREFIX_PATH=/usr/lib/aarch64-linux-gnu/cmake deploy/build.sh --force' ``` `QT_ROOT_PATH` и `CMAKE_PREFIX_PATH` обязательны, потому что `deploy/build.sh` ищет Qt только в структуре официального установщика (`$QT_ROOT_PATH/gcc_64`), которой у Qt из дистрибутива нет. Две вещи выглядят как ошибки, но ими не являются: `qt-cmake` в Debian отсутствует (он поставляется только с установщиком Qt), а хост-утилиты Qt (`moc`, `rcc`, `uic`, `repc`) лежат в `/usr/lib/qt6/libexec/` и намеренно не входят в `PATH`. CMake находит их через конфигурационные пакеты Qt6, поэтому `command -v` ошибочно сообщает об их отсутствии. Результат: `client/AmneziaVPN` и `service/server/AmneziaVPN-service` собираются полностью, 0 ошибок, ELF 64-bit LSB PIE ARM aarch64. **Собирается — не значит запускается.** Бинарники, собранные в контейнере trixie, слинкованы с glibc 2.41 и Qt 6.8.2. В Raspberry Pi OS bookworm — glibc 2.36 и Qt 6.4.2: ``` libc.so.6: version `GLIBC_2.38' not found libQt6Core.so.6: version `Qt_6.8' not found ``` Версионирование символов в glibc совместимо только вперёд, поэтому бинарник, собранный против 2.41, никогда не загрузится на 2.36. Чтобы запустить его на том же хосте, нужен второй, постоянный контейнер с рантаймом Qt 6.8. С ним демон на aarch64 стартует нормально: `LinuxDaemon`, `WireguardUtilsLinux`, `DnsUtilsLinux` и `IPUtilsLinux` создаются, IPC-сокет открывается в `/var/run/amneziavpn/daemon.socket`. Окружение: Raspberry Pi 5, 8 ГБ, aarch64, Raspberry Pi OS bookworm (Debian 12), сборка из ветки `dev`.
Author
Owner

@iv4nconnect commented on GitHub (Jul 26, 2026):

Would an aarch64 Linux CI job be welcome? Happy to help, I have the hardware set up and can test whatever's useful.

Yes! Definitely! I, personally, really need it and if you could release a testing version, I'd be happy to test it!

<!-- gh-comment-id:5085256070 --> @iv4nconnect commented on GitHub (Jul 26, 2026): > Would an aarch64 Linux CI job be welcome? Happy to help, I have the hardware set up and can test whatever's useful. Yes! Definitely! I, personally, really need it and if you could release a testing version, I'd be happy to test it!
Author
Owner

@Mezo-oz commented on GitHub (Jul 28, 2026):

Ok so the client and service daemon are running on a Pi 5 I have running Debian 13. So Debian 13 native build works directly, and I'll post full steps once I can validate that the VPN works end to end. For Debian 12, native build compiles but wont run since there is a glibc/Qt mismatch.

<!-- gh-comment-id:5108967015 --> @Mezo-oz commented on GitHub (Jul 28, 2026): Ok so the client and service daemon are running on a Pi 5 I have running Debian 13. So Debian 13 native build works directly, and I'll post full steps once I can validate that the VPN works end to end. For Debian 12, native build compiles but wont run since there is a glibc/Qt mismatch.
Sign in to join this conversation.
No labels
pull-request
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
amnezia-vpn/amnezia-client#525
No description provided.