编译共享库时会发生什么?

时间:2013-02-22 13:10:16

标签: gcc ld

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

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

2 个答案:

答案 0 :(得分:4)

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

您可以通过运行

来查看这些引用
objdump -T a.out

nm -D a.out

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

答案 1 :(得分:0)

有关显式动态链接加载程序管理的信息,请参阅 dlopen dlsym 的手册页。