Skip to content

Commit 19475ad

Browse files
committed
chore: Statically link OpenMP into the cracker fun util on Windows
For some reason even with -DCMAKE_EXE_LINKER_FLAGS="-static" specified, CMake still links OpenMP dynamically, even though it links other libs statically, e.g. -pthread.
1 parent 1be311e commit 19475ad

File tree

3 files changed

+21
-10
lines changed

3 files changed

+21
-10
lines changed

other/docker/windows/build_toxcore.sh

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,10 @@ build() {
6666
TOXCORE_CFLAGS="-fno-asynchronous-unwind-tables"
6767
fi
6868

69+
# Patch CMakeLists.txt to make cracker.exe statically link against OpenMP. For some reason
70+
# -DCMAKE_EXE_LINKER_FLAGS="-static" doesn't do it.
71+
sed -i "s|OpenMP::OpenMP_C)|$(realpath -- /usr/lib/gcc/"$WINDOWS_TOOLCHAIN"/*-win32/libgomp.a) \${CMAKE_THREAD_LIBS_INIT})\ntarget_compile_options(cracker PRIVATE -fopenmp)|g" ../other/fun/CMakeLists.txt
72+
6973
# Silly way to bypass a shellharden check
7074
read -ra EXTRA_CMAKE_FLAGS_ARRAY <<<"$EXTRA_CMAKE_FLAGS"
7175
CFLAGS="$CFLAGS $TOXCORE_CFLAGS" \

other/fun/CMakeLists.txt

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -42,12 +42,12 @@ add_executable(cracker_simple cracker_simple.c)
4242
target_link_libraries(cracker_simple PRIVATE misc_tools)
4343
target_link_sodium(cracker_simple)
4444

45-
# MSVC doesn't support OpenMP
46-
if(NOT MSVC)
47-
find_package(OpenMP)
48-
if(OpenMP_C_FOUND)
49-
add_executable(cracker cracker.c)
50-
target_link_sodium(cracker)
51-
target_link_libraries(cracker PRIVATE OpenMP::OpenMP_C)
52-
endif()
45+
find_package(OpenMP)
46+
if(OpenMP_C_FOUND)
47+
add_executable(cracker cracker.c)
48+
target_link_libraries(cracker PRIVATE OpenMP::OpenMP_C)
49+
target_link_sodium(cracker)
50+
else()
51+
add_executable(cracker cracker.c)
52+
target_link_sodium(cracker)
5353
endif()

other/fun/cracker.c

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
#include <omp.h>
3434
#define NUM_THREADS() ((unsigned) omp_get_max_threads())
3535
#else
36+
#pragma message("Being built without OpenMP support -- the program will utilize a single thread only.")
3637
#define NUM_THREADS() (1U)
3738
#endif
3839

@@ -112,8 +113,9 @@ static size_t match_hex_prefix(const uint8_t *key, const uint8_t *prefix, size_t
112113
static void cracker_core(uint64_t range_start, uint64_t range_end, uint64_t range_offs, uint64_t priv_key_shadow[4],
113114
uint32_t *longest_match, uint8_t hex_prefix[MAX_CRACK_BYTES], size_t prefix_chars_len)
114115
{
116+
#if defined(_OPENMP)
115117
#pragma omp parallel for firstprivate(priv_key_shadow) shared(longest_match, range_start, range_end, range_offs, hex_prefix, prefix_chars_len) schedule(static) default(none)
116-
118+
#endif
117119
for (uint64_t batch = range_start; batch < range_end; ++batch) {
118120
uint8_t *priv_key = (uint8_t *) priv_key_shadow;
119121
/*
@@ -134,14 +136,19 @@ static void cracker_core(uint64_t range_start, uint64_t range_end, uint64_t rang
134136

135137
// Global compare and update
136138
uint32_t l_longest_match;
139+
#if defined(_OPENMP)
137140
#pragma omp atomic read
141+
#endif
138142
l_longest_match = *longest_match;
139143

140144
if (matching > l_longest_match) {
145+
#if defined(_OPENMP)
141146
#pragma omp atomic write
147+
#endif
142148
*longest_match = matching;
143-
149+
#if defined(_OPENMP)
144150
#pragma omp critical
151+
#endif
145152
{
146153
printf("%u chars matching: \n", matching);
147154
printf("Public key: ");

0 commit comments

Comments
 (0)