编译 x86 Android 版 openssl 在模拟器运行

本文解决在Android设备上使用OpenSSL遇到的chmod权限、编译参数及库链接错误等问题,通过调整编译选项和参数,最终使OpenSSL在Android环境中正常运行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题一:chmod 无效

先push openssl程序
PATH=$HOME/apps/android-sdk/platform-tools:$PATH
adb -s emulator-5554 push $HOME/libs/android-x86-build/out_ndk16_x86_clang/bin/openssl /sdcard/Download/
登陆android,修改属性
adb -s emulator-5554 shell
cd /sdcard/Download/
chmod 777 openssl
切换到 su,仍然无效
# mv openssl /data/local/tmp/
# cd /data/local/tmp/
# chmod 777 openssl
# ls -l
修改成功。

问题二:运行报错

// 使用 -fPIC
"./openssl": error: Android 5.0 and later only support position-independent executables (-fPIE).

// 使用 -fPIE
CANNOT LINK EXECUTABLE "./openssl": "/data/local/tmp/openssl" has text relocations
gcc编译参数-fPIC

PIC就是position independent code
-fPIC 作用于编译阶段,告诉编译器产生与位置无关代码(Position-Independent Code),则产生的代码中,没有绝对地址,全部使用相对地址,故而代码可以被加载器加载到内存的任意位置,都可以正确的执行。

-fPIC用于生成动态库,-fPIE用与生成可执行文件 (我认为此说法不全面,如下)

  • 用gcc编译出位置无关可执行程序,必须使用 -fPIE 和 -pie 选项。其中,-fPIE选项用于编译器,从.c或.cpp编译出来的.o文件将是位置无关的目标文件。而-pie选项则用于链接器,链接器能够把-fPIE选项下编译出来的.o文件链接成位置无关可执行程序。

所以openssl加上编译选项:“-fPIE -pie”,运行,仍然报错:

CANNOT LINK EXECUTABLE "./openssl": "/data/local/tmp/openssl" has text relocations

是编译参数未生效?仔细查看./Configure生成的Makefile,参数都有。后来仔细思考了一翻,是由于没加“no-asm”参数造成。
重新push进模拟器,一切OK。

问题三:链接生成的openssl库报错

按此生成的openssl库,将不能用于其它程序,因为链接会报错:

ld: error: ...... libcrypto.a(dh_asn1.o): relocation R_386_GOTOFF against preemptible symbol DHxparams_it cannot be used when making a shared object

看来编译库只能使用 “-fPIC” 选项了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值