1# Build for the AddressSanitizer runtime support library. 2 3set(ASAN_SOURCES 4 asan_allocator.cpp 5 asan_activation.cpp 6 asan_debugging.cpp 7 asan_descriptions.cpp 8 asan_errors.cpp 9 asan_fake_stack.cpp 10 asan_flags.cpp 11 asan_fuchsia.cpp 12 asan_globals.cpp 13 asan_globals_win.cpp 14 asan_interceptors.cpp 15 asan_interceptors_memintrinsics.cpp 16 asan_linux.cpp 17 asan_mac.cpp 18 asan_malloc_linux.cpp 19 asan_malloc_mac.cpp 20 asan_malloc_win.cpp 21 asan_memory_profile.cpp 22 asan_poisoning.cpp 23 asan_posix.cpp 24 asan_premap_shadow.cpp 25 asan_report.cpp 26 asan_rtems.cpp 27 asan_rtl.cpp 28 asan_shadow_setup.cpp 29 asan_stack.cpp 30 asan_stats.cpp 31 asan_suppressions.cpp 32 asan_thread.cpp 33 asan_win.cpp 34 ) 35 36if (NOT WIN32 AND NOT APPLE) 37 list(APPEND ASAN_SOURCES 38 asan_interceptors_vfork.S 39 ) 40endif() 41 42set(ASAN_CXX_SOURCES 43 asan_new_delete.cpp 44 ) 45 46set(ASAN_PREINIT_SOURCES 47 asan_preinit.cpp 48 ) 49 50SET(ASAN_HEADERS 51 asan_activation.h 52 asan_activation_flags.inc 53 asan_allocator.h 54 asan_descriptions.h 55 asan_errors.h 56 asan_fake_stack.h 57 asan_flags.h 58 asan_flags.inc 59 asan_init_version.h 60 asan_interceptors.h 61 asan_interceptors_memintrinsics.h 62 asan_interface.inc 63 asan_interface_internal.h 64 asan_internal.h 65 asan_lock.h 66 asan_malloc_local.h 67 asan_mapping.h 68 asan_mapping_myriad.h 69 asan_poisoning.h 70 asan_premap_shadow.h 71 asan_report.h 72 asan_scariness_score.h 73 asan_stack.h 74 asan_stats.h 75 asan_suppressions.h 76 asan_thread.h 77 ) 78 79include_directories(..) 80 81set(ASAN_CFLAGS ${SANITIZER_COMMON_CFLAGS}) 82set(ASAN_COMMON_DEFINITIONS ${COMPILER_RT_ASAN_SHADOW_SCALE_DEFINITION}) 83 84append_rtti_flag(OFF ASAN_CFLAGS) 85 86set(ASAN_DYNAMIC_LINK_FLAGS ${SANITIZER_COMMON_LINK_FLAGS}) 87 88if(ANDROID) 89# Put most Sanitizer shared libraries in the global group. For more details, see 90# android-changes-for-ndk-developers.md#changes-to-library-search-order 91 if (COMPILER_RT_HAS_Z_GLOBAL) 92 list(APPEND ASAN_DYNAMIC_LINK_FLAGS -Wl,-z,global) 93 endif() 94endif() 95 96set(ASAN_DYNAMIC_DEFINITIONS 97 ${ASAN_COMMON_DEFINITIONS} ASAN_DYNAMIC=1) 98append_list_if(WIN32 INTERCEPTION_DYNAMIC_CRT ASAN_DYNAMIC_DEFINITIONS) 99 100set(ASAN_DYNAMIC_CFLAGS ${ASAN_CFLAGS}) 101append_list_if(COMPILER_RT_HAS_FTLS_MODEL_INITIAL_EXEC 102 -ftls-model=initial-exec ASAN_DYNAMIC_CFLAGS) 103append_list_if(MSVC /DEBUG ASAN_DYNAMIC_LINK_FLAGS) 104 105set(ASAN_DYNAMIC_LIBS ${SANITIZER_CXX_ABI_LIBRARIES} ${SANITIZER_COMMON_LINK_LIBS}) 106 107append_list_if(COMPILER_RT_HAS_LIBDL dl ASAN_DYNAMIC_LIBS) 108append_list_if(COMPILER_RT_HAS_LIBRT rt ASAN_DYNAMIC_LIBS) 109append_list_if(COMPILER_RT_HAS_LIBM m ASAN_DYNAMIC_LIBS) 110append_list_if(COMPILER_RT_HAS_LIBPTHREAD pthread ASAN_DYNAMIC_LIBS) 111append_list_if(COMPILER_RT_HAS_LIBLOG log ASAN_DYNAMIC_LIBS) 112append_list_if(MINGW "${MINGW_LIBRARIES}" ASAN_DYNAMIC_LIBS) 113 114if (TARGET cxx-headers OR HAVE_LIBCXX) 115 set(ASAN_DEPS cxx-headers) 116endif() 117 118# Compile ASan sources into an object library. 119 120add_compiler_rt_object_libraries(RTAsan_dynamic 121 OS ${SANITIZER_COMMON_SUPPORTED_OS} 122 ARCHS ${ASAN_SUPPORTED_ARCH} 123 SOURCES ${ASAN_SOURCES} ${ASAN_CXX_SOURCES} 124 ADDITIONAL_HEADERS ${ASAN_HEADERS} 125 CFLAGS ${ASAN_DYNAMIC_CFLAGS} 126 DEFS ${ASAN_DYNAMIC_DEFINITIONS} 127 DEPS ${ASAN_DEPS}) 128 129if(NOT APPLE) 130 add_compiler_rt_object_libraries(RTAsan 131 ARCHS ${ASAN_SUPPORTED_ARCH} 132 SOURCES ${ASAN_SOURCES} 133 ADDITIONAL_HEADERS ${ASAN_HEADERS} 134 CFLAGS ${ASAN_CFLAGS} 135 DEFS ${ASAN_COMMON_DEFINITIONS} 136 DEPS ${ASAN_DEPS}) 137 add_compiler_rt_object_libraries(RTAsan_cxx 138 ARCHS ${ASAN_SUPPORTED_ARCH} 139 SOURCES ${ASAN_CXX_SOURCES} 140 ADDITIONAL_HEADERS ${ASAN_HEADERS} 141 CFLAGS ${ASAN_CFLAGS} 142 DEFS ${ASAN_COMMON_DEFINITIONS} 143 DEPS ${ASAN_DEPS}) 144 add_compiler_rt_object_libraries(RTAsan_preinit 145 ARCHS ${ASAN_SUPPORTED_ARCH} 146 SOURCES ${ASAN_PREINIT_SOURCES} 147 ADDITIONAL_HEADERS ${ASAN_HEADERS} 148 CFLAGS ${ASAN_CFLAGS} 149 DEFS ${ASAN_COMMON_DEFINITIONS} 150 DEPS ${ASAN_DEPS}) 151 152 file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/dummy.cpp "") 153 add_compiler_rt_object_libraries(RTAsan_dynamic_version_script_dummy 154 ARCHS ${ASAN_SUPPORTED_ARCH} 155 SOURCES ${CMAKE_CURRENT_BINARY_DIR}/dummy.cpp 156 CFLAGS ${ASAN_DYNAMIC_CFLAGS} 157 DEFS ${ASAN_DYNAMIC_DEFINITIONS} 158 DEPS ${ASAN_DEPS}) 159endif() 160 161# Build ASan runtimes shipped with Clang. 162add_compiler_rt_component(asan) 163 164if(APPLE) 165 add_weak_symbols("asan" WEAK_SYMBOL_LINK_FLAGS) 166 add_weak_symbols("lsan" WEAK_SYMBOL_LINK_FLAGS) 167 add_weak_symbols("ubsan" WEAK_SYMBOL_LINK_FLAGS) 168 add_weak_symbols("sanitizer_common" WEAK_SYMBOL_LINK_FLAGS) 169 add_weak_symbols("xray" WEAK_SYMBOL_LINK_FLAGS) 170 171 add_compiler_rt_runtime(clang_rt.asan 172 SHARED 173 OS ${SANITIZER_COMMON_SUPPORTED_OS} 174 ARCHS ${ASAN_SUPPORTED_ARCH} 175 OBJECT_LIBS RTAsan_dynamic 176 RTInterception 177 RTSanitizerCommon 178 RTSanitizerCommonLibc 179 RTSanitizerCommonCoverage 180 RTSanitizerCommonSymbolizer 181 RTLSanCommon 182 RTUbsan 183 CFLAGS ${ASAN_DYNAMIC_CFLAGS} 184 LINK_FLAGS ${WEAK_SYMBOL_LINK_FLAGS} 185 DEFS ${ASAN_DYNAMIC_DEFINITIONS} 186 PARENT_TARGET asan) 187else() 188 # Build separate libraries for each target. 189 190 set(ASAN_COMMON_RUNTIME_OBJECT_LIBS 191 RTInterception 192 RTSanitizerCommon 193 RTSanitizerCommonLibc 194 RTSanitizerCommonCoverage 195 RTSanitizerCommonSymbolizer 196 RTLSanCommon 197 RTUbsan) 198 199 add_compiler_rt_runtime(clang_rt.asan 200 STATIC 201 ARCHS ${ASAN_SUPPORTED_ARCH} 202 OBJECT_LIBS RTAsan_preinit 203 RTAsan 204 ${ASAN_COMMON_RUNTIME_OBJECT_LIBS} 205 CFLAGS ${ASAN_CFLAGS} 206 DEFS ${ASAN_COMMON_DEFINITIONS} 207 PARENT_TARGET asan) 208 209 add_compiler_rt_runtime(clang_rt.asan_cxx 210 STATIC 211 ARCHS ${ASAN_SUPPORTED_ARCH} 212 OBJECT_LIBS RTAsan_cxx 213 RTUbsan_cxx 214 CFLAGS ${ASAN_CFLAGS} 215 DEFS ${ASAN_COMMON_DEFINITIONS} 216 PARENT_TARGET asan) 217 218 add_compiler_rt_runtime(clang_rt.asan-preinit 219 STATIC 220 ARCHS ${ASAN_SUPPORTED_ARCH} 221 OBJECT_LIBS RTAsan_preinit 222 CFLAGS ${ASAN_CFLAGS} 223 DEFS ${ASAN_COMMON_DEFINITIONS} 224 PARENT_TARGET asan) 225 226 foreach(arch ${ASAN_SUPPORTED_ARCH}) 227 if (UNIX) 228 add_sanitizer_rt_version_list(clang_rt.asan-dynamic-${arch} 229 LIBS clang_rt.asan-${arch} clang_rt.asan_cxx-${arch} 230 EXTRA asan.syms.extra) 231 set(VERSION_SCRIPT_FLAG 232 -Wl,--version-script,${CMAKE_CURRENT_BINARY_DIR}/clang_rt.asan-dynamic-${arch}.vers) 233 # The Solaris 11.4 linker supports a subset of GNU ld version scripts, 234 # but requires a special option to enable it. 235 if (OS_NAME MATCHES "SunOS") 236 list(APPEND VERSION_SCRIPT_FLAG -Wl,-z,gnu-version-script-compat) 237 endif() 238 set_property(SOURCE 239 ${CMAKE_CURRENT_BINARY_DIR}/dummy.cpp 240 APPEND PROPERTY 241 OBJECT_DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/clang_rt.asan-dynamic-${arch}.vers) 242 else() 243 set(VERSION_SCRIPT_FLAG) 244 endif() 245 246 set(ASAN_DYNAMIC_WEAK_INTERCEPTION) 247 if (WIN32) 248 add_compiler_rt_object_libraries(AsanWeakInterception 249 ${SANITIZER_COMMON_SUPPORTED_OS} 250 ARCHS ${arch} 251 SOURCES asan_win_weak_interception.cpp 252 CFLAGS ${ASAN_CFLAGS} -DSANITIZER_DYNAMIC 253 DEFS ${ASAN_COMMON_DEFINITIONS} 254 DEPS ${ASAN_DEPS}) 255 set(ASAN_DYNAMIC_WEAK_INTERCEPTION 256 AsanWeakInterception 257 UbsanWeakInterception 258 SancovWeakInterception 259 SanitizerCommonWeakInterception) 260 endif() 261 262 add_compiler_rt_runtime(clang_rt.asan 263 SHARED 264 ARCHS ${arch} 265 OBJECT_LIBS ${ASAN_COMMON_RUNTIME_OBJECT_LIBS} 266 RTAsan_dynamic 267 # The only purpose of RTAsan_dynamic_version_script_dummy is to 268 # carry a dependency of the shared runtime on the version script. 269 # Replacing it with a straightforward 270 # add_dependencies(clang_rt.asan-dynamic-${arch} clang_rt.asan-dynamic-${arch}-version-list) 271 # generates an order-only dependency in ninja. 272 RTAsan_dynamic_version_script_dummy 273 RTUbsan_cxx 274 ${ASAN_DYNAMIC_WEAK_INTERCEPTION} 275 CFLAGS ${ASAN_DYNAMIC_CFLAGS} 276 LINK_FLAGS ${ASAN_DYNAMIC_LINK_FLAGS} 277 ${VERSION_SCRIPT_FLAG} 278 LINK_LIBS ${ASAN_DYNAMIC_LIBS} 279 DEFS ${ASAN_DYNAMIC_DEFINITIONS} 280 PARENT_TARGET asan) 281 282 if (SANITIZER_USE_SYMBOLS AND NOT ${arch} STREQUAL "i386") 283 add_sanitizer_rt_symbols(clang_rt.asan_cxx 284 ARCHS ${arch}) 285 add_dependencies(asan clang_rt.asan_cxx-${arch}-symbols) 286 add_sanitizer_rt_symbols(clang_rt.asan 287 ARCHS ${arch} 288 EXTRA asan.syms.extra) 289 add_dependencies(asan clang_rt.asan-${arch}-symbols) 290 endif() 291 292 if (WIN32) 293 add_compiler_rt_object_libraries(AsanDllThunk 294 ${SANITIZER_COMMON_SUPPORTED_OS} 295 ARCHS ${arch} 296 SOURCES asan_globals_win.cpp 297 asan_win_dll_thunk.cpp 298 CFLAGS ${ASAN_CFLAGS} -DSANITIZER_DLL_THUNK 299 DEFS ${ASAN_COMMON_DEFINITIONS} 300 DEPS ${ASAN_DEPS}) 301 302 add_compiler_rt_runtime(clang_rt.asan_dll_thunk 303 STATIC 304 ARCHS ${arch} 305 OBJECT_LIBS AsanDllThunk 306 UbsanDllThunk 307 SancovDllThunk 308 SanitizerCommonDllThunk 309 SOURCES $<TARGET_OBJECTS:RTInterception.${arch}> 310 PARENT_TARGET asan) 311 312 set(DYNAMIC_RUNTIME_THUNK_CFLAGS "-DSANITIZER_DYNAMIC_RUNTIME_THUNK") 313 if(MSVC) 314 list(APPEND DYNAMIC_RUNTIME_THUNK_CFLAGS "-Zl") 315 elseif(CMAKE_C_COMPILER_ID MATCHES Clang) 316 list(APPEND DYNAMIC_RUNTIME_THUNK_CFLAGS "-nodefaultlibs") 317 endif() 318 319 add_compiler_rt_object_libraries(AsanDynamicRuntimeThunk 320 ${SANITIZER_COMMON_SUPPORTED_OS} 321 ARCHS ${arch} 322 SOURCES asan_globals_win.cpp 323 asan_win_dynamic_runtime_thunk.cpp 324 CFLAGS ${ASAN_CFLAGS} ${DYNAMIC_RUNTIME_THUNK_CFLAGS} 325 DEFS ${ASAN_COMMON_DEFINITIONS} 326 DEPS ${ASAN_DEPS}) 327 328 add_compiler_rt_runtime(clang_rt.asan_dynamic_runtime_thunk 329 STATIC 330 ARCHS ${arch} 331 OBJECT_LIBS AsanDynamicRuntimeThunk 332 UbsanDynamicRuntimeThunk 333 SancovDynamicRuntimeThunk 334 SanitizerCommonDynamicRuntimeThunk 335 CFLAGS ${ASAN_CFLAGS} ${DYNAMIC_RUNTIME_THUNK_CFLAGS} 336 DEFS ${ASAN_COMMON_DEFINITIONS} 337 PARENT_TARGET asan) 338 endif() 339 endforeach() 340endif() 341 342add_compiler_rt_resource_file(asan_blacklist asan_blacklist.txt asan) 343 344add_subdirectory(scripts) 345 346if(COMPILER_RT_INCLUDE_TESTS) 347 add_subdirectory(tests) 348endif() 349