mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
[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:
@@ -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
|
||||
)
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -17,7 +17,11 @@
|
||||
|
||||
#if os(Linux)
|
||||
|
||||
#if canImport(Glibc)
|
||||
import Glibc
|
||||
#elseif canImport(Musl)
|
||||
import Musl
|
||||
#endif
|
||||
|
||||
import _Backtracing
|
||||
@_spi(Internal) import _Backtracing
|
||||
|
||||
@@ -18,6 +18,8 @@
|
||||
import Darwin.C
|
||||
#elseif canImport(Glibc)
|
||||
import Glibc
|
||||
#elseif canImport(Musl)
|
||||
import Musl
|
||||
#elseif canImport(CRT)
|
||||
import CRT
|
||||
#endif
|
||||
|
||||
@@ -16,6 +16,8 @@
|
||||
import Darwin
|
||||
#elseif canImport(Glibc)
|
||||
import Glibc
|
||||
#elseif canImport(Musl)
|
||||
import Musl
|
||||
#elseif canImport(CRT)
|
||||
import CRT
|
||||
#endif
|
||||
|
||||
@@ -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>
|
||||
|
||||
|
||||
@@ -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");
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user