Не удалось найти символ «EVP_MD_CTX_new» при ссылке на «libcurl.so» - PullRequest
1 голос
/ 12 марта 2019

Я скомпилировал OpenSSL / 1.1.1b и Curl / 7.61.0 для Android. Обе библиотеки являются общими, и они компилируются без проблем. При запуске nm и readelf в библиотеках я получаю следующие выходные данные:

#
# Curl
#
❯ $NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64/bin/arm-linux-androideabi-nm -D libcurl.so | rg EVP_MD_CTX_
         U EVP_MD_CTX_free
         U EVP_MD_CTX_new

❯ $NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64/bin/arm-linux-androideabi-readelf -s app/src/main/jniLibs/armeabi-v7a/libcurl.so | rg EVP_MD_CTX_
    70: 00000000     0 FUNC    GLOBAL DEFAULT  UND EVP_MD_CTX_new@OPENSSL_1_1_0 (3)
    78: 00000000     0 FUNC    GLOBAL DEFAULT  UND EVP_MD_CTX_free@OPENSSL_1_1_0 (3)
  1793: 00000000     0 FUNC    GLOBAL DEFAULT  UND EVP_MD_CTX_new
  1801: 00000000     0 FUNC    GLOBAL DEFAULT  UND EVP_MD_CTX_free

#
# Crypto
#
❯ $NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64/bin/arm-linux-androideabi-nm -D libcrypto.so | rg EVP_MD_CTX_
00129e14 T EVP_MD_CTX_clear_flags
0011d080 T EVP_MD_CTX_copy
0011ceec T EVP_MD_CTX_copy_ex
0011d130 T EVP_MD_CTX_ctrl
0011cbb0 T EVP_MD_CTX_free
00129dd8 T EVP_MD_CTX_md
00129dec T EVP_MD_CTX_md_data
0011cb98 T EVP_MD_CTX_new
00129de4 T EVP_MD_CTX_pkey_ctx
0011cac0 T EVP_MD_CTX_reset
00129e04 T EVP_MD_CTX_set_flags
00129e30 T EVP_MD_CTX_set_pkey_ctx
00129dfc T EVP_MD_CTX_set_update_fn
00129e24 T EVP_MD_CTX_test_flags
00129df4 T EVP_MD_CTX_update_fn

❯ $NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64/bin/arm-linux-androideabi-readelf -s app/src/main/jniLibs/armeabi-v7a/libcrypto.so | rg EVP_MD_CTX_
   170: 0011cb98    24 FUNC    GLOBAL DEFAULT   11 EVP_MD_CTX_new@@OPENSSL_1_1_0
   172: 00129de4     8 FUNC    GLOBAL DEFAULT   11 EVP_MD_CTX_pkey_ctx@@OPENSSL_1_1_0
   174: 00129dd8    12 FUNC    GLOBAL DEFAULT   11 EVP_MD_CTX_md@@OPENSSL_1_1_0
   177: 0011cbb0    40 FUNC    GLOBAL DEFAULT   11 EVP_MD_CTX_free@@OPENSSL_1_1_0
   956: 00129dec     8 FUNC    GLOBAL DEFAULT   11 EVP_MD_CTX_md_data@@OPENSSL_1_1_0
  1166: 00129e04    16 FUNC    GLOBAL DEFAULT   11 EVP_MD_CTX_set_flags@@OPENSSL_1_1_0
  1168: 00129dfc     8 FUNC    GLOBAL DEFAULT   11 EVP_MD_CTX_set_update_fn@@OPENSSL_1_1_0
  1307: 0011ceec   404 FUNC    GLOBAL DEFAULT   11 EVP_MD_CTX_copy_ex@@OPENSSL_1_1_0
  1344: 0011cac0   216 FUNC    GLOBAL DEFAULT   11 EVP_MD_CTX_reset@@OPENSSL_1_1_0
  2127: 00129e30    76 FUNC    GLOBAL DEFAULT   11 EVP_MD_CTX_set_pkey_ctx@@OPENSSL_1_1_1
  2150: 00129e24    12 FUNC    GLOBAL DEFAULT   11 EVP_MD_CTX_test_flags@@OPENSSL_1_1_0
  2159: 00129e14    16 FUNC    GLOBAL DEFAULT   11 EVP_MD_CTX_clear_flags@@OPENSSL_1_1_0
  2164: 0011d130    56 FUNC    GLOBAL DEFAULT   11 EVP_MD_CTX_ctrl@@OPENSSL_1_1_0
  2165: 0011d080    32 FUNC    GLOBAL DEFAULT   11 EVP_MD_CTX_copy@@OPENSSL_1_1_0
  2276: 00129df4     8 FUNC    GLOBAL DEFAULT   11 EVP_MD_CTX_update_fn@@OPENSSL_1_1_0
 11007: 0011cb98    24 FUNC    GLOBAL DEFAULT   11 EVP_MD_CTX_new
 11009: 00129de4     8 FUNC    GLOBAL DEFAULT   11 EVP_MD_CTX_pkey_ctx
 11011: 00129dd8    12 FUNC    GLOBAL DEFAULT   11 EVP_MD_CTX_md
 11014: 0011cbb0    40 FUNC    GLOBAL DEFAULT   11 EVP_MD_CTX_free
 11793: 00129dec     8 FUNC    GLOBAL DEFAULT   11 EVP_MD_CTX_md_data
 12003: 00129e04    16 FUNC    GLOBAL DEFAULT   11 EVP_MD_CTX_set_flags
 12005: 00129dfc     8 FUNC    GLOBAL DEFAULT   11 EVP_MD_CTX_set_update_fn
 12144: 0011ceec   404 FUNC    GLOBAL DEFAULT   11 EVP_MD_CTX_copy_ex
 12181: 0011cac0   216 FUNC    GLOBAL DEFAULT   11 EVP_MD_CTX_reset
 12964: 00129e30    76 FUNC    GLOBAL DEFAULT   11 EVP_MD_CTX_set_pkey_ctx
 12987: 00129e24    12 FUNC    GLOBAL DEFAULT   11 EVP_MD_CTX_test_flags
 12996: 00129e14    16 FUNC    GLOBAL DEFAULT   11 EVP_MD_CTX_clear_flags
 13001: 0011d130    56 FUNC    GLOBAL DEFAULT   11 EVP_MD_CTX_ctrl
 13002: 0011d080    32 FUNC    GLOBAL DEFAULT   11 EVP_MD_CTX_copy
 13113: 00129df4     8 FUNC    GLOBAL DEFAULT   11 EVP_MD_CTX_update_fn

