From c0e4046b446234639d023798c593f3c69fdfc202 Mon Sep 17 00:00:00 2001 From: Jan Breig Date: Thu, 25 Jun 2026 05:47:11 +0200 Subject: [PATCH 1/5] Suppress errors on implicit zero initialization of structs Fixes compiler errors on missing braces when building with Android NDK. --- client/CMakeLists.txt | 2 +- client/deps/amiibo.cmake | 2 +- client/deps/id48lib.cmake | 2 +- client/deps/lua.cmake | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/client/CMakeLists.txt b/client/CMakeLists.txt index fda4ea575..8182ffb96 100644 --- a/client/CMakeLists.txt +++ b/client/CMakeLists.txt @@ -825,7 +825,7 @@ if ((NOT SKIPQT EQUAL 1) AND Qt6_FOUND) target_include_directories(proxmark3 PRIVATE ${CMAKE_CURRENT_BINARY_DIR}) endif() -target_compile_options(proxmark3 PUBLIC -Wall -Werror -O3) +target_compile_options(proxmark3 PUBLIC -Wall -Werror -Wno-missing-braces -O3) if (EMBED_READLINE) if (NOT SKIPREADLINE EQUAL 1) add_dependencies(proxmark3 ncurses readline) diff --git a/client/deps/amiibo.cmake b/client/deps/amiibo.cmake index c946c0682..8f2ba5fdb 100644 --- a/client/deps/amiibo.cmake +++ b/client/deps/amiibo.cmake @@ -19,7 +19,7 @@ target_link_libraries(pm3rrg_rdv4_amiibo PRIVATE m pm3rrg_rdv4_mbedtls) -target_compile_options(pm3rrg_rdv4_amiibo PRIVATE -Wall -Werror -O3) +target_compile_options(pm3rrg_rdv4_amiibo PRIVATE -Wall -Werror -Wno-missing-braces -O3) set_property(TARGET pm3rrg_rdv4_amiibo PROPERTY POSITION_INDEPENDENT_CODE ON) target_include_directories(pm3rrg_rdv4_amiibo PRIVATE amiitool diff --git a/client/deps/id48lib.cmake b/client/deps/id48lib.cmake index 39d58ceac..ea3336430 100644 --- a/client/deps/id48lib.cmake +++ b/client/deps/id48lib.cmake @@ -5,7 +5,7 @@ add_library(pm3rrg_rdv4_id48 STATIC id48/src/id48_generator.c id48/src/id48_recover.c ) -target_compile_options( pm3rrg_rdv4_id48 PRIVATE -Wpedantic -Wall -Werror -O3 -Wno-unknown-pragmas -Wno-inline -Wno-unused-function -DID48_NO_STDIO) +target_compile_options( pm3rrg_rdv4_id48 PRIVATE -Wpedantic -Wall -Werror -O3 -Wno-unknown-pragmas -Wno-inline -Wno-unused-function -Wno-missing-braces -DID48_NO_STDIO) target_include_directories(pm3rrg_rdv4_id48 PRIVATE id48/public) target_include_directories(pm3rrg_rdv4_id48 INTERFACE id48/public) set_property(TARGET pm3rrg_rdv4_id48 PROPERTY POSITION_INDEPENDENT_CODE ON) diff --git a/client/deps/lua.cmake b/client/deps/lua.cmake index d89275be6..889a44cf3 100644 --- a/client/deps/lua.cmake +++ b/client/deps/lua.cmake @@ -52,5 +52,5 @@ if (NOT MINGW) endif (NOT MINGW) target_include_directories(pm3rrg_rdv4_lua INTERFACE liblua) -target_compile_options(pm3rrg_rdv4_lua PRIVATE -Wall -Werror -O3) +target_compile_options(pm3rrg_rdv4_lua PRIVATE -Wall -Werror -Wno-missing-braces -O3) set_property(TARGET pm3rrg_rdv4_lua PROPERTY POSITION_INDEPENDENT_CODE ON) From 5b5a3496e13d7d8f27020c0b7278c11ba84c80a2 Mon Sep 17 00:00:00 2001 From: Jan Breig Date: Thu, 25 Jun 2026 05:49:23 +0200 Subject: [PATCH 2/5] Ignore deprecated tempnam in liblua Fixes compiler errors on deprecated declarations when building with Android NDK. --- client/deps/lua.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/deps/lua.cmake b/client/deps/lua.cmake index 889a44cf3..fb5138b44 100644 --- a/client/deps/lua.cmake +++ b/client/deps/lua.cmake @@ -52,5 +52,5 @@ if (NOT MINGW) endif (NOT MINGW) target_include_directories(pm3rrg_rdv4_lua INTERFACE liblua) -target_compile_options(pm3rrg_rdv4_lua PRIVATE -Wall -Werror -Wno-missing-braces -O3) +target_compile_options(pm3rrg_rdv4_lua PRIVATE -Wall -Werror -Wno-missing-braces -Wno-deprecated-declarations -O3) set_property(TARGET pm3rrg_rdv4_lua PROPERTY POSITION_INDEPENDENT_CODE ON) From f5925c766e0eef8329bbda3970e89f159fc0992f Mon Sep 17 00:00:00 2001 From: Jan Breig Date: Thu, 25 Jun 2026 05:50:12 +0200 Subject: [PATCH 3/5] Add spinlock shim for Android NDK builds Fixes compiler errors on missing spinlock when building with Android NDK. --- client/src/cmdparser.c | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/client/src/cmdparser.c b/client/src/cmdparser.c index 5cfbf58b8..76c28118a 100644 --- a/client/src/cmdparser.c +++ b/client/src/cmdparser.c @@ -30,6 +30,24 @@ # include "pthread_spin_lock_shim.h" // spinlock shim for OSX .. #endif +#ifdef __ANDROID__ +//Spinlock patch for building with Android NDK + +typedef pthread_mutex_t pthread_spinlock_t; + +#define pthread_spin_init(lock, pshared) \ + pthread_mutex_init(lock, NULL) + +#define pthread_spin_lock(lock) \ + pthread_mutex_lock(lock) + +#define pthread_spin_unlock(lock) \ + pthread_mutex_unlock(lock) + +#define pthread_spin_destroy(lock) \ + pthread_mutex_destroy(lock) +#endif + #define MAX_PM3_INPUT_ARGS_LENGTH 4096 bool AlwaysAvailable(void) { From 18cdd5e9c920abc0ce95cd0387454cb740c5de85 Mon Sep 17 00:00:00 2001 From: Jan Breig Date: Thu, 25 Jun 2026 05:51:38 +0200 Subject: [PATCH 4/5] Disable GCC pragmas for Android NDK builds on x86 Fixes clang error due to invalid AVX2 pragma on x86 when building with Android NDK. --- client/CMakeLists.txt | 8 ++++++++ client/src/loclass/cipher_bs_avx2.c | 6 +++--- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/client/CMakeLists.txt b/client/CMakeLists.txt index 8182ffb96..800f30ff3 100644 --- a/client/CMakeLists.txt +++ b/client/CMakeLists.txt @@ -500,6 +500,14 @@ set (TARGET_SOURCES ${CMAKE_BINARY_DIR}/version_pm3.c ) +# Enable AVX2 support for x86/x64 +if(CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64|AMD64|i.86") + set_source_files_properties( + src/loclass/cipher_bs_avx2.c + PROPERTIES COMPILE_OPTIONS "-mavx2" + ) +endif() + add_custom_command( OUTPUT ${CMAKE_BINARY_DIR}/version_pm3.c COMMAND sh ${PM3_ROOT}/tools/mkversion.sh ${CMAKE_BINARY_DIR}/version_pm3.c || ${CMAKE_COMMAND} -E copy ${PM3_ROOT}/common/default_version_pm3.c ${CMAKE_BINARY_DIR}/version_pm3.c diff --git a/client/src/loclass/cipher_bs_avx2.c b/client/src/loclass/cipher_bs_avx2.c index 718522f99..c72238c26 100644 --- a/client/src/loclass/cipher_bs_avx2.c +++ b/client/src/loclass/cipher_bs_avx2.c @@ -18,7 +18,7 @@ #include -#if defined(__GNUC__) || defined(__clang__) +#if (defined(__GNUC__) || defined(__clang__)) && !defined(__ANDROID__) #pragma GCC push_options #pragma GCC target("avx2") #endif @@ -263,14 +263,14 @@ void doMAC_brute_match256(const uint64_t y_bits_bs[96 * BS256_WORDS], _mm256_storeu_si256((__m256i *)match_out, mac_match); } -#if defined(__GNUC__) || defined(__clang__) +#if (defined(__GNUC__) || defined(__clang__)) && !defined(__ANDROID__) #pragma GCC pop_options #endif bool bs_avx2_supported(void) { static int cached = -1; if (cached < 0) { -#if defined(__GNUC__) || defined(__clang__) +#if (defined(__GNUC__) || defined(__clang__)) && !defined(__ANDROID__) __builtin_cpu_init(); cached = __builtin_cpu_supports("avx2") ? 1 : 0; #else From dace610d59b1974b52c2ad8d30d93e2d78e6660a Mon Sep 17 00:00:00 2001 From: Jan Breig Date: Thu, 25 Jun 2026 06:03:10 +0200 Subject: [PATCH 5/5] Disable GCC pragmas for Android NDK builds on x86/x64 Fixes clang error due to invalid AVX-512 pragma on x86/x64 when building with Android NDK. --- client/CMakeLists.txt | 8 ++++++++ client/src/loclass/cipher_bs_avx512.c | 6 +++--- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/client/CMakeLists.txt b/client/CMakeLists.txt index 800f30ff3..6a8c304db 100644 --- a/client/CMakeLists.txt +++ b/client/CMakeLists.txt @@ -508,6 +508,14 @@ if(CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64|AMD64|i.86") ) endif() +# Enable AVX 512 support for x64 +if(CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64|AMD64") + set_source_files_properties( + src/loclass/cipher_bs_avx512.c + PROPERTIES COMPILE_OPTIONS "-mavx512f" + ) +endif() + add_custom_command( OUTPUT ${CMAKE_BINARY_DIR}/version_pm3.c COMMAND sh ${PM3_ROOT}/tools/mkversion.sh ${CMAKE_BINARY_DIR}/version_pm3.c || ${CMAKE_COMMAND} -E copy ${PM3_ROOT}/common/default_version_pm3.c ${CMAKE_BINARY_DIR}/version_pm3.c diff --git a/client/src/loclass/cipher_bs_avx512.c b/client/src/loclass/cipher_bs_avx512.c index ac1b279a1..4cb784457 100644 --- a/client/src/loclass/cipher_bs_avx512.c +++ b/client/src/loclass/cipher_bs_avx512.c @@ -19,7 +19,7 @@ #include -#if defined(__GNUC__) || defined(__clang__) +#if (defined(__GNUC__) || defined(__clang__)) && !defined(__ANDROID__) #pragma GCC push_options #pragma GCC target("avx512f") #endif @@ -291,14 +291,14 @@ void doMAC_brute_match512(const uint64_t y_bits_bs[96 * BS512_WORDS], _mm512_storeu_si512((void *)match_out, mac_match); } -#if defined(__GNUC__) || defined(__clang__) +#if (defined(__GNUC__) || defined(__clang__)) && !defined(__ANDROID__) #pragma GCC pop_options #endif bool bs_avx512_supported(void) { static int cached = -1; if (cached < 0) { -#if defined(__GNUC__) || defined(__clang__) +#if (defined(__GNUC__) || defined(__clang__)) && !defined(__ANDROID__) __builtin_cpu_init(); cached = __builtin_cpu_supports("avx512f") ? 1 : 0; #else