【问题标题】:What happens when compiling against a shared library?针对共享库进行编译时会发生什么?
【发布时间】:2013-02-22 13:10:16
【问题描述】:

我了解,当链接到静态库(即 libname.a)时,所用函数的二进制代码会从存档中取出并插入应用程序二进制文件中。因此,静态库必须在编译时存在。

但是,对于共享库,我迷路了。不复制函数定义。那么为什么需要在链接器命令行上提供共享库?另外,是否有不同的方法可以链接到共享库?它们是什么?

【问题讨论】:

    标签: gcc ld


    【解决方案1】:

    需要将共享库提供给链接器的命令行,以便将对特定函数和这些函数所在文件的引用存储到可执行文件中。运行可执行文件时,首先加载动态链接器(/lib/ld-linux.so/libexec/ld-elf.so 等,具体取决于您的系统)并检查这些引用。一旦找到 lib 文件,它就会将它们(使用mmap() 系统调用)映射到程序的地址空间。

    你可以通过运行查看这些引用

    objdump -T a.out
    

    nm -D a.out
    

    对于 ELF 可执行文件,.interp 部分的存在意味着程序使用动态链接。

    【讨论】:

    【解决方案2】:

    请参阅 dlopendlsym 的手册页,了解显式动态链接加载器管理。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-11
      • 2018-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多