config_sanitizers.mk revision 8f5e67a98c2ec05bd0c966f75222bc2bd52caf5b
1##############################################
2## Perform configuration steps for sanitizers.
3##############################################
4
5my_sanitize := $(strip $(LOCAL_SANITIZE))
6
7# Don't apply sanitizers to NDK code.
8ifdef LOCAL_SDK_VERSION
9  my_sanitize := never
10endif
11
12# Configure SANITIZE_HOST / SANITIZE_TARGET.
13ifeq ($(my_sanitize),)
14  ifdef LOCAL_IS_HOST_MODULE
15    my_sanitize := $(strip $(SANITIZE_HOST))
16  else
17    my_sanitize := $(strip $(SANITIZE_TARGET))
18  endif
19
20  # SANITIZE_HOST=true is a deprecated way to say SANITIZE_HOST=address.
21  ifeq ($(my_sanitize),true)
22    my_sanitize := address
23  endif
24
25  # SANITIZE_HOST is only in effect if the module is already using clang (host
26  # modules that haven't set `LOCAL_CLANG := false` and device modules that
27  # have set `LOCAL_CLANG := true`.
28  ifneq ($(my_clang),true)
29    my_sanitize :=
30  endif
31endif
32
33ifeq ($(my_sanitize),never)
34  my_sanitize :=
35endif
36
37# Undefined symbols can occur if a non-sanitized library links
38# sanitized static libraries. That's OK, because the executable
39# always depends on the ASan runtime library, which defines these
40# symbols.
41ifneq ($(strip $(SANITIZE_TARGET)),)
42  ifndef LOCAL_IS_HOST_MODULE
43    ifeq ($(LOCAL_MODULE_CLASS),SHARED_LIBRARIES)
44      ifeq ($(my_sanitize),)
45        my_allow_undefined_symbols := true
46      endif
47    endif
48  endif
49endif
50
51# Sanitizers can only be used with clang.
52ifneq ($(my_clang),true)
53  ifneq ($(my_sanitize),)
54    $(error $(LOCAL_PATH): $(LOCAL_MODULE): Use of sanitizers requires LOCAL_CLANG := true)
55  endif
56endif
57
58ifneq ($(filter default-ub,$(my_sanitize)),)
59  my_sanitize := $(CLANG_DEFAULT_UB_CHECKS)
60endif
61
62ifneq ($(my_sanitize),)
63  fsanitize_arg := $(subst $(space),$(comma),$(my_sanitize)),
64  my_cflags += -fsanitize=$(fsanitize_arg)
65
66  ifdef LOCAL_IS_HOST_MODULE
67    my_cflags += -fno-sanitize-recover=all
68    my_ldflags += -fsanitize=$(fsanitize_arg)
69    my_ldlibs += -ldl
70  else
71    my_cflags += -fsanitize-undefined-trap-on-error
72    my_cflags += -ftrap-function=abort
73    my_shared_libraries += libdl
74  endif
75endif
76
77ifneq ($(filter address,$(my_sanitize)),)
78  # Frame pointer based unwinder in ASan requires ARM frame setup.
79  LOCAL_ARM_MODE := arm
80  my_cflags += $(ADDRESS_SANITIZER_CONFIG_EXTRA_CFLAGS)
81  my_ldflags += $(ADDRESS_SANITIZER_CONFIG_EXTRA_LDFLAGS)
82  ifdef LOCAL_IS_HOST_MODULE
83    # -nodefaultlibs (provided with libc++) prevents the driver from linking
84    # libraries needed with -fsanitize=address. http://b/18650275 (WAI)
85    my_ldlibs += -lm -lpthread
86    my_ldflags += -Wl,--no-as-needed
87  else
88    my_cflags += -mllvm -asan-globals=0
89    # ASan runtime library must be the first in the link order.
90    my_shared_libraries := $($(LOCAL_2ND_ARCH_VAR_PREFIX)ADDRESS_SANITIZER_RUNTIME_LIBRARY) \
91                           $(my_shared_libraries) \
92                           $(ADDRESS_SANITIZER_CONFIG_EXTRA_SHARED_LIBRARIES)
93    my_static_libraries += $(ADDRESS_SANITIZER_CONFIG_EXTRA_STATIC_LIBRARIES)
94    my_ldflags += -Wl,-rpath,$($(LOCAL_2ND_ARCH_VAR_PREFIX)ADDRESS_SANITIZER_RPATH)
95    my_linker := $($(LOCAL_2ND_ARCH_VAR_PREFIX)ADDRESS_SANITIZER_LINKER)
96  endif
97endif
98
99ifneq ($(filter undefined,$(my_sanitize)),)
100  ifndef LOCAL_IS_HOST_MODULE
101    $(error ubsan is not yet supported on the target)
102  endif
103endif
104
105ifneq ($(strip $(LOCAL_SANITIZE_RECOVER)),)
106  recover_arg := $(subst $(space),$(comma),$(LOCAL_SANITIZE_RECOVER)),
107  my_cflags += -fsanitize-recover=$(recover_arg)
108endif
109