【发布时间】:2012-09-06 06:01:18
【问题描述】:
在一个项目中,我的同事创建了一个静态库,例如 liba.a,它与应用程序链接。
在 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 不允许重定位在共享对象中。
有人知道吗?
谢谢转发。
【问题讨论】:
-
我认为-static -share不应该混用....
-
以下文本是从codesurgery 的ld.pdf 复制而来的:“-static 不要链接到共享库。这仅在支持共享库的平台上有意义。此选项可以是与“-shared”一起使用。这样做意味着正在创建一个共享库,但必须通过从静态库中拉入条目来解析该库的所有外部引用。”
-
@DavidChyi:这只是说 -static 和 -shared 可以混合使用,但并不是一个好主意。一般来说,编译器有很多选项对于普通应用程序来说不是一个好主意。它们对于编译内核、引导加载程序、微控制器代码等特殊情况很重要。
标签: linux linker arm shared-libraries libc