【问题标题】:Android nkd r15c and UBSAN clangAndroid ndk r15c 和 UBSAN clang
【发布时间】:2018-02-02 19:03:05
【问题描述】:

我正在尝试使用 ndk r15c 和 clang 构建一个简单的 Android 二进制文件来测试 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 运行时中的符号,符号似乎存在。

注意:我也尝试在我的 Android.mk 中使用 LOCAL_SANITIZE := undefined 而不是 -fsanitize=undefined,结果相同。

【问题讨论】:

    标签: android c++ android-ndk clang ubsan


    【解决方案1】:

    我们目前不在 NDK 中发布 ubsan 运行时:https://github.com/android-ndk/ndk/issues/183

    目前,您可以改用-fsanitize=undefined -fsanitize-trap=undefined。这并不理想,因为您只会得到一个陷阱(ARM 上的 SIGILL,很确定它对于其他平台也是如此),而不是有用的诊断,但在我们将 ubsan 运行时放入 NDK 之前,总比没有好。

    【讨论】:

    • UBSAN 运行时包含在 ndk r15c 中。我看到包含的库,如果我将其添加为预建库并链接到它,事情就会按预期工作。但是,使用标志似乎不起作用。
    猜你喜欢
    • 2018-01-12
    • 1970-01-01
    • 2019-04-27
    • 2018-05-31
    • 1970-01-01
    • 1970-01-01
    • 2015-03-14
    • 2016-07-01
    • 1970-01-01
    相关资源
    最近更新 更多