Skip to content

Commit 5939dbd

Browse files
committed
[SR-648] Add option to create statically linked binaries
- Add ImageInspectionStatic.cpp to lookup protocol conformance and metadata sections in static binaries - For Linux, build libswiftImageInspectionShared.a and libswiftImageInspectionStatic.a for linking with libswiftCore.a. This allows static binaries to be built without linking to libdl. libswiftImageInspectionShared (ImageInspectionELF.cpp) is automatically compiled into libswiftCore.so - Adds -static-executable option to swiftc to use along with -emit-executable that uses linker arguments in static-executable-args.lnk. This also requires a libicu to be compiled using the --libicu which has configure options that dont require libdl for accessing ICU datafiles - Static binaries only work on Linux at this time
1 parent 742c658 commit 5939dbd

File tree

9 files changed

+179
-15
lines changed

9 files changed

+179
-15
lines changed

cmake/modules/AddSwift.cmake

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -567,7 +567,7 @@ function(_add_swift_library_single target name)
567567
cmake_parse_arguments(SWIFTLIB_SINGLE
568568
"${SWIFTLIB_SINGLE_options}"
569569
"MODULE_TARGET;SDK;ARCHITECTURE;INSTALL_IN_COMPONENT;DEPLOYMENT_VERSION_OSX;DEPLOYMENT_VERSION_IOS;DEPLOYMENT_VERSION_TVOS;DEPLOYMENT_VERSION_WATCHOS"
570-
"DEPENDS;LINK_LIBRARIES;FRAMEWORK_DEPENDS;FRAMEWORK_DEPENDS_WEAK;LLVM_COMPONENT_DEPENDS;C_COMPILE_FLAGS;SWIFT_COMPILE_FLAGS;LINK_FLAGS;PRIVATE_LINK_LIBRARIES;INTERFACE_LINK_LIBRARIES;INCORPORATE_OBJECT_LIBRARIES;FILE_DEPENDS"
570+
"DEPENDS;LINK_LIBRARIES;FRAMEWORK_DEPENDS;FRAMEWORK_DEPENDS_WEAK;LLVM_COMPONENT_DEPENDS;C_COMPILE_FLAGS;SWIFT_COMPILE_FLAGS;LINK_FLAGS;PRIVATE_LINK_LIBRARIES;INTERFACE_LINK_LIBRARIES;INCORPORATE_OBJECT_LIBRARIES;INCORPORATE_OBJECT_LIBRARIES_SHARED_ONLY;FILE_DEPENDS"
571571
${ARGN})
572572

573573
set(SWIFTLIB_SINGLE_SOURCES ${SWIFTLIB_SINGLE_UNPARSED_ARGUMENTS})
@@ -739,6 +739,12 @@ function(_add_swift_library_single target name)
739739
$<TARGET_OBJECTS:${object_library}${VARIANT_SUFFIX}>)
740740
endforeach()
741741

742+
set(SWIFTLIB_INCORPORATED_OBJECT_LIBRARIES_EXPRESSIONS_SHARED_ONLY)
743+
foreach(object_library ${SWIFTLIB_SINGLE_INCORPORATE_OBJECT_LIBRARIES_SHARED_ONLY})
744+
list(APPEND SWIFTLIB_INCORPORATED_OBJECT_LIBRARIES_EXPRESSIONS_SHARED_ONLY
745+
$<TARGET_OBJECTS:${object_library}${VARIANT_SUFFIX}>)
746+
endforeach()
747+
742748
set(SWIFTLIB_SINGLE_XCODE_WORKAROUND_SOURCES)
743749
if(XCODE AND SWIFTLIB_SINGLE_TARGET_LIBRARY)
744750
set(SWIFTLIB_SINGLE_XCODE_WORKAROUND_SOURCES
@@ -747,11 +753,17 @@ function(_add_swift_library_single target name)
747753
${SWIFT_SOURCE_DIR}/cmake/dummy.cpp)
748754
endif()
749755

