【complier】libxxx.so: has text relocations and -PIC

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!

原文地址:https://www.cnblogs.com/SoaringLee/p/10532294.html