嵌入在归档中的动态链接器依赖项信息

时间:2009-02-21 14:56:54

标签: linux linker

动态库很不错。它们中嵌入了一些信息,可以帮助运行时链接器确定最终可执行文件需要加载的其他库。它还告诉可执行文件将加载哪些符号

然而,静态库是一个痛苦的问题。链接器不会自动链接存档的依赖项。当静态链接中等复杂或具有深度依赖图的库时,这会变得令人发指。

那么为什么归档只能包含他们的依赖信息呢?我试着做到这一点。我的想法的关键是/usr/lib/libc.so。此文件不是共享对象文件,而是链接描述文件。

链接器脚本为您提供了对最终链接器输出的大量控制,但我想要的只是指定您可以使用的依赖项:

INPUT( -ldependency -ldependecy2 )

以下是我的问题。

  • 这看起来很简单,为什么以前没有这样做过?我不能成为第一个想到这一点的人。这比pkg-config或libtool(尤其是libtool ugh)更容易,更直观。
  • 我尝试将链接描述文件嵌入到存档中,但它不起作用。为什么不?可以使它工作吗?我怀疑一些聪明的使用ranlib可能会成功,但它超出了我的范围。

我目前的解决方案是创建一个名为libMyLibrary.a的链接描述文件。它包含

INPUT( -lMyRealLibrary -ldependency1 -ldependency2 )

我必须亲自插入依赖项,如果ld可以为我做好,那将是另一天的问题。

2 个答案:

答案 0 :(得分:0)

要回答问题的第二部分,ar p ARCHIVE SCRIPT将捕获ARCHIVE中包含的SCRIPT的内容。或ar x ARCHIVE SCRIPT提取文件,然后将其传递给链接器,如ld blah blah -TSCRIPT

答案 1 :(得分:0)

此形式的链接器脚本仅由GNU-ld支持(新的Gold ELF链接器也支持有限)。如果您有任何可移植性要求,最好不要依赖链接器脚本支持。

libtool专门用 编写,以帮助创建共享库的可移植性(平台之间的细节差别很大)。

如果您不需要可移植性,那么当然您不需要libtool及其复杂性。