【问题标题】:error when trying to compile wrapper for openssl library libcrypto.a尝试为 openssl 库 libcrypto.a 编译包装器时出错
【发布时间】:2014-05-05 06:22:48
【问题描述】:

我正在尝试为围绕 libcrypto.a 的 android 包装器构建一个动态库,如

中所述

http://wiki.openssl.org/index.php/FIPS_Library_and_Android#Using_FIPS_OpenSSL_in_a_real_Application

我已经按照页面上的建议生成了 libcrypto.a,但是当我尝试编译我的 wrapper.c 时出现链接器错误,'atexit' 的多个定义

这是我用来编译的命令行:

arm-linux-androideabi-gcc wrapper.c -fPIC -shared -I/usr/local/ssl/android-14/include -Wl,-Bstatic -lcrypto -L/usr/local/ssl/android-14/lib -o libwrapper.so --sysroot=/Users/scoleman/android-ndk-r9d/platforms/android-14/arch-arm -Wl, -Bdynamic

结果如下:

/Users/scoleman/android-ndk-r9d/toolchains/arm-linux-androideabi-4.6/prebuilt/darwin-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld: error: /Users/scoleman/android-ndk-r9d/platforms/android-14/arch-arm/usr/lib/libc.a(atexit.o): multiple definition of 'atexit'
/Users/scoleman/android-ndk-r9d/toolchains/arm-linux-androideabi-4.6/prebuilt/darwin-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld: /Users/scoleman/android-ndk-r9d/platforms/android-14/arch-arm/usr/lib/crtbegin_so.o: previous definition here
/Users/scoleman/android-ndk-r9d/toolchains/arm-linux-androideabi-4.6/prebuilt/darwin-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld: error: cannot find -ldl
collect2: ld returned 1 exit status

这是我的 wrapper.c:

#include <string.h>
#include <jni.h>

int MY_FIPS_mode()   {
   int mode = mode = FIPS_mode();
   return mode;
}

【问题讨论】:

  • 废话....您的-Wl, -Bdynamic 中有一个空格。删除空格。
  • 现在也可以使用:OpenSSL and Android。它删除了不相关的 FIPS 内容。

标签: android android-ndk openssl wrapper linker-errors


【解决方案1】:
Here's the command line I'm using to compile:

arm-linux-androideabi-gcc wrapper.c -fPIC -shared -I/usr/local/ssl/android-14/include -Wl,-Bstatic -lcrypto -L/usr/local/ssl/android-14/lib -o libwrapper.so --sysroot=/Users/scoleman/android-ndk-r9d/platforms/android-14/arch-arm -Wl, -Bdynamic

我能够用你的命令行复制这个问题。我会采用的方法是(添加换行符以提高可读性):

arm-linux-androideabi-gcc wrapper.c -fPIC -shared -o libwrapper.so
    --sysroot=.../android-ndk-r9d/platforms/android-14/arch-arm
    -I/usr/local/ssl/android-14/include
    /usr/local/ssl/android-14/lib/libssl.a
    /usr/local/ssl/android-14/lib/libcrypto.a
    -ldl

--sysroot 将引入适用于 Android 4.0 (API 14) 的平台头文件和库。那应该是定义atexit 的地方。我认为-Bstatic-Bdynamic 可能会使事情复杂化,因为atexit 是由libc.acrtbegin_so.o 提供的。

我避免使用-Bstatic-Bdynamic。当我想要静态链接时,我会专门调出静态库的完整路径名,比如/usr/local/ssl/android-14/lib/libcrypto.a。请记住,存档是目标文件 (*.o) 的集合,因此您可以在任何可以使用目标文件的地方使用它。


使用页面和您的源中的setenv-android.sh 脚本,我无法复制:

$ . ./setenv-android.sh 
ANDROID_NDK_ROOT: /opt/android-ndk-r9
ANDROID_EABI: arm-linux-androideabi-4.6
ANDROID_API: android-14
ANDROID_SYSROOT: /opt/android-ndk-r9/platforms/android-14/arch-arm
ANDROID_TOOLCHAIN: /opt/android-ndk-r9/toolchains/arm-linux-androideabi-4.6/prebuilt/darwin-x86_64/bin
CROSS_COMPILE: arm-linux-androideabi-
ANDROID_DEV: /opt/android-ndk-r9/platforms/android-14/arch-arm/usr

$ cat wrapper.c 
#include <string.h>
#include <jni.h>
#include <openssl/evp.h>

int MY_FIPS_mode()   {
    int mode = FIPS_mode();
    return mode;
}

$ arm-linux-androideabi-gcc wrapper.c -fPIC -shared -o libwrapper.so \
>     --sysroot=$ANDROID_SYSROOT \
>     -I/usr/local/ssl/android-14/include \
>     /usr/local/ssl/android-14/lib/libssl.a \
>     /usr/local/ssl/android-14/lib/libcrypto.a \
>     -ldl

$ ls
libwrapper.so       setenv-android.sh   wrapper.c

$ arm-linux-androideabi-readelf -h libwrapper.so 
ELF Header:
  Magic:   7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00 
  Class:                             ELF32
  Data:                              2's complement, little endian
  Version:                           1 (current)
  OS/ABI:                            UNIX - System V
  ABI Version:                       0
  Type:                              DYN (Shared object file)
  Machine:                           ARM
  Version:                           0x1
  Entry point address:               0x0
  Start of program headers:          52 (bytes into file)
  Start of section headers:          244660 (bytes into file)
  Flags:                             0x5000000, Version5 EABI
  Size of this header:               52 (bytes)
  Size of program headers:           32 (bytes)
  Number of program headers:         7
  Size of section headers:           40 (bytes)
  Number of section headers:         34
  Section header string table index: 33

$ arm-linux-androideabi-nm -D libwrapper.so | grep MY_FIPS_mode
00009fa4 T MY_FIPS_mode

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多