【问题标题】:compiling libcurl for android mips为 android mips 编译 libcurl
【发布时间】:2014-09-15 00:23:44
【问题描述】:

我创建了一个脚本,可以为 3 个平台(更像 4 个)为 android 编译 curl: 1.armv5 2.armv7 3.x86 4.mips

我在 SO:enter link description here 中使用此帖子进行操作 对于 arm 和 x86,一切正常(我使用我事先为相同平台编译的 ndk 工具链和 openssl 特定库)。 唯一有问题的平台是 mips。我确实得到了 libcrul.a、la 和 .so 但在尝试编译可执行文件 curl 时链接失败:

libtool: link: mipsel-linux-android-gcc -O2 -Wno-system-headers -o .libs/curl curl-tool_binmode.o curl-tool_bname.o curl-tool_cb_dbg.o curl-tool_cb_hdr.o curl-tool_cb_prg.o curl-tool_cb_rea.o curl-tool_cb_see.o curl-tool_cb_wrt.o curl-tool_cfgable.o curl-tool_convert.o curl-tool_dirhie.o curl-tool_doswin.o curl-tool_easysrc.o curl-tool_formparse.o curl-tool_getparam.o curl-tool_getpass.o curl-tool_help.o curl-tool_helpers.o curl-tool_homedir.o curl-tool_hugehelp.o curl-tool_libinfo.o curl-tool_main.o curl-tool_metalink.o curl-tool_mfiles.o curl-tool_msgs.o curl-tool_operate.o curl-tool_operhlp.o curl-tool_panykey.o curl-tool_paramhlp.o curl-tool_parsecfg.o curl-tool_setopt.o curl-tool_sleep.o curl-tool_urlglob.o curl-tool_util.o curl-tool_vms.o curl-tool_writeenv.o curl-tool_writeout.o curl-tool_xattr.o ../lib/curl-strtoofft.o ../lib/curl-strdup.o ../lib/curl-rawstr.o ../lib/curl-nonblock.o ../lib/curl-warnless.o  -L/usr/local/android-ndk/platforms/android-9/arch-mips/usr/lib -L/home/eyal/devel/openssl/lib ../lib/.libs/libcurl.so -lz
/usr/local/ndk-toolchains/mipsel-linux-android-4.6/bin/../lib/gcc/mipsel-linux-android/4.6/../../../../mipsel-linux-android/bin/ld: warning: libssl.so.1.1.0, needed by ../lib/.libs/libcurl.so, not found (try using -rpath or -rpath-link)
/usr/local/ndk-toolchains/mipsel-linux-android-4.6/bin/../lib/gcc/mipsel-linux-android/4.6/../../../../mipsel-linux-android/bin/ld: warning: libcrypto.so.1.1.0, needed by ../lib/.libs/libcurl.so, not found (try using -rpath or -rpath-link)
../lib/.libs/libcurl.so: undefined reference to `RAND_load_file'
../lib/.libs/libcurl.so: undefined reference to `SSL_CTX_use_certificate'
../lib/.libs/libcurl.so: undefined reference to `X509_load_crl_file'
../lib/.libs/libcurl.so: undefined reference to `SSL_set_fd'
../lib/.libs/libcurl.so: undefined reference to `SSL_set_connect_state'
../lib/.libs/libcurl.so: undefined reference to `SSL_CTX_free'
../lib/.libs/libcurl.so: undefined reference to `X509_free'

还有更多“未定义的引用”错误,我饶了你... 该库存在,-L 路径没问题,我检查了,权限似乎很好,而且它适用于 arm 和 x86 for android。 我正在使用--host=mipsel-linux-android,这可能是错误的,但似乎它是正确的,.so 和 .a 是构建的,所以一切顺利,但由于某种原因,ld 在尝试时无法找到 ssl 和 crypt创建和执行。

有人知道吗?当尝试手动使用工具链使用 libssl 编译文件时,我成功了!

10 倍。

【问题讨论】:

  • 您是否在真实设备上执行 MIPS 测试?如果有,是哪一个? (我一直在尝试查找 MIPS 设备进行测试,但在美国销售渠道中找不到)。
  • 我们只有一个设备,它在恶意软件研究实验室中,我已经很久没有使用它了,所以我不记得它的名字了,它很漂亮而且是粉红色的 :-) 是的,非常少,接近市场上不存在的 mips 设备,我使用 MIPS android 模拟器进行测试。将可执行文件放入 /data/local/ 并运行它。

标签: android curl ssl android-ndk mips


【解决方案1】:

../lib/.libs/libcurl.so:未定义对 `RAND_load_file' 的引用

