From f0b15e173be354301fa38354d016211192e36460 Mon Sep 17 00:00:00 2001 From: Evgenii Stepanov Date: Fri, 24 Apr 2015 16:34:47 -0700 Subject: [PATCH] Fix AddressSanitizer link order and multilib setup. ASan runtime library (when using dynamic linking) must be the first dependency of the main executable to achieve correct symbol interposition. This matches how the clang driver works. In multilib setup, ASan-RT name depends on the target arch: /system/lib/libclang_rt.asan-arm-android.so /system/lib64/libclang_rt.asan-arm64-android.so We also set RPATH to /system/lib/asan or /system/lib64/asan to have a place for ASan-only versions of system libraries. Change-Id: I5c0cdb89e5e08a1950eb276e406da9f31a6e52dd --- core/clang/TARGET_arm.mk | 4 ++++ core/clang/TARGET_arm64.mk | 4 ++++ core/clang/config.mk | 4 +--- core/config_sanitizers.mk | 6 +++++- 4 files changed, 14 insertions(+), 4 deletions(-) diff --git a/core/clang/TARGET_arm.mk b/core/clang/TARGET_arm.mk index 6f6d6246c7..62ce2427ca 100644 --- a/core/clang/TARGET_arm.mk +++ b/core/clang/TARGET_arm.mk @@ -66,3 +66,7 @@ $(clang_2nd_arch_prefix)RS_TRIPLE_CFLAGS := $(clang_2nd_arch_prefix)RS_COMPAT_TRIPLE := armv7-none-linux-gnueabi $(clang_2nd_arch_prefix)TARGET_LIBPROFILE_RT := $(LLVM_RTLIB_PATH)/libclang_rt.profile-arm-android.a + +# Address sanitizer clang config +$(clang_2nd_arch_prefix)ADDRESS_SANITIZER_RUNTIME_LIBRARY := libclang_rt.asan-arm-android +$(clang_2nd_arch_prefix)ADDRESS_SANITIZER_RPATH := /system/lib/asan diff --git a/core/clang/TARGET_arm64.mk b/core/clang/TARGET_arm64.mk index b67d458820..ea4d93770e 100644 --- a/core/clang/TARGET_arm64.mk +++ b/core/clang/TARGET_arm64.mk @@ -64,3 +64,7 @@ RS_TRIPLE_CFLAGS := RS_COMPAT_TRIPLE := aarch64-linux-android TARGET_LIBPROFILE_RT := $(LLVM_RTLIB_PATH)/libclang_rt.profile-aarch64-android.a + +# Address sanitizer clang config +ADDRESS_SANITIZER_RUNTIME_LIBRARY := libclang_rt.asan-arm64-android +ADDRESS_SANITIZER_RPATH := /system/lib64/asan diff --git a/core/clang/config.mk b/core/clang/config.mk index 24c06b63c7..7947e6194f 100644 --- a/core/clang/config.mk +++ b/core/clang/config.mk @@ -144,12 +144,10 @@ clang_2nd_arch_prefix := $(TARGET_2ND_ARCH_VAR_PREFIX) include $(BUILD_SYSTEM)/clang/TARGET_$(TARGET_2ND_ARCH).mk endif -# Address sanitizer clang config -ADDRESS_SANITIZER_RUNTIME_LIBRARY := libclang_rt.asan_$(TARGET_ARCH)_android ADDRESS_SANITIZER_CONFIG_EXTRA_CFLAGS := -fno-omit-frame-pointer ADDRESS_SANITIZER_CONFIG_EXTRA_LDFLAGS := -Wl,-u,__asan_preinit -ADDRESS_SANITIZER_CONFIG_EXTRA_SHARED_LIBRARIES := libdl $(ADDRESS_SANITIZER_RUNTIME_LIBRARY) +ADDRESS_SANITIZER_CONFIG_EXTRA_SHARED_LIBRARIES := libdl ADDRESS_SANITIZER_CONFIG_EXTRA_STATIC_LIBRARIES := libasan # This allows us to use the superset of functionality that compiler-rt diff --git a/core/config_sanitizers.mk b/core/config_sanitizers.mk index 210d442409..6b0c6c8cdd 100644 --- a/core/config_sanitizers.mk +++ b/core/config_sanitizers.mk @@ -80,8 +80,12 @@ ifneq ($(filter address,$(my_sanitize)),) # libraries needed with -fsanitize=address. http://b/18650275 (WAI) my_ldlibs += -ldl -lpthread else - my_shared_libraries += $(ADDRESS_SANITIZER_CONFIG_EXTRA_SHARED_LIBRARIES) + # ASan runtime library must be the first in the link order. + my_shared_libraries := $($(LOCAL_2ND_ARCH_VAR_PREFIX)ADDRESS_SANITIZER_RUNTIME_LIBRARY) \ + $(my_shared_libraries) \ + $(ADDRESS_SANITIZER_CONFIG_EXTRA_SHARED_LIBRARIES) my_static_libraries += $(ADDRESS_SANITIZER_CONFIG_EXTRA_STATIC_LIBRARIES) + my_ldflags += -Wl,-rpath,$($(LOCAL_2ND_ARCH_VAR_PREFIX)ADDRESS_SANITIZER_RPATH) endif endif