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.  链接程序和库的更新及新增功能

索引

调试帮助

链接编辑器提供了调试功能,允许您详细地跟踪链接编辑过程。此功能有助于了解并调试应用程序和库的链接编辑。使用此功能显示的信息类型应保持不变。不过,信息的确切格式可能随发行版的不同而有所变化。

如果不太了解 ELF 格式,可能会不熟悉某些调试输出。不过,您可能对其中许多方面不太感兴趣。

使用 -D 选项可以启用调试。必须使用一个或多个标记扩充此选项,以指示需要的调试类型。

在命令行中键入 -D help,可以显示 -D 的可用标记。

$ ld -Dhelp

缺省情况下,会将所有调试输出发送到标准错误输出文件 stderr。可以使用 output 标记将调试输出定向到其他文件。例如,可以将帮助文本输出到名为 ld-debug.txt 的文件中。

$ ld -Dhelp,output=ld-debug.txt

大多数编译器驱动程序会为 -D 选项指定不同的含义,通常是为了定义预处理宏。可以使用 LD_OPTIONS 环境变量跳过编译器驱动程序,将 -D 选项直接提供给链接编辑器。

以下示例说明了如何跟踪输入文件。此语法可用于确定在链接编辑中使用的库。使用此语法也可以显示从归档中提取的目标文件。

$ LD_OPTIONS=-Dfiles cc -o prog main.o -L. -lfoo
....
debug: file=main.o  [ ET_REL ]
debug: file=./libfoo.a  [ archive ]
debug: file=./libfoo.a(foo.o)  [ ET_REL ]
debug: file=./libfoo.a  [ archive ] (again)
....

其中,成员 foo.o 是从归档库 libfoo.a 中提取的,目的是满足对 prog 的链接编辑。请注意,对归档搜索了两次,以验证提取 foo.o 时没有提取其他可重定位目标文件。多个 "(again)" 诊断指示该归档是使用 lorder(1)tsort(1) 进行排序的候选归档。

使用 symbols 标记,可以确定导致提取归档成员的符号和进行初始符号引用的目标文件。

$ LD_OPTIONS=-Dsymbols cc -o prog main.o -L. -lfoo
....
debug: symbol table processing; input file=main.o  [ ET_REL ]
....
debug: symbol[7]=foo  (global); adding
debug:
debug: symbol table processing; input file=./libfoo.a  [ archive ]
debug: archive[0]=bar
debug: archive[1]=foo  (foo.o) resolves undefined or tentative symbol
debug:
debug: symbol table processing; input file=./libfoo(foo.o)  [ ET_REL ]
....

符号 foomain.o 引用。将此符号添加到链接编辑器的内部符号表中。此符号引用会导致从归档 libfoo.a 中提取可重定位目标文件 foo.o


注 - 本文档中对此输出进行了简化。


可以使用 detail 标记及 symbols 标记,观察输入文件处理期间符号解析的详细信息。

$ LD_OPTIONS=-Dsymbols,detail cc -o prog main.o -L. -lfoo
....
debug: symbol table processing; input file=main.o  [ ET_REL ]
....
debug: symbol[7]=foo  (global); adding
debug:   entered  0x000000 0x000000 NOTY GLOB  UNDEF REF_REL_NEED
debug:
debug: symbol table processing; input file=./libfoo.a  [ archive ]
debug: archive[0]=bar
debug: archive[1]=foo  (foo.o) resolves undefined or tentative symbol
debug:
debug: symbol table processing; input file=./libfoo.a(foo.o)  [ ET_REL ]
debug: symbol[1]=foo.c
....
debug: symbol[7]=bar  (global); adding
debug:   entered  0x000000 0x000004 OBJT GLOB  3     REF_REL_NEED
debug: symbol[8]=foo  (global); resolving [7][0]
debug:       old  0x000000 0x000000 NOTY GLOB  UNDEF main.o
debug:       new  0x000000 0x000024 FUNC GLOB  2     ./libfoo.a(foo.o)
debug:  resolved  0x000000 0x000024 FUNC GLOB  2     REF_REL_NEED
....

已使用提取的归档成员 foo.o 中的符号定义覆盖 main.o 中的原始未定义符号 foo。详细的符号信息反映每个符号的属性。

在上一个示例中,可以看到使用一些调试标记可产生大量输出。要监视部分输入文件的活动,可直接将 -D 选项放置在链接编辑命令行中。可以通过切换打开和关闭此选项。在以下示例中,只有在处理库 libbar 期间,才会打开符号处理的显示功能。

$ ld .... -o prog main.o -L. -Dsymbols -lbar -D!symbols ....

注 - 要获取链接编辑命令行,可能必须从使用的任何驱动程序展开编译行。请参见使用编译器驱动程序