1 # Build for the AddressSanitizer runtime support library. 2 3 set(ASAN_SOURCES 4 asan_allocator.cc 5 asan_activation.cc 6 asan_debugging.cc 7 asan_fake_stack.cc 8 asan_flags.cc 9 asan_globals.cc 10 asan_interceptors.cc 11 asan_linux.cc 12 asan_mac.cc 13 asan_malloc_linux.cc 14 asan_malloc_mac.cc 15 asan_malloc_win.cc 16 asan_poisoning.cc 17 asan_posix.cc 18 asan_report.cc 19 asan_rtl.cc 20 asan_stack.cc 21 asan_stats.cc 22 asan_suppressions.cc 23 asan_thread.cc 24 asan_win.cc) 25 26 set(ASAN_CXX_SOURCES 27 asan_new_delete.cc) 28 29 set(ASAN_PREINIT_SOURCES 30 asan_preinit.cc) 31 32 include_directories(..) 33 34 set(ASAN_CFLAGS ${SANITIZER_COMMON_CFLAGS}) 35 append_no_rtti_flag(ASAN_CFLAGS) 36 37 set(ASAN_COMMON_DEFINITIONS 38 ASAN_HAS_EXCEPTIONS=1) 39 40 set(ASAN_DYNAMIC_LINK_FLAGS) 41 42 if(ANDROID) 43 list(APPEND ASAN_COMMON_DEFINITIONS 44 ASAN_LOW_MEMORY=1) 45 # On Android, -z global does not do what it is documented to do. 46 # On Android, -z global moves the library ahead in the lookup order, 47 # placing it right after the LD_PRELOADs. This is used to compensate for the fact 48 # that Android linker does not look at the dependencies of the main executable 49 # that aren't dependencies of the current DSO when resolving symbols from said DSO. 50 # As a net result, this allows running ASan executables without LD_PRELOAD-ing the 51 # ASan runtime library. 52 # The above is applicable to L MR1 or newer. 53 if (COMPILER_RT_HAS_Z_GLOBAL) 54 list(APPEND ASAN_DYNAMIC_LINK_FLAGS -Wl,-z,global) 55 endif() 56 endif() 57 58 set(ASAN_DYNAMIC_DEFINITIONS 59 ${ASAN_COMMON_DEFINITIONS} ASAN_DYNAMIC=1) 60 append_list_if(WIN32 INTERCEPTION_DYNAMIC_CRT ASAN_DYNAMIC_DEFINITIONS) 61 62 set(ASAN_DYNAMIC_CFLAGS ${ASAN_CFLAGS}) 63 append_list_if(COMPILER_RT_HAS_FTLS_MODEL_INITIAL_EXEC 64 -ftls-model=initial-exec ASAN_DYNAMIC_CFLAGS) 65 append_list_if(MSVC /DEBUG ASAN_DYNAMIC_CFLAGS) 66 67 append_list_if(COMPILER_RT_HAS_LIBC c ASAN_DYNAMIC_LIBS) 68 append_list_if(COMPILER_RT_HAS_LIBDL dl ASAN_DYNAMIC_LIBS) 69 append_list_if(COMPILER_RT_HAS_LIBRT rt ASAN_DYNAMIC_LIBS) 70 append_list_if(COMPILER_RT_HAS_LIBM m ASAN_DYNAMIC_LIBS) 71 append_list_if(COMPILER_RT_HAS_LIBPTHREAD pthread ASAN_DYNAMIC_LIBS) 72 append_list_if(COMPILER_RT_HAS_LIBSTDCXX stdc++ ASAN_DYNAMIC_LIBS) 73 append_list_if(COMPILER_RT_HAS_LIBLOG log ASAN_DYNAMIC_LIBS) 74 75 # Compile ASan sources into an object library. 76 77 add_compiler_rt_object_libraries(RTAsan_dynamic 78 OS ${SANITIZER_COMMON_SUPPORTED_OS} 79 ARCHS ${ASAN_SUPPORTED_ARCH} 80 SOURCES ${ASAN_SOURCES} ${ASAN_CXX_SOURCES} 81 CFLAGS ${ASAN_DYNAMIC_CFLAGS} 82 DEFS ${ASAN_DYNAMIC_DEFINITIONS}) 83 84 if(NOT APPLE) 85 add_compiler_rt_object_libraries(RTAsan 86 ARCHS ${ASAN_SUPPORTED_ARCH} 87 SOURCES ${ASAN_SOURCES} CFLAGS ${ASAN_CFLAGS} 88 DEFS ${ASAN_COMMON_DEFINITIONS}) 89 add_compiler_rt_object_libraries(RTAsan_cxx 90 ARCHS ${ASAN_SUPPORTED_ARCH} 91 SOURCES ${ASAN_CXX_SOURCES} CFLAGS ${ASAN_CFLAGS} 92 DEFS ${ASAN_COMMON_DEFINITIONS}) 93 add_compiler_rt_object_libraries(RTAsan_preinit 94 ARCHS ${ASAN_SUPPORTED_ARCH} 95 SOURCES ${ASAN_PREINIT_SOURCES} CFLAGS ${ASAN_CFLAGS} 96 DEFS ${ASAN_COMMON_DEFINITIONS}) 97 98 file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/dummy.cc "") 99 add_compiler_rt_object_libraries(RTAsan_dynamic_version_script_dummy 100 ARCHS ${ASAN_SUPPORTED_ARCH} 101 SOURCES ${CMAKE_CURRENT_BINARY_DIR}/dummy.cc 102 CFLAGS ${ASAN_DYNAMIC_CFLAGS} 103 DEFS ${ASAN_DYNAMIC_DEFINITIONS}) 104 endif() 105 106 # Build ASan runtimes shipped with Clang. 107 add_custom_target(asan) 108 if(APPLE) 109 add_compiler_rt_runtime(clang_rt.asan 110 SHARED 111 OS ${SANITIZER_COMMON_SUPPORTED_OS} 112 ARCHS ${ASAN_SUPPORTED_ARCH} 113 OBJECT_LIBS RTAsan_dynamic 114 RTInterception 115 RTSanitizerCommon 116 RTSanitizerCommonLibc 117 RTLSanCommon 118 RTUbsan 119 CFLAGS ${ASAN_DYNAMIC_CFLAGS} 120 DEFS ${ASAN_DYNAMIC_DEFINITIONS} 121 PARENT_TARGET asan) 122 else() 123 # Build separate libraries for each target. 124 125 set(ASAN_COMMON_RUNTIME_OBJECT_LIBS 126 RTInterception 127 RTSanitizerCommon 128 RTSanitizerCommonLibc 129 RTLSanCommon 130 RTUbsan) 131 132 add_compiler_rt_runtime(clang_rt.asan 133 STATIC 134 ARCHS ${ASAN_SUPPORTED_ARCH} 135 OBJECT_LIBS RTAsan_preinit 136 RTAsan 137 ${ASAN_COMMON_RUNTIME_OBJECT_LIBS} 138 CFLAGS ${ASAN_CFLAGS} 139 DEFS ${ASAN_COMMON_DEFINITIONS} 140 PARENT_TARGET asan) 141 142 add_compiler_rt_runtime(clang_rt.asan_cxx 143 STATIC 144 ARCHS ${ASAN_SUPPORTED_ARCH} 145 OBJECT_LIBS RTAsan_cxx 146 RTUbsan_cxx 147 CFLAGS ${ASAN_CFLAGS} 148 DEFS ${ASAN_COMMON_DEFINITIONS} 149 PARENT_TARGET asan) 150 151 add_compiler_rt_runtime(clang_rt.asan-preinit 152 STATIC 153 ARCHS ${ASAN_SUPPORTED_ARCH} 154 OBJECT_LIBS RTAsan_preinit 155 CFLAGS ${ASAN_CFLAGS} 156 DEFS ${ASAN_COMMON_DEFINITIONS} 157 PARENT_TARGET asan) 158 159 foreach(arch ${ASAN_SUPPORTED_ARCH}) 160 if (UNIX AND NOT ${arch} MATCHES "i386|i686") 161 add_sanitizer_rt_version_list(clang_rt.asan-dynamic-${arch} 162 LIBS clang_rt.asan-${arch} clang_rt.asan_cxx-${arch} 163 EXTRA asan.syms.extra) 164 set(VERSION_SCRIPT_FLAG 165 -Wl,--version-script,${CMAKE_CURRENT_BINARY_DIR}/clang_rt.asan-dynamic-${arch}.vers) 166 set_source_files_properties( 167 ${CMAKE_CURRENT_BINARY_DIR}/dummy.cc 168 PROPERTIES 169 OBJECT_DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/clang_rt.asan-dynamic-${arch}.vers) 170 else() 171 set(VERSION_SCRIPT_FLAG) 172 endif() 173 174 add_compiler_rt_runtime(clang_rt.asan 175 SHARED 176 ARCHS ${arch} 177 OBJECT_LIBS ${ASAN_COMMON_RUNTIME_OBJECT_LIBS} 178 RTAsan_dynamic 179 # The only purpose of RTAsan_dynamic_version_script_dummy is to carry 180 # a dependency of the shared runtime on the version script. With CMake 181 # 3.1 or later it can be replaced with a straightforward 182 # add_dependencies(clang_rt.asan-dynamic-${arch} clang_rt.asan-dynamic-${arch}-version-list) 183 RTAsan_dynamic_version_script_dummy 184 RTUbsan_cxx 185 CFLAGS ${ASAN_DYNAMIC_CFLAGS} 186 LINKFLAGS ${ASAN_DYNAMIC_LINK_FLAGS} 187 ${VERSION_SCRIPT_FLAG} 188 LINK_LIBS ${ASAN_DYNAMIC_LIBS} 189 DEFS ${ASAN_DYNAMIC_DEFINITIONS} 190 PARENT_TARGET asan) 191 192 if (UNIX AND NOT ${arch} MATCHES "i386|i686") 193 add_sanitizer_rt_symbols(clang_rt.asan_cxx 194 ARCHS ${arch}) 195 add_dependencies(asan clang_rt.asan_cxx-${arch}-symbols) 196 add_sanitizer_rt_symbols(clang_rt.asan 197 ARCHS ${arch} 198 EXTRA asan.syms.extra) 199 add_dependencies(asan clang_rt.asan-${arch}-symbols) 200 endif() 201 202 if (WIN32) 203 add_compiler_rt_runtime(clang_rt.asan_dll_thunk 204 STATIC 205 ARCHS ${arch} 206 SOURCES asan_win_dll_thunk.cc 207 $<TARGET_OBJECTS:RTInterception.${arch}> 208 CFLAGS ${ASAN_CFLAGS} -DASAN_DLL_THUNK 209 DEFS ${ASAN_COMMON_DEFINITIONS} 210 PARENT_TARGET asan) 211 add_compiler_rt_runtime(clang_rt.asan_dynamic_runtime_thunk 212 STATIC 213 ARCHS ${arch} 214 SOURCES asan_win_dynamic_runtime_thunk.cc 215 CFLAGS ${ASAN_CFLAGS} -DASAN_DYNAMIC_RUNTIME_THUNK -Zl 216 DEFS ${ASAN_COMMON_DEFINITIONS} 217 PARENT_TARGET asan) 218 endif() 219 endforeach() 220 endif() 221 222 add_compiler_rt_resource_file(asan_blacklist asan_blacklist.txt) 223 add_dependencies(asan asan_blacklist) 224 add_dependencies(compiler-rt asan) 225 226 add_subdirectory(scripts) 227 228 if(COMPILER_RT_INCLUDE_TESTS) 229 add_subdirectory(tests) 230 endif() 231