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

颜照片

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

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

Related 相关文章

  1. 1

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

  2. 2

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

  3. 3

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

  4. 4

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

  5. 5

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

  6. 6

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

  7. 7

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

  8. 8

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

  9. 9

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

  10. 10

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

  11. 11

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

  12. 12

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

  13. 13

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

  14. 14

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

  15. 15

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

  16. 16

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

  17. 17

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

  18. 18

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

  19. 19

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

  20. 20

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

  21. 21

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

  22. 22

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

  23. 23

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

  24. 24

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

  25. 25

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

  26. 26

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

  27. 27

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

  28. 28

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

  29. 29

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

热门标签

归档