TL;博士链接共享库可执行与另一个共享库
是否有这样的Linux负载的任何分歧和链接共享库,如果库是由可执行文件或通过其他共享库链接?
背景
假设我有包含具有静态std::map
一个类共享库(例如libA.so
)和一组单类。每个单身人士课程都可以访问地图并静态地将自己的一个实例添加到地图中。
有两种情况:
- 我使用共享库(
libA.so
)中的可执行文件读取所有注册类从全球地图。 - 我使用共享库(
libA.so
)在另一个共享库(libB.so
),并使用在可执行这个新的。在这种情况下,libB.so
使用来自libA.so
的地图为可执行文件提供一些功能(如外观)。
问题
如果使用(即链接)此共享库中的可执行(方案1)中,上述地图包含单类的列表,然而,如果使用这个库在另一个共享库中,然后在可执行文件中使用新文件(场景2),地图似乎是空的。
我似乎无法理解链接器如何处理共享库,在任何情况下。
更新
事实证明libB.so
不链接到正确libA.so
即使使用的g++
-lA
标志作为明确指示。虽然我不能看到libA.so
通过libB.so
使用ldd
,pmap
或objdump
联系,我使用的libA.so
类时,没有得到运行时错误。如果我运行与clang++
相同的命令,我可以看到所有所需的库都列出。
在UNIX系统上,共享库仅为其代码页共享内存。除非您编写特殊代码以使库使用共享内存,否则数据页仍驻留在使用库的进程中。我相信Windows有一个DLL将共享数据和代码的模式。 – jxh
@jxh我在Linux上,但仍然无法理解当我通过另一个共享库链接共享库时为什么会发生所有这些静态初始化,以及为什么它可以正常工作,如果直接通过可执行文件链接它? –
当你生成你的第二个库时,你是否100%确定你是第一个共享库的静态链接? –