1############################################## 2## Perform configuration steps for sanitizers. 3############################################## 4 5my_sanitize := $(strip $(LOCAL_SANITIZE)) 6 7# SANITIZE_HOST is only in effect if the module is already using clang (host 8# modules that haven't set `LOCAL_CLANG := false` and device modules that 9# have set `LOCAL_CLANG := true`. 10my_global_sanitize := 11ifeq ($(my_clang),true) 12 ifdef LOCAL_IS_HOST_MODULE 13 my_global_sanitize := $(strip $(SANITIZE_HOST)) 14 15 # SANITIZE_HOST=true is a deprecated way to say SANITIZE_HOST=address. 16 my_global_sanitize := $(subst true,address,$(my_global_sanitize)) 17 else 18 my_global_sanitize := $(strip $(SANITIZE_TARGET)) 19 endif 20endif 21 22# The sanitizer specified by the environment wins over the module. 23ifneq ($(my_global_sanitize),) 24 my_sanitize := $(my_global_sanitize) 25endif 26 27# Don't apply sanitizers to NDK code. 28ifdef LOCAL_SDK_VERSION 29 my_sanitize := 30endif 31 32# Never always wins. 33ifeq ($(LOCAL_SANITIZE),never) 34 my_sanitize := 35endif 36 37# TSAN is not supported on 32-bit architectures. For non-multilib cases, make 38# its use an error. For multilib cases, don't use it for the 32-bit case. 39ifneq ($(filter thread,$(my_sanitize)),) 40 ifeq ($(my_32_64_bit_suffix),32) 41 ifeq ($(my_module_multilib),both) 42 my_sanitize := $(filter-out thread,$(my_sanitize)) 43 else 44 $(error $(LOCAL_PATH): $(LOCAL_MODULE): TSAN cannot be used for 32-bit modules.) 45 endif 46 endif 47endif 48 49# Undefined symbols can occur if a non-sanitized library links 50# sanitized static libraries. That's OK, because the executable 51# always depends on the ASan runtime library, which defines these 52# symbols. 53ifneq ($(strip $(SANITIZE_TARGET)),) 54 ifndef LOCAL_IS_HOST_MODULE 55 ifeq ($(LOCAL_MODULE_CLASS),SHARED_LIBRARIES) 56 ifeq ($(my_sanitize),) 57 my_allow_undefined_symbols := true 58 endif 59 endif 60 # Workaround for a bug in AddressSanitizer that breaks stack unwinding. 61 # https://code.google.com/p/address-sanitizer/issues/detail?id=387 62 # Revert when external/compiler-rt is updated past r236014. 63 LOCAL_PACK_MODULE_RELOCATIONS := false 64 endif 65endif 66 67# Sanitizers can only be used with clang. 68ifneq ($(my_clang),true) 69 ifneq ($(my_sanitize),) 70 $(error $(LOCAL_PATH): $(LOCAL_MODULE): Use of sanitizers requires LOCAL_CLANG := true) 71 endif 72endif 73 74ifneq ($(filter default-ub,$(my_sanitize)),) 75 my_sanitize := $(CLANG_DEFAULT_UB_CHECKS) 76endif 77 78ifneq ($(filter coverage,$(my_sanitize)),) 79 ifeq ($(filter address,$(my_sanitize)),) 80 $(error $(LOCAL_PATH): $(LOCAL_MODULE): Use of 'coverage' also requires 'address') 81 endif 82 my_cflags += -fsanitize-coverage=edge,indirect-calls,8bit-counters,trace-cmp 83 my_sanitize := $(filter-out coverage,$(my_sanitize)) 84endif 85 86ifneq ($(my_sanitize),) 87 fsanitize_arg := $(subst $(space),$(comma),$(my_sanitize)) 88 my_cflags += -fsanitize=$(fsanitize_arg) 89 90 ifdef LOCAL_IS_HOST_MODULE 91 my_cflags += -fno-sanitize-recover=all 92 my_ldflags += -fsanitize=$(fsanitize_arg) 93 my_ldlibs += -lrt -ldl 94 else 95 ifeq ($(filter address,$(my_sanitize)),) 96 my_cflags += -fsanitize-trap=all 97 my_cflags += -ftrap-function=abort 98 endif 99 my_shared_libraries += libdl 100 endif 101endif 102 103ifneq ($(filter address,$(my_sanitize)),) 104 # Frame pointer based unwinder in ASan requires ARM frame setup. 105 LOCAL_ARM_MODE := arm 106 my_cflags += $(ADDRESS_SANITIZER_CONFIG_EXTRA_CFLAGS) 107 my_ldflags += $(ADDRESS_SANITIZER_CONFIG_EXTRA_LDFLAGS) 108 ifdef LOCAL_IS_HOST_MODULE 109 # -nodefaultlibs (provided with libc++) prevents the driver from linking 110 # libraries needed with -fsanitize=address. http://b/18650275 (WAI) 111 my_ldlibs += -lm -lpthread 112 my_ldflags += -Wl,--no-as-needed 113 else 114 my_cflags += -mllvm -asan-globals=0 115 # ASan runtime library must be the first in the link order. 116 my_shared_libraries := $($(LOCAL_2ND_ARCH_VAR_PREFIX)ADDRESS_SANITIZER_RUNTIME_LIBRARY) \ 117 $(my_shared_libraries) \ 118 $(ADDRESS_SANITIZER_CONFIG_EXTRA_SHARED_LIBRARIES) 119 my_static_libraries += $(ADDRESS_SANITIZER_CONFIG_EXTRA_STATIC_LIBRARIES) 120 121 my_linker := $($(LOCAL_2ND_ARCH_VAR_PREFIX)ADDRESS_SANITIZER_LINKER) 122 # Make sure linker_asan get installed. 123 $(LOCAL_INSTALLED_MODULE) : | $(PRODUCT_OUT)$($(LOCAL_2ND_ARCH_VAR_PREFIX)ADDRESS_SANITIZER_LINKER) 124 endif 125endif 126 127ifneq ($(filter undefined,$(my_sanitize)),) 128 ifndef LOCAL_IS_HOST_MODULE 129 $(error ubsan is not yet supported on the target) 130 endif 131endif 132 133ifneq ($(strip $(LOCAL_SANITIZE_RECOVER)),) 134 recover_arg := $(subst $(space),$(comma),$(LOCAL_SANITIZE_RECOVER)), 135 my_cflags += -fsanitize-recover=$(recover_arg) 136endif 137