Date: 2018.11.5
1、前言
在工程实现中,通常低层库采用动态库或静态库的形式,对于静态库,其中的函数符号是分段存放的,并且相对于每个段开始,地址都是绝对的;而动态库中的函数符号是全部存放在一起的,在链接时,可能需要重定位导致修改其中的函数地址。比如对于静态库进行解包并重新编译成动态库,这个时候就需要在编译.o文件时,加上-PIC,用于生成位置无关的代码。
2、关于编译选项-fPIC
https://en.wikipedia.org/wiki/Position-independent_code
3、libxxx.so: has text relocations
https://stackoverflow.com/questions/32346402/libavcodec-so-has-text-relocations/32609976#
问题原因:so动态链接库的代码并非PIC(Position independent code)的。
分析和解决方案:
在编译动态库.so和目标文件.o文件时,需要加上-fPIC,用于生成位置无关的代码。
若不添加-fPIC,则加载so文件的代码段时,代码段中引用的数据对象需要重定位,这样就导致修改了代码段的内容,导致不会链接这个.so文件了。
4、补充知识
参考:https://blog.csdn.net/ahence/article/details/68953878
定位哪个so文件有text relocations问题:
readelf -a path/to/yourlib.so | grep TEXTREL
如果输出如下所示:
0x00000016 (TEXTREL) 0x0
则说明这该so文件不是PIC,是有text relocations问题的。
说明:
TEXTREL表示代码段重定位表地址,PIC的共享对象不会包含任何代码段重定位表。因此如果上述命令无任何输出,则该表示so文件没有重定位问题。
一个App中通常会有多个so文件,有自己编写的,也有第三方的,可以使用上述方法来确定这些so文件是否有text relocations问题
THE END!