在一个项目中,我的同事创build了一个静态库,例如与应用程序链接的liba.a。
在liba.a中,他将libc malloc()覆盖为其所有者版本。
我创build了一个共享库libs.so它也与应用程序链接。
问题是当我的libs.so链接到应用程序时,我的libs.so中使用的malloc()将是liba.a中的malloc(),而不是标准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中使用错误版本升级共享库而不重新编译依赖的可执行文件相当普遍; libc开发人员知道如何做到这一点。