链接编辑可处理多种输入文件,这些文件通常由编译器、汇编程序或者 ld(1) 生成。链接编辑器会串联并解释这些输入文件内的数据,以形成单个输出文件。虽然链接编辑器提供许多选项,但是生成的输出文件为以下四种基本类型之一:
静态可执行文件–已解析了所有符号引用的输入可重定位目标文件的串联。此可执行文件代表运行就绪进程。请参见静态可执行文件。
动态可执行文件–要求运行时链接程序进行干预以生成可运行进程的输入可重定位目标文件的串联。动态可执行文件可能仍需要在运行时绑定的符号引用。动态可执行文件通常具有一个或多个以共享目标文件形式存在的依赖项。
共享目标文件–提供各种服务的输入可重定位目标文件的串联,运行时这些服务可能绑定到动态可执行文件。一个共享目标文件可能依赖于其他共享目标文件。
图 1-1 中显示了这些输出文件及其创建过程中使用的主要链接编辑器选项。
动态可执行文件和共享目标文件通常合称为动态目标文件。本文档重点介绍动态目标文件。
图 1-1 静态或动态链接编辑
许多发行版都建议不要创建静态可执行文件。实际上,这些版本中从未提供过 64 位系统归档库。因为静态可执行文件是基于系统归档库生成的,所以这种可执行文件包含关于系统实现的详细信息。该自包含特性有许多缺点:
静态可执行文件无法利用以共享目标文件形式发布的系统修补程序。因此,必须重新生成静态可执行文件,才能利用众多的系统改进功能。
这种可执行文件是否能够在未来的发行版上运行可能会受到影响。
系统实现详细信息的重复会对系统性能造成负面影响。
从 Oracle Solaris 10 发行版开始,操作系统不再包含 32 位系统归档库。如果没有这些库,尤其是 libc.a,不具备专业系统知识就无法创建静态可执行文件。请注意,链接编辑器处理静态链接选项的功能以及归档库的处理仍保持不变。