2017-08-24 38 views
0

我想建立一個簡單的Android二進制文件來測試UBSAN(未定義的行爲消毒劑)使用ndk r15c和鏗。Android nkd r15c和UBSAN鐺

jni/main.cpp:17: error: undefined reference to '__ubsan_handle_type_mismatch_v1' 
jni/main.cpp:24: error: undefined reference to '__ubsan_handle_add_overflow' 
jni/main.cpp:30: error: undefined reference to '__ubsan_handle_type_mismatch_v1' 
jni/main.cpp:32: error: undefined reference to '__ubsan_handle_type_mismatch_v1' 
jni/main.cpp:32: error: undefined reference to '__ubsan_handle_type_mismatch_v1' 
jni/main.cpp:32: error: undefined reference to '__ubsan_handle_dynamic_type_cache_miss' 
jni/main.cpp:33: error: undefined reference to '__ubsan_handle_dynamic_type_cache_miss' 
jni/main.cpp:33: error: undefined reference to '__ubsan_handle_dynamic_type_cache_miss' 
jni/main.cpp:34: error: undefined reference to '__ubsan_vptr_type_cache' 
jni/main.cpp:34: error: undefined reference to '__ubsan_vptr_type_cache' 
jni/main.cpp:34: error: undefined reference to '__ubsan_vptr_type_cache' 
jni/main.cpp:34: error: undefined reference to '__ubsan_handle_dynamic_type_cache_miss' 
jni/main.cpp:36: error: undefined reference to '__ubsan_vptr_type_cache' 
/opt/android_ndk/android-ndk-r15c/sources/cxx-stl/stlport/stlport/stl/_ostream.c:336: error: undefined reference to '__ubsan_handle_sub_overflow' 
/opt/android_ndk/android-ndk-r15c/sources/cxx-stl/stlport/stlport/stl/_ostream.c:357: error: undefined reference to '__ubsan_handle_load_invalid_value' 
/opt/android_ndk/android-ndk-r15c/sources/cxx-stl/stlport/stlport/stl/_ostream.c:343: error: undefined reference to '__ubsan_handle_load_invalid_value' 
/opt/android_ndk/android-ndk-r15c/sources/cxx-stl/stlport/stlport/stl/_ostream.c:348: error: undefined reference to '__ubsan_handle_load_invalid_value' 
/opt/android_ndk/android-ndk-r15c/sources/cxx-stl/stlport/stlport/stl/_ostream.h:192: error: undefined reference to '__ubsan_handle_load_invalid_value' 
/opt/android_ndk/android-ndk-r15c/sources/cxx-stl/stlport/stlport/stl/_ostream.h:136: error: undefined reference to '__ubsan_handle_negate_overflow' 
/opt/android_ndk/android-ndk-r15c/sources/cxx-stl/stlport/stlport/stl/char_traits.h:194: error: undefined reference to '__ubsan_handle_negate_overflow' 
/opt/android_ndk/android-ndk-r15c/sources/cxx-stl/stlport/stlport/stl/_string.h:379: error: undefined reference to '__ubsan_handle_add_overflow' 
/opt/android_ndk/android-ndk-r15c/sources/cxx-stl/stlport/stlport/stl/_string_base.h:105: error: undefined reference to '__ubsan_handle_negate_overflow' 
/opt/android_ndk/android-ndk-r15c/sources/cxx-stl/stlport/stlport/stl/_string_base.h:105: error: undefined reference to '__ubsan_handle_divrem_overflow' 
/opt/android_ndk/android-ndk-r15c/sources/cxx-stl/stlport/stlport/stl/_alloc.h:330: error: undefined reference to '__ubsan_handle_negate_overflow' 
/opt/android_ndk/android-ndk-r15c/sources/cxx-stl/stlport/stlport/stl/_alloc.h:330: error: undefined reference to '__ubsan_handle_divrem_overflow' 
/opt/android_ndk/android-ndk-r15c/sources/cxx-stl/stlport/stlport/stl/_alloc.h:352: error: undefined reference to '__ubsan_handle_divrem_overflow' 

我Android.mk文件如下:

LOCAL_PATH:= $(call my-dir) 
include $(CLEAR_VARS) 

LOCAL_CFLAGS += -Wall 

LOCAL_LDLIBS := -L$(LOCAL_PATH)/lib -llog -g 

LOCAL_C_INCLUDES := bionic 
LOCAL_C_INCLUDES += $(LOCAL_PATH)/include 

LOCAL_SRC_FILES:= main.cpp 
LOCAL_CPPFLAGS := -Wall -fPIE -fexceptions -fsanitize=undefined 
LOCAL_LDLIBS := -L$(SYSROOT)/usr/lib -llog -fPIE -pie -fsanitize=undefined 

LOCAL_MODULE := ubsan_test 

include $(BUILD_EXECUTABLE) 

我Application.mk如下:然而構建試圖與下面的錯誤鏈接失敗時

NDK_TOOLCHAIN_VERSION:=clang 
APP_STL:=stlport_static 
APP_ABI := armeabi armeabi-v7a 
APP_PLATFORM := android-17 

我猜測我錯過了一些鏈接器標誌或其他設置,但一直未能弄清楚發生了什麼。查看ubsan運行時中的符號,sybol似乎就存在了。

注意:我也試過在我的Android.mk中使用LOCAL_SANITIZE:= undefined代替-fsanitize = undefined,結果相同。

回答

0

目前我們不出貨ubsan運行在NDK:https://github.com/android-ndk/ndk/issues/183

現在,您可以使用-fsanitize=undefined -fsanitize-trap=undefined代替。這是不理想的,因爲不是一個有用的診斷,你只是得到一個陷阱(ARM上的SIGILL,相當確定它在其他平臺上是一樣的),但是直到我們將ubsan運行時加入NDK,它總比沒有好。

+0

UBSAN運行時包含在ndk r15c中。我看到這個庫包括在內,如果我將它作爲一個預先構建的庫並添加鏈接,就可以按預期工作。但是,使用這些標誌似乎不起作用。 – user821602