链接可执行文件中的共享库与另一个共享库

颜照片

tl; dr

如果库是通过可执行文件或其他共享库链接的,则linux加载和链接共享库的方式是否有所不同?

背景

假设我有一个共享库(例如libA.so),其中包含一个带有静态类的类std::map和一组单例类。每个单例类都可以访问地图,并将自身的实例静态添加到地图。

有两种情况:

  1. libA.so在可执行文件中使用共享库()从全局映射中读取所有已注册的类。
  2. libA.so在另一个共享库(libB.so)中使用了共享库(),并在可执行文件中使用了这个新在这种情况下,libB.so使用map fromlibA.so为可执行文件(如外观)提供某些功能。

问题

如果我在可执行文件中使用(即链接)此共享库(场景1),则上述映射包含单例类的列表,但是,如果我在另一个共享库中使用此库,然后在可执行文件中使用新的共享库(场景1) 2),地图似乎是空的。

在这两种情况下,我似乎都无法理解链接器如何处理共享库。

更新

事实证明libB.solibA.so即使使用-lA标志明确指示也无法正确链接g++虽然我不能看到libA.so通过连接libB.so使用lddpmap或者objdump,我使用的类时,没有得到运行时错误libA.so如果我运行相同的命令,则clang++可以看到所有必需的库均已列出。

x

我将描述一种可能产生您所看到的行为的方案。

  1. 调用单例对象的全局构造函数,并针对地图进行注册。
  2. 映射的全局构造函数被调用,从而导致将映射初始化为空的数据结构。

另一种情况:

  • 如果您是libB.so从全局构造函数中读取地图,则可能在任何对象有机会将其注册之前调用该地图

通常,不能保证从不同的翻译单元(当然也不能从不同的共享库)执行全局构造函数的顺序。

上面第一个问题的解决方案是为地图使用单例样式模式,以便在使用时对其进行初始化,而不是通过全局构造函数进行初始化。

TheMap & GlobalMap () {
    static TheMap instance;
    return instance;
}

上面第二个问题的解决方案是禁止从全局构造函数访问全局地图。也就是说,将所有全局构造函数更改libB.so为在使用时进行初始化,而不是在全局构造函数中进行初始化。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

CMake:将静态库从子目录链接到另一个子目录中的可执行文件

来自分类Dev

从可执行文件到另一个位置调用数据库的可能性

来自分类Dev

在将共享库层次结构链接到可执行文件时,cmake链接错误

来自分类Dev

Linux:可执行文件找不到共享库

来自分类Dev

如何帮助可执行文件找到共享库?

来自分类Dev

更改Linux可执行文件的特定共享库

来自分类Dev

将静态库的多个不兼容版本链接到一个可执行文件中

来自分类Dev

将静态库的多个不兼容版本链接到一个可执行文件中

来自分类Dev

scp之后C ++可执行文件无法链接到共享库

来自分类Dev

cmake,无法运行与预编译共享库链接的可执行文件

来自分类Dev

是否可以有两个带有共享库的g ++可执行文件?

来自分类Dev

将共享库中的符号解析为可执行文件

来自分类Dev

将共享库中的符号解析为可执行文件

来自分类Dev

将可执行文件移动到$ PATH中的另一个文件夹后,找不到可执行文件

来自分类Dev

链接到在退出时链接到另一个共享库段的共享库

来自分类Dev

如何将 32 位共享库(.so 文件)链接到 32 位可执行文件?

来自分类Dev

在Linux中将共享库与另一个共享库链接

来自分类Dev

如何将共享库链接到另一个共享库

来自分类Dev

链接可执行文件与共享库时,为什么GNU ld解析符号的方式不同?

来自分类Dev

用另一个文件编写可执行文件

来自分类Dev

用另一个文件编写可执行文件

来自分类Dev

可执行文件,静态库和共享库之间的关系

来自分类Dev

CMake:使用静态库在一个项目中构建多个可执行文件

来自分类Dev

CMake:使用静态库在一个项目中构建多个可执行文件

来自分类Dev

是否可以绕过已经编译的可执行文件所需的共享库依赖关系?

来自分类Dev

具有多个可执行文件的CMake共享库

来自分类Dev

使用“ -fPIC”标志编译可执行文件(无共享库)

来自分类Dev

Linux-为什么我的可执行文件将libpthread作为共享库?

来自分类Dev

Readelf报表程序是共享库,而不是可执行文件

Related 相关文章

  1. 1

    CMake:将静态库从子目录链接到另一个子目录中的可执行文件

  2. 2

    从可执行文件到另一个位置调用数据库的可能性

  3. 3

    在将共享库层次结构链接到可执行文件时,cmake链接错误

  4. 4

    Linux:可执行文件找不到共享库

  5. 5

    如何帮助可执行文件找到共享库?

  6. 6

    更改Linux可执行文件的特定共享库

  7. 7

    将静态库的多个不兼容版本链接到一个可执行文件中

  8. 8

    将静态库的多个不兼容版本链接到一个可执行文件中

  9. 9

    scp之后C ++可执行文件无法链接到共享库

  10. 10

    cmake,无法运行与预编译共享库链接的可执行文件

  11. 11

    是否可以有两个带有共享库的g ++可执行文件?

  12. 12

    将共享库中的符号解析为可执行文件

  13. 13

    将共享库中的符号解析为可执行文件

  14. 14

    将可执行文件移动到$ PATH中的另一个文件夹后,找不到可执行文件

  15. 15

    链接到在退出时链接到另一个共享库段的共享库

  16. 16

    如何将 32 位共享库(.so 文件)链接到 32 位可执行文件?

  17. 17

    在Linux中将共享库与另一个共享库链接

  18. 18

    如何将共享库链接到另一个共享库

  19. 19

    链接可执行文件与共享库时,为什么GNU ld解析符号的方式不同?

  20. 20

    用另一个文件编写可执行文件

  21. 21

    用另一个文件编写可执行文件

  22. 22

    可执行文件,静态库和共享库之间的关系

  23. 23

    CMake:使用静态库在一个项目中构建多个可执行文件

  24. 24

    CMake:使用静态库在一个项目中构建多个可执行文件

  25. 25

    是否可以绕过已经编译的可执行文件所需的共享库依赖关系?

  26. 26

    具有多个可执行文件的CMake共享库

  27. 27

    使用“ -fPIC”标志编译可执行文件(无共享库)

  28. 28

    Linux-为什么我的可执行文件将libpthread作为共享库?

  29. 29

    Readelf报表程序是共享库,而不是可执行文件

热门标签

归档