config_sanitizers.mk revision b32c0009a30098efbfb59a533bf3b213a3bbfb24
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. 13ifdef LOCAL_IS_HOST_MODULE 14 ifeq ($(my_sanitize),) 15 my_sanitize := $(strip $(SANITIZE_HOST)) 16 17 # SANTIZIZE_HOST=true is a deprecated way to say SANITIZE_HOST=address. 18 ifeq ($(my_sanitize),true) 19 my_sanitize := address 20 endif 21 22 # SANITIZE_HOST is only in effect if the module is already using clang (host 23 # modules that haven't set `LOCAL_CLANG := false` and device modules that 24 # have set `LOCAL_CLANG := true`. 25 ifneq ($(my_clang),true) 26 my_sanitize := 27 endif 28 endif 29endif 30 31ifeq ($(my_sanitize),never) 32 my_sanitize := 33endif 34 35# Sanitizers can only be used with clang. 36ifneq ($(my_clang),true) 37 ifneq ($(my_sanitize),) 38 $(error $(LOCAL_PATH): $(LOCAL_MODULE): Use of sanitizers requires LOCAL_CLANG := true) 39 endif 40endif 41 42ifneq ($(filter default-ub,$(my_sanitize)),) 43 my_sanitize := $(CLANG_DEFAULT_UB_CHECKS) 44 45 ifdef LOCAL_IS_HOST_MODULE 46 my_cflags += -fno-sanitize-recover=all 47 my_ldlibs += -ldl 48 else 49 my_cflags += -fsanitize-undefined-trap-on-error 50 my_shared_libraries += libdl 51 endif 52endif 53 54ifneq ($(my_sanitize),) 55 fsanitize_arg := $(subst $(space),$(comma),$(my_sanitize)), 56 my_cflags += -fsanitize=$(fsanitize_arg) 57 58 ifdef LOCAL_IS_HOST_MODULE 59 my_ldflags += -fsanitize=$(fsanitize_arg) 60 endif 61endif 62 63ifneq ($(filter address,$(my_sanitize)),) 64 # Frame pointer based unwinder in ASan requires ARM frame setup. 65 LOCAL_ARM_MODE := arm 66 my_cflags += $(ADDRESS_SANITIZER_CONFIG_EXTRA_CFLAGS) 67 my_ldflags += $(ADDRESS_SANITIZER_CONFIG_EXTRA_LDFLAGS) 68 ifdef LOCAL_IS_HOST_MODULE 69 # -nodefaultlibs (provided with libc++) prevents the driver from linking 70 # libraries needed with -fsanitize=address. http://b/18650275 (WAI) 71 my_ldlibs += -lm -ldl -lpthread 72 my_ldflags += -Wl,--no-as-needed 73 else 74 # ASan runtime library must be the first in the link order. 75 my_shared_libraries := $($(LOCAL_2ND_ARCH_VAR_PREFIX)ADDRESS_SANITIZER_RUNTIME_LIBRARY) \ 76 $(my_shared_libraries) \ 77 $(ADDRESS_SANITIZER_CONFIG_EXTRA_SHARED_LIBRARIES) 78 my_static_libraries += $(ADDRESS_SANITIZER_CONFIG_EXTRA_STATIC_LIBRARIES) 79 my_ldflags += -Wl,-rpath,$($(LOCAL_2ND_ARCH_VAR_PREFIX)ADDRESS_SANITIZER_RPATH) 80 endif 81endif 82 83ifneq ($(filter undefined,$(my_sanitize)),) 84 my_cflags += -fno-sanitize-recover=all 85 86 ifdef LOCAL_IS_HOST_MODULE 87 my_ldlibs += -ldl 88 else 89 $(error ubsan is not yet supported on the target) 90 endif 91endif 92 93 94ifneq ($(strip $(LOCAL_SANITIZE_RECOVER)),) 95 recover_arg := $(subst $(space),$(comma),$(LOCAL_SANITIZE_RECOVER)), 96 my_cflags += -fsanitize-recover=$(recover_arg) 97endif 98 99ifeq ($(strip $(LOCAL_DETECT_INTEGER_OVERFLOWS)),true) 100 ifeq ($(my_clang),true) 101 my_cflags += -fsanitize=signed-integer-overflow,unsigned-integer-overflow 102 my_cflags += -ftrap-function=abort 103 my_cflags += -fsanitize-undefined-trap-on-error 104 else 105 $(error $(LOCAL_MODULE): You must enable LOCAL_CLANG:=true to use LOCAL_DETECT_INTEGER_OVERFLOWS) 106 endif 107endif 108