使用-fPIC参数编译的动态库报 unexpected reloc type 0x03
在编译动态库时,由于没有加 -fPIC 参数,导致运行程序连接该动态库时报错:unexpected reloc type 0x03
查询资料,得出需要在编译动态库时使用 -fPIC 参数后,才能解决这个问题。
根据在gcc编译参数中增加 -fPIC 参数后,编译出来的库还是会报:unexpected reloc type 0x03 错误。
原因
通过查看编译参数发现,其中还存在 -fPIE -pie 参数
查询相关资料,发现 PIE 和 PIC 是类似的功能,一个是用于动态库编译,一个是用于可执行文件的编译。
修改
把编译参数中的 -fPIE -pie 去掉后,编译的动态库就可以正常链接了。
其他
使用 readelf -d libtest.so|grep TEXTREL 结果是否为空,可以确认库是否有使用 -fPIC 参数编译,空则有使用 -fPIC
使用 readelf -r libtest.so|grep R_ARM_REL32 也有同样的效果,并且能查看到具体是哪个函数导致的问题。