756+
set(INCORPORATED_OBJECT_LIBRARIES_EXPRESSIONS ${SWIFTLIB_INCORPORATED_OBJECT_LIBRARIES_EXPRESSIONS})
757+
if(${libkind} STREQUAL "SHARED")
758+
list(APPEND INCORPORATED_OBJECT_LIBRARIES_EXPRESSIONS
759+
${SWIFTLIB_INCORPORATED_OBJECT_LIBRARIES_EXPRESSIONS_SHARED_ONLY})
760+
endif()
761+
750762
add_library("${target}" ${libkind}
751763
${SWIFT_SECTIONS_OBJECT_BEGIN}
752764
${SWIFTLIB_SINGLE_SOURCES}
753765
${SWIFTLIB_SINGLE_EXTERNAL_SOURCES}
754-
${SWIFTLIB_INCORPORATED_OBJECT_LIBRARIES_EXPRESSIONS}
766+
${INCORPORATED_OBJECT_LIBRARIES_EXPRESSIONS}
755767
${SWIFTLIB_SINGLE_XCODE_WORKAROUND_SOURCES}
756768
${SWIFT_SECTIONS_OBJECT_END})
757769
_set_target_prefix_and_suffix("${target}" "${libkind}" "${SWIFTLIB_SINGLE_SDK}")
@@ -1270,7 +1282,7 @@ function(add_swift_library name)
12701282
cmake_parse_arguments(SWIFTLIB
12711283
"${SWIFTLIB_options}"
12721284
"INSTALL_IN_COMPONENT;DEPLOYMENT_VERSION_OSX;DEPLOYMENT_VERSION_IOS;DEPLOYMENT_VERSION_TVOS;DEPLOYMENT_VERSION_WATCHOS"
1273-
"DEPENDS;LINK_LIBRARIES;SWIFT_MODULE_DEPENDS;SWIFT_MODULE_DEPENDS_OSX;SWIFT_MODULE_DEPENDS_IOS;SWIFT_MODULE_DEPENDS_TVOS;SWIFT_MODULE_DEPENDS_WATCHOS;SWIFT_MODULE_DEPENDS_FREEBSD;SWIFT_MODULE_DEPENDS_LINUX;FRAMEWORK_DEPENDS;FRAMEWORK_DEPENDS_WEAK;FRAMEWORK_DEPENDS_OSX;FRAMEWORK_DEPENDS_IOS_TVOS;LLVM_COMPONENT_DEPENDS;FILE_DEPENDS;TARGET_SDKS;C_COMPILE_FLAGS;SWIFT_COMPILE_FLAGS;SWIFT_COMPILE_FLAGS_OSX;SWIFT_COMPILE_FLAGS_IOS;SWIFT_COMPILE_FLAGS_TVOS;SWIFT_COMPILE_FLAGS_WATCHOS;LINK_FLAGS;PRIVATE_LINK_LIBRARIES;INTERFACE_LINK_LIBRARIES;INCORPORATE_OBJECT_LIBRARIES"
1285+
"DEPENDS;LINK_LIBRARIES;SWIFT_MODULE_DEPENDS;SWIFT_MODULE_DEPENDS_OSX;SWIFT_MODULE_DEPENDS_IOS;SWIFT_MODULE_DEPENDS_TVOS;SWIFT_MODULE_DEPENDS_WATCHOS;SWIFT_MODULE_DEPENDS_FREEBSD;SWIFT_MODULE_DEPENDS_LINUX;FRAMEWORK_DEPENDS;FRAMEWORK_DEPENDS_WEAK;FRAMEWORK_DEPENDS_OSX;FRAMEWORK_DEPENDS_IOS_TVOS;LLVM_COMPONENT_DEPENDS;FILE_DEPENDS;TARGET_SDKS;C_COMPILE_FLAGS;SWIFT_COMPILE_FLAGS;SWIFT_COMPILE_FLAGS_OSX;SWIFT_COMPILE_FLAGS_IOS;SWIFT_COMPILE_FLAGS_TVOS;SWIFT_COMPILE_FLAGS_WATCHOS;LINK_FLAGS;PRIVATE_LINK_LIBRARIES;INTERFACE_LINK_LIBRARIES;INCORPORATE_OBJECT_LIBRARIES;INCORPORATE_OBJECT_LIBRARIES_SHARED_ONLY"
12741286
${ARGN})
12751287
set(SWIFTLIB_SOURCES ${SWIFTLIB_UNPARSED_ARGUMENTS})
12761288

