在一个项目中,我的同事创建了一个静态库,例如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不允许重定位在共享对象中。
有人对此有所了解吗?
谢谢。
答案 0 :(得分:2)
您不能,因为共享库中的代码必须使用-fPIC
进行编译,而静态库中的代码则不能编译。如果你设法做到这一点,生成的可执行文件最终会多次与libc链接,无论如何都会非常脆弱,可能迟早会崩溃,所以你不应该这样做。因此:
<强>不即可。动态库必须动态链接到系统库,任何链接到任何动态库的可执行文件也必须动态链接系统库。
我还想提醒您,将GNU libc与非GPL应用程序静态链接是非法的,因为LGPL仅排除动态链接代码。这是为了允许错误修复库而无需重新编译可能无法获得源的可执行文件。在Linux中使用bugfixed版本升级共享库而不重新编译依赖的可执行文件是相当常见的; libc开发人员知道如何做到这一点。