Skip to content

MinGW: libwinpthreads and crt need to be built with -mno-outline-atomics #208

@Blackhex

Description

@Blackhex

The second stage aarch64-w64-mingw32 build of libwinpthreads with --enable-static, --enable-shared, --enable-wildcard, and --with-libraries=all fails with the following errors:

/bin/bash ./libtool  --tag=CC   --mode=link aarch64-w64-mingw32-gcc -Wall -DWIN32_LEAN_AND_MEAN  -O0 -ggdb -no-undefined -version-info 1:0:0 -L./fakelib -Wc,-no-pthread  -o libwinpthread.la -rpath /home/radekbarton/cross-aarch64-w64-mingw32-msvcrt/aarch64-w64-mingw32/lib src/libwinpthread_la-barrier.lo src/libwinpthread_la-cond.lo src/libwinpthread_la-misc.lo src/libwinpthread_la-mutex.lo src/libwinpthread_la-rwlock.lo src/libwinpthread_la-spinlock.lo src/libwinpthread_la-thread.lo src/libwinpthread_la-ref.lo src/libwinpthread_la-sem.lo src/libwinpthread_la-sched.lo src/libwinpthread_la-clock.lo src/libwinpthread_la-nanosleep.lo src/version.lo  
libtool: link: aarch64-w64-mingw32-gcc -shared  src/.libs/libwinpthread_la-barrier.o src/.libs/libwinpthread_la-cond.o src/.libs/libwinpthread_la-misc.o src/.libs/libwinpthread_la-mutex.o src/.libs/libwinpthread_la-rwlock.o src/.libs/libwinpthread_la-spinlock.o src/.libs/libwinpthread_la-thread.o src/.libs/libwinpthread_la-ref.o src/.libs/libwinpthread_la-sem.o src/.libs/libwinpthread_la-sched.o src/.libs/libwinpthread_la-clock.o src/.libs/libwinpthread_la-nanosleep.o src/.libs/version.o   -L./fakelib  -O0 -ggdb -no-pthread   -o .libs/libwinpthread-1.dll -Wl,--enable-auto-image-base -Xlinker --out-implib -Xlinker .libs/libwinpthread.dll.a
/home/radekbarton/cross-aarch64-w64-mingw32-msvcrt/lib/gcc/aarch64-w64-mingw32/15.0.1/../../../../aarch64-w64-mingw32/bin/ld: /home/radekbarton/cross-aarch64-w64-mingw32-msvcrt/lib/gcc/aarch64-w64-mingw32/15.0.1/../../../../aarch64-w64-mingw32/lib/dllcrt2.o: in function `_InterlockedCompareExchangePointer':
/home/radekbarton/cross-aarch64-w64-mingw32-msvcrt/aarch64-w64-mingw32/include/psdk_inc/intrin-impl.h:1760:(.text+0x110): undefined reference to `__aarch64_cas8_sync'

/home/radekbarton/cross-aarch64-w64-mingw32-msvcrt/lib/gcc/aarch64-w64-mingw32/15.0.1/../../../../aarch64-w64-mingw32/bin/ld: /home/radekbarton/cross-aarch64-w64-mingw32-msvcrt/lib/gcc/aarch64-w64-mingw32/15.0.1/../../../../aarch64-w64-mingw32/lib/dllcrt2.o: in function `_InterlockedExchangePointer':
/home/radekbarton/cross-aarch64-w64-mingw32-msvcrt/aarch64-w64-mingw32/include/psdk_inc/intrin-impl.h:1771:(.text+0x1e8): undefined reference to `__aarch64_swp8_sync'

/home/radekbarton/cross-aarch64-w64-mingw32-msvcrt/lib/gcc/aarch64-w64-mingw32/15.0.1/../../../../aarch64-w64-mingw32/bin/ld: src/.libs/libwinpthread_la-barrier.o: in function `_InterlockedDecrement':
/home/radekbarton/cross-aarch64-w64-mingw32-msvcrt/aarch64-w64-mingw32/include/psdk_inc/intrin-impl.h:1705:
/home/radekbarton/cross-aarch64-w64-mingw32-msvcrt/lib/gcc/aarch64-w64-mingw32/15.0.1/../../../../aarch64-w64-mingw32/bin/ld: /home/radekbarton/cross-aarch64-w64-mingw32-msvcrt/aarch64-w64-mingw32/include/psdk_inc/intrin-impl.h:1672:(.text+0x1d2c): undefined reference to `__aarch64_ldadd4_sync'

collect2: error: ld returned 1 exit status
make[4]: *** [Makefile:706: libwinpthread.la] Error 1

The root cause is that https://github.com/Windows-on-ARM-Experiments/mingw-woarm64/blob/woarm64/mingw-w64-headers/include/psdk_inc/intrin-impl.h#L1760 file references GCC built-in functions like __sync_val_compare_and_swap that is implemented using __aarch64_cas8_sync LSE intrinsic in libgcc.a but the libwinpthread links against fakelib that does not define those symbols.

One possible workaround is to add -mno-outline-atomics to CFLAGS when building both mingw-w64-crt and mingw-w64-winpthreads.

Another workaround is:

--- a/mingw-w64-libraries/winpthreads/Makefile.am
+++ b/mingw-w64-libraries/winpthreads/Makefile.am
@@ -19,7 +19,7 @@ AM_CFLAGS += -nologo
 libwinpthread_la_CPPFLAGS += -D_CRT_NONSTDC_NO_WARNINGS
 else
 libwinpthread_la_CPPFLAGS += -D__USE_MINGW_ANSI_STDIO=0
-libwinpthread_la_LDFLAGS += -L$(builddir)/fakelib -Wc,-no-pthread
+libwinpthread_la_LDFLAGS += -Wc,-no-pthread
 EXTRA_libwinpthread_la_DEPENDENCIES = fakelib/libgcc.a  fakelib/libgcc_eh.a  fakelib/libgcc_s.a
 
 # Break circular dep on bootstrap
diff --git a/mingw-w64-libraries/winpthreads/Makefile.in b/mingw-w64-libraries/winpthreads/Makefile.in
index e14a95843..7561b16d9 100644
--- a/mingw-w64-libraries/winpthreads/Makefile.in
+++ b/mingw-w64-libraries/winpthreads/Makefile.in
@@ -93,7 +93,7 @@ host_triplet = @host@
 @MSVC_TRUE@am__append_1 = -nologo
 @MSVC_TRUE@am__append_2 = -D_CRT_NONSTDC_NO_WARNINGS
 @MSVC_FALSE@am__append_3 = -D__USE_MINGW_ANSI_STDIO=0
-@MSVC_FALSE@am__append_4 = -L$(builddir)/fakelib -Wc,-no-pthread
+@MSVC_FALSE@am__append_4 = -Wc,-no-pthread
 @COPY_STATIC_TRUE@am__append_5 = libpthread.a
 @COPY_SHARED_TRUE@am__append_6 = libpthread.dll.a
 subdir = .

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions