Linux   发布时间:2022-04-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了如何将libc.a链接到arm-linux中的共享库中使用arm-none-linux-gnueabi-gcc大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

概述

在一个项目中,我的同事创建了一个静态库,例如liba.a,它与app链接. 在liba.a中,他将libc malloc()覆盖为其所有者版本. 我创建了一个共享库libs.so,它也与app链接. 问题是当我的libs.so与app链接时,我的libs.so中使用的malloc()将是liba.a中的那个, 不是标准libc.so中的那个,这会导致问题. 然后,我想将libc.a静态链接到我的l
一个项目中,我的同事创建了一个静态库,例如liba.a,它与app链接.

在liba.a中,他将libc malloc()覆盖为其所有者版本.

我创建了一个共享库libs.so,它也与app链接.

问题是当我的libs.so与app链接时,我的libs.so中使用的malloc()将是liba.a中的那个,
不是标准libc.so中的那个,这会导致问题.

然后,我想将libc.a静态链接到我的libs.so,我为gcc使用了-static -shared -fPIC标志.

但我总是得到arm-2012.03 / bin /../ lib / gcc / arm-none-linux-gnueabi / 4.6.3 /../../../../ arm-none-linux-gnueabi / bin / ld:arm-2012.03 / bin /../ arm-none-linux-gnueabi / libc /usr/lib / libc.a(dl-tsd.o)(.text 0x14):共享对象中不允许R_ARM_TLS_LE32重定位.

有没有人有这个想法?

谢谢你.

解决方法

您不能,因为共享库中的代码必须使用-fPIC进行编译,而静态库中的代码则不能.如果你设法做到这一点,生成的可执行文件最终会多次与libc链接,无论如何都会非常脆弱,可能迟早会崩溃,所以你不应该这样做.因此:

别.动态库必须动态链接到系统库,任何链接到任何动态库的可执行文件也必须动态链接系统库.

我还想提醒您,将GNU libc与非GPL应用程序静态链接是非法的,因为LGPL仅排除动态链接代码.这是为了允许错误修复库而无需重新编译可能无法获得源的可执行文件.在Linux中使用bugfixed版本@L_674_30@共享库而不重新编译依赖的可执行文件是相当常见的; libc开发人员知道如何做到这一点.

大佬总结

以上是大佬教程为你收集整理的如何将libc.a链接到arm-linux中的共享库中使用arm-none-linux-gnueabi-gcc全部内容,希望文章能够帮你解决如何将libc.a链接到arm-linux中的共享库中使用arm-none-linux-gnueabi-gcc所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。