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