制作一个能从其他共享库中 "再导出 "符号的共享库。

问题描述 投票:0回答:1

假设有一个简单的二进制,依赖于三个库。libA.so, libB.solibC.so. 在通常的情况下,这三个依赖关系会出现在 readelf 根据需要。但是,我很好奇,是否可以把共享库做成一个 libABC.so 它什么都不做,只是通过 "重定向 "符号来充当三个实际库的接口。这样一来,也许我们可以拥有多个版本的 libABC.so 的不同版本,而二进制文件可以只 "依赖 "于三个依赖关系。libABC.so. ELF是否可以这样做?

另一个可能的用例是反过来,当二进制已经依赖于一个现有的库时 libABC.so 恰好被拆成了三个独立的库。

要注意的是,我不一定有实际用途或实际用例。无论上述例子是否实用,我只是对这种可能性感到好奇。

从其他库重新导出共享库符号(OS X POSIX) 有一个很有前途的题目,但答案似乎要么是达尔文特有的,要么是没有完全回答这个问题。

interface linker dependencies shared-libraries elf
1个回答
2
投票

那个 一种 与ELF一起工作,因为符号的扁平命名空间:如果你依赖于一个库,你通常可以同时访问它的依赖库的符号(例外情况是当 dlopen() 被使用)。)

但大多数链接编辑器(ld)默认不这样做(现在已经不这样做了),因为这样做会让不需要的库被添加到依赖关系中去。在 GNU ld 该功能由 --as-needed 标志,如果我没记错的话,大约十年前就已经默认开启了。

你应该可以用GNU强制执行你正在寻找的行为。ld 通过连接(例如通过GCC前端)与 gcc yourprogram.c -Wl,--no-as-needed -lABC -Wl,--as-needed. 这将强制链接到 libABC.so 程序是否在使用其导出的符号之一。

我曾广泛地写过关于这个功能的文章,因为它为当时的发行版解决了许多问题。在我的博客上 如果你要研究它的实用性是什么。

© www.soinside.com 2019 - 2024. All rights reserved.