#
# SSL
#
❯ $NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64/bin/arm-linux-androideabi-nm -D libssl.so | rg EVP_MD_CTX_
         U EVP_MD_CTX_copy
         U EVP_MD_CTX_copy_ex
         U EVP_MD_CTX_ctrl
         U EVP_MD_CTX_free
         U EVP_MD_CTX_md
         U EVP_MD_CTX_new
         U EVP_MD_CTX_set_flags

❯ $NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64/bin/arm-linux-androideabi-readelf -s libssl.so | rg EVP_MD_CTX_
   115: 00000000     0 FUNC    GLOBAL DEFAULT  UND EVP_MD_CTX_md@OPENSSL_1_1_0 (6)
   124: 00000000     0 FUNC    GLOBAL DEFAULT  UND EVP_MD_CTX_copy@OPENSSL_1_1_0 (6)
   125: 00000000     0 FUNC    GLOBAL DEFAULT  UND EVP_MD_CTX_copy_ex@OPENSSL_1_1_0 (6)
   127: 00000000     0 FUNC    GLOBAL DEFAULT  UND EVP_MD_CTX_free@OPENSSL_1_1_0 (6)
   129: 00000000     0 FUNC    GLOBAL DEFAULT  UND EVP_MD_CTX_new@OPENSSL_1_1_0 (6)
   140: 00000000     0 FUNC    GLOBAL DEFAULT  UND EVP_MD_CTX_set_flags@OPENSSL_1_1_0 (6)
   168: 00000000     0 FUNC    GLOBAL DEFAULT  UND EVP_MD_CTX_ctrl@OPENSSL_1_1_0 (6)
  2413: 00000000     0 FUNC    GLOBAL DEFAULT  UND EVP_MD_CTX_md
  2422: 00000000     0 FUNC    GLOBAL DEFAULT  UND EVP_MD_CTX_copy
  2423: 00000000     0 FUNC    GLOBAL DEFAULT  UND EVP_MD_CTX_copy_ex
  2425: 00000000     0 FUNC    GLOBAL DEFAULT  UND EVP_MD_CTX_free
  2427: 00000000     0 FUNC    GLOBAL DEFAULT  UND EVP_MD_CTX_new
  2438: 00000000     0 FUNC    GLOBAL DEFAULT  UND EVP_MD_CTX_set_flags
  2466: 00000000     0 FUNC    GLOBAL DEFAULT  UND EVP_MD_CTX_ctrl

Когда я пытаюсь загрузить библиотеки на Android с помощью следующего кода,

System.loadLibrary("crypto");
System.loadLibrary("ssl");
System.loadLibrary("curl");

Я получаю следующую ошибку:

E/art: dlopen("/data/app/com.example.lhahn.loadlibtest-1/lib/arm/libcurl.so", RTLD_LAZY) failed: dlopen failed: cannot locate symbol "EVP_MD_CTX_new" referenced by "libcurl.so"...
D/AndroidRuntime: Shutting down VM
E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.lhahn.loadlibtest, PID: 3925
    java.lang.UnsatisfiedLinkError: dlopen failed: cannot locate symbol "EVP_MD_CTX_new" referenced by "libcurl.so"...
        at java.lang.Runtime.loadLibrary(Runtime.java:371)
        at java.lang.System.loadLibrary(System.java:989)
        at com.example.lhahn.loadlibtest.MainActivity.onCreate(MainActivity.java:15)
        at android.app.Activity.performCreate(Activity.java:6289)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1119)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2646)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2758)
        at android.app.ActivityThread.access$900(ActivityThread.java:177)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1448)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:145)
        at android.app.ActivityThread.main(ActivityThread.java:5942)
        at java.lang.reflect.Method.invoke(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:372)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1400)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1195)
I/Process: Sending signal. PID: 3925 SIG: 9
Application terminated.

Однако, как видно из результатов команд, символ EVP_MD_CTX_new определен правильно (по крайней мере, так кажется). Теперь возникает вопрос: есть ли у вас представление о том, в чем может быть проблема? Одна вещь, которую я не понимаю, это символ EVP_MD_CTX_new@OPENSSL_1_1_0 (3). Я понятия не имею, что означает суффикс @OPENSSL_1_1_0 (3).

Следует отметить, что при статической компиляции библиотеки OpenSSL с помощью libcurl.so вызов loadLibrary работает правильно. Другое дело, что я собираю библиотеку OpenSSL с помощью следующего вызова:

make SHLIB_VERSION_NUMBER= SHLIB_EXT=.so install

Это необходимо для того, чтобы libcrypto.so и libssl.so не получали номер версии суффикса. Может быть, это может быть проблемой?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...