@@ -1491,6 +1503,7 @@ function(add_swift_library name)
14911503
LINK_FLAGS ${SWIFTLIB_LINK_FLAGS}
14921504
PRIVATE_LINK_LIBRARIES ${swiftlib_private_link_libraries_targets}
14931505
INCORPORATE_OBJECT_LIBRARIES ${SWIFTLIB_INCORPORATE_OBJECT_LIBRARIES}
1506+
INCORPORATE_OBJECT_LIBRARIES_SHARED_ONLY ${SWIFTLIB_INCORPORATE_OBJECT_LIBRARIES_SHARED_ONLY}
14941507
${SWIFTLIB_DONT_EMBED_BITCODE_keyword}
14951508
${SWIFTLIB_API_NOTES_NON_OVERLAY_keyword}
14961509
${SWIFTLIB_IS_STDLIB_keyword}
@@ -1682,6 +1695,7 @@ function(add_swift_library name)
16821695
PRIVATE_LINK_LIBRARIES ${SWIFTLIB_PRIVATE_LINK_LIBRARIES}
16831696
INTERFACE_LINK_LIBRARIES ${SWIFTLIB_INTERFACE_LINK_LIBRARIES}
16841697
INCORPORATE_OBJECT_LIBRARIES ${SWIFTLIB_INCORPORATE_OBJECT_LIBRARIES}
1698+
INCORPORATE_OBJECT_LIBRARIES_SHARED_ONLY ${SWIFTLIB_INCORPORATE_OBJECT_LIBRARIES_SHARED_ONLY}
16851699
${SWIFTLIB_DONT_EMBED_BITCODE_keyword}
16861700
${SWIFTLIB_API_NOTES_NON_OVERLAY_keyword}
16871701
${SWIFTLIB_IS_STDLIB_keyword}

include/swift/Option/Options.td

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -282,6 +282,12 @@ def no_static_stdlib: Flag<["-"], "no-static-stdlib">,
282282
Flags<[HelpHidden]>,
283283
HelpText<"Don't statically link the Swift standard library">;
284284

285+
def static_executable : Flag<["-"], "static-executable">,
286+
HelpText<"Statically link the executable">;
287+
def no_static_executable : Flag<["-"], "no-static-executable">,
288+
Flags<[HelpHidden]>,
289+
HelpText<"Don't statically link the executable">;
290+
285291
def use_ld : Joined<["-"], "use-ld=">,
286292
Flags<[DoesNotAffectIncrementalBuild]>,
287293
HelpText<"Specifies the linker to be used">;

lib/Driver/ToolChains.cpp

