2017-08-24 3 views
0

J'essaye de construire un binaire Android simple pour tester UBSAN (désinfectant comportement non défini) en utilisant ndk r15c et clang. Cependant, la construction échoue lorsque vous essayez de créer un lien avec l'erreur suivante:Android nkd r15c et 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' 

Mon fichier Android.mk est la suivante:

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) 

Mon Application.mk est la suivante:

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

Je devine qu'il me manque un drapeau d'éditeur de liens ou un autre paramètre mais je n'ai pas été capable de comprendre ce qui se passe. En regardant les symboles dans l'exécution d'ubsan, les sybols semblent ainsi exister.

Note: J'ai également essayé d'utiliser LOCAL_SANITIZE: = undefined au lieu de -fsanitize = undefined dans mon Android.mk avec le même résultat.

Répondre

0

Nous ne pas expédier le moteur d'exécution de ubsan dans le NDK: https://github.com/android-ndk/ndk/issues/183

Pour l'instant, vous pouvez utiliser -fsanitize=undefined -fsanitize-trap=undefined à la place. Ce n'est pas idéal parce que plutôt qu'un diagnostic utile vous obtenez juste un piège (un SIGILL sur ARM, à peu près sûr que c'est la même chose pour d'autres plateformes), mais c'est mieux que rien jusqu'à ce que le Runtime soit dans le NDK.

+0

Le runtime UBSAN est inclus dans ndk r15c. Je vois la bibliothèque incluse, et si j'ajoute cela comme une bibliothèque préconstruite et un lien contre elle, les choses fonctionnent comme prévu. Cependant, l'utilisation des drapeaux ne semble pas fonctionner. – user821602