链接器如何生成库?该库的内容是什么?

时间:2015-09-21 17:32:54

标签: c++ linker

参考这个答案:https://stackoverflow.com/a/6264256/5324086, 我发现链接器具有比管理目标文件符号的绝对地址更多的功能。

链接器生成的库包含什么?这是不是......说一个C标准库?

为什么链接器甚至需要生成库?

2 个答案:

答案 0 :(得分:3)

确切的细节取决于库的类型(您可以搜索共享库格式),但基本组件将包括已编译的代码,以及一个符号表,告诉链接器哪个地址对应于每个名称。请注意,这与目标文件非常相似。静态库基本上是目标文件的归档,编译器以类似的方式链接它们。使用动态库,操作系统可以在加载程序时查看,然后链接符号。它们通常在每个程序的地址空间中都没有相同的绝对地址,因此这些地址将相对于操作系统加载库的位置。

C标准库(Windows上的MSVC运行时)是库的一个示例。

答案 1 :(得分:0)

静态库只是目标文件的集合。您可以将它们视为包含所有相关.a文件的tar文件(或者,在Windows上,作为包含obj文件的zip文件)。此处不涉及链接器的链接部分(事实上,传统上Unix系统上的静态库是使用ar实用程序完成的,它与tar以某种方式相关。它们在编译时完全解析,它们只是用来避免重建所有长时间构建或具有复杂构建过程的东西。

动态库是一种不同的野兽。它们是完全成熟的可执行文件,可以由其他进程加载,因此需要常规链接器,原因与普通可执行文件中使用的相同。它们不是仅提供单个入口点,而是导出加载器(或“运行时链接器”)使用的完整符号表,以允许宿主程序找到所需的过程。通常,它们还包含重定位信息,以允许在目标地址空间中的任何地址加载(或者出于同样的原因,它们在位置无关的代码中编译)。