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