From 9fc5fcb0af7d068298bb1950e8d00ce26a70456c Mon Sep 17 00:00:00 2001 From: Adeel Mujahid <3840695+am11@users.noreply.github.com> Date: Wed, 21 Jun 2023 19:15:05 +0300 Subject: [PATCH] Fix ID regression in Alpine Linux builds (#86804) Co-authored-by: Jan Vorlicek --- eng/native/configureplatform.cmake | 23 ++++------------- eng/native/configuretools.cmake | 16 ++++++++++++ eng/native/init-distro-rid.sh | 7 ++++- src/coreclr/clrdefinitions.cmake | 6 ++--- src/coreclr/debug/dbgutil/CMakeLists.txt | 6 ++--- src/coreclr/debug/dbgutil/elfreader.cpp | 10 ++++---- src/coreclr/pal/src/CMakeLists.txt | 12 ++++----- src/mono/CMakeLists.txt | 30 ---------------------- .../System.Globalization.Native/CMakeLists.txt | 2 +- .../CMakeLists.txt | 2 +- 10 files changed, 46 insertions(+), 68 deletions(-) diff --git a/eng/native/configureplatform.cmake b/eng/native/configureplatform.cmake index 2d6e142..2f6ca03 100644 --- a/eng/native/configureplatform.cmake +++ b/eng/native/configureplatform.cmake @@ -75,11 +75,6 @@ if(CLR_CMAKE_HOST_OS STREQUAL linux) COMMAND bash -c "source ${LINUX_ID_FILE} && echo \$ID" OUTPUT_VARIABLE CLR_CMAKE_LINUX_ID OUTPUT_STRIP_TRAILING_WHITESPACE) - - execute_process( - COMMAND bash -c "if strings \"${CMAKE_SYSROOT}/usr/bin/ldd\" 2>&1 | grep -q musl; then echo musl; fi" - OUTPUT_VARIABLE CLR_CMAKE_LINUX_MUSL - OUTPUT_STRIP_TRAILING_WHITESPACE) endif() if(DEFINED CLR_CMAKE_LINUX_ID) @@ -87,12 +82,8 @@ if(CLR_CMAKE_HOST_OS STREQUAL linux) set(CLR_CMAKE_TARGET_TIZEN_LINUX 1) set(CLR_CMAKE_HOST_OS ${CLR_CMAKE_LINUX_ID}) elseif(CLR_CMAKE_LINUX_ID STREQUAL alpine) - set(CLR_CMAKE_HOST_ALPINE_LINUX 1) - set(CLR_CMAKE_HOST_OS ${CLR_CMAKE_LINUX_ID}) - endif() - - if(CLR_CMAKE_LINUX_MUSL STREQUAL musl) set(CLR_CMAKE_HOST_LINUX_MUSL 1) + set(CLR_CMAKE_HOST_OS ${CLR_CMAKE_LINUX_ID}) endif() endif(DEFINED CLR_CMAKE_LINUX_ID) endif(CLR_CMAKE_HOST_OS STREQUAL linux) @@ -359,21 +350,17 @@ if(CLR_CMAKE_TARGET_OS STREQUAL linux) set(CLR_CMAKE_TARGET_LINUX 1) endif(CLR_CMAKE_TARGET_OS STREQUAL linux) -if(CLR_CMAKE_HOST_LINUX_MUSL) - set(CLR_CMAKE_TARGET_LINUX_MUSL 1) -endif(CLR_CMAKE_HOST_LINUX_MUSL) - if(CLR_CMAKE_TARGET_OS STREQUAL tizen) set(CLR_CMAKE_TARGET_UNIX 1) set(CLR_CMAKE_TARGET_LINUX 1) set(CLR_CMAKE_TARGET_TIZEN_LINUX 1) endif(CLR_CMAKE_TARGET_OS STREQUAL tizen) -if(CLR_CMAKE_TARGET_OS STREQUAL alpine) +if(CLR_CMAKE_HOST_LINUX_MUSL OR CLR_CMAKE_TARGET_OS STREQUAL alpine) set(CLR_CMAKE_TARGET_UNIX 1) set(CLR_CMAKE_TARGET_LINUX 1) - set(CLR_CMAKE_TARGET_ALPINE_LINUX 1) -endif(CLR_CMAKE_TARGET_OS STREQUAL alpine) + set(CLR_CMAKE_TARGET_LINUX_MUSL 1) +endif(CLR_CMAKE_HOST_LINUX_MUSL OR CLR_CMAKE_TARGET_OS STREQUAL alpine) if(CLR_CMAKE_TARGET_OS STREQUAL android) set(CLR_CMAKE_TARGET_UNIX 1) @@ -483,7 +470,7 @@ if (NOT (CLR_CMAKE_TARGET_OS STREQUAL CLR_CMAKE_HOST_OS) AND NOT CLR_CMAKE_TARGE if(NOT (CLR_CMAKE_HOST_OS STREQUAL windows)) message(FATAL_ERROR "Invalid host and target os/arch combination. Host OS: ${CLR_CMAKE_HOST_OS}") endif() - if(NOT (CLR_CMAKE_TARGET_LINUX OR CLR_CMAKE_TARGET_ALPINE_LINUX)) + if(NOT (CLR_CMAKE_TARGET_LINUX OR CLR_CMAKE_TARGET_LINUX_MUSL)) message(FATAL_ERROR "Invalid host and target os/arch combination. Target OS: ${CLR_CMAKE_TARGET_OS}") endif() if(NOT ((CLR_CMAKE_HOST_ARCH_AMD64 AND (CLR_CMAKE_TARGET_ARCH_AMD64 OR CLR_CMAKE_TARGET_ARCH_ARM64)) OR (CLR_CMAKE_HOST_ARCH_I386 AND CLR_CMAKE_TARGET_ARCH_ARM))) diff --git a/eng/native/configuretools.cmake b/eng/native/configuretools.cmake index f42eef1..6b23f2b 100644 --- a/eng/native/configuretools.cmake +++ b/eng/native/configuretools.cmake @@ -46,6 +46,7 @@ if(NOT WIN32 AND NOT CLR_CMAKE_TARGET_BROWSER AND NOT CLR_CMAKE_TARGET_WASI) locate_toolchain_exec(ar CMAKE_AR YES) locate_toolchain_exec(nm CMAKE_NM YES) locate_toolchain_exec(ranlib CMAKE_RANLIB YES) + locate_toolchain_exec(strings CMAKE_STRINGS YES) if(CMAKE_C_COMPILER_ID MATCHES "Clang") locate_toolchain_exec(link CMAKE_LINKER YES) @@ -91,3 +92,18 @@ if (NOT CLR_CMAKE_HOST_WIN32) set(LD_OSX 1) endif() endif() + +# This introspection depends on CMAKE_STRINGS, which is why it's in this file instead of configureplatform +if (CLR_CMAKE_HOST_LINUX) + execute_process( + COMMAND bash -c "if ${CMAKE_STRINGS} \"${CMAKE_SYSROOT}/usr/bin/ldd\" 2>&1 | grep -q musl; then echo musl; fi" + OUTPUT_VARIABLE CLR_CMAKE_LINUX_MUSL + OUTPUT_STRIP_TRAILING_WHITESPACE) + + if(CLR_CMAKE_LINUX_MUSL STREQUAL musl) + set(CLR_CMAKE_HOST_LINUX_MUSL 1) + set(CLR_CMAKE_TARGET_UNIX 1) + set(CLR_CMAKE_TARGET_LINUX 1) + set(CLR_CMAKE_TARGET_LINUX_MUSL 1) + endif() +endif() diff --git a/eng/native/init-distro-rid.sh b/eng/native/init-distro-rid.sh index db0e2a5..aba9fe2 100644 --- a/eng/native/init-distro-rid.sh +++ b/eng/native/init-distro-rid.sh @@ -116,9 +116,14 @@ initDistroRidGlobal() if [ -z "${__PortableTargetOS:-}" ]; then __PortableTargetOS="$targetOs" + STRINGS="$(command -v strings || true)" + if [ -z "$STRINGS" ]; then + STRINGS="$(command -v llvm-strings || true)" + fi + # Check for musl-based distros (e.g Alpine Linux, Void Linux). if "${rootfsDir}/usr/bin/ldd" --version 2>&1 | grep -q musl || - strings "${rootfsDir}/usr/bin/ldd" 2>&1 | grep -q musl; then + ( [ -n "$STRINGS" ] && "$STRINGS" "${rootfsDir}/usr/bin/ldd" 2>&1 | grep -q musl ); then __PortableTargetOS="linux-musl" fi fi diff --git a/src/coreclr/clrdefinitions.cmake b/src/coreclr/clrdefinitions.cmake index 172d68e..1d9ea0e 100644 --- a/src/coreclr/clrdefinitions.cmake +++ b/src/coreclr/clrdefinitions.cmake @@ -33,11 +33,11 @@ if (CLR_CMAKE_TARGET_APPLE AND CLR_CMAKE_TARGET_ARCH_ARM64) add_compile_definitions($<$>>:OSX_ARM64_ABI>) endif(CLR_CMAKE_TARGET_APPLE AND CLR_CMAKE_TARGET_ARCH_ARM64) -if(CLR_CMAKE_TARGET_ALPINE_LINUX) - # Alpine Linux doesn't have fixed stack limit, this define disables some stack pointer +if(CLR_CMAKE_TARGET_LINUX_MUSL) + # musl-libc doesn't have fixed stack limit, this define disables some stack pointer # sanity checks in debug / checked build that rely on a fixed stack limit add_definitions(-DNO_FIXED_STACK_LIMIT) -endif(CLR_CMAKE_TARGET_ALPINE_LINUX) +endif(CLR_CMAKE_TARGET_LINUX_MUSL) add_definitions(-D_BLD_CLR) add_definitions(-DDEBUGGING_SUPPORTED) diff --git a/src/coreclr/debug/dbgutil/CMakeLists.txt b/src/coreclr/debug/dbgutil/CMakeLists.txt index 91f4140..100a399 100644 --- a/src/coreclr/debug/dbgutil/CMakeLists.txt +++ b/src/coreclr/debug/dbgutil/CMakeLists.txt @@ -11,9 +11,9 @@ endif(CLR_CMAKE_HOST_WIN32 OR CLR_CMAKE_HOST_OSX) add_definitions(-DPAL_STDCPP_COMPAT) -if(CLR_CMAKE_TARGET_ALPINE_LINUX) - add_definitions(-DTARGET_ALPINE_LINUX) -endif(CLR_CMAKE_TARGET_ALPINE_LINUX) +if(CLR_CMAKE_TARGET_LINUX_MUSL) + add_definitions(-DTARGET_LINUX_MUSL) +endif(CLR_CMAKE_TARGET_LINUX_MUSL) set(DBGUTIL_SOURCES dbgutil.cpp diff --git a/src/coreclr/debug/dbgutil/elfreader.cpp b/src/coreclr/debug/dbgutil/elfreader.cpp index 51b64e2..8df8a4b 100644 --- a/src/coreclr/debug/dbgutil/elfreader.cpp +++ b/src/coreclr/debug/dbgutil/elfreader.cpp @@ -115,11 +115,11 @@ ElfReader::PopulateForSymbolLookup(uint64_t baseAddress) // Enumerate program headers searching for the PT_DYNAMIC header, etc. if (!EnumerateProgramHeaders( baseAddress, -#ifdef TARGET_ALPINE_LINUX - // On Alpine, the below dynamic entries for hash, string table, etc. are - // RVAs instead of absolute address like on all other Linux distros. Get - // the "loadbias" (basically the base address of the module) and add to - // these RVAs. +#ifdef TARGET_LINUX_MUSL + // On musl based platforms (Alpine), the below dynamic entries for hash, + // string table, etc. are RVAs instead of absolute address like on all + // other Linux distros. Get the "loadbias" (basically the base address + // of the module) and add to these RVAs. &loadbias, #else nullptr, diff --git a/src/coreclr/pal/src/CMakeLists.txt b/src/coreclr/pal/src/CMakeLists.txt index bd5a6bd..4ec2c2b 100644 --- a/src/coreclr/pal/src/CMakeLists.txt +++ b/src/coreclr/pal/src/CMakeLists.txt @@ -86,18 +86,18 @@ add_definitions(-DLP64COMPATIBLE) add_definitions(-DCORECLR) add_definitions(-DPIC) -if(CLR_CMAKE_HOST_ARCH_AMD64 AND CLR_CMAKE_TARGET_LINUX AND NOT CLR_CMAKE_HOST_ALPINE_LINUX) +if(CLR_CMAKE_HOST_ARCH_AMD64 AND CLR_CMAKE_TARGET_LINUX AND NOT CLR_CMAKE_TARGET_LINUX_MUSL) # Currently the _xstate is not available on Alpine Linux add_definitions(-DXSTATE_SUPPORTED) -endif(CLR_CMAKE_HOST_ARCH_AMD64 AND CLR_CMAKE_TARGET_LINUX AND NOT CLR_CMAKE_HOST_ALPINE_LINUX) +endif(CLR_CMAKE_HOST_ARCH_AMD64 AND CLR_CMAKE_TARGET_LINUX AND NOT CLR_CMAKE_TARGET_LINUX_MUSL) -if(CLR_CMAKE_HOST_ALPINE_LINUX) +if(CLR_CMAKE_TARGET_LINUX_MUSL) # Setting RLIMIT_NOFILE breaks debugging of coreclr on Alpine Linux for some reason add_definitions(-DDONT_SET_RLIMIT_NOFILE) # On Alpine Linux, we need to ensure that the reported stack range for the primary thread is # larger than the initial committed stack size. add_definitions(-DENSURE_PRIMARY_STACK_SIZE) -endif(CLR_CMAKE_HOST_ALPINE_LINUX) +endif(CLR_CMAKE_TARGET_LINUX_MUSL) # turn off capability to remove unused functions (which was enabled in debug build with sanitizers) set(CMAKE_SHARED_LINKER_FLAGS_DEBUG "${CMAKE_SHARED_LINKER_FLAGS_DEBUG} -Wl,--no-gc-sections") @@ -316,9 +316,9 @@ if(CLR_CMAKE_TARGET_LINUX) endif(CLR_CMAKE_USE_SYSTEM_LIBUNWIND) # bundled libunwind requires using libucontext on alpine and x86 and ppc64le - if(CLR_CMAKE_TARGET_ALPINE_LINUX AND (CLR_CMAKE_TARGET_ARCH_I386 OR CLR_CMAKE_TARGET_ARCH_POWERPC64)) + if(CLR_CMAKE_TARGET_LINUX_MUSL AND (CLR_CMAKE_TARGET_ARCH_I386 OR CLR_CMAKE_TARGET_ARCH_POWERPC64)) target_link_libraries(coreclrpal PUBLIC ucontext) - endif(CLR_CMAKE_TARGET_ALPINE_LINUX AND (CLR_CMAKE_TARGET_ARCH_I386 OR CLR_CMAKE_TARGET_ARCH_POWERPC64)) + endif(CLR_CMAKE_TARGET_LINUX_MUSL AND (CLR_CMAKE_TARGET_ARCH_I386 OR CLR_CMAKE_TARGET_ARCH_POWERPC64)) endif(CLR_CMAKE_TARGET_LINUX) diff --git a/src/mono/CMakeLists.txt b/src/mono/CMakeLists.txt index bc65886..b1b90b8 100644 --- a/src/mono/CMakeLists.txt +++ b/src/mono/CMakeLists.txt @@ -218,36 +218,6 @@ elseif(CLR_CMAKE_HOST_OS STREQUAL "linux") # Enable the "full RELRO" options (RELRO & BIND_NOW) at link time add_link_options(-Wl,-z,relro) add_link_options(-Wl,-z,now) - - # Detect Linux ID - # TODO: Eventually merge with eng/native/configureplatform.cmake - set(LINUX_ID_FILE "/etc/os-release") - if(CMAKE_CROSSCOMPILING) - set(LINUX_ID_FILE "${CMAKE_SYSROOT}${LINUX_ID_FILE}") - endif() - - if(EXISTS ${LINUX_ID_FILE}) - execute_process( - COMMAND bash -c "source ${LINUX_ID_FILE} && echo \$ID" - OUTPUT_VARIABLE CLR_CMAKE_LINUX_ID - OUTPUT_STRIP_TRAILING_WHITESPACE) - - execute_process( - COMMAND bash -c "if strings \"${CMAKE_SYSROOT}/usr/bin/ldd\" 2>&1 | grep -q musl; then echo musl; fi" - OUTPUT_VARIABLE CLR_CMAKE_LINUX_MUSL - OUTPUT_STRIP_TRAILING_WHITESPACE) - endif() - - if(DEFINED CLR_CMAKE_LINUX_ID) - if(CLR_CMAKE_LINUX_ID STREQUAL alpine) - set(CLR_CMAKE_HOST_ALPINE_LINUX 1) - set(CLR_CMAKE_HOST_OS ${CLR_CMAKE_LINUX_ID}) - endif() - - if(CLR_CMAKE_LINUX_MUSL STREQUAL musl) - set(CLR_CMAKE_HOST_LINUX_MUSL 1) - endif() - endif(DEFINED CLR_CMAKE_LINUX_ID) elseif(CLR_CMAKE_HOST_OS STREQUAL "android") set(HOST_LINUX 1) add_definitions(-D_GNU_SOURCE -D_REENTRANT) diff --git a/src/native/libs/System.Globalization.Native/CMakeLists.txt b/src/native/libs/System.Globalization.Native/CMakeLists.txt index eee9dff..8f528be 100644 --- a/src/native/libs/System.Globalization.Native/CMakeLists.txt +++ b/src/native/libs/System.Globalization.Native/CMakeLists.txt @@ -140,7 +140,7 @@ endif() install (TARGETS System.Globalization.Native-Static DESTINATION ${STATIC_LIB_DESTINATION} COMPONENT libs) -if(NOT CLR_CMAKE_TARGET_APPLE AND NOT CLR_CMAKE_TARGET_ANDROID AND NOT CLR_CMAKE_TARGET_ALPINE_LINUX) +if(NOT CLR_CMAKE_TARGET_APPLE AND NOT CLR_CMAKE_TARGET_ANDROID AND NOT CLR_CMAKE_TARGET_LINUX_MUSL) if (GEN_SHARED_LIB) add_custom_command(TARGET System.Globalization.Native POST_BUILD COMMENT "Verifying System.Globalization.Native.so dependencies" diff --git a/src/native/libs/System.Security.Cryptography.Native/CMakeLists.txt b/src/native/libs/System.Security.Cryptography.Native/CMakeLists.txt index 8eb0b88..f990162 100644 --- a/src/native/libs/System.Security.Cryptography.Native/CMakeLists.txt +++ b/src/native/libs/System.Security.Cryptography.Native/CMakeLists.txt @@ -103,7 +103,7 @@ if (GEN_SHARED_LIB) # # on Linux, the build will succeed with undefined symbols, then the script reports them # and fails the build for us. - if (NOT APPLE AND NOT CLR_CMAKE_TARGET_ALPINE_LINUX) + if (NOT APPLE AND NOT CLR_CMAKE_TARGET_LINUX_MUSL) add_custom_command(TARGET System.Security.Cryptography.Native.OpenSsl POST_BUILD COMMENT "Verifying System.Security.Cryptography.Native.OpenSsl.so dependencies" COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/../verify-so.sh -- 2.7.4