Skip to content

Commit 8e0325e

Browse files
committed
[Linux] Provide a statically linked swift-backtrace binary.
This adds a new binary, `swift-backtrace-static`, to the build. The runtime will not by default use this binary as the backtracer, but if you want to statically link your own binaries against the standard library you can copy `swift-backtrace-static` rather than `swift-backtrace` alongside your binary, naming it `swift-backtrace`, and the runtime should find and use it, which will mean you don't need to have `libswiftCore.so` et al installed. rdar://115278959
1 parent 4553515 commit 8e0325e

File tree

4 files changed

+127
-6
lines changed

4 files changed

+127
-6
lines changed

stdlib/cmake/modules/AddSwiftStdlib.cmake

Lines changed: 33 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1530,8 +1530,14 @@ function(add_swift_target_library_single target name)
15301530
"${SWIFT_NATIVE_SWIFT_TOOLS_PATH}/../lib/swift/${SWIFT_SDK_${SWIFTLIB_SINGLE_SDK}_LIB_SUBDIR}")
15311531
target_link_directories(${target_static} PRIVATE
15321532
${library_search_directories})
1533+
1534+
_list_add_string_suffix(
1535+
"${SWIFTLIB_SINGLE_PRIVATE_LINK_LIBRARIES}"
1536+
"-static"
1537+
target_private_libs)
1538+
15331539
target_link_libraries("${target_static}" PRIVATE
1534-
${SWIFTLIB_SINGLE_PRIVATE_LINK_LIBRARIES})
1540+
${target_private_libs})
15351541

15361542
# Force executables linker language to be CXX so that we do not link using the
15371543
# host toolchain swiftc.
@@ -2692,6 +2698,24 @@ function(_add_swift_target_executable_single name)
26922698
set_target_properties(${name} PROPERTIES FOLDER "Swift executables")
26932699
endfunction()
26942700

