2017-08-24 11 views
0

ndk r15cとclangを使ってUBSAN(Undefined behavior sanitizer)をテストする簡単なAndroidバイナリを構築しようとしています。Android nkd r15cとUBSAN clang

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ランタイムのシンボルを見ると、sybolsが存在するように見えます。

注:Android.mkで-fsanitize = undefinedの代わりにLOCAL_SANITIZE:= undefinedを使用してみましたが、同じ結果が得られました。

答えて

0

我々は現在、NDKでubsanランタイムを出荷していない:https://github.com/android-ndk/ndk/issues/183

今のところ、あなたの代わりに-fsanitize=undefined -fsanitize-trap=undefinedを使用することができます。これは理想的ではありません。役立つ診断ではなく、トラップ(ARM上ではSIGILL、他のプラットフォームでも同じですが)が得られますが、ubsanランタイムをNDKに入れるまでは何も役に立ちません。

+0

UBSANランタイムはndk r15cに含まれています。私は図書館が含まれているのを見て、それをあらかじめ構築された図書館とそれにリンクすると、物事は期待どおりに機能します。しかし、フラグを使用することは機能していないようです。 – user821602

関連する問題