如何将libc.a链接到arm-linux中的共享库中使用arm-none-linux-gn
在一个项目中,我的同事创建了一个静态库,例如liba.a,它与app链接.
在liba.a中,他将libc malloc()覆盖为其所有者版本. 我创建了一个共享库libs.so,它也与app链接. 问题是当我的libs.so与app链接时,我的libs.so中使用的malloc()将是liba.a中的那个, 然后,我想将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版本升级共享库而不重新编译依赖的可执行文件是相当常见的; libc开发人员知道如何做到这一点. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |