diff options
author | Francis Ricci <francisjricci@gmail.com> | 2017-01-09 03:51:42 +0000 |
---|---|---|
committer | Francis Ricci <francisjricci@gmail.com> | 2017-01-09 03:51:42 +0000 |
commit | ae4b8805fdce22aacb5644520c4dc42ce2656ebf (patch) | |
tree | 77e6862afbfa593d23c5069cfd364d3334be406a | |
parent | cf0113c530ec1a9e44a3fcec909ee10725df5347 (diff) | |
download | compiler-rt-ae4b8805fdce22aacb5644520c4dc42ce2656ebf.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@291417 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | cmake/Modules/SanitizerUtils.cmake | 11 | ||||
-rw-r--r-- | lib/asan/CMakeLists.txt | 5 | ||||
-rw-r--r-- | lib/asan/tests/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/tests/CMakeLists.txt | 3 | ||||
-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/tsan/tests/CMakeLists.txt | 8 | ||||
-rw-r--r-- | lib/ubsan/CMakeLists.txt | 4 | ||||
-rw-r--r-- | lib/ubsan/weak_symbols.txt | 1 |
12 files changed, 58 insertions, 3 deletions
diff --git a/cmake/Modules/SanitizerUtils.cmake b/cmake/Modules/SanitizerUtils.cmake index c66083c24..3e1a6346e 100644 --- a/cmake/Modules/SanitizerUtils.cmake +++ b/cmake/Modules/SanitizerUtils.cmake @@ -46,6 +46,17 @@ macro(add_sanitizer_rt_symbols name) endforeach() endmacro() +# This function is only used on Darwin, where undefined symbols must be specified +# in the linker invocation. +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/tests/CMakeLists.txt b/lib/asan/tests/CMakeLists.txt index 3e56763a8..22fa61dd1 100644 --- a/lib/asan/tests/CMakeLists.txt +++ b/lib/asan/tests/CMakeLists.txt @@ -59,6 +59,11 @@ list(APPEND ASAN_UNITTEST_COMMON_CFLAGS if(APPLE) list(APPEND ASAN_UNITTEST_COMMON_CFLAGS ${DARWIN_osx_CFLAGS}) list(APPEND ASAN_UNITTEST_COMMON_LINKFLAGS ${DARWIN_osx_LINKFLAGS}) + + add_weak_symbols("asan" WEAK_SYMBOL_LINKFLAGS) + add_weak_symbols("ubsan" WEAK_SYMBOL_LINKFLAGS) + add_weak_symbols("sanitizer_common" WEAK_SYMBOL_LINKFLAGS) + list(APPEND ASAN_UNITTEST_COMMON_LINKFLAGS ${WEAK_SYMBOL_LINKFLAGS}) endif() if(MSVC) 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/tests/CMakeLists.txt b/lib/sanitizer_common/tests/CMakeLists.txt index b66f7563b..841acb315 100644 --- a/lib/sanitizer_common/tests/CMakeLists.txt +++ b/lib/sanitizer_common/tests/CMakeLists.txt @@ -81,6 +81,9 @@ endif() if(APPLE) list(APPEND SANITIZER_TEST_CFLAGS_COMMON ${DARWIN_osx_CFLAGS}) list(APPEND SANITIZER_TEST_LINK_FLAGS_COMMON ${DARWIN_osx_LINKFLAGS}) + + add_weak_symbols("sanitizer_common" WEAK_SYMBOL_LINKFLAGS) + list(APPEND SANITIZER_TEST_LINK_FLAGS_COMMON ${WEAK_SYMBOL_LINKFLAGS}) endif() # MSVC linker is allocating 1M for the stack by default, which is not 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/tsan/tests/CMakeLists.txt b/lib/tsan/tests/CMakeLists.txt index 4587e47ba..ac7412940 100644 --- a/lib/tsan/tests/CMakeLists.txt +++ b/lib/tsan/tests/CMakeLists.txt @@ -76,14 +76,18 @@ macro(add_tsan_unittest testname) ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) list(APPEND TEST_OBJECTS lib${TSAN_TEST_RUNTIME}.a) list(APPEND TEST_DEPS ${TSAN_TEST_RUNTIME}) + + add_weak_symbols("ubsan" WEAK_SYMBOL_LINKFLAGS) + add_weak_symbols("sanitizer_common" WEAK_SYMBOL_LINKFLAGS) + # Intentionally do *not* link with `-fsanitize=thread`. We already link # against a static version of the runtime, and we don't want the dynamic # one. add_compiler_rt_test(TsanUnitTests "${testname}-${arch}-Test" OBJECTS ${TEST_OBJECTS} DEPS ${TEST_DEPS} - LINK_FLAGS ${TARGET_LINK_FLAGS} ${DARWIN_osx_LINKFLAGS} - -lc++) + LINK_FLAGS ${TARGET_LINK_FLAGS} ${DARWIN_osx_LINK_FLAGS} + ${WEAK_SYMBOL_LINKFLAGS} -lc++) endif() endforeach() endif() 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 |