2013-02-22 53 views
4

我知道,当与静态库(即libname.a)链接时,所使用函数的二进制代码将从存档中取出,并且将在应用程序二进制文件中插入。因此,静态库必须在编译时出现。针对共享库进行编译时会发生什么?

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

回答

4

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

您可以通过运行

objdump -T a.out 

nm -D a.out 

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

+0

谢谢。同时,我发现[this](http://www.yolinux.com/TUTORIAL/LibraryArchives-StaticAndDynamic.html)优秀教程,补充您的解释。 – Vorac 2013-02-25 08:19:41

0

参见手册页的dlopen对dlsym显式动态链接装载机管理。