Skip to content

Commit 4ef98f1

Browse files
authored
Merge pull request #71847 from al45tair/eng/PR-123507656
[Backtracing] Make the backtracer work for fully-static Linux.
2 parents da779ca + f4bf278 commit 4ef98f1

File tree

8 files changed

+49
-10
lines changed

8 files changed

+49
-10
lines changed

stdlib/public/Backtracing/CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,5 +92,5 @@ add_swift_target_library(swift_Backtracing ${SWIFT_STDLIB_LIBRARY_BUILD_TYPES} I
9292
INSTALL_IN_COMPONENT stdlib
9393
MACCATALYST_BUILD_FLAVOR "zippered"
9494

95-
TARGET_SDKS OSX LINUX
95+
TARGET_SDKS OSX LINUX LINUX_STATIC
9696
)

stdlib/public/Backtracing/Context.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -708,10 +708,10 @@ extension arm_gprs {
708708
}
709709
}
710710

711-
to[31] = mctx.sp
711+
to[31] = UInt64(mctx.sp)
712712
}
713713
}
714-
gprs.pc = mctx.pc
714+
gprs.pc = UInt64(mctx.pc)
715715
gprs.valid = 0x1ffffffff
716716
}
717717

stdlib/public/libexec/swift-backtrace/CMakeLists.txt

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,13 @@
33
set(darwin)
44
set(wincrt_sdk)
55
set(glibc)
6+
set(musl)
67

78
if(SWIFT_BUILD_SDK_OVERLAY)
89
set(darwin Darwin)
910
set(wincrt_sdk CRT WinSDK)
1011
set(glibc Glibc)
12+
set(musl Musl)
1113
endif()
1214

1315
# Similarly, we only want the _Backtracing dependency if we're building
@@ -41,9 +43,10 @@ add_swift_target_executable(swift-backtrace BUILD_WITH_LIBEXEC
4143

4244
SWIFT_MODULE_DEPENDS ${backtracing}
4345

44-
SWIFT_MODULE_DEPENDS_OSX ${darwin}
45-
SWIFT_MODULE_DEPENDS_WINDOWS ${wincrt_sdk}
46-
SWIFT_MODULE_DEPENDS_LINUX ${glibc}
46+
SWIFT_MODULE_DEPENDS_OSX ${darwin}
47+
SWIFT_MODULE_DEPENDS_WINDOWS ${wincrt_sdk}
48+
SWIFT_MODULE_DEPENDS_LINUX ${glibc}
49+
SWIFT_MODULE_DEPENDS_LINUX_STATIC ${musl}
4750

4851
INSTALL_IN_COMPONENT libexec
4952
COMPILE_FLAGS
@@ -52,22 +55,30 @@ add_swift_target_executable(swift-backtrace BUILD_WITH_LIBEXEC
5255

5356
TARGET_SDKS OSX LINUX)
5457

58+
set(static_target_sdks)
5559
if(SWIFT_BUILD_STATIC_STDLIB)
60+
list(APPEND static_target_sdks "LINUX")
61+
endif()
62+
if("LINUX_STATIC" IN_LIST SWIFT_SDKS)
63+
list(APPEND static_target_sdks "LINUX_STATIC")
64+
endif()
65+
if(static_target_sdks)
5666
add_swift_target_executable(swift-backtrace-static BUILD_WITH_LIBEXEC
5767
PREFER_STATIC
5868

5969
${BACKTRACING_SOURCES}
6070

6171
SWIFT_MODULE_DEPENDS ${backtracing}
6272

63-
SWIFT_MODULE_DEPENDS_OSX ${darwin}
64-
SWIFT_MODULE_DEPENDS_WINDOWS ${wincrt_sdk}
65-
SWIFT_MODULE_DEPENDS_LINUX ${glibc}
73+
SWIFT_MODULE_DEPENDS_OSX ${darwin}
74+
SWIFT_MODULE_DEPENDS_WINDOWS ${wincrt_sdk}
75+
SWIFT_MODULE_DEPENDS_LINUX ${glibc}
76+
SWIFT_MODULE_DEPENDS_LINUX_STATIC ${musl}
6677

6778
INSTALL_IN_COMPONENT libexec
6879
COMPILE_FLAGS
6980
${BACKTRACING_COMPILE_FLAGS}
7081
-parse-as-library
7182

72-
TARGET_SDKS LINUX)
83+
TARGET_SDKS ${static_target_sdks})
7384
endif()

stdlib/public/libexec/swift-backtrace/TargetLinux.swift

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,11 @@
1717

1818
#if os(Linux)
1919

20+
#if canImport(Glibc)
2021
import Glibc
22+
#elseif canImport(Musl)
23+
import Musl
24+
#endif
2125

2226
import _Backtracing
2327
@_spi(Internal) import _Backtracing

stdlib/public/libexec/swift-backtrace/Utils.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@
1818
import Darwin.C
1919
#elseif canImport(Glibc)
2020
import Glibc
21+
#elseif canImport(Musl)
22+
import Musl
2123
#elseif canImport(CRT)
2224
import CRT
2325
#endif

stdlib/public/libexec/swift-backtrace/main.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616
import Darwin
1717
#elseif canImport(Glibc)
1818
import Glibc
19+
#elseif canImport(Musl)
20+
import Musl
1921
#elseif canImport(CRT)
2022
import CRT
2123
#endif

stdlib/public/runtime/CrashHandlerLinux.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,14 @@
1616

1717
#ifdef __linux__
1818

19+
#ifndef _GNU_SOURCE
20+
#define _GNU_SOURCE 1
21+
#endif
22+
23+
#ifndef _LARGEFILE64_SOURCE
24+
#define _LARGEFILE64_SOURCE 1
25+
#endif
26+
1927
#include <linux/capability.h>
2028
#include <linux/futex.h>
2129

stdlib/public/runtime/Paths.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -525,6 +525,18 @@ _swift_initRuntimePath(void *) {
525525
int ret = ::dladdr((void *)_swift_initRuntimePath, &dli);
526526

527527
if (!ret) {
528+
#ifdef __linux__
529+
// If we don't find anything, try reading /proc/self/exe as a fallback;
530+
// this is needed with Musl when statically linking because in that case
531+
// dladdr() does nothing.
532+
char pathBuf[4096];
533+
ssize_t len = readlink("/proc/self/exe", pathBuf, sizeof(pathBuf));
534+
if (len > 0 && len < sizeof(pathBuf)) {
535+
runtimePath = ::strdup(pathBuf);
536+
return;
537+
}
538+
#endif
539+
528540
swift::fatalError(/* flags = */ 0,
529541
"Unable to obtain Swift runtime path\n");
530542
}

0 commit comments

Comments
 (0)