JavaScript is required to for searching.
跳过导航链接
退出打印视图
Oracle Solaris 11.1 链接程序和库指南     Oracle Solaris 11.1 Information Library (简体中文)
为本文档评分
search filter icon
search icon

文档信息

前言

第 1 部分使用链接编辑器和运行时链接程序

1.  Oracle Solaris 链接编辑器介绍

2.  链接编辑器

调用链接编辑器

直接调用

使用编译器驱动程序

跨链接编辑

指定链接编辑器选项

输入文件处理

归档处理

共享目标文件处理

与其他库链接

库命名约定

同时链接共享目标文件和归档

命令行中归档的位置

链接编辑器搜索的目录

运行时链接程序搜索的目录

初始化节和终止节

符号处理

符号可见性

符号解析

简单解析

复杂解析

致命解析

未定义符号

生成可执行输出文件

生成共享目标文件输出文件

弱符号

输出文件中的暂定符号顺序

定义其他符号

使用 -u 选项定义其他符号

定义符号引用

定义绝对符号

定义暂定 (tentative) 符号

扩充符号定义

缩减符号作用域

删除符号

外部绑定

字符串表压缩

生成输出文件

标识功能要求

标识平台功能

标识计算机功能

标识硬件功能

标识软件功能

创建符号功能函数系列

创建符号功能数据项系列

将目标文件功能转换为符号功能

功能系列试验

重定位处理

位移重定位

桩目标文件

辅助目标文件

调试器访问及辅助目标文件使用

父目标文件

调试帮助

3.  运行时链接程序

4.  共享目标文件

第 2 部分快速参考

5.  链接编辑器快速参考

第 3 部分高级主题

6.  直接绑定

7.  生成目标文件以优化系统性能

8.  Mapfile

9.  接口和版本控制

10.  使用动态字符串标记建立依赖性

11.  可扩展性机制

第 4 部分ELF 应用程序二进制接口

12.  目标文件格式

13.  程序装入和动态链接

14.  线程局部存储

第 5 部分附录

A.  链接程序和库的更新及新增功能

B.  System V 发行版 4(版本 1)Mapfile

索引

请告诉我们如何提高我们的文档:
过于简略
不易阅读或难以理解
重要信息缺失
错误的内容
需要翻译的版本
其他
Your rating has been updated
感谢您的反馈!

您的反馈将非常有助于我们提供更好的文档。 您是否愿意参与我们的内容改进并提供进一步的意见?

辅助目标文件

缺省情况下,目标文件包含可分配不可分配节。可分配节是包含可执行代码和运行时该代码需要的数据的节。不可分配节包含补充信息,在运行时执行目标文件时这些信息不是必需的。这些节用于支持调试器和其他观察工具的操作。在运行时操作系统不会将目标文件中的不可分配节装入内存,因此,无论其大小如何,都不会影响内存使用或运行时性能的其他方面。

为方便起见,可分配节和不可分配节通常保留在同一文件中。但是,在某些情况下,将这些节分开会很有用。

传统上,将不可分配节从目标文件中剥离,以解决这些问题。剥离很有效,但是会销毁以后可能需要的数据。而 Solaris 链接编辑器可以将不可分配节写入辅助目标文件。此功能可使用 -z ancillary 命令行选项启用。

$ ld ... -z ancillary[=outfile] ...

缺省情况下,辅助文件和主输出目标文件同名,具有 .anc 文件扩展名。但是,可以将 outfile 值提供给 -z ancillary 选项来指定一个不同的名称。

指定了 -z ancillary 时,链接编辑器将执行以下操作。

通过该组织,可以从主目标文件或辅助目标文件中获取节头的完整列表、完整的符号表以及主目标文件和辅助目标文件的完整列表。

以下示例说明了辅助目标文件的底层实现。辅助目标文件是通过将 -z ancillary 命令行选项添加到原本采用常规方式的编译中创建的。file 实用程序显示生成了名为 a.out 的可执行文件和名为 a.out.anc 的关联辅助目标文件。

$ cat hello.c
#include <stdio.h>

int
main(int argc, char **argv) 
{ 
        (void) printf("hello, world\n");
        return (0);
}
$ cc -g -zancillary hello.c
$ file a.out a.out.anc
a.out: ELF 32-bit LSB executable 80386 Version 1 [FPU], dynamically
       linked, not stripped, ancillary object a.out
a.out.anc: ELF 32-bit LSB ancillary 80386 Version 1, primary object a.out
$ ./a.out
hello world

生成的主目标文件是可以用平常方式执行的普通可执行文件。在运行时,该文件与生成过程中不使用辅助目标文件,然后使用 stripmcs 命令剥离不可分配内容的可执行文件没有区别。

如前所述,主目标文件和辅助目标文件包含相同的节头。要查看其如何工作,使用 elfdump 实用程序显示这些节头并对其进行比较会有所帮助。下表显示了从前一链接编辑示例中选择的部分节头的信息。

