动态链接警告:creating a DT_TEXTREL in object

前一段时间将一个模块做成动态库的过程中,编译.so的时候有一个警告:creating a DT_TEXTREL in object。

但是明明makefile里面是有加fPIC的,不知为何还会生成DT_TEXTREL。

导致设备启动的时候加载.so文件的时候,弹出了“Can't modify /lib/libispfront.so's text section. Use GCC option -fPIC for shared objects, please.”

对着makefile瞅了半天,也没发现哪里有问题。

问题实际上出在这个.so文件所链接的一个静态库上,这个静态库编译的时候是没加fPIC的,所以生成的代码不是地址无关的,

导致的最终结果是生成的.so中一半地址无关代码,一半地址相关需要重定位的。

正常来说这种.so应该也是能正常加载的,但是不知为何,可能链接器做了什么我不了解的限制,只加载fPIC的.so,

或者是链接器链接的时候有什么选项没有选对?

但是,可悲的是这个静态库的源代码随着部门划分划走了,所以拿不到源代码,也就无法重新编译。

最终想了另外一个办法饶了过去,将这个静态库从.so中拎了出来,放在可执行程序中,然后就只把能编译的代码编成.so。

问题暂时是绕过去了,但是这个降低耦合的目的没有达到,起码是事倍功半。。。

当看到这样的错误信息时,你正在处理的是一个动态链接(Dynamic Linked Libraries, DLLs)程序,特别是Position Independent Executables (PIE) 类型的。警告信息提到`creating DT_TEXTREL in a PIE`,表示链接器发现了一个文本关联关系(Text Relocation)在可执行文件的 Position Independent Code (PIC) 中,这是不应该出现在PIE中的一种情况。 PIE是一种Linux特有的可执行文件格式,它使得程序可以在不同的地址空间上运行而无需修改其内容,这对于动态链接非常关键,因为它允许共享库独立于主程序加载。然而,创建文本关联关系通常意味着某些代码依赖于静态链接或全局偏移量,这对PIE来说是不允许的。 导致这个问题的原因可能是: 1. **不兼容的链接器选项**:你可能设置了错误的链接器选项,比如不小心指定了静态链接而非动态链接。 2. **库的问题**:某些依赖的库可能不是PIE友好,或者在链接过程中没有正确处理。 3. **代码中的硬编码地址**:如果你的代码直接引用了函数地址或者其他静态资源,可能会生成这种警告。 4. **交叉编译**:如果你在一个平台上编译目标为另一个平台的程序,也可能出现问题,因为目标平台的地址布局与原平台不同。 解决这个问题,你需要检查链接配置,并确保所有的库都支持PIE模式。可能需要重新配置链接选项,比如删除`-Ttext-section-literals`之类的可能导致DT_TEXTREL的选项,或者对那些不能作为PIE处理的库进行特殊处理。如果问题仍然存在,检查代码中是否有需要修改的地方以适应PIE模式。在完成修正后,再次尝试编译。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值