为什么“EVP_get_cipherbyname”符号只在一些Android设备上导出?

为什么“EVP_get_cipherbyname”符号只在一些Android设备上导出?,android,android-ndk,dynamic-linking,Android,Android Ndk,Dynamic Linking,我有一个用Qt为Android构建的应用程序。该应用程序附带了定制的openssl版本。这适用于大多数设备,但是,在一些设备上,一旦https请求完成,它就会崩溃 一个例子是三星-SM-G930AZ,API级别26(安卓8.0) 它在崩溃时生成以下跟踪 backtrace: #00 pc 00000000000667c4 /system/lib64/libc.so (strcasecmp+8) #01 pc 000000000023ddd0 /system/lib64/lib

我有一个用Qt为Android构建的应用程序。该应用程序附带了定制的openssl版本。这适用于大多数设备,但是,在一些设备上,一旦https请求完成,它就会崩溃

一个例子是三星-SM-G930AZ,API级别26(安卓8.0)

它在崩溃时生成以下跟踪

backtrace:
    #00 pc 00000000000667c4  /system/lib64/libc.so (strcasecmp+8)
    #01 pc 000000000023ddd0  /system/lib64/libandroid_runtime.so (EVP_get_cipherbyname+24)
    #02 pc 000000000003a5f0  /data/app/ch.opengis.qfield_beta-ojJ20GzjLOx-tvpq9AD27A==/lib/arm64/libssl_1_1.so (offset 0x29000)
我从这个设备下载了
libandroid\u runtime.so
文件,其中列出了提到的符号

readelf -Ws libandroid_runtime.so | grep EVP_get_cipherbyname
  3593: 000000000023dd78   336 FUNC    GLOBAL DEFAULT   12 EVP_get_cipherbyname
另一方面(不是崩溃的SM-T580,Android 8.1),情况并非如此

readelf -Ws /tmp/libandroid_runtime.so | grep EVP_get_cipherbyname
此符号也在应用程序附带的
libcrypto_1_1.中。我想这次碰撞应该对这次碰撞负责

在过去的几年中,Android 7完成了以下NDK更改:

为了减少此限制可能对当前发布的应用程序产生的影响,对于API级别为23或更低的应用程序,可以在Android 7.0(API级别24)上临时访问一组具有重要用途的库,如
libandroid_runtime.so
,[…]

该应用程序的目标API级别为29,因此我假设此库不应可用于此应用程序

如何避免这次事故? 可以阻止它加载
libandroid\u运行时吗?那么
可以使用特定的标志编译openssl吗?或者需要一种完全不同的方法吗