[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
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
}

View File

@@ -3,11 +3,13 @@
set(darwin)
set(wincrt_sdk)
set(glibc)
set(musl)
if(SWIFT_BUILD_SDK_OVERLAY)
set(darwin Darwin)
set(wincrt_sdk CRT WinSDK)
set(glibc Glibc)
set(musl Musl)
endif()
# 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_OSX ${darwin}
SWIFT_MODULE_DEPENDS_WINDOWS ${wincrt_sdk}
SWIFT_MODULE_DEPENDS_LINUX ${glibc}
SWIFT_MODULE_DEPENDS_OSX ${darwin}
SWIFT_MODULE_DEPENDS_WINDOWS ${wincrt_sdk}
SWIFT_MODULE_DEPENDS_LINUX ${glibc}
SWIFT_MODULE_DEPENDS_LINUX_STATIC ${musl}
INSTALL_IN_COMPONENT libexec
COMPILE_FLAGS
@@ -52,7 +55,14 @@ add_swift_target_executable(swift-backtrace BUILD_WITH_LIBEXEC
TARGET_SDKS OSX LINUX)
set(static_target_sdks)
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
PREFER_STATIC
@@ -60,14 +70,15 @@ if(SWIFT_BUILD_STATIC_STDLIB)
SWIFT_MODULE_DEPENDS ${backtracing}
SWIFT_MODULE_DEPENDS_OSX ${darwin}
SWIFT_MODULE_DEPENDS_WINDOWS ${wincrt_sdk}
SWIFT_MODULE_DEPENDS_LINUX ${glibc}
SWIFT_MODULE_DEPENDS_OSX ${darwin}
SWIFT_MODULE_DEPENDS_WINDOWS ${wincrt_sdk}
SWIFT_MODULE_DEPENDS_LINUX ${glibc}
SWIFT_MODULE_DEPENDS_LINUX_STATIC ${musl}
INSTALL_IN_COMPONENT libexec
COMPILE_FLAGS
${BACKTRACING_COMPILE_FLAGS}
-parse-as-library
TARGET_SDKS LINUX)
TARGET_SDKS ${static_target_sdks})
endif()

View File

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

View File

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

View File

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

View File

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

View File

@@ -525,6 +525,18 @@ _swift_initRuntimePath(void *) {
int ret = ::dladdr((void *)_swift_initRuntimePath, &dli);
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,
"Unable to obtain Swift runtime path\n");
}