前言
高通8155平台有自己的客制化,仅按照google的描述在编译命令里面加上-fsanitize=address是不能够编译出来带ASAN的bin或者SO。还需要更多的编译属性配置。
一、system分区模块打开ASAN
修改自己对应模块bin以及shared libs 的Android.bp
1. 针对Android.bp情形
Android.bp 的cflags 里面添加 :
"-Wno-error", "-fno-omit-frame-pointer", "-O0", "-Wno-frame-larger-than="
Android.bp 申明属性 :
clang: true sanitize: {address: true,}
示例如下:
cc_defaults {
name: "asan_debugd_defaults",
cflags: [
"-Werror",
"-Wall",
//enable asan related cflags begin
"-Wno-error",
"-fno-omit-frame-pointer",
"-O0",
"-Wno-frame-larger-than=",
//enable asan related cflags end
],
clang: true, //ASAN related property
sanitize: {address: true,}, //ASAN option
cppflags: [
"-Wnon-virtual-dtor",
"-fno-strict-aliasing",
],
ldflags: [
"-Wl",
],
}
cc_binary {
name: "asan_debugd",
defaults: ["asan_debugd_defaults"],
static_libs: [ "libAsanDebug",],
shared_libs: [ "liblog", "libutils", "libcutils"],
srcs: ["asan_debugd.cpp"],
}
注意,如果bin开启了ASAN,则bin的static libraries 都默认开启ASAN。而shared libraries 不会感染编译配置。所以可疑的shared libs 也要加。
2, 针对Android.mk情形
Android.mk需要打开如下属性:
LOCAL_CFLAGS += -fno-omit-frame-pointer -O0 -Wno-frame-larger-than= -fsanitize=address
LOCAL_CLANG := true
LOCAL_SHARED_LIBRARIES +=libclang_rt.asan-aarch64-android
其中LOCAL_SHARED_LIBRARIES 所申明的.so,在/system/lib64/里面有,在/system/lib/里面的so叫另外一个名字libclang_rt.asan-arm-android.so, 所以最好仅编译64位版本。只要能复现问题,不必32、64位都要编译。
示例(仅演示64位)如下:
LOCAL_PATH := $(call my-dir)
################################### /system/bin/asan_debugd ############################################
include $(CLEAR_VARS)
LOCAL_MODULE := asan_debugd
LOCAL_CFLAGS := -Werror
LOCAL_LDFLAGS += -Wl
LOCAL_CPPFLAGS += -Wfloat-equal -Wformat=2 -Wshadow -fstack-protector-all
LOCAL_MODULE_TAGS := optional
LOCAL_MULTILIB :=64
LOCAL_SRC_FILES += asan_debugd.cpp
LOCAL_C_INCLUDES := $(LOCAL_PATH)
LOCAL_SHARED_LIBRARIES := liblog libutils libcutils \
libAsanDebug
#LOCAL_STATIC_LIBRARIES := libAsanDebug
#asan related cflags
LOCAL_CFLAGS += -fno-omit-frame-pointer -O0 -Wno-frame-larger-than= -fsanitize=address
LOCAL_CLANG := true
LOCAL_SHARED_LIBRARIES +=libclang_rt.asan-aarch64-android
include $(BUILD_EXECUTABLE)
二,vendor分区打开ASAN
1, 预编译ASAN库
vendor空间所开启的编译命令与上述类似。但是有个问题,在/vendor/lib64/里面没有libclang_rt.asan-aarch64-android.so,所以需要把/system/lib64/里面的libclang_rt.asan-aarch64-android.so 预编译到/vendor/lib64.
如果不会写预编译的Android.mk 可以点击下面链接下载,预编译的lib以及Android.mk我都整理号了:
高通8155p平台QNX+Android9开启ASAN定位内存问题方法Android.mk与Android.bp都有_高通8155资源-CSDN文库
上述文件夹下载好了,放到能够编译到的地方即可。然后修改自己模块的Android.mk或者Android.bp 以下假设我预编译到vendor/lib(64)的.so改名叫做libclang_rt.asan-android_vnd.so
为了方便大家调试,我把32、64位的.so都编译进去了。并且各位的Android.bp不用再声明32或者64了。
2,vendor分区Android.bp
cc_defaults {
name: "asan_debuglib_defaults_vnd",
cflags: [
"-Werror",
"-Wall",
"-Wno-error", // asan related cflags
"-fno-omit-frame-pointer", // asan related cflags
"-O0", // asan related cflags
"-Wno-frame-larger-than=" // asan related cflags
],
cppflags: [
"-Wnon-virtual-dtor",
"-fno-strict-aliasing",
],
ldflags: [
"-Wl",
],
shared_libs: [ "liblog", "libutils", "libcutils",
"libclang_rt.asan-android_vnd",
],
clang: true, // asan related cflags
sanitize: {address: true,}, // asan related cflags
compile_multilib: "64",
}
// vendor/lib64/libAsanDebug_vnd
cc_library_shared {
name: "libAsanDebug_vnd",
vendor: true, //vendor partition
defaults: ["asan_debuglib_defaults_vnd"],
static_libs: [
],
export_include_dirs: ["export_headers", ],
srcs: ["AsanDebug.cpp"],
}
3,vendor分区Android.mk
LOCAL_PATH := $(call my-dir)
##################################### /vendor/lib64/libAsanDebug_vnd #################################
include $(CLEAR_VARS)
LOCAL_MODULE := libAsanDebug_vnd
LOCAL_CFLAGS := -Werror
LOCAL_LDFLAGS += -Wl
LOCAL_MODULE_TAGS := optional
LOCAL_SRC_FILES += AsanDebug.cpp
LOCAL_C_INCLUDES := $(LOCAL_PATH) \
$(LOCAL_PATH)/export_headers
LOCAL_EXPORT_C_INCLUDE_DIRS := $(LOCAL_PATH)/export_headers
#ifeq (1,$(filter 1,$(shell echo "$$(( $(PLATFORM_SDK_VERSION) >= 26 ))" )))
LOCAL_PROPRIETARY_MODULE := true
#endif
LOCAL_SHARED_LIBRARIES :=liblog libutils libcutils
#asan related configure begin
LOCAL_CFLAGS += -