2701+
# Conditionally append -static to a name, if that variant is a valid target
2702+
function(append_static name result_var_name)
2703+
cmake_parse_arguments(APPEND_TARGET
2704+
"STATIC_SWIFT_STDLIB"
2705+
""
2706+
""
2707+
${ARGN})
2708+
if(STATIC_SWIFT_STDLIB)
2709+
if(TARGET "${name}-static")
2710+
set("${result_var_name}" "${name}-static" PARENT_SCOPE)
2711+
else()
2712+
set("${result_var_name}" "${name}" PARENT_SCOPE)
2713+
endif()
2714+
else()
2715+
set("${result_var_name}" "${name}" PARENT_SCOPE)
2716+
endif()
2717+
endfunction()
2718+
26952719
# Add an executable for each target variant. Executables are given suffixes
26962720
# with the variant SDK and ARCH.
26972721
#
@@ -2700,7 +2724,8 @@ function(add_swift_target_executable name)
27002724
set(SWIFTEXE_options
27012725
EXCLUDE_FROM_ALL
27022726
BUILD_WITH_STDLIB
2703-
BUILD_WITH_LIBEXEC)
2727+
BUILD_WITH_LIBEXEC
2728+
PREFER_STATIC)
27042729
set(SWIFTEXE_single_parameter_options
27052730
INSTALL_IN_COMPONENT)
27062731
set(SWIFTEXE_multiple_parameter_options
@@ -2886,8 +2911,12 @@ function(add_swift_target_executable name)
28862911
list(APPEND swiftexe_module_dependency_targets
28872912
"swift${mod}${MODULE_VARIANT_SUFFIX}")
28882913

2889-
list(APPEND swiftexe_link_libraries_targets
2890-
"swift${mod}${VARIANT_SUFFIX}")
2914+
set(library_target "swift${mod}${VARIANT_SUFFIX}")
2915+
if(SWIFTEXE_TARGET_PREFER_STATIC AND TARGET "${library_target}-static")
2916+
set(library_target "${library_target}-static")
2917+
endif()
2918+
2919+
list(APPEND swiftexe_link_libraries_targets "${library_target}")
28912920
endforeach()
28922921

28932922
# Don't add the ${arch} to the suffix. We want to link against fat

stdlib/public/Backtracing/CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ add_swift_target_library(swift_Backtracing ${SWIFT_STDLIB_LIBRARY_BUILD_TYPES} I
7878

7979
SWIFT_MODULE_DEPENDS ${concurrency}
8080

81-
LINK_LIBRARIES ${swift_backtracing_link_libraries}
81+
PRIVATE_LINK_LIBRARIES ${swift_backtracing_link_libraries}
8282

8383
SWIFT_COMPILE_FLAGS
8484
${SWIFT_STANDARD_LIBRARY_SWIFT_FLAGS}

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

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,13 +26,18 @@ set(BACKTRACING_COMPILE_FLAGS
2626
"-Xcc;-I${SWIFT_SOURCE_DIR}/include"
2727
"-Xcc;-I${CMAKE_BINARY_DIR}/include")
2828

29-
add_swift_target_executable(swift-backtrace BUILD_WITH_LIBEXEC
29+
set(BACKTRACING_SOURCES
3030
main.swift
3131
AnsiColor.swift
3232
TargetMacOS.swift
3333
TargetLinux.swift
3434
Themes.swift
3535
Utils.swift
36+
)
37+
38+
39+
add_swift_target_executable(swift-backtrace BUILD_WITH_LIBEXEC
40+
${BACKTRACING_SOURCES}
3641

3742
SWIFT_MODULE_DEPENDS ${backtracing}
3843

@@ -47,3 +52,22 @@ add_swift_target_executable(swift-backtrace BUILD_WITH_LIBEXEC
4752

4853
TARGET_SDKS OSX LINUX)
4954

55+
if(SWIFT_BUILD_STATIC_STDLIB)
56+
add_swift_target_executable(swift-backtrace-static BUILD_WITH_LIBEXEC
57+
PREFER_STATIC
58+
59+
${BACKTRACING_SOURCES}
60+
61+
SWIFT_MODULE_DEPENDS ${backtracing}
62+
63+
SWIFT_MODULE_DEPENDS_OSX ${darwin}
64+
SWIFT_MODULE_DEPENDS_WINDOWS ${wincrt_sdk}
65+
SWIFT_MODULE_DEPENDS_LINUX ${glibc}
66+
67+
INSTALL_IN_COMPONENT libexec
68+
COMPILE_FLAGS
69+
${BACKTRACING_COMPILE_FLAGS}
70+
-parse-as-library
71+
72+
TARGET_SDKS LINUX)
73+
endif()
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
// RUN: %empty-directory(%t)
2+
// RUN: %target-build-swift %s -parse-as-library %import-static-libdispatch -Onone -g -o %t/StaticBacktracer
3+
// RUN: %target-codesign %t/StaticBacktracer
4+
// RUN: /usr/bin/ldd %backtracer-static | %FileCheck %s --check-prefix LIBS
5+
// RUN: (env SWIFT_BACKTRACE=enable=yes,cache=no,swift-backtrace=%backtracer-static %target-run %t/StaticBacktracer 2>&1 || true) | %FileCheck %s
6+
7+
// UNSUPPORTED: use_os_stdlib
8+
// UNSUPPORTED: back_deployment_runtime
9+
// UNSUPPORTED: asan
10+
// REQUIRES: executable_test
11+
// REQUIRES: backtracing
12+
// REQUIRES: static_stdlib
13+
// REQUIRES: OS=linux-gnu
14+
15+
func level1() {
16+
level2()
17+
}
18+
19+
func level2() {
20+
level3()
21+
}
22+
23+
func level3() {
24+
level4()
25+
}
26+
27+
func level4() {
28+
level5()
29+
}
30+
31+
func level5() {
32+
print("About to crash")
33+
let ptr = UnsafeMutablePointer<Int>(bitPattern: 4)!
34+
ptr.pointee = 42
35+
}
36+
37+
@main
38+
struct StaticBacktracer {
39+
static func main() {
40+
level1()
41+
}
42+
}
43+
44+
// CHECK: *** Program crashed: Bad pointer dereference at 0x{{0+}}4 ***
45+
46+
// CHECK: Thread 0 {{(".*" )?}}crashed:
47+
48+
// CHECK: 0 0x{{[0-9a-f]+}} level5() + {{[0-9]+}} in StaticBacktracer at {{.*}}/StaticBacktracer.swift:34:15
49+
// CHECK-NEXT: 1 [ra] 0x{{[0-9a-f]+}} level4() + {{[0-9]+}} in StaticBacktracer at {{.*}}/StaticBacktracer.swift:28:3
50+
// CHECK-NEXT: 2 [ra] 0x{{[0-9a-f]+}} level3() + {{[0-9]+}} in StaticBacktracer at {{.*}}/StaticBacktracer.swift:24:3
51+
// CHECK-NEXT: 3 [ra] 0x{{[0-9a-f]+}} level2() + {{[0-9]+}} in StaticBacktracer at {{.*}}/StaticBacktracer.swift:20:3
52+
// CHECK-NEXT: 4 [ra] 0x{{[0-9a-f]+}} level1() + {{[0-9]+}} in StaticBacktracer at {{.*}}/StaticBacktracer.swift:16:3
53+
// CHECK-NEXT: 5 [ra] 0x{{[0-9a-f]+}} static StaticBacktracer.main() + {{[0-9]+}} in StaticBacktracer at {{.*}}/StaticBacktracer.swift:40:5
54+
// CHECK-NEXT: 6 [ra] [system] 0x{{[0-9a-f]+}} static StaticBacktracer.$main() + {{[0-9]+}} in StaticBacktracer at {{.*}}/<compiler-generated>
55+
// CHECK-NEXT: 7 [ra] 0x{{[0-9a-f]+}} main + {{[0-9]+}} in StaticBacktracer at {{.*}}/StaticBacktracer.swift
56+
57+
// CHECK: Registers:
58+
59+
// CHECK: Images ({{[0-9]+}} omitted):
60+
61+
// CHECK: {{0x[0-9a-f]+}}–{{0x[0-9a-f]+}}{{ +}}{{([0-9a-f]+|<no build ID>)}}{{ +}}StaticBacktracer{{ +}}{{.*}}/StaticBacktracer
62+
63+
// .............................................................................
64+
65+
// We mustn't have any Swift libraries dynamically linked here; that's the
66+
// entire point.
67+
68+
// LIBS-NOT: libswift{{.*}}.so

0 commit comments

Comments
 (0)