试图编译OpenSSL库libcrypto.a包装时错误 [英] error when trying to compile wrapper for openssl library libcrypto.a

查看:2878
本文介绍了试图编译OpenSSL库libcrypto.a包装时错误的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图建立围绕Android的libcrypto.a包装一个动态库在

描述

<一个href=\"http://wiki.openssl.org/index.php/FIPS_Library_and_Android#Using_FIPS_OpenSSL_in_a_real_Application\" rel=\"nofollow\">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 /本地/ SSL / Android的14 /包括-Wl,-Bstatic -lcrypto -L / USR /本地/ SSL / Android的14 / lib目录-o libwrapper.so --sysroot = /用户/ scoleman / Android的NDK-r9d /平台/ Android的14 /弓臂轮候册,-Bdynamic

下面是结果:

<$p$p><$c$c>/Users/scoleman/android-ndk-r9d/toolchains/arm-linux-androideabi-4.6/$p$pbuilt/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/libc.a(a​​texit.o):atexit对的多重定义
/Users/scoleman/android-ndk-r9d/toolchains/arm-linux-androideabi-4.6/$p$pbuilt/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定义
/Users/scoleman/android-ndk-r9d/toolchains/arm-linux-androideabi-4.6/$p$pbuilt/darwin-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld:错误:无法找到-ldl
collect2:劳工处返回1退出状态

下面是我的wrapper.c:

 的#include&LT;&string.h中GT;
#包括LT&;&jni.h GT;INT MY_FIPS_mode(){
   INT模式=模式= FIPS_mode();
   返回模式;
}


解决方案

 下面是我使用编译命令行:在arm-linux的-androideabi-GCC wrapper.c -fPIC -shared -I在/ usr /本地/ SSL / Android的14 /包括-Wl,-Bstatic -lcrypto -L在/ usr /本地/ SSL / Android的14 / lib目录 - Ølibwrapper.so --sysroot = /用户/ scoleman / Android的NDK-r9d /平台/ Android的14 /弓臂轮候册,-Bdynamic

我能够与您的命令行复制的问题。我将接近这个问题的方法是(增加了可读性换行):

  ARM-Linux的androideabi-GCC wrapper.c -fPIC -shared -o libwrapper.so
    --sysroot = ... / Android的NDK-r9d /平台/ Android的14 /弓臂
    -I在/ usr /本地/ SSL / Android的14 /包括
    /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.a crtbegin_so.o

我避免 -Bstatic -Bdynamic 。当我想静态链接,我专门召唤出静态库的完整路径,如 /usr/local/ssl/android-14/lib/libcrypto.a 。请记住,归档是目标文件( * 0 ),所以你可以用它随时随地可以使用的目标文件。

的集合

从页面使用 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 /平台/ Android的14 /弓臂
ANDROID_TOOLCHAIN​​:/opt/android-ndk-r9/tool​​chains/arm-linux-androideabi-4.6/$p$pbuilt/darwin-x86_64/bin
CROSS_COMPILE ARM-Linux的androideabi-
ANDROID_DEV中:/ opt / Android的NDK-R9 /平台/ Android的14 /弓臂的/ usr$猫wrapper.c
#包括LT&;&string.h中GT;
#包括LT&;&jni.h GT;
#包括LT&;的OpenSSL / evp.h&GT;INT MY_FIPS_mode(){
    INT模式= FIPS_mode();
    返回模式;
}$臂Linux的androideabi-GCC wrapper.c -fPIC -shared -o libwrapper.so \\
&GT; --sysroot = $ ANDROID_SYSROOT \\
&GT; -I在/ usr /本地/ SSL / Android的14 /包括\\
&GT; /usr/local/ssl/android-14/lib/libssl.a \\
&GT; /usr/local/ssl/android-14/lib/libcrypto.a \\
&GT; -ldl$ LS
libwrapper.so setenv-android.sh wrapper.c$臂Linux的androideabi-readelf -h libwrapper.so
ELF头:
  魔:1408米45 4C 46 01 01 01 00 00 00 00 00 00 00 00 00
  类别:ELF32
  数据:2的补,小尾数
  版本:1(电流)
  OS / ABI:UNIX - 系统V
  ABI版本:0
  类型:DYN(共享对象文件)
  机:ARM
  版本:为0x1
  入口地址:为0x0
  程序头开始:52(字节到文件)
  节头的开始:244660(字节到文件)
  标志:0x5000000,版本5 EABI
  这个头的大小:52(字节)
  程序头的尺寸:32(字节)
  程序头数:7
  节头的大小:40(字节)
  节头数:34
  节头字符串表指数:33$臂Linux的androideabi纳米-D libwrapper.so | grep的MY_FIPS_mode
00009fa4ŧMY_FIPS_mode

I'm trying to build a dynamic library for android wrapper around libcrypto.a as described in

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

I've produced the libcrypto.a as suggested on the page, but when I try to compile my wrapper.c I get a linker error, multiple definition of 'atexit'

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

Here are the results:

/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

Here's my wrapper.c:

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

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

解决方案

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

I was able to duplicate the issue with your command line. The way I would approach this is (line breaks added for readability):

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 will bring in the platform headers and libraries for Android 4.0 (API 14). That should be where atexit is defined. I think the -Bstatic and -Bdynamic might be complicating things since atexit was provided by both libc.a and crtbegin_so.o.

I avoid -Bstatic and -Bdynamic. When I want static linking, I specifically call out the full pathname of the static library, like /usr/local/ssl/android-14/lib/libcrypto.a. Remember, an archive is a collection of object files (*.o), so you can use it wherever you can use an object file.


Using the setenv-android.sh script from the page and your source, I was not able to duplicate:

$ . ./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

这篇关于试图编译OpenSSL库libcrypto.a包装时错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