JavaScript is required to for searching.
跳过导航链接
退出打印视图
链接程序和库指南     Oracle Solaris 10 8/11 Information Library (简体中文)
search filter icon
search icon

文档信息

前言

1.  Oracle Solaris 链接编辑器介绍

2.  链接编辑器

调用链接编辑器

直接调用

使用编译器驱动程序

32 位链接编辑器和 64 位链接编辑器

跨链接编辑

指定链接编辑器选项

输入文件处理

归档处理

共享目标文件处理

与其他库链接

库命名约定

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

命令行中归档的位置

链接编辑器搜索的目录

使用命令行选项

使用环境变量

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

初始化节和终止节

符号处理

符号解析

简单解析

复杂解析

致命解析

未定义符号

生成可执行输出文件

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

弱符号

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

定义其他符号

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

定义符号引用

定义绝对符号

定义暂定 (tentative) 符号

扩充符号定义

缩减符号作用域

删除符号

外部绑定

字符串表压缩

生成输出文件

标识功能要求

标识平台功能

标识计算机功能

标识硬件功能

标识软件功能

软件功能帧指针处理

创建符号功能函数系列

创建符号功能数据项系列

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

功能系列试验

重定位处理

位移重定位

桩目标文件

调试帮助

3.  运行时链接程序

4.  共享目标文件

5.  应用程序二进制接口与版本控制

6.  支持接口

7.  目标文件格式

8.  线程局部存储

9.  Mapfile

A.  链接编辑器快速参考

B.  版本控制快速参考

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

D.  直接绑定

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

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

索引

重定位处理

创建了输出文件后,将输入文件中的所有数据节复制到新映像。将输入文件指定的所有重定位应用于输出映像。还要将必须生成的所有其他重定位信息写入新映像。

重定位处理通常很容易,但可能会出现错误状态并伴随有特定错误消息。有两种状态需要详细介绍。第一种状态涉及位置相关代码产生的文本重定位。与位置无关的代码中对此状态有更详细的介绍。第二种状态可以由位移重定位产生,下一小节中将对位移重定位进行更全面的介绍。

位移重定位

如果将位移重定位应用于可以在复制重定位中使用的数据项,可能会出现错误状态。复制重定位中介绍了有关复制重定位的详细信息。

已重定位的偏移和重定位目标保持分隔相同的位移时,位移重定位仍然有效。复制重定位是指将共享目标文件中的全局数据项复制到可执行文件的 .bss 中。此复制将保留可执行文件的只读文本段。如果对复制的数据应用了位移重定位,或者外部重定位是对复制的数据进行位移,位移重定位将变为无效。

有两个验证领域会尝试确定位移重定位问题。

为了帮助诊断这些问题,链接编辑器使用一个或多个动态 DT_FLAGS_1 标志指示动态目标文件使用的位移重定位,如表 7-34 中所示。此外,可以使用链接编辑器的 -z verbose 选项显示可疑重定位。

例如,假设将创建具有全局数据项 bar[] 的共享目标文件,将对该数据项应用位移重定位。如果从动态可执行文件引用,那么此项可能已进行了复制重定位。链接编辑器使用以下内容对此情况提出警告。

$ cc -G -o libfoo.so.1 -z verbose -K pic foo.o
ld: warning: relocation warning: R_SPARC_DISP32: file foo.o: symbol foo: \
    displacement relocation to be applied to the symbol bar: at 0x194: \
    displacement relocation will be visible in output image

现在,如果创建引用数据项 bar[] 的应用程序,那么将创建复制重定位。此复制将导致位移重定位无效。由于链接编辑器可以显式发现此情况,所以不论是否使用 -z verbose 选项都将生成错误消息。

$ cc -o prog prog.o -L. -lfoo
ld: warning: relocation error: R_SPARC_DISP32: file foo.so: symbol foo: \
    displacement relocation applied to the symbol bar at: 0x194: \
    the symbol bar is a copy relocated symbol

注 - ldd(1)-d-r 选项配合使用时,使用位移动态标志可生成类似的重定位警告。


通过确保要重定位(偏移)的符号定义和重定位的符号目标都是局部的,可以避免这些错误状态。使用静态定义或链接编辑器的作用域设置方法。请参见缩减符号作用域。通过使用功能接口访问共享目标文件中的数据可以避免此类型的重定位问题。