Lines changed: 27 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -949,6 +949,12 @@ toolchains::Darwin::constructInvocation(const LinkJobAction &job,
949949
assert(context.Output.getPrimaryOutputType() == types::TY_Image &&
950950
"Invalid linker output type.");
951951

952+
if (context.Args.hasFlag(options::OPT_static_executable,
953+
options::OPT_no_static_executable,
954+
false)) {
955+
llvm::report_fatal_error("-static-executable is not supported on Darwin");
956+
}
957+
952958
const Driver &D = getDriver();
953959
const llvm::Triple &Triple = getTriple();
954960

@@ -1354,9 +1360,26 @@ toolchains::GenericUnix::constructInvocation(const LinkJobAction &job,
13541360

13551361
// Link the standard library.
13561362
Arguments.push_back("-L");
1357-
if (context.Args.hasFlag(options::OPT_static_stdlib,
1358-
options::OPT_no_static_stdlib,
1359-
false)) {
1363+
if (context.Args.hasFlag(options::OPT_static_executable,
1364+
options::OPT_no_static_executable,
1365+
false)) {
1366+
SmallString<128> StaticRuntimeLibPath;
1367+
getRuntimeStaticLibraryPath(StaticRuntimeLibPath, context.Args, *this);
1368+
Arguments.push_back(context.Args.MakeArgString(StaticRuntimeLibPath));
1369+
1370+
SmallString<128> linkFilePath = StaticRuntimeLibPath;
1371+
llvm::sys::path::append(linkFilePath, "static-executable-args.lnk");
1372+
auto linkFile = linkFilePath.str();
1373+
1374+
if (llvm::sys::fs::is_regular_file(linkFile)) {
1375+
Arguments.push_back(context.Args.MakeArgString(Twine("@") + linkFile));
1376+
} else {
1377+
llvm::report_fatal_error("-static-executable not supported on this platform");
1378+
}
1379+
}
1380+
else if (context.Args.hasFlag(options::OPT_static_stdlib,
1381+
options::OPT_no_static_stdlib,
1382+
false)) {
13601383
SmallString<128> StaticRuntimeLibPath;
13611384
getRuntimeStaticLibraryPath(StaticRuntimeLibPath, context.Args, *this);
13621385
Arguments.push_back(context.Args.MakeArgString(StaticRuntimeLibPath));
@@ -1381,6 +1404,7 @@ toolchains::GenericUnix::constructInvocation(const LinkJobAction &job,
13811404
}
13821405
else {
13831406
Arguments.push_back(context.Args.MakeArgString(RuntimeLibPath));
1407+
Arguments.push_back("-lswiftCore");
13841408
}
13851409

13861410

@@ -1401,8 +1425,6 @@ toolchains::GenericUnix::constructInvocation(const LinkJobAction &job,
14011425
Twine("-u", llvm::getInstrProfRuntimeHookVarName())));
14021426
}
14031427

1404-
// Always add the stdlib
1405-
Arguments.push_back("-lswiftCore");
14061428

14071429
// Add any autolinking scripts to the arguments
14081430
for (const Job *Cmd : context.Inputs) {

stdlib/public/core/CMakeLists.txt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -213,6 +213,12 @@ if(SWIFT_CHECK_ESSENTIAL_STDLIB)
213213
target_link_libraries(swift_stdlib_essential ${RUNTIME_DEPENDENCY})
214214
endif()
215215

216+
217+
set(shared_only_libs)
218+
if(SWIFT_BUILD_STATIC_STDLIB AND "${SWIFT_HOST_VARIANT_SDK}" STREQUAL "LINUX")
219+
list(APPEND shared_only_libs swiftImageInspectionShared)
220+
endif()
221+
216222
add_swift_library(swiftCore ${SWIFT_STDLIB_LIBRARY_BUILD_TYPES} IS_STDLIB IS_STDLIB_CORE
217223
${SWIFTLIB_SOURCES}
218224
# The copy_shim_headers target dependency is required to let the
@@ -228,5 +234,6 @@ add_swift_library(swiftCore ${SWIFT_STDLIB_LIBRARY_BUILD_TYPES} IS_STDLIB IS_STD
228234
LINK_FLAGS ${swift_core_link_flags}
229235
PRIVATE_LINK_LIBRARIES ${swift_core_private_link_libraries}
230236
INCORPORATE_OBJECT_LIBRARIES swiftRuntime swiftStdlibStubs
237+
INCORPORATE_OBJECT_LIBRARIES_SHARED_ONLY ${shared_only_libs}
231238
FRAMEWORK_DEPENDS ${swift_core_framework_depends}
232239
INSTALL_IN_COMPONENT stdlib)

stdlib/public/runtime/CMakeLists.txt

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,13 +62,57 @@ set(LLVM_OPTIONAL_SOURCES
6262
MutexPThread.cpp
6363
MutexWin32.cpp
6464
CygwinPort.cpp
65+
ImageInspectionELF.cpp
66+
ImageInspectionStatic.cpp
6567
${swift_runtime_sources}
6668
${swift_runtime_objc_sources}
6769
${swift_runtime_leaks_sources})
6870

6971
set(swift_runtime_library_compile_flags ${swift_runtime_compile_flags})
7072
list(APPEND swift_runtime_library_compile_flags -DswiftCore_EXPORTS)
7173

74+
set(sdk "${SWIFT_HOST_VARIANT_SDK}")
75+
if(SWIFT_BUILD_STATIC_STDLIB AND "${sdk}" STREQUAL "LINUX")
76+
list(REMOVE_ITEM swift_runtime_sources ImageInspectionELF.cpp)
77+
set(static_binary_lnk_file_list)
78+
string(TOLOWER "${sdk}" lowercase_sdk)
79+
80+
# These two libaries are only used with the static swiftcore
81+
add_library(swiftImageInspectionStatic STATIC ImageInspectionStatic.cpp)
82+
set_target_properties(swiftImageInspectionStatic PROPERTIES
83+
ARCHIVE_OUTPUT_DIRECTORY "${SWIFTSTATICLIB_DIR}/${lowercase_sdk}")
84+
85+
add_library(swiftImageInspectionShared STATIC ImageInspectionELF.cpp)
86+
set_target_properties(swiftImageInspectionShared PROPERTIES
87+
ARCHIVE_OUTPUT_DIRECTORY "${SWIFTSTATICLIB_DIR}/${lowercase_sdk}")
88+
89+
swift_install_in_component(stdlib
90+
TARGETS swiftImageInspectionStatic swiftImageInspectionShared
91+
DESTINATION "lib/swift_static/${lowercase_sdk}")
92+
93+
# Generate the static-executable-args.lnk file used for ELF systems (eg linux)
94+
set(linkfile "${lowercase_sdk}/static-executable-args.lnk")
95+
add_custom_command_target(swift_static_binary_${sdk}_args
96+
COMMAND
97+
"${CMAKE_COMMAND}" -E copy
98+
"${SWIFT_SOURCE_DIR}/utils/${lowercase}/static-executable-args.lnk"
99+
"${SWIFTSTATICLIB_DIR}/${linkfile}"
100+
OUTPUT
101+
"${SWIFTSTATICLIB_DIR}/${linkfile}")
102+
103+
list(APPEND static_binary_lnk_file_list ${swift_static_binary_${sdk}_args})
104+
swift_install_in_component(stdlib
105+
FILES "${SWIFTSTATICLIB_DIR}/${linkfile}"
106+
DESTINATION "lib/swift_static/${lowercase_sdk}")
107+
add_custom_target(static_binary_magic ALL DEPENDS ${static_binary_lnk_file_list})
108+
109+
add_swift_library(swiftImageInspectionShared OBJECT_LIBRARY TARGET_LIBRARY
110+
ImageInspectionELF.cpp
111+
C_COMPILE_FLAGS ${swift_runtime_library_compile_flags}
112+
LINK_FLAGS ${swift_runtime_linker_flags}
113+
INSTALL_IN_COMPONENT never_install)
114+
endif()
115+
72116
add_swift_library(swiftRuntime OBJECT_LIBRARY TARGET_LIBRARY
73117
${swift_runtime_sources}
74118
${swift_runtime_objc_sources}

stdlib/public/runtime/ImageInspectionELF.cpp

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
#if defined(__ELF__) || defined(__ANDROID__)
2020

2121
#include "ImageInspection.h"
22+
#include "../SwiftShims/Visibility.h"
2223
#include <elf.h>
2324
#include <link.h>
2425
#include <string.h>
@@ -28,11 +29,11 @@ using namespace swift;
2829
/// The symbol name in the image that identifies the beginning of the
2930
/// protocol conformances table.
3031
static const char ProtocolConformancesSymbol[] =
31-
".swift2_protocol_conformances_start";
32+
"__swift2_protocol_conformances_start";
3233
/// The symbol name in the image that identifies the beginning of the
3334
/// type metadata record table.
3435
static const char TypeMetadataRecordsSymbol[] =
35-
".swift2_type_metadata_start";
36+
"__swift2_type_metadata_start";
3637

3738
/// Context arguments passed down from dl_iterate_phdr to its callback.
3839
struct InspectArgs {
@@ -77,6 +78,7 @@ static int iteratePHDRCallback(struct dl_phdr_info *info,
7778
return 0;
7879
}
7980

81+
SWIFT_RUNTIME_EXPORT
8082
void swift::initializeProtocolConformanceLookup() {
8183
// Search the loaded dls. This only searches the already
8284
// loaded ones.
@@ -89,6 +91,7 @@ void swift::initializeProtocolConformanceLookup() {
8991
dl_iterate_phdr(iteratePHDRCallback, &ProtocolConformanceArgs);
9092
}
9193

94+
SWIFT_RUNTIME_EXPORT
9295
void swift::initializeTypeMetadataRecordLookup() {
9396
InspectArgs TypeMetadataRecordArgs = {
9497
TypeMetadataRecordsSymbol,
@@ -97,6 +100,7 @@ void swift::initializeTypeMetadataRecordLookup() {
97100
dl_iterate_phdr(iteratePHDRCallback, &TypeMetadataRecordArgs);
98101
}
99102

103+
SWIFT_RUNTIME_EXPORT
100104
int swift::_swift_dladdr(const void* addr, Dl_info* info) {
101105
return dladdr(addr, info);
102106
}
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
//===-- ImageInspectionStatic.cpp -------------------------------*- C++ -*-===//
2+
//
3+
// This source file is part of the Swift.org open source project
4+
//
5+
// Copyright (c) 2016 Apple Inc. and the Swift project authors
6+
// Licensed under Apache License v2.0 with Runtime Library Exception
7+
//
8+
// See http://swift.org/LICENSE.txt for license information
9+
// See http://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
10+
//
11+
//===----------------------------------------------------------------------===//
12+
//
13+
// Implementation of functions to read data sections from static executable.
14+
//
15+
//===----------------------------------------------------------------------===//
16+
17+
#include "ImageInspection.h"
18+
19+
// Currently only tested on linux but should work for any ELF platform
20+
#if defined(__ELF__) && defined(__linux__)
21+
22+
// These are defined in swift_sections.S
23+
// Used in swift_sections.S to mark the start of a section
24+
struct SectionInfo {
25+
uint64_t size;
26+
const uint8_t data[0];
27+
};
28+
extern const SectionInfo __swift2_protocol_conformances_start;
29+
extern const SectionInfo __swift2_type_metadata_start;
30+
31+
32+
void
33+
swift::initializeProtocolConformanceLookup() {
34+
addImageProtocolConformanceBlockCallback(
35+
__swift2_protocol_conformances_start.data,
36+
__swift2_protocol_conformances_start.size);
37+
}
38+
39+
void
40+
swift::initializeTypeMetadataRecordLookup() {
41+
addImageTypeMetadataRecordBlockCallback(
42+
__swift2_type_metadata_start.data,
43+
__swift2_type_metadata_start.size);
44+
}
45+
46+
// This is called from Errors.cpp when dumping a stack trace entry.
47+
// It could be implemented by parsing the ELF information in the
48+
// executable. For now it returns 0 for error (cant lookup address).
49+
int
50+
swift::_swift_dladdr(const void* addr, Dl_info* info) {
51+
return 0;
52+
}
53+
54+
#endif

stdlib/public/runtime/swift_sections.S

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -31,14 +31,14 @@
3131
.p2align 3
3232

3333
#if defined(SWIFT_BEGIN)
34-
.globl .\()\name\()_start
35-
.protected .\()\name\()_start
36-
.\()\name\()_start:
34+
.globl __\()\name\()_start
35+
.protected __\()\name\()_start
36+
__\()\name\()_start:
3737
#if defined(__BIG_ENDIAN__)
3838
.long 0
39-
.long .\()\name\()_end - .\()\name\()_start - 8
39+
.long .\()\name\()_end - __\()\name\()_start - 8
4040
#else
41-
.long .\()\name\()_end - .\()\name\()_start - 8
41+
.long .\()\name\()_end - __\()\name\()_start - 8
4242
.long 0
4343
#endif
4444
#endif

utils/static-executable-args.lnk

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
-static
2+
-lswiftCore
3+
-lswiftImageInspectionStatic
4+
-Xlinker
5+
--defsym=__import_pthread_self=pthread_self
6+
-Xlinker
7+
--defsym=__import_pthread_once=pthread_once
8+
-Xlinker
9+
--defsym=__import_pthread_key_create=pthread_key_create
10+
-lpthread
11+
-licui18n
12+
-licuuc
13+
-licudata

0 commit comments

Comments
 (0)