Android 尝试编译openssl库libcrypto.a的包装时出错

Android 尝试编译openssl库libcrypto.a的包装时出错,android,android-ndk,openssl,wrapper,linker-errors,Android,Android Ndk,Openssl,Wrapper,Linker Errors,我正试图围绕libcrypto.a为android包装器构建一个动态库,如中所述 我已经按照页面上的建议生成了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/s

我正试图围绕libcrypto.a为android包装器构建一个动态库,如中所述

我已经按照页面上的建议生成了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
这是我的包装纸

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

int MY_FIPS_mode()   {
   int mode = mode = FIPS_mode();
   return mode;
}
#包括
#包括
int MY_FIPS_mode(){
int mode=mode=FIPS_mode();
返回模式;
}
我可以用你的命令行复制这个问题。我的方法是(为可读性增加换行符):

--sysroot
将引入Android 4.0(API 14)的平台头和库。这应该是定义atexit的地方。我认为
-Bstatic
-Bdynamic
可能会使事情变得复杂,因为
atexit
是由
libc.a
crtbegin\u so.o
提供的

我避免使用
-b静态
-b动态
。当我需要静态链接时,我会特别调用静态库的完整路径名,比如
/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
$/setenv-android.sh
ANDROID\u NDK\u ROOT:/opt/ANDROID-NDK-r9
ANDROID_EABI:arm-linux-AndroidABI-4.6
ANDROID_API:ANDROID-14
ANDROID\u SYSROOT:/opt/ANDROID-ndk-r9/platforms/ANDROID-14/arch-arm
ANDROID_工具链:/opt/ANDROID-ndk-r9/toolschains/arm-linux-androideabi-4.6/prebuild/darwin-x86_64/bin
交叉编译:armlinux和androideabi-
ANDROID_-DEV:/opt/ANDROID-ndk-r9/platforms/ANDROID-14/arch-arm/usr
$cat包装器.c
#包括
#包括
#包括
int MY_FIPS_mode(){
int mode=FIPS_mode();
返回模式;
}
$arm linux androideabi gcc wrapper.c-fPIC-shared-o libwrapper.so\
>--sysroot=$ANDROID\u sysroot\
>-I/usr/local/ssl/android-14/include\
>/usr/local/ssl/android-14/lib/libssl.a\
>/usr/local/ssl/android-14/lib/libcrypto.a\
>-低密度脂蛋白
$ls
libwrapper.so setenv-android.sh wrapper.c
$arm linux androideabi readelf-h libwrapper.so
ELF标头:
魔术:7f 45 4c 46 01 01 00 00
类别:ELF32
数据:2的补码,小尾端
版本:1(当前版本)
OS/ABI:UNIX-SystemV
ABI版本:0
类型:DYN(共享对象文件)
机器:手臂
版本:0x1
入口点地址:0x0
程序头的开始:52(文件中的字节)
节头的开头:244660(文件中的字节)
标志:0x5000000,版本5 EABI
此标头的大小:52(字节)
程序头的大小:32(字节)
程序头数:7
节标题的大小:40(字节)
节头数:34
节头字符串表索引:33
$arm linux androideabi nm-D libwrapper.so | grep MY_FIPS_模式
00009fa4 T MY_FIPS_模式

废话。。。。您的
-Wl,-b动态
中有一个空格。删除该空间。该空间现在也可用:。它删除了不相关的FIPS内容。
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
$ . ./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