问题一: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” 选项了。