Interface 创建一个共享库,该库;转口;来自其他共享库的符号

Interface 创建一个共享库,该库;转口;来自其他共享库的符号,interface,linker,dependencies,shared-libraries,elf,Interface,Linker,Dependencies,Shared Libraries,Elf,假设有一个简单的二进制文件依赖于三个库,libA.so,libB.so,和libC.so。在通常情况下,这三个依赖项将根据需要显示在readelf中。然而,我很好奇是否有可能创建一个共享库libABC。因此除了通过“重定向”符号充当三个实际库的接口外,它什么也不做。这样,可能一个人可以有多个版本的libABC.so,这反过来又指向三个依赖项的不同版本,二进制文件可以“依赖”于libABC.so。ELF能做到这一点吗 另一种可能的使用情形是相反的,当二进制文件已经依赖于一个现有的库libABC时。

假设有一个简单的二进制文件依赖于三个库,
libA.so
libB.so
,和
libC.so
。在通常情况下,这三个依赖项将根据需要显示在
readelf
中。然而,我很好奇是否有可能创建一个共享库
libABC。因此
除了通过“重定向”符号充当三个实际库的接口外,它什么也不做。这样,可能一个人可以有多个版本的
libABC.so
,这反过来又指向三个依赖项的不同版本,二进制文件可以“依赖”于
libABC.so
。ELF能做到这一点吗

另一种可能的使用情形是相反的,当二进制文件已经依赖于一个现有的库
libABC时。因此碰巧被分成三个单独的库

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

有一个很有希望的标题,但答案似乎是达尔文特有的,或者没有完全回答这个问题。

由于符号的扁平名称空间,ELF可以使用这种方式:如果您依赖于一个库,则通常可以同时访问其依赖项的符号(当
dlopen()时除外)使用了

但是大多数链接编辑器(
ld
)在默认情况下不再这样做,因为这样会让不需要的库添加到依赖项中。在GNU
ld
中,该功能由
--as needed
标志控制,如果我没记错的话,大约在10年前默认打开了该功能

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

我写了很多关于这个特性的文章,因为它解决了当时发行版的许多问题,如果您正在研究它的实用性。

由于符号的扁平名称空间,这种方法适用于ELF:如果您依赖于一个库,则通常可以同时访问其依赖项的符号(使用
dlopen()
时除外)

但是大多数链接编辑器(
ld
)在默认情况下不再这样做,因为这样会让不需要的库添加到依赖项中。在GNU
ld
中,该功能由
--as needed
标志控制,如果我没记错的话,大约在10年前默认打开了该功能

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

我已经写了很多关于这个特性的文章,因为它解决了当时发行版的许多问题,如果你想了解它的实用性的话