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