gcc - 针对共享库进行编译时会发生什么?

标签 gcc ld

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

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

最佳答案

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

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

objdump -T a.out

或者
nm -D a.out

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

关于gcc - 针对共享库进行编译时会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15025040/

相关文章:

c - 从优化为循环不变的循环中的结构指针取消引用成员吗?

c - typeof的返回类型是什么?

c - 在 Linux 上 undefined reference 但在 Mac 上工作正常

xcode - 将静态框架转换为动态

c++ - AIX 6.1 链接器错误

gcc - 如何将 -m elf_i386 传递给 gcc?

gcc - 不执行共享库构造函数

c - 将 mex 文件链接到静态 mpfr 库时出现问题

gcc - 为什么交叉编译Arm Linux GCC 出错?

gcc - mulx 指令的固有特性