5

在一个项目中,我的同事创建了一个静态库,例如 liba.a,它与 app 链接。

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

我创建了一个共享库 libs.so,它也与应用程序链接。

问题是当我的 libs.so 与应用程序链接时,我的 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 在共享对象中不允许重定位.

有人知道吗?

谢谢转发。

4

1 回答 1

2

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

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

我还想提醒您,将 GNU libc 与非 GPL 应用程序静态链接是非法的,因为 LGPL 只排除动态链接的代码。这是为了允许在不重新编译源可能不可用的可执行文件的情况下修复库的错误。在 Linux 中,在不重新编译依赖的可执行文件的情况下升级带有错误修复版本的共享库是很常见的;libc 开发人员知道如何做到这一点。

于 2012-09-13T08:34:38.807 回答