Skip to content

Commit e46de4e

Browse files
authored
[runtimes] Fix link order of system librarires on Apple platforms (llvm#66940)
On Apple platforms, we always support the -nostdlib++ flag. Hence, it is not necessary to manually link against system libraries. In fact, doing so causes us to link against libSystem explicitly, which messes up with the order of libraries we should use. Indeed: Before patch, using the system unwinder (LIBCXXABI_USE_LLVM_UNWINDER = OFF) =========================================================================== $ otool -L lib/{libc++.1.dylib,libc++abi.1.dylib,libunwind.1.dylib} lib/libc++.1.dylib: @rpath/libc++.1.dylib /usr/lib/libSystem.B.dylib @rpath/libc++abi.1.dylib lib/libc++abi.1.dylib: @rpath/libc++abi.1.dylib /usr/lib/libSystem.B.dylib lib/libunwind.1.dylib: @rpath/libunwind.1.dylib /usr/lib/libSystem.B.dylib After patch, using the system unwinder (LIBCXXABI_USE_LLVM_UNWINDER = OFF) =========================================================================== $ otool -L lib/{libc++.1.dylib,libc++abi.1.dylib,libunwind.1.dylib} lib/libc++.1.dylib: @rpath/libc++.1.dylib @rpath/libc++abi.1.dylib /usr/lib/libSystem.B.dylib lib/libc++abi.1.dylib: @rpath/libc++abi.1.dylib /usr/lib/libSystem.B.dylib lib/libunwind.1.dylib: @rpath/libunwind.1.dylib /usr/lib/libSystem.B.dylib Before patch, with the LLVM unwinder (LIBCXXABI_USE_LLVM_UNWINDER = ON) ======================================================================= $ otool -L lib/{libc++.1.dylib,libc++abi.1.dylib,libunwind.1.dylib} lib/libc++.1.dylib: @rpath/libc++.1.dylib /usr/lib/libSystem.B.dylib @rpath/libc++abi.1.dylib @rpath/libunwind.1.dylib lib/libc++abi.1.dylib: @rpath/libc++abi.1.dylib /usr/lib/libSystem.B.dylib @rpath/libunwind.1.dylib lib/libunwind.1.dylib: @rpath/libunwind.1.dylib /usr/lib/libSystem.B.dylib After patch, with the LLVM unwinder (LIBCXXABI_USE_LLVM_UNWINDER = ON) ====================================================================== $ otool -L lib/{libc++.1.dylib,libc++abi.1.dylib,libunwind.1.dylib} lib/libc++.1.dylib: @rpath/libc++.1.dylib @rpath/libc++abi.1.dylib @rpath/libunwind.1.dylib /usr/lib/libSystem.B.dylib lib/libc++abi.1.dylib: @rpath/libc++abi.1.dylib @rpath/libunwind.1.dylib /usr/lib/libSystem.B.dylib lib/libunwind.1.dylib: @rpath/libunwind.1.dylib /usr/lib/libSystem.B.dylib As we can see, libSystem appears before the just-built libraries before the patch, which causes the libunwind.dylib bundled in libSystem.dylib to be used instead of the just-built libunwind.dylib. We didn't notice the issue until recently when I tried to update the macOS CI builders to macOS 13.5, where it is necessary to use the right libunwind library (the exact reason still needs to be investigated).
1 parent 3bd7a9b commit e46de4e

File tree

5 files changed

+24
-27
lines changed

5 files changed

+24
-27
lines changed

libcxx/CMakeLists.txt

+13-15
Original file line numberDiff line numberDiff line change
@@ -659,24 +659,22 @@ function(cxx_link_system_libraries target)
659659
target_add_link_flags_if_supported(${target} PRIVATE "--unwindlib=none")
660660
endif()
661661

662-
if (LIBCXX_HAS_SYSTEM_LIB)
663-
target_link_libraries(${target} PRIVATE System)
664-
endif()
665-
666-
if (LIBCXX_HAS_PTHREAD_LIB)
667-
target_link_libraries(${target} PRIVATE pthread)
668-
endif()
662+
if (NOT APPLE) # On Apple platforms, we always use -nostdlib++ so we don't need to re-add other libraries
663+
if (LIBCXX_HAS_PTHREAD_LIB)
664+
target_link_libraries(${target} PRIVATE pthread)
665+
endif()
669666

670-
if (LIBCXX_HAS_C_LIB)
671-
target_link_libraries(${target} PRIVATE c)
672-
endif()
667+
if (LIBCXX_HAS_C_LIB)
668+
target_link_libraries(${target} PRIVATE c)
669+
endif()
673670

674-
if (LIBCXX_HAS_M_LIB)
675-
target_link_libraries(${target} PRIVATE m)
676-
endif()
671+
if (LIBCXX_HAS_M_LIB)
672+
target_link_libraries(${target} PRIVATE m)
673+
endif()
677674

678-
if (LIBCXX_HAS_RT_LIB)
679-
target_link_libraries(${target} PRIVATE rt)
675+
if (LIBCXX_HAS_RT_LIB)
676+
target_link_libraries(${target} PRIVATE rt)
677+
endif()
680678
endif()
681679

682680
if (LIBCXX_USE_COMPILER_RT)

libcxx/cmake/config-ix.cmake

-4
Original file line numberDiff line numberDiff line change
@@ -110,10 +110,8 @@ if(WIN32 AND NOT MINGW)
110110
set(LIBCXX_HAS_PTHREAD_LIB NO)
111111
set(LIBCXX_HAS_M_LIB NO)
112112
set(LIBCXX_HAS_RT_LIB NO)
113-
set(LIBCXX_HAS_SYSTEM_LIB NO)
114113
set(LIBCXX_HAS_ATOMIC_LIB NO)
115114
elseif(APPLE)
116-
check_library_exists(System write "" LIBCXX_HAS_SYSTEM_LIB)
117115
set(LIBCXX_HAS_PTHREAD_LIB NO)
118116
set(LIBCXX_HAS_M_LIB NO)
119117
set(LIBCXX_HAS_RT_LIB NO)
@@ -122,12 +120,10 @@ elseif(FUCHSIA)
122120
set(LIBCXX_HAS_M_LIB NO)
123121
set(LIBCXX_HAS_PTHREAD_LIB NO)
124122
set(LIBCXX_HAS_RT_LIB NO)
125-
set(LIBCXX_HAS_SYSTEM_LIB NO)
126123
check_library_exists(atomic __atomic_fetch_add_8 "" LIBCXX_HAS_ATOMIC_LIB)
127124
else()
128125
check_library_exists(pthread pthread_create "" LIBCXX_HAS_PTHREAD_LIB)
129126
check_library_exists(m ccos "" LIBCXX_HAS_M_LIB)
130127
check_library_exists(rt clock_gettime "" LIBCXX_HAS_RT_LIB)
131-
set(LIBCXX_HAS_SYSTEM_LIB NO)
132128
check_library_exists(atomic __atomic_fetch_add_8 "" LIBCXX_HAS_ATOMIC_LIB)
133129
endif()

libcxxabi/cmake/config-ix.cmake

-2
Original file line numberDiff line numberDiff line change
@@ -95,11 +95,9 @@ if(FUCHSIA)
9595
set(LIBCXXABI_HAS_PTHREAD_LIB NO)
9696
check_library_exists(c __cxa_thread_atexit_impl ""
9797
LIBCXXABI_HAS_CXA_THREAD_ATEXIT_IMPL)
98-
set(LIBCXXABI_HAS_SYSTEM_LIB NO)
9998
else()
10099
check_library_exists(dl dladdr "" LIBCXXABI_HAS_DL_LIB)
101100
check_library_exists(pthread pthread_once "" LIBCXXABI_HAS_PTHREAD_LIB)
102101
check_library_exists(c __cxa_thread_atexit_impl ""
103102
LIBCXXABI_HAS_CXA_THREAD_ATEXIT_IMPL)
104-
check_library_exists(System write "" LIBCXXABI_HAS_SYSTEM_LIB)
105103
endif()

libcxxabi/src/CMakeLists.txt

+1-3
Original file line numberDiff line numberDiff line change
@@ -67,9 +67,7 @@ if (LIBCXXABI_ENABLE_FORGIVING_DYNAMIC_CAST)
6767
add_definitions(-D_LIBCXXABI_FORGIVING_DYNAMIC_CAST)
6868
endif()
6969

70-
if (APPLE)
71-
add_library_flags_if(LIBCXXABI_HAS_SYSTEM_LIB System)
72-
else()
70+
if (NOT APPLE) # On Apple platforms, we always use -nostdlib++ so we don't need to re-add other libraries
7371
if (LIBCXXABI_ENABLE_THREADS)
7472
add_library_flags_if(LIBCXXABI_HAS_PTHREAD_LIB pthread)
7573
endif()

libunwind/src/CMakeLists.txt

+10-3
Original file line numberDiff line numberDiff line change
@@ -65,16 +65,23 @@ set(LIBUNWIND_SOURCES
6565
${LIBUNWIND_ASM_SOURCES})
6666

6767
# Generate library list.
68-
add_library_flags_if(LIBUNWIND_HAS_C_LIB c)
6968
if (LIBUNWIND_USE_COMPILER_RT)
7069
add_library_flags("${LIBUNWIND_BUILTINS_LIBRARY}")
7170
else()
7271
add_library_flags_if(LIBUNWIND_HAS_GCC_S_LIB gcc_s)
7372
add_library_flags_if(LIBUNWIND_HAS_GCC_LIB gcc)
7473
endif()
75-
add_library_flags_if(LIBUNWIND_HAS_DL_LIB dl)
74+
if (NOT APPLE) # On Apple platforms, we don't need to link explicitly against system libraries
75+
add_library_flags_if(LIBUNWIND_HAS_C_LIB c)
76+
add_library_flags_if(LIBUNWIND_HAS_DL_LIB dl)
77+
78+
if (LIBUNWIND_ENABLE_THREADS)
79+
add_library_flags_if(LIBUNWIND_HAS_PTHREAD_LIB pthread)
80+
add_compile_flags_if(LIBUNWIND_WEAK_PTHREAD_LIB -DLIBUNWIND_USE_WEAK_PTHREAD=1)
81+
endif()
82+
endif()
83+
7684
if (LIBUNWIND_ENABLE_THREADS)
77-
add_library_flags_if(LIBUNWIND_HAS_PTHREAD_LIB pthread)
7885
add_compile_flags_if(LIBUNWIND_WEAK_PTHREAD_LIB -DLIBUNWIND_USE_WEAK_PTHREAD=1)
7986
endif()
8087

0 commit comments

Comments
 (0)