假设有一个简单的二进制,依赖于三个库。libA.so
, libB.so
和 libC.so
. 在通常的情况下,这三个依赖关系会出现在 readelf
根据需要。但是,我很好奇,是否可以把共享库做成一个 libABC.so
它什么都不做,只是通过 "重定向 "符号来充当三个实际库的接口。这样一来,也许我们可以拥有多个版本的 libABC.so
的不同版本,而二进制文件可以只 "依赖 "于三个依赖关系。libABC.so
. ELF是否可以这样做?
另一个可能的用例是反过来,当二进制已经依赖于一个现有的库时 libABC.so
恰好被拆成了三个独立的库。
要注意的是,我不一定有实际用途或实际用例。无论上述例子是否实用,我只是对这种可能性感到好奇。
从其他库重新导出共享库符号(OS X POSIX) 有一个很有前途的题目,但答案似乎要么是达尔文特有的,要么是没有完全回答这个问题。
那个 一种 与ELF一起工作,因为符号的扁平命名空间:如果你依赖于一个库,你通常可以同时访问它的依赖库的符号(例外情况是当 dlopen()
被使用)。)
但大多数链接编辑器(ld
)默认不这样做(现在已经不这样做了),因为这样做会让不需要的库被添加到依赖关系中去。在 GNU ld
该功能由 --as-needed
标志,如果我没记错的话,大约十年前就已经默认开启了。
你应该可以用GNU强制执行你正在寻找的行为。ld
通过连接(例如通过GCC前端)与 gcc yourprogram.c -Wl,--no-as-needed -lABC -Wl,--as-needed
. 这将强制链接到 libABC.so
程序是否在使用其导出的符号之一。
我曾广泛地写过关于这个功能的文章,因为它为当时的发行版解决了许多问题。在我的博客上 如果你要研究它的实用性是什么。