索引
节名称
类型
主标志
辅助标志
主大小
辅助大小
13
.text
PROGBITS
ALLOC EXECINSTR
ALLOC EXECINSTR SUNW_ABSENT
0x131
0
20
.data
PROGBITS
WRITE ALLOC
WRITE ALLOC SUNW_ABSENT
0x4c
0
21
.symtab
SYMTAB
0
0
0x450
0x450
22
.strtab
STRTAB
STRINGS
STRINGS
0x1ad
0x1ad
24
.debug_info
PROGBITS
SUNW_ABSENT
0
0
0x1a7
28
.shstrtab
STRTAB
STRINGS
STRINGS
0x118
0x118
29
.SUNW_ancillary
SUNW_ancillary
0
0
0x30
0x30

大多数节的数据仅存在于这两个文件之一中,不存在于另一个文件中。不存在数据时,会设置 SHF_SUNW_ABSENT 节头标志。运行时需要的可分配节数据在主目标文件中。用于调试但运行时不需要的不可分配节的数据放置在辅助文件中。一小组不可分配节在两个文件中都完整地存在。这些是用于将主目标文件和辅助目标文件联系在一起的 .SUNW_ancillary 节、节名称字符串表 .shstrtab 、符号表 .symtab 及其关联的字符串表 .strtab

可以从主目标文件中剥离符号表。遇到不带符号表的目标文件的调试器可以使用 .SUNW_ancillary 节查找辅助目标文件并访问其中包含的符号。

主目标文件和所有相关的辅助目标文件均包含一个允许标识所有目标文件并将其关联在一起的 .SUNW_ancillary 节。

$ elfdump -T SUNW_ancillary a.out a.out.anc
a.out:
Ancillary Section:  .SUNW_ancillary
     index  tag                    value
       [0]  ANC_SUNW_CHECKSUM     0x8724              
       [1]  ANC_SUNW_MEMBER       0x1         a.out
       [2]  ANC_SUNW_CHECKSUM     0x8724         
       [3]  ANC_SUNW_MEMBER       0x1a3       a.out.anc
       [4]  ANC_SUNW_CHECKSUM     0xfbe2              
       [5]  ANC_SUNW_NULL         0                   

a.out.anc:
Ancillary Section:  .SUNW_ancillary
     index  tag                    value
       [0]  ANC_SUNW_CHECKSUM     0xfbe2              
       [1]  ANC_SUNW_MEMBER       0x1         a.out
       [2]  ANC_SUNW_CHECKSUM     0x8724              
       [3]  ANC_SUNW_MEMBER       0x1a3       a.out.anc
       [4]  ANC_SUNW_CHECKSUM     0xfbe2              
       [5]  ANC_SUNW_NULL         0          

两个目标文件的辅助节包含相同数量的元素,除第一个元素外均相同。每个目标文件(从主目标文件开始)都是以下述方式引入的:首先是用于指定文件名的 MEMBER 元素,后面跟着是用于标识目标文件的 CHECKSUM。在此示例中,主目标文件为 a.out,其校验和为 0x8724。辅助目标文件为 a.out.anc,其校验和为 0xfbe2.SUNW_ancillary 节中的第一个元素(位于主目标文件的 MEMBER 元素之前)始终是 CHECKSUM 元素,它包含要检查的文件的校验和。

调试器访问及辅助目标文件使用

调试器和其他观察工具必须合并在主目标文件和辅助目标文件中找到的信息,以便生成目标文件的完整视图。这等同于处理单个文件中的信息。包含相同节头的主目标文件和辅助目标文件以及单个符号表可简化该合并。

调试器可以使用以下步骤组合这些文件中包含的信息。

  1. 从主目标文件或任何辅助目标文件开始,查找 .SUNW_ancillary 节。存在此节指示该目标文件是辅助组的一部分,其中包含的信息可用于获取完整文件列表以及确定这些文件中的哪一个是当前检查的文件。

  2. 使用要检查的目标文件中的节头数组作为初始模板,在内存中创建一个节头数组。

  3. 依次打开并读取 .SUNW_ancillary 节标识的每个文件。对于每个文件,使用不包含 SHF_SUNW_ABSENT 标志集的每个节的信息填充内存中的节头数组。

结果是节头的一个完整内存中副本,其中包含指向所有节的数据的指针。在获得该信息后,调试器会像在使用单个文件时一样继续访问和控制正在运行的程序。


注 - 辅助目标文件的 ELF 定义提供了单个主目标文件和任意数量的辅助目标文件。当前,Oracle Solaris 链接编辑器仅生成单个包含所有不可分配节的辅助目标文件。这种情况以后可能会改变。应该编写调试器和其他观察工具来处理多个辅助目标文件的一般情况。