Skip to content

Commit 2ba67d0

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 0a8d0e8 commit 2ba67d0

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
@@ -1518,8 +1518,14 @@ function(add_swift_target_library_single target name)
15181518
"${SWIFT_NATIVE_SWIFT_TOOLS_PATH}/../lib/swift/${SWIFT_SDK_${SWIFTLIB_SINGLE_SDK}_LIB_SUBDIR}")
15191519
target_link_directories(${target_static} PRIVATE
15201520
${library_search_directories})
1521+
1522+
_list_add_string_suffix(
1523+
"${SWIFTLIB_SINGLE_PRIVATE_LINK_LIBRARIES}"
1524+
"-static"
1525+
target_private_libs)
1526+
15211527
target_link_libraries("${target_static}" PRIVATE
1522-
${SWIFTLIB_SINGLE_PRIVATE_LINK_LIBRARIES})
1528+
${target_private_libs})
15231529

15241530
# Force executables linker language to be CXX so that we do not link using the
15251531
# host toolchain swiftc.
@@ -2680,6 +2686,24 @@ function(_add_swift_target_executable_single name)
26802686
set_target_properties(${name} PROPERTIES FOLDER "Swift executables")
26812687
endfunction()
26822688

2689+
# Conditionally append -static to a name, if that variant is a valid target
2690+
function(append_static name result_var_name)
2691+
cmake_parse_arguments(APPEND_TARGET
2692+
"STATIC_SWIFT_STDLIB"
2693+
""
2694+
""
2695+
${ARGN})
2696+
if(STATIC_SWIFT_STDLIB)
2697+
if(TARGET "${name}-static")
2698+
set("${result_var_name}" "${name}-static" PARENT_SCOPE)
2699+
else()
2700+
set("${result_var_name}" "${name}" PARENT_SCOPE)
2701+
endif()
2702+
else()
2703+
set("${result_var_name}" "${name}" PARENT_SCOPE)
2704+
endif()
2705+
endfunction()
2706+
26832707
# Add an executable for each target variant. Executables are given suffixes
26842708
# with the variant SDK and ARCH.
26852709
#
@@ -2688,7 +2712,8 @@ function(add_swift_target_executable name)
26882712
set(SWIFTEXE_options
26892713
EXCLUDE_FROM_ALL
26902714
BUILD_WITH_STDLIB
2691-
BUILD_WITH_LIBEXEC)
2715+
BUILD_WITH_LIBEXEC
2716+
PREFER_STATIC)
26922717
set(SWIFTEXE_single_parameter_options
26932718
INSTALL_IN_COMPONENT)
26942719
set(SWIFTEXE_multiple_parameter_options
@@ -2874,8 +2899,12 @@ function(add_swift_target_executable name)
28742899
list(APPEND swiftexe_module_dependency_targets
28752900
"swift${mod}${MODULE_VARIANT_SUFFIX}")
28762901

2877-
list(APPEND swiftexe_link_libraries_targets
2878-
"swift${mod}${VARIANT_SUFFIX}")
2902+
set(library_target "swift${mod}${VARIANT_SUFFIX}")
2903+
if(SWIFTEXE_TARGET_PREFER_STATIC AND TARGET "${library_target}-static")
2904+
set(library_target "${library_target}-static")
2905+
endif()
2906+
2907+
list(APPEND swiftexe_link_libraries_targets "${library_target}")
28792908
endforeach()
28802909

28812910
# 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)