据我所知,当链接到静态库(即libname.a)时,已使用的函数的二进制代码将从存档中取出,插入在应用程序二进制文件中。因此,静态库必须在编译时出现。
然而,对于共享库,我迷路了。不复制函数定义。然后为什么需要在链接器命令行上提供共享库?此外,有不同的方式来链接共享库,它们是什么?
答案 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 的手册页。