我知道,当与静态库(即libname.a)链接时,所使用函数的二进制代码将从存档中取出,并且将在应用程序二进制文件中插入。因此,静态库必须在编译时出现。针对共享库进行编译时会发生什么?
但是,与共享库我迷路了。函数定义不会被复制。然后为什么需要在链接器命令行上提供共享库?另外,是否有不同的方式链接到共享库,它们是什么?
我知道,当与静态库(即libname.a)链接时,所使用函数的二进制代码将从存档中取出,并且将在应用程序二进制文件中插入。因此,静态库必须在编译时出现。针对共享库进行编译时会发生什么?
但是,与共享库我迷路了。函数定义不会被复制。然后为什么需要在链接器命令行上提供共享库?另外,是否有不同的方式链接到共享库,它们是什么?
需要将共享库提供给链接器的命令行,以便对特定函数和这些函数所在的文件的引用存储到可执行文件中。当可执行文件运行时,首先加载动态链接程序(/lib/ld-linux.so
,/libexec/ld-elf.so
等,取决于您的系统)并检查这些引用。一旦找到lib文件,它会将它们(使用mmap()
系统调用)映射到程序的地址空间。
您可以通过运行
objdump -T a.out
或
nm -D a.out
对于ELF可执行文件看到这些引用,该.interp
部分的存在意味着程序使用动态链接。
参见手册页的dlopen和对dlsym显式动态链接装载机管理。
谢谢。同时,我发现[this](http://www.yolinux.com/TUTORIAL/LibraryArchives-StaticAndDynamic.html)优秀教程,补充您的解释。 – Vorac 2013-02-25 08:19:41