Gcc 在对共享库进行编译时会发生什么?

Gcc 在对共享库进行编译时会发生什么?,gcc,ld,Gcc,Ld,我知道,当链接静态库(即libname.a)时,所用函数的二进制代码将从存档中取出并插入到应用程序二进制中。因此,静态库必须在编译时出现 然而,有了共享库,我就迷路了。不复制函数定义。那么,为什么需要在链接器命令行上提供共享库呢?另外,是否有不同的方式链接共享库?它们是什么?共享库需要被提供给链接器的命令行,以便将对特定函数和这些函数所在文件的引用存储到可执行文件中。运行可执行文件时,首先加载动态链接器(/lib/ld linux.so,/libexec/ld elf.so,等等,具体取决于您的

我知道,当链接静态库(即libname.a)时,所用函数的二进制代码将从存档中取出并插入到应用程序二进制中。因此,静态库必须在编译时出现


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

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

您可以通过运行

objdump -T a.out


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

请参阅dlopendlsym的手册页,了解显式动态链接加载程序管理。

谢谢。同时,我找到了[本](教程),补充了您的解释。
nm -D a.out