我知道,当链接到静态库(即 libname.a)时,所用函数的二进制代码会从存档中取出并插入到应用程序二进制文件中。因此,静态库必须在编译时存在。
但是,对于共享库,我迷路了。不复制函数定义。那么为什么需要在链接器命令行上提供共享库呢?此外,是否有不同的方法可以链接到共享库,它们是什么?
共享库需要提供给链接器的命令行,以便对特定函数和这些函数所在文件的引用存储到可执行文件中。运行可执行文件时,首先加载动态链接器(/lib/ld-linux.so
,/libexec/ld-elf.so
等,取决于您的系统)并检查这些引用。一旦找到 lib 文件,它就会将它们(使用mmap()
系统调用)映射到程序的地址空间。
您可以通过运行查看这些引用
objdump -T a.out
或者
nm -D a.out
对于 ELF 可执行文件,该.interp
部分的存在意味着程序使用动态链接。
有关显式动态链接加载器管理,请参见dlopen和dlsym的手册页。