我想创建一个共用图书馆使用的职能从一个第3方的静态图书馆。例如, foobarlibfoobar.a.我知道,我的主要应用程序也被采用 foo 和将出口这符号。所以我只是想要链接 bar 保存的代码尺寸和留'foo'未解决(因为它将提供主要应用程序)。如果包括我 libfoobar.a, ,连接 ld 将包括的职能在我的共享图书馆。如果我不包括 libfoobar.a, 我的图书馆不会有访问的功能 bar 由于应用程序本身是不连接 bar.问题:

  • 是否有办法说 ld 只有解决的某些符号,当建筑物的共用图书馆?
  • libfoobar.a 进入一个共用图书馆?
  • 提取的文件含有的功能 barlibfoobar.a 并规定,在连接线?
  • 不要担心它,运行时间将使用的装载机 bar 从你的应用程序,以便复制 bar 在共用库中不会被装?
有帮助吗?

解决方案

以下几点试图回答的问题我已经提出:

  • ld 似乎不能让你忽略联在某些符号从一个静态的图书馆。使用 --just-symbols--undefined (或 EXTERN 连接的脚本命令)不会阻止 ld 从联的符号。
  • 换一个静态的图书馆, libfoobar.一个, ,进入一个共用一个, libfoobar.此。1.0, 和出口的所有可见,符号。你也可以使用 --version-script 和其他方法来出口的一个子集的符号。

    ld -shared -soname libfoobar.so.1 -o libfoobar.so.1.0 --whole-archive libfoobar.a --no-whole-archive

  • 最好是 删除 存档的成员从 复制 你的静态图书馆于它是提取他们,因为可能有内部的依赖你必须要管理。例如,假设你是导出所有的符号,你可以产生一个地图文件从你的主要可执行的。然后你可以查询所有存档的成员,可执行拉在从复制的静态图书馆和删除他们的副本。所以当你的DSO联静态的图书馆,它将保留相同的符号没有得到解决。

  • 它可以指定你的主要执行作为一个共用图书馆为你DSO如果你编译可执行的 --pie 选项。你DSO将链接到可执行的,如果它之前的静态图书馆的链路命令。需要说明的是,主要的执行必须是可以通过 LD_LIBRARY_PATH-rpath.此外,使用 strace 表明,由于可执行的是一种依赖的图书馆,它再次装载时你DSO负荷。

    ld -shared -rpath '$ORIGIN' -L. -lc -ldl -o DSO.so DSO.o app libfoobar.a

  • 动态的接头将使用的可执行的版本 foo 第一,除非你打电话 dlopen里()RTLD_DEEPBIND 标志。使用 strace 显示整个DSO文件映射 mmap2() 进入存储器。然而,维基百科的要求,对mmap"实际读磁盘中执行"懒惰"的方式后,一个特定位置进行访问。" 如果这是真的,然后重复 foo 不会被加载。注意,复盖只会发生,如果你DSO 出口 功能 foo.否则,功能 foo 这是静态连接到你的DSO将使用,每当你的DSO电话 foo.

最后,如果 mmap() 使用一个懒惰的阅读,那么最好的解决办法是,以连接你的DSO在正常的方式和我们的动态连接和linux照顾的其余部分。

其他提示

我不是最大的专家共享图书馆,所以我可能是错误在这里!

如果我猜对的是什么你想要做的,只是链接,共享lib对libc.此。你不想要一个额外的复制的sscanf嵌入你的图书馆。

我回答你问题之前,我已经很想出什么你越来越在,在种情况下你有兴趣的答案。

是否有一个方式告诉ld只解决特定的符号,当建筑物的共用图书馆?

只有外部的,不是静态、功能和变量去在共用库的符号表。

当你建立自己的共享图书馆,任何符号中找不到对象在连接命令行会仍未得到解决。如果接头抱怨说,你可能需要的链接,共享lib对 共享 libc.你可以共享库,取决于其他共享库,并ld。因此可以处理与依赖关系链。

如果我有更多的代表,我要问这样一个评论:你有一个定制版本的sprintf/sscanf,或将它被确定为共享lib使用执行在lc?如果lc是好的,然后我回答可能解决你的问题。如果没有,那么你需要建立共享lib的对象仅有的功能需要。即不链接对抗/usr/lib/libc.a.

也许我得到迷惑你

libc.a(实际上不是"真正的"libc) 线。/usr/lib/libc.一个是真的glibc(on linux)。这是一个静态连接的副本相同的码在libc.此。除非你在谈论你自己的libc.一个(这是我在想什么在第一次)...

把libc.一成一个共用图书馆?你可能可以,但不要,因为它可能不是编位置独立代码,因此它将需要大量的迁移,通过ld。所以在运行时间。

提取sscanf从libc.一个和指定的连接线?

可能是可能的。ar t/usr/lib/libc.a为列表的内容。(ar args类似焦油。焦油ar磁带。...老学校的Unix在这里.) 可能不那么容易的,因为sscanf可能取决于符号。o文件中。a.

回答你的修订更明确的问题。

请记住,正常点的一个共同lib是,多个程序可以链接反对的。所以你的优化使用主要程序的符号为一个功能你需要的只会的工作,如果主要程序总是提供了这个符号(通过一个静态lib或其他行为)。这通常不是人们想要什么做的。

如果这只是几个小的功能,也许你应该让它是。你可能会结束了两份代码的功能、一个在你shlib,和一个在主要程序。如果他们是少(或至少没有巨大的),或不被称为经常和没有性能至关重要的,那么代码尺寸/I-cache击中有两个副本没什么可担心的。(翻译:我不知道如何避免它关掉我的头顶,所以我可能不需要时间看起来和做出更加复杂的生成文件,以避免它。)

看看我的其他答复一些评论乱搞ar提取的东西从一个静态的图书馆。摘要:可能是非微不足道,因为你不知道之间的依赖关系的各种。o文件中。a.

它可以做什么你希望有你共用图书馆出口的符号,它拉在从静态的图书馆。然后,当你的链接,主要的应用程序,把你的共用图书馆前的静态lib在连接命令行。ld会找到"foo"在你的shlib,并使用,复制(如果这种重新出口诀窍是可能的),但对"酒吧"这将需要包括一份从静态lib。

ld--出口的动态可能是你需要什么导出所有的符号中的动态符号表。尝试。并搜索"出口"在docs/人页。"出口"的术语,使得一个符号显示在图书馆。--出口-所有的符号是在i386PE(windows DLL)部分,否则它可能会做的伎俩。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top