这些是 OpenSSL 函数。你有为 MIPS 交叉编译的 OpenSSL 吗?如果有,是否可用?


libtool: link: mipsel-linux-android-gcc -O2 -Wno-system-headers -o .libs/curl curl-tool_binmode.o 
curl-tool_bname.o curl-tool_cb_dbg.o curl-tool_cb_hdr.o curl-tool_cb_prg.o curl-tool_cb_rea.o 
curl-tool_cb_see.o curl-tool_cb_wrt.o curl-tool_cfgable.o curl-tool_convert.o curl-tool_dirhie.o 
curl-tool_doswin.o curl-tool_easysrc.o curl-tool_formparse.o curl-tool_getparam.o 
curl-tool_getpass.o curl-tool_help.o curl-tool_helpers.o curl-tool_homedir.o curl-tool_hugehelp.o 
curl-tool_libinfo.o curl-tool_main.o curl-tool_metalink.o curl-tool_mfiles.o curl-tool_msgs.o 
curl-tool_operate.o curl-tool_operhlp.o curl-tool_panykey.o curl-tool_paramhlp.o 
curl-tool_parsecfg.o curl-tool_setopt.o curl-tool_sleep.o curl-tool_urlglob.o curl-tool_util.o 
curl-tool_vms.o curl-tool_writeenv.o curl-tool_writeout.o curl-tool_xattr.o ../lib/curl-strtoofft.o 
../lib/curl-strdup.o ../lib/curl-rawstr.o ../lib/curl-nonblock.o ../lib/curl-warnless.o 
 -L/usr/local/android-ndk/platforms/android-9/arch-mips/usr/lib -L/home/eyal/devel/openssl/lib 
../lib/.libs/libcurl.so -lz

好的...看起来您指定了libcrypto 和libssl 的路径:

-L/home/eyal/devel/openssl/lib

但看起来你并没有传入实际的库:

-lssl -lcrypto

我正在使用 --host=mipsel-linux-android 这可能是错误的...

这对我来说看起来不错。以下是 Autotools 列表中的人told me to use for Android/ARM:

./configure --build=`./config.guess` --host=arm-linux-androideabi

我希望 MIPS 能够使用类似这样的东西,因为 Autotools 的人传授了什么:

./configure --build=`./config.guess` --host=mipsel-linux-android

但我仍然认为你的还可以。

【讨论】:

  • 是的,我为上面指定的所有平台编译了 openssl,它在它的 Config perl 脚本中支持它们,我检查了,我还用文件 libssl.so 仔细检查了 .so 库并看到了确实是 32 位 mips 二进制文件。如果您指定 -L 并且您没有明确使用 openssl 函数但您的共享库 (libcurl.so) 使用了它,它应该会自动找到它,并且它适用于 arm 和 x86!只是 mips 让我头疼,顺便说一句,如果我明确指定 libssl 和 libcrypt 的路径,编译通过。
  • 对于 MIPS,我只需要添加到 LDFLAGS -lssl 和 -lcrypto 出于某种原因。其他拱门不需要它,如果你问我,mips 交叉编译 ld 中的错误。
  • @codeScriber openSSL 库的名称在每个平台上都不相同。如果我没记错的话,-lssl 和 -lcrypto 是由 openssl 包在 unix like/variant 平台下生成的库的名称。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-06-05
  • 1970-01-01
  • 2018-01-23
  • 2011-11-09
  • 2016-02-24
  • 2015-12-20
  • 2015-08-11
相关资源
最近更新 更多