我知道在链接静态库(即 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/