diff --git a/src/coreclr/nativeaot/Runtime/CMakeLists.txt b/src/coreclr/nativeaot/Runtime/CMakeLists.txt index e491f54a562445..d229e7f2dd14c6 100644 --- a/src/coreclr/nativeaot/Runtime/CMakeLists.txt +++ b/src/coreclr/nativeaot/Runtime/CMakeLists.txt @@ -179,8 +179,26 @@ else() include(${CLR_SRC_NATIVE_DIR}/external/llvm-libunwind.cmake) - list(APPEND FULL_RUNTIME_SOURCES ${LLVM_LIBUNWIND_SOURCES}) - set(RUNTIME_SOURCES_ARCH_ASM ${LLVM_LIBUNWIND_ASM_SOURCES}) + set(NATIVEAOT_LOCALIZE_LIBUNWIND_SYMBOLS OFF) + if(CLR_CMAKE_TARGET_UNIX AND NOT CLR_CMAKE_TARGET_APPLE AND NOT CLR_CMAKE_TARGET_ARCH_WASM) + set(NATIVEAOT_LOCALIZE_LIBUNWIND_SYMBOLS ON) + endif() + + if(NATIVEAOT_LOCALIZE_LIBUNWIND_SYMBOLS) + # Build the bundled libunwind implementation and the runtime unwinder code + # that references it into one relocatable object. The runtime sources are + # part of the partial link so their references to libunwind's implementation + # symbols are resolved before those symbols are localized. + set(NATIVEAOT_PRIVATE_LIBUNWIND_SOURCES + unix/UnwindHelpers.cpp + unix/UnixNativeCodeManager.cpp + ${LLVM_LIBUNWIND_SOURCES} + ${LLVM_LIBUNWIND_ASM_SOURCES}) + list(REMOVE_ITEM FULL_RUNTIME_SOURCES unix/UnwindHelpers.cpp unix/UnixNativeCodeManager.cpp) + else() + list(APPEND FULL_RUNTIME_SOURCES ${LLVM_LIBUNWIND_SOURCES}) + set(RUNTIME_SOURCES_ARCH_ASM ${LLVM_LIBUNWIND_ASM_SOURCES}) + endif() set(ASM_SUFFIX S) endif() @@ -316,6 +334,7 @@ convert_to_absolute_path(FULL_RUNTIME_SOURCES ${FULL_RUNTIME_SOURCES}) convert_to_absolute_path(SERVER_GC_SOURCES ${SERVER_GC_SOURCES}) convert_to_absolute_path(STANDALONEGC_DISABLED_SOURCES ${STANDALONEGC_DISABLED_SOURCES}) convert_to_absolute_path(STANDALONEGC_ENABLED_SOURCES ${STANDALONEGC_ENABLED_SOURCES}) +convert_to_absolute_path(NATIVEAOT_PRIVATE_LIBUNWIND_SOURCES ${NATIVEAOT_PRIVATE_LIBUNWIND_SOURCES}) convert_to_absolute_path(RUNTIME_SOURCES_ARCH_ASM ${RUNTIME_SOURCES_ARCH_ASM}) convert_to_absolute_path(VXSORT_SOURCES ${VXSORT_SOURCES}) convert_to_absolute_path(DUMMY_VXSORT_SOURCES ${DUMMY_VXSORT_SOURCES}) diff --git a/src/coreclr/nativeaot/Runtime/Full/CMakeLists.txt b/src/coreclr/nativeaot/Runtime/Full/CMakeLists.txt index 1cd73bfd07823d..450414105347dd 100644 --- a/src/coreclr/nativeaot/Runtime/Full/CMakeLists.txt +++ b/src/coreclr/nativeaot/Runtime/Full/CMakeLists.txt @@ -22,11 +22,80 @@ if (CLR_CMAKE_TARGET_WIN32) endif() endif (CLR_CMAKE_TARGET_WIN32) -add_library(Runtime.WorkstationGC STATIC ${COMMON_RUNTIME_SOURCES} ${FULL_RUNTIME_SOURCES} ${RUNTIME_ARCH_ASM_OBJECTS}) +if(NATIVEAOT_PRIVATE_LIBUNWIND_SOURCES) + if(NOT CMAKE_OBJCOPY) + message(FATAL_ERROR "CMAKE_OBJCOPY is required to privatize NativeAOT libunwind symbols") + endif() + + add_library(Runtime.PrivateLibunwind OBJECT ${NATIVEAOT_PRIVATE_LIBUNWIND_SOURCES}) + + set(NATIVEAOT_PRIVATE_LIBUNWIND_OBJECT "${CMAKE_CURRENT_BINARY_DIR}/Runtime.PrivateLibunwind.o") + set(NATIVEAOT_PRIVATE_LIBUNWIND_SYMBOLS "${CMAKE_CURRENT_BINARY_DIR}/Runtime.PrivateLibunwind.localize") + set(NATIVEAOT_PRIVATE_LIBUNWIND_NM_OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/Runtime.PrivateLibunwind.nm") + set(NATIVEAOT_PRIVATE_LIBUNWIND_SYMBOLS_UNSORTED "${CMAKE_CURRENT_BINARY_DIR}/Runtime.PrivateLibunwind.localize.unsorted") + # The relocatable object includes runtime-owned objects so their references to + # libunwind implementation symbols are resolved before localization. The + # localize list is generated only from the bundled libunwind source objects. + set(NATIVEAOT_PRIVATE_LIBUNWIND_SYMBOL_OBJECTS "$,EXCLUDE,.*(UnwindHelpers|UnixNativeCodeManager)\\.cpp\\.o$>") + set(NATIVEAOT_PRIVATE_LIBUNWIND_LINKER "${CMAKE_LINKER}") + get_filename_component(NATIVEAOT_PRIVATE_LIBUNWIND_LINKER_NAME "${NATIVEAOT_PRIVATE_LIBUNWIND_LINKER}" NAME) + if(NATIVEAOT_PRIVATE_LIBUNWIND_LINKER_NAME MATCHES "^llvm-link(-[0-9.]+)?(\\.exe)?$") + set(NATIVEAOT_PRIVATE_LIBUNWIND_LINKER_VERSION "${CMAKE_MATCH_1}") + set(NATIVEAOT_PRIVATE_LIBUNWIND_LINKER_EXTENSION "${CMAKE_MATCH_2}") + get_filename_component(NATIVEAOT_PRIVATE_LIBUNWIND_TOOL_DIR "${NATIVEAOT_PRIVATE_LIBUNWIND_LINKER}" DIRECTORY) + find_program(NATIVEAOT_PRIVATE_LIBUNWIND_LD_LLD + NAMES "ld.lld${NATIVEAOT_PRIVATE_LIBUNWIND_LINKER_VERSION}${NATIVEAOT_PRIVATE_LIBUNWIND_LINKER_EXTENSION}" ld.lld + PATHS "${NATIVEAOT_PRIVATE_LIBUNWIND_TOOL_DIR}" + NO_DEFAULT_PATH) + if(NOT NATIVEAOT_PRIVATE_LIBUNWIND_LD_LLD) + message(FATAL_ERROR "ld.lld is required to privatize NativeAOT libunwind symbols") + endif() + set(NATIVEAOT_PRIVATE_LIBUNWIND_LINKER "${NATIVEAOT_PRIVATE_LIBUNWIND_LD_LLD}") + endif() + + add_custom_command( + OUTPUT "${NATIVEAOT_PRIVATE_LIBUNWIND_OBJECT}" + COMMAND "${CMAKE_COMMAND}" -E rm -f + "${NATIVEAOT_PRIVATE_LIBUNWIND_OBJECT}" + "${NATIVEAOT_PRIVATE_LIBUNWIND_NM_OUTPUT}" + "${NATIVEAOT_PRIVATE_LIBUNWIND_SYMBOLS_UNSORTED}" + # Generate the objcopy symbol list from libunwind-owned object files only. + COMMAND sh -c "nm_tool=\"$1\" && shift && \"$nm_tool\" --extern-only --defined-only \"$@\" > \"$0\"" + "${NATIVEAOT_PRIVATE_LIBUNWIND_NM_OUTPUT}" + "${CMAKE_NM}" + ${NATIVEAOT_PRIVATE_LIBUNWIND_SYMBOL_OBJECTS} + COMMAND "${CMAKE_COMMAND}" -E touch "${NATIVEAOT_PRIVATE_LIBUNWIND_SYMBOLS_UNSORTED}" + COMMAND awk -v "out=${NATIVEAOT_PRIVATE_LIBUNWIND_SYMBOLS_UNSORTED}" + "/^[0-9A-Fa-f]+[ \t]+[A-Za-z][ \t]+[^ \t]+$/ { print \$3 > out }" + "${NATIVEAOT_PRIVATE_LIBUNWIND_NM_OUTPUT}" + COMMAND sort -u -o + "${NATIVEAOT_PRIVATE_LIBUNWIND_SYMBOLS}" + "${NATIVEAOT_PRIVATE_LIBUNWIND_SYMBOLS_UNSORTED}" + COMMAND "${CMAKE_COMMAND}" -E rm -f + "${NATIVEAOT_PRIVATE_LIBUNWIND_NM_OUTPUT}" + "${NATIVEAOT_PRIVATE_LIBUNWIND_SYMBOLS_UNSORTED}" + COMMAND "${NATIVEAOT_PRIVATE_LIBUNWIND_LINKER}" -r $ -o "${NATIVEAOT_PRIVATE_LIBUNWIND_OBJECT}" + COMMAND "${CMAKE_OBJCOPY}" + "--localize-symbols=${NATIVEAOT_PRIVATE_LIBUNWIND_SYMBOLS}" + "${NATIVEAOT_PRIVATE_LIBUNWIND_OBJECT}" + DEPENDS + Runtime.PrivateLibunwind + $ + BYPRODUCTS "${NATIVEAOT_PRIVATE_LIBUNWIND_SYMBOLS}" + COMMENT "Privatizing NativeAOT libunwind symbols" + COMMAND_EXPAND_LISTS + VERBATIM + ) + set_source_files_properties("${NATIVEAOT_PRIVATE_LIBUNWIND_OBJECT}" PROPERTIES + EXTERNAL_OBJECT TRUE + GENERATED TRUE) +endif() + +add_library(Runtime.WorkstationGC STATIC ${COMMON_RUNTIME_SOURCES} ${FULL_RUNTIME_SOURCES} ${NATIVEAOT_PRIVATE_LIBUNWIND_OBJECT} ${RUNTIME_ARCH_ASM_OBJECTS}) add_dependencies(Runtime.WorkstationGC aot_eventing_headers) target_link_libraries(Runtime.WorkstationGC PRIVATE aotminipal nativeaot_cdac_contract_descriptor nativeaot_gc_wks_descriptor) -add_library(Runtime.ServerGC STATIC ${COMMON_RUNTIME_SOURCES} ${FULL_RUNTIME_SOURCES} ${SERVER_GC_SOURCES} ${RUNTIME_ARCH_ASM_OBJECTS}) +add_library(Runtime.ServerGC STATIC ${COMMON_RUNTIME_SOURCES} ${FULL_RUNTIME_SOURCES} ${NATIVEAOT_PRIVATE_LIBUNWIND_OBJECT} ${SERVER_GC_SOURCES} ${RUNTIME_ARCH_ASM_OBJECTS}) add_dependencies(Runtime.ServerGC aot_eventing_headers) target_link_libraries(Runtime.ServerGC PRIVATE aotminipal nativeaot_cdac_contract_descriptor nativeaot_gc_wks_descriptor nativeaot_gc_svr_descriptor)