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