2017-08-24 1 views
0

Ich versuche, eine einfache Android-Binär zu bauen UBSAN (Undefined Verhalten Desinfektionsmittel) mit ndk R15C und Clang zu testen. Allerdings schlägt die Build bei dem Versuch, mit dem folgenden Fehler zu verknüpfen:Android nkd r15c und 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' 

Meine Android.mk Datei ist wie folgt:

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) 

Mein Application.mk ist wie folgt:

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

Ich vermute, dass ich einige Linker-Flag oder eine andere Einstellung fehlt, aber nicht in der Lage, herauszufinden, was los ist. Betrachtet man die Symbole in der Laufzeit von ubsan, scheinen die Symbole so zu existieren.

Hinweis: Ich habe auch versucht mit LOCAL_SANITIZE: = undefiniert anstelle von -fsanitize = undefined in meinem Android.mk mit dem gleichen Ergebnis.

Antwort

0

Wir derzeit nicht die ubsan Laufzeit im NDK versenden: https://github.com/android-ndk/ndk/issues/183

Vorerst Sie -fsanitize=undefined -fsanitize-trap=undefined stattdessen verwenden können. Dies ist nicht ideal, denn anstatt eine hilfreiche Diagnose zu erhalten, erhalten Sie nur eine Falle (eine SIGILL auf ARM, ziemlich sicher, dass es für andere Plattformen gleich ist), aber es ist besser als nichts, bis wir die Laufzeit in das NDK bekommen.

+0

Die UBSAN-Laufzeit ist in ndk r15c enthalten. Ich sehe, dass die Bibliothek enthalten ist, und wenn ich das als eine vorgefertigte Bibliothek und einen Link dagegen hinzufüge, funktionieren die Dinge wie erwartet. Die Verwendung der Flags scheint jedoch nicht zu funktionieren. – user821602

Verwandte Themen