Skip to content

Commit 2efd1be

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 580e618 commit 2efd1be

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
@@ -1550,8 +1550,14 @@ function(add_swift_target_library_single target name)
15501550
"${SWIFT_NATIVE_SWIFT_TOOLS_PATH}/../lib/swift/${SWIFT_SDK_${SWIFTLIB_SINGLE_SDK}_LIB_SUBDIR}")
15511551
target_link_directories(${target_static} PRIVATE
15521552
${library_search_directories})
1553+
1554+
_list_add_string_suffix(
1555+
"${SWIFTLIB_SINGLE_PRIVATE_LINK_LIBRARIES}"
1556+
"-static"
1557+
target_private_libs)
1558+
15531559
target_link_libraries("${target_static}" PRIVATE
1554-
${SWIFTLIB_SINGLE_PRIVATE_LINK_LIBRARIES})
1560+
${target_private_libs})
15551561

15561562
# Force executables linker language to be CXX so that we do not link using the
15571563
# host toolchain swiftc.
@@ -2712,6 +2718,24 @@ function(_add_swift_target_executable_single name)
27122718
set_target_properties(${name} PROPERTIES FOLDER "Swift executables")
27132719
endfunction()
27142720

2721+
# Conditionally append -static to a name, if that variant is a valid target
2722+
function(append_static name result_var_name)
2723+
cmake_parse_arguments(APPEND_TARGET
2724+
"STATIC_SWIFT_STDLIB"
2725+
""
2726+
""
2727+
${ARGN})
2728+
if(STATIC_SWIFT_STDLIB)
2729+
if(TARGET "${name}-static")
2730+
set("${result_var_name}" "${name}-static" PARENT_SCOPE)
2731+
else()
2732+
set("${result_var_name}" "${name}" PARENT_SCOPE)
2733+
endif()
2734+
else()
2735+
set("${result_var_name}" "${name}" PARENT_SCOPE)
2736+
endif()
2737+
endfunction()
2738+
27152739
# Add an executable for each target variant. Executables are given suffixes
27162740
# with the variant SDK and ARCH.
27172741
#
@@ -2720,7 +2744,8 @@ function(add_swift_target_executable name)
27202744
set(SWIFTEXE_options
27212745
EXCLUDE_FROM_ALL
27222746
BUILD_WITH_STDLIB
2723-
BUILD_WITH_LIBEXEC)
2747+
BUILD_WITH_LIBEXEC
2748+
PREFER_STATIC)
27242749
set(SWIFTEXE_single_parameter_options
27252750
INSTALL_IN_COMPONENT)
27262751
set(SWIFTEXE_multiple_parameter_options
@@ -2906,8 +2931,12 @@ function(add_swift_target_executable name)
29062931
list(APPEND swiftexe_module_dependency_targets
29072932
"swift${mod}${MODULE_VARIANT_SUFFIX}")
29082933

2909-
list(APPEND swiftexe_link_libraries_targets
2910-
"swift${mod}${VARIANT_SUFFIX}")
2934+
set(library_target "swift${mod}${VARIANT_SUFFIX}")
2935+
if(SWIFTEXE_TARGET_PREFER_STATIC AND TARGET "${library_target}-static")
2936+
set(library_target "${library_target}-static")
2937+
endif()
2938+
2939+
list(APPEND swiftexe_link_libraries_targets "${library_target}")
29112940
endforeach()
29122941

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