config_sanitizers.mk revision 74b32b8dfcd5fdab7348d473635b056aea484add
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 my_cflags += -fsanitize-undefined-trap-on-error 96 my_cflags += -ftrap-function=abort 97 my_shared_libraries += libdl 98 endif 99endif 100 101ifneq ($(filter address,$(my_sanitize)),) 102 # Frame pointer based unwinder in ASan requires ARM frame setup. 103 LOCAL_ARM_MODE := arm 104 my_cflags += $(ADDRESS_SANITIZER_CONFIG_EXTRA_CFLAGS) 105 my_ldflags += $(ADDRESS_SANITIZER_CONFIG_EXTRA_LDFLAGS) 106 ifdef LOCAL_IS_HOST_MODULE 107 # -nodefaultlibs (provided with libc++) prevents the driver from linking 108 # libraries needed with -fsanitize=address. http://b/18650275 (WAI) 109 my_ldlibs += -lm -lpthread 110 my_ldflags += -Wl,--no-as-needed 111 else 112 my_cflags += -mllvm -asan-globals=0 113 # ASan runtime library must be the first in the link order. 114 my_shared_libraries := $($(LOCAL_2ND_ARCH_VAR_PREFIX)ADDRESS_SANITIZER_RUNTIME_LIBRARY) \ 115 $(my_shared_libraries) \ 116 $(ADDRESS_SANITIZER_CONFIG_EXTRA_SHARED_LIBRARIES) 117 my_static_libraries += $(ADDRESS_SANITIZER_CONFIG_EXTRA_STATIC_LIBRARIES) 118 my_ldflags += -Wl,-rpath,$($(LOCAL_2ND_ARCH_VAR_PREFIX)ADDRESS_SANITIZER_RPATH) 119 120 my_linker := $($(LOCAL_2ND_ARCH_VAR_PREFIX)ADDRESS_SANITIZER_LINKER) 121 # Make sure linker_asan get installed. 122 $(LOCAL_INSTALLED_MODULE) : | $(PRODUCT_OUT)$($(LOCAL_2ND_ARCH_VAR_PREFIX)ADDRESS_SANITIZER_LINKER) 123 endif 124endif 125 126ifneq ($(filter undefined,$(my_sanitize)),) 127 ifndef LOCAL_IS_HOST_MODULE 128 $(error ubsan is not yet supported on the target) 129 endif 130endif 131 132ifneq ($(strip $(LOCAL_SANITIZE_RECOVER)),) 133 recover_arg := $(subst $(space),$(comma),$(LOCAL_SANITIZE_RECOVER)), 134 my_cflags += -fsanitize-recover=$(recover_arg) 135endif 136