diff options
author | Francis Ricci <francisjricci@gmail.com> | 2017-01-07 00:31:24 +0000 |
---|---|---|
committer | Francis Ricci <francisjricci@gmail.com> | 2017-01-07 00:31:24 +0000 |
commit | 421408c0f2cc811bcf9a945be6e95e46f76cb358 (patch) | |
tree | 6edd756fe14bfddcc92abfc231d4a5799ca6b291 | |
parent | 4ef2dc3fe6295e56f6e24772065b82c5b39b48ad (diff) | |
download | compiler-rt-421408c0f2cc811bcf9a945be6e95e46f76cb358.tar.gz |
Enable weak hooks on darwin
Summary:
By default, darwin requires a definition for weak interface functions at
link time. Adding the '-U' link flag with each weak function allows these
weak interface functions to be used without definitions, which mirrors
behavior on linux and windows.
Reviewers: compnerd, eugenis
Subscribers: kubabrecka, mgorny, llvm-commits
Differential Revision: https://reviews.llvm.org/D28203
git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@291314 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | cmake/Modules/SanitizerUtils.cmake | 9 | ||||
-rw-r--r-- | lib/asan/CMakeLists.txt | 5 | ||||
-rw-r--r-- | lib/asan/weak_symbols.txt | 3 | ||||
-rw-r--r-- | lib/sanitizer_common/sanitizer_internal_defs.h | 2 | ||||
-rw-r--r-- | lib/sanitizer_common/weak_symbols.txt | 6 | ||||
-rw-r--r-- | lib/stats/CMakeLists.txt | 8 | ||||
-rw-r--r-- | lib/tsan/CMakeLists.txt | 5 | ||||
-rw-r--r-- | lib/ubsan/CMakeLists.txt | 4 | ||||
-rw-r--r-- | lib/ubsan/weak_symbols.txt | 1 |
9 files changed, 42 insertions, 1 deletions
diff --git a/cmake/Modules/SanitizerUtils.cmake b/cmake/Modules/SanitizerUtils.cmake index c66083c24..6ead24e12 100644 --- a/cmake/Modules/SanitizerUtils.cmake +++ b/cmake/Modules/SanitizerUtils.cmake @@ -46,6 +46,15 @@ macro(add_sanitizer_rt_symbols name) endforeach() endmacro() +function(add_weak_symbols libname linkflags) + file(STRINGS "${COMPILER_RT_SOURCE_DIR}/lib/${libname}/weak_symbols.txt" WEAK_SYMBOLS) + set(local_linkflags ${${linkflags}}) + foreach(SYMBOL ${WEAK_SYMBOLS}) + set(local_linkflags ${local_linkflags} -Wl,-U,${SYMBOL}) + endforeach() + set(${linkflags} ${local_linkflags} PARENT_SCOPE) +endfunction() + macro(add_sanitizer_rt_version_list name) set(vers ${CMAKE_CURRENT_BINARY_DIR}/${name}.vers) cmake_parse_arguments(ARG "" "" "LIBS;EXTRA" ${ARGN}) diff --git a/lib/asan/CMakeLists.txt b/lib/asan/CMakeLists.txt index 1258ef616..4bebb0a45 100644 --- a/lib/asan/CMakeLists.txt +++ b/lib/asan/CMakeLists.txt @@ -106,6 +106,10 @@ endif() add_compiler_rt_component(asan) if(APPLE) + add_weak_symbols("asan" WEAK_SYMBOL_LINKFLAGS) + add_weak_symbols("ubsan" WEAK_SYMBOL_LINKFLAGS) + add_weak_symbols("sanitizer_common" WEAK_SYMBOL_LINKFLAGS) + add_compiler_rt_runtime(clang_rt.asan SHARED OS ${SANITIZER_COMMON_SUPPORTED_OS} @@ -117,6 +121,7 @@ if(APPLE) RTLSanCommon RTUbsan CFLAGS ${ASAN_DYNAMIC_CFLAGS} + LINKFLAGS ${WEAK_SYMBOL_LINKFLAGS} DEFS ${ASAN_DYNAMIC_DEFINITIONS} PARENT_TARGET asan) else() diff --git a/lib/asan/weak_symbols.txt b/lib/asan/weak_symbols.txt new file mode 100644 index 000000000..ba7b0272c --- /dev/null +++ b/lib/asan/weak_symbols.txt @@ -0,0 +1,3 @@ +___asan_default_options +___asan_default_suppressions +___asan_on_error diff --git a/lib/sanitizer_common/sanitizer_internal_defs.h b/lib/sanitizer_common/sanitizer_internal_defs.h index 8ebe91a6b..5338f7942 100644 --- a/lib/sanitizer_common/sanitizer_internal_defs.h +++ b/lib/sanitizer_common/sanitizer_internal_defs.h @@ -32,7 +32,7 @@ # define SANITIZER_WEAK_ATTRIBUTE __attribute__((weak)) #endif -#if (SANITIZER_LINUX || SANITIZER_WINDOWS) && !SANITIZER_GO +#if (SANITIZER_LINUX || SANITIZER_MAC || SANITIZER_WINDOWS) && !SANITIZER_GO # define SANITIZER_SUPPORTS_WEAK_HOOKS 1 #else # define SANITIZER_SUPPORTS_WEAK_HOOKS 0 diff --git a/lib/sanitizer_common/weak_symbols.txt b/lib/sanitizer_common/weak_symbols.txt new file mode 100644 index 000000000..8a1e32b80 --- /dev/null +++ b/lib/sanitizer_common/weak_symbols.txt @@ -0,0 +1,6 @@ +___sanitizer_free_hook +___sanitizer_malloc_hook +___sanitizer_symbolize_code +___sanitizer_symbolize_data +___sanitizer_symbolize_demangle +___sanitizer_symbolize_flush diff --git a/lib/stats/CMakeLists.txt b/lib/stats/CMakeLists.txt index 33ab1aea6..ec75262d4 100644 --- a/lib/stats/CMakeLists.txt +++ b/lib/stats/CMakeLists.txt @@ -5,8 +5,14 @@ set_target_properties(stats PROPERTIES FOLDER "Compiler-RT Misc") if(APPLE) set(STATS_LIB_FLAVOR SHARED) + + add_weak_symbols("asan" WEAK_SYMBOL_LINKFLAGS) + add_weak_symbols("ubsan" WEAK_SYMBOL_LINKFLAGS) + add_weak_symbols("sanitizer_common" WEAK_SYMBOL_LINKFLAGS) else() set(STATS_LIB_FLAVOR STATIC) + + set(WEAK_SYMBOL_LINKFLAGS) endif() add_compiler_rt_runtime(clang_rt.stats @@ -17,6 +23,7 @@ add_compiler_rt_runtime(clang_rt.stats OBJECT_LIBS RTSanitizerCommon RTSanitizerCommonLibc CFLAGS ${SANITIZER_COMMON_CFLAGS} + LINKFLAGS ${WEAK_SYMBOL_LINKFLAGS} PARENT_TARGET stats) add_compiler_rt_runtime(clang_rt.stats_client @@ -25,4 +32,5 @@ add_compiler_rt_runtime(clang_rt.stats_client OS ${SANITIZER_COMMON_SUPPORTED_OS} SOURCES stats_client.cc CFLAGS ${SANITIZER_COMMON_CFLAGS} + LINKFLAGS ${WEAK_SYMBOL_LINKFLAGS} PARENT_TARGET stats) diff --git a/lib/tsan/CMakeLists.txt b/lib/tsan/CMakeLists.txt index b26a884b1..75d26349a 100644 --- a/lib/tsan/CMakeLists.txt +++ b/lib/tsan/CMakeLists.txt @@ -107,6 +107,10 @@ if(APPLE) # Pass ASM file directly to the C++ compiler. set_source_files_properties(${TSAN_ASM_SOURCES} PROPERTIES LANGUAGE C) endif() + + add_weak_symbols("ubsan" WEAK_SYMBOL_LINKFLAGS) + add_weak_symbols("sanitizer_common" WEAK_SYMBOL_LINKFLAGS) + add_compiler_rt_runtime(clang_rt.tsan SHARED OS ${TSAN_SUPPORTED_OS} @@ -117,6 +121,7 @@ if(APPLE) RTSanitizerCommonLibc RTUbsan CFLAGS ${TSAN_RTL_CFLAGS} + LINKFLAGS ${WEAK_SYMBOL_LINKFLAGS} PARENT_TARGET tsan) add_compiler_rt_object_libraries(RTTsan_dynamic OS ${TSAN_SUPPORTED_OS} diff --git a/lib/ubsan/CMakeLists.txt b/lib/ubsan/CMakeLists.txt index 036c65a09..ebff36019 100644 --- a/lib/ubsan/CMakeLists.txt +++ b/lib/ubsan/CMakeLists.txt @@ -56,6 +56,9 @@ if(APPLE) SOURCES ${UBSAN_STANDALONE_SOURCES} CFLAGS ${UBSAN_STANDALONE_CFLAGS}) + add_weak_symbols("ubsan" WEAK_SYMBOL_LINKFLAGS) + add_weak_symbols("sanitizer_common" WEAK_SYMBOL_LINKFLAGS) + add_compiler_rt_runtime(clang_rt.ubsan SHARED OS ${SANITIZER_COMMON_SUPPORTED_OS} @@ -64,6 +67,7 @@ if(APPLE) RTUbsan_standalone RTSanitizerCommon RTSanitizerCommonLibc + LINKFLAGS ${WEAK_SYMBOL_LINKFLAGS} PARENT_TARGET ubsan) endif() diff --git a/lib/ubsan/weak_symbols.txt b/lib/ubsan/weak_symbols.txt new file mode 100644 index 000000000..69e1bc185 --- /dev/null +++ b/lib/ubsan/weak_symbols.txt @@ -0,0 +1 @@ +___ubsan_default_options |