[Backtracing] Make the backtracer work for fully-static Linux.

The backtracer and its build system need a couple of changes to make
them work with the new fully-static Linux support.

rdar://123507656
This commit is contained in:
Alastair Houghton
2024-02-23 15:29:53 +00:00
parent 978169f029
commit f4bf27852f
8 changed files with 49 additions and 10 deletions

View File

@@ -92,5 +92,5 @@ add_swift_target_library(swift_Backtracing ${SWIFT_STDLIB_LIBRARY_BUILD_TYPES} I
INSTALL_IN_COMPONENT stdlib INSTALL_IN_COMPONENT stdlib
MACCATALYST_BUILD_FLAVOR "zippered" MACCATALYST_BUILD_FLAVOR "zippered"
TARGET_SDKS OSX LINUX TARGET_SDKS OSX LINUX LINUX_STATIC
) )

View File

@@ -708,10 +708,10 @@ extension arm_gprs {
} }
} }
to[31] = mctx.sp to[31] = UInt64(mctx.sp)
} }
} }
gprs.pc = mctx.pc gprs.pc = UInt64(mctx.pc)
gprs.valid = 0x1ffffffff gprs.valid = 0x1ffffffff
} }

View File

@@ -3,11 +3,13 @@
set(darwin) set(darwin)
set(wincrt_sdk) set(wincrt_sdk)
set(glibc) set(glibc)
set(musl)
if(SWIFT_BUILD_SDK_OVERLAY) if(SWIFT_BUILD_SDK_OVERLAY)
set(darwin Darwin) set(darwin Darwin)
set(wincrt_sdk CRT WinSDK) set(wincrt_sdk CRT WinSDK)
set(glibc Glibc) set(glibc Glibc)
set(musl Musl)
endif() endif()
# Similarly, we only want the _Backtracing dependency if we're building # Similarly, we only want the _Backtracing dependency if we're building
@@ -41,9 +43,10 @@ add_swift_target_executable(swift-backtrace BUILD_WITH_LIBEXEC
SWIFT_MODULE_DEPENDS ${backtracing} SWIFT_MODULE_DEPENDS ${backtracing}
SWIFT_MODULE_DEPENDS_OSX ${darwin} SWIFT_MODULE_DEPENDS_OSX ${darwin}
SWIFT_MODULE_DEPENDS_WINDOWS ${wincrt_sdk} SWIFT_MODULE_DEPENDS_WINDOWS ${wincrt_sdk}
SWIFT_MODULE_DEPENDS_LINUX ${glibc} SWIFT_MODULE_DEPENDS_LINUX ${glibc}
SWIFT_MODULE_DEPENDS_LINUX_STATIC ${musl}
INSTALL_IN_COMPONENT libexec INSTALL_IN_COMPONENT libexec
COMPILE_FLAGS COMPILE_FLAGS
@@ -52,7 +55,14 @@ add_swift_target_executable(swift-backtrace BUILD_WITH_LIBEXEC
TARGET_SDKS OSX LINUX) TARGET_SDKS OSX LINUX)
set(static_target_sdks)
if(SWIFT_BUILD_STATIC_STDLIB) if(SWIFT_BUILD_STATIC_STDLIB)
list(APPEND static_target_sdks "LINUX")
endif()
if("LINUX_STATIC" IN_LIST SWIFT_SDKS)
list(APPEND static_target_sdks "LINUX_STATIC")
endif()
if(static_target_sdks)
add_swift_target_executable(swift-backtrace-static BUILD_WITH_LIBEXEC add_swift_target_executable(swift-backtrace-static BUILD_WITH_LIBEXEC
PREFER_STATIC PREFER_STATIC
@@ -60,14 +70,15 @@ if(SWIFT_BUILD_STATIC_STDLIB)
SWIFT_MODULE_DEPENDS ${backtracing} SWIFT_MODULE_DEPENDS ${backtracing}
SWIFT_MODULE_DEPENDS_OSX ${darwin} SWIFT_MODULE_DEPENDS_OSX ${darwin}
SWIFT_MODULE_DEPENDS_WINDOWS ${wincrt_sdk} SWIFT_MODULE_DEPENDS_WINDOWS ${wincrt_sdk}
SWIFT_MODULE_DEPENDS_LINUX ${glibc} SWIFT_MODULE_DEPENDS_LINUX ${glibc}
SWIFT_MODULE_DEPENDS_LINUX_STATIC ${musl}
INSTALL_IN_COMPONENT libexec INSTALL_IN_COMPONENT libexec
COMPILE_FLAGS COMPILE_FLAGS
${BACKTRACING_COMPILE_FLAGS} ${BACKTRACING_COMPILE_FLAGS}
-parse-as-library -parse-as-library
TARGET_SDKS LINUX) TARGET_SDKS ${static_target_sdks})
endif() endif()

View File

@@ -17,7 +17,11 @@
#if os(Linux) #if os(Linux)
#if canImport(Glibc)
import Glibc import Glibc
#elseif canImport(Musl)
import Musl
#endif
import _Backtracing import _Backtracing
@_spi(Internal) import _Backtracing @_spi(Internal) import _Backtracing

View File

@@ -18,6 +18,8 @@
import Darwin.C import Darwin.C
#elseif canImport(Glibc) #elseif canImport(Glibc)
import Glibc import Glibc
#elseif canImport(Musl)
import Musl
#elseif canImport(CRT) #elseif canImport(CRT)
import CRT import CRT
#endif #endif

View File

@@ -16,6 +16,8 @@
import Darwin import Darwin
#elseif canImport(Glibc) #elseif canImport(Glibc)
import Glibc import Glibc
#elseif canImport(Musl)
import Musl
#elseif canImport(CRT) #elseif canImport(CRT)
import CRT import CRT
#endif #endif

View File

@@ -16,6 +16,14 @@
#ifdef __linux__ #ifdef __linux__
#ifndef _GNU_SOURCE
#define _GNU_SOURCE 1
#endif
#ifndef _LARGEFILE64_SOURCE
#define _LARGEFILE64_SOURCE 1
#endif
#include <linux/capability.h> #include <linux/capability.h>
#include <linux/futex.h> #include <linux/futex.h>

View File

@@ -525,6 +525,18 @@ _swift_initRuntimePath(void *) {
int ret = ::dladdr((void *)_swift_initRuntimePath, &dli); int ret = ::dladdr((void *)_swift_initRuntimePath, &dli);
if (!ret) { if (!ret) {
#ifdef __linux__
// If we don't find anything, try reading /proc/self/exe as a fallback;
// this is needed with Musl when statically linking because in that case
// dladdr() does nothing.
char pathBuf[4096];
ssize_t len = readlink("/proc/self/exe", pathBuf, sizeof(pathBuf));
if (len > 0 && len < sizeof(pathBuf)) {
runtimePath = ::strdup(pathBuf);
return;
}
#endif
swift::fatalError(/* flags = */ 0, swift::fatalError(/* flags = */ 0,
"Unable to obtain Swift runtime path\n"); "Unable to obtain Swift runtime path\n");
} }