2004 年 5 月 25 日更新 |
Sun[tm] Studio 9:增量式链接编辑器自述文件 |
目录
A. 简介
本文档包含有关 Sun Studio 9 发行版的增量式链接编辑器 (ILD) 的信息。本文档描述了本发行版本的一些新功能,包括此发行版本作出的软件更正,并列出了已知的问题、限制和不兼容性。本文档中的信息优先于此发行版本各手册中的信息。
产品文档
- Solaris 平台的发行说明:可以通过 Sun Studio 9 网站 http://developers.sun.com/tools/cc/documentation/ss9_docs/release_notes.html 获得此发行说明。发行说明中的信息会更新和扩展所有自述文件中的信息。
- Sun Studio 9 文档:产品手册页、自述文件的 HTML 版本以及手册可以从 /installation_directory/SUNWspro/docs/index.html 进行访问。缺省安装目录为 /opt。您可以从 index.html 页访问下列文档:
- C 编译器自述文件
- C++ 编译器自述文件
- C 用户指南
- C++ 用户指南
- 数学库自述文件
- 数值计算指南
- Sun 性能库自述文件
- Sun 性能库参考手册
- Fortran 和 C 的 Sun 性能库用户指南
- 集成开发环境 (IDE) 文档:Sun Studio 9 IDE 所有组件的联机帮助可从 IDE 中的 [帮助] 菜单进行访问。
- 开发人员资源门户:有关技术文章、代码样例、文档和知识库,请参见开发人员门户,网址:http://developers.sun.com/prodtech/cc。
要查看本自述的文本格式文件,请输入以下的命令:
more /opt/SUNWspro/READMEs/ild
如要查看本自述的 HTML 格式文件,请使用浏览器访问缺省安装目录:
file:/opt/SUNWspro/docs/index.html注意—如果 Sun Studio 9 软件未安装在缺省 /opt 目录中,请询问系统管理员以获得系统中的等价路径。
B. 关于 Sun Studio 9 递增连接编辑器
此发行版本的 ILD 可用于 Solaris[tm] 操作环境 (SPARC(R);Platform Edition) 8、9 和 10 Beta 版本;以及 Solaris 操作环境 (x86 Platform Edition) 8、9 和 10 Beta 版本。
注意—在本文档中,术语“IA”指 Intel 32 位处理器体系结构,包括 Pentium、Pentium Pro、Pentium II、Pentium II Xeon、Celeron、Pentium III 和 Pentium III Xeon 处理器以及 AMD 和 Cyrix 制造的兼容微处理器。
C. 新特性和更改的特性
本节描述了 ILD 的新增和更改的功能。这些新增功能和更改的功能记录在与每一项一起列出的标识号下面的 Bugtraq+ 数据库中。
也可以转到 http://docs.sun.com 来访问此手册。
- ILD 支持通过《C 用户指南》和《C++ 用户指南》中提供的特殊声明说明符启用链接器作用域,也支持通过 -xldscope 编译器选项启用链接器作用域。
- ILD 通过将 .stab.sbfocus 和 .stab.sbfocusstr 部分链接到输出可执行文件中,来支持 DWARF 格式的源代码浏览器信息。
关于 DWARF 格式的更多信息,请参见《C 用户指南》或 cc(1) 中的 -xdebugformat。
- ILD 通过 SPARC 平台的增强 ILD 变量来支持本地线程存储。
关于本地线程存储的详细信息,请参见《C 用户指南》和《C++ 用户指南》中提供的声明说明符,也可以查看 -xthreadvar 编译器选项的解释。
D. 软件更正
本节详细说明了以下软件更正:
- 4783169
ILD 已经更新,以避免同时进行更新、链接和第二次更新输入文件的操作。如果同时进行这些操作,会导致 ILD 不能检测到输入文件的二次更新(其 st_mtime 保持不变)。
- 4754134
ILD 已经更新,以删除在 .stab.index%* 部分有关 N_OBJ stabs 数目的一个错误假设,该假设导致了错误的 comdat stabs。
- 4695562
ILD 已经更新,以便能够正确处理不可分配段符号的重定位。
E. 问题和解决办法
本节讨论了已知的软件问题及其可能的解决方法。关于更新和补丁程序,请查看相关信息,网址为 http://developers.sun.com/prodtech/cc/support_index.html。
- ILD 现在支持对寄存器符号定义的只加策略。这一策略意味着如果输入文件使用寄存器符号,那么对该文件的修改会导致 ILD 执行全链接,而不是增量式链接。
- 使用优化级而非 -g 编译可以导致对寄存器符号的使用。而且,当链接器和没有使用 -g 进行编译的程序一起使用时,要充分利用 ILD 就需要格外小心。
- ILD 使用一个和归档库输入文件相关联的时间标记,以确定哪些文件被更新过。如果在任何库中都不存在相同符号的多次定义,那 ILD 将会正确工作。然而,同一个符号在一个或多个库中的多次定义会使 ILD 无法分辨。在这些情况下,ILD 只会生成一个错误的程序。
- -m 选项会生成一个内存映射,但是不会在标准输出上生成一个非致命的多重定义的列表。
- 一旦一个输入文件从归档文件中提取出来并链接到一个增量式可执行程序,那么即使删除了对它的所有引用,输入文件也将一直在这个可执行程序中,直到下一次初始化链接。在这样的测试情况下,第一个链接有一个指向 myfunc1 和 myfunc2 的引用。one.o 和 two.o 均被从归档文件中正确提取出来。请查看错误描述最后部分的代码。
% cc -c main1.c main2.c one.c two.c % ar cr libfoo.a one.o two.o % rm -f a.out % cp main2.o main.o # references myfunc1 and myfunc2 % cc -xildon main.o libfoo.a # first link (initial link) % ./a.out Calling myfunc1! myfunc1 called! Calling myfunc2! myfunc2 called! % nm a.out | grep myfunc [59] | 68912| 32|FUNC |GLOB|0 |8 |myfunc1 [60] | 68960| 32|FUNC |GLOB|0 |8 |myfunc2
在第二个链接中,myfunc2 已经不再被引用,但是它仍然出现在可执行程序中(任何其他在 two.0 中定义的符号也是一样的)。然后通过删除 a.out,强制进行新的初始链接,第三个链接不再包含 myfunc2。
% cp main1.o main.o # myfunc2 no longer referenced % cc -xildon main.o libfoo.a # second link (incremental link) % ./a.out Calling myfunc1 myfunc1 called! % nm a.out | grep myfunc [59] | 68912| 32|FUNC |GLOB|0 |8 |myfunc1 [60] | 68960| 32|FUNC |GLOB|0 |8 |myfunc2 # Removing a.out fixes the problem. % rm a.out # force a new initial link % cc -xildon main.o libfoo.a # third link (initial link) % nm a.out | grep myfunc [58] | 68832| 32|FUNC |GLOB|0 |8 |myfunc1
以下情况会导致出现问题:
在程序的其他地方定义了一些已经在 two.o 中定义的标识符,包括 two.o,将出现错误定义或多重定义的符号错误。
dbx 和其他检查 a.out 的工具仍然检测到 two.o 被包含。例如,如果您在第二次链接的输出上运行 dxb,可以在 myfun2 中请求停止。这实际并不是问题,但仍可能产生疑惑。
它也可能有重叠错误。这就是说,two.o 在程序中只能够包含对归档文档的其他输入文件中出现的符号的引用,这就引起对更多输入文件的不必要的抽取。这些新的归档也可能出现上面列出的问题。
程序代码:
% cat main1.c #include <stdio.h> extern void myfunc1(void); int main(void) { (void)printf("Calling myfunc1\n"); myfunc1(); return 0; } % cat main2.c #include <stdio.h> extern void myfunc1(void), myfunc2(void); int main(void) { (void)printf("Calling myfunc1!\n"); myfunc1(); (void)printf("Calling myfunc2!\n"); myfunc2(); return 0; } % cat one.c #include <stdio.h> void myfunc1(void) { (void)printf("myfunc1 called!\n"); } % cat two.c #include <stdio.h> void myfunc2(void) { (void)printf("myfunc2 called!\n"); }
F. 限制和不兼容
本节讨论系统或其他软件的限制和不兼容。有关此 Sun Studio 9 发行版的最新信息,请参见 《Sun Studio 9 发行说明》,网址为 http://developers.sun.com/tools/cc/documentation/ss9_docs/release_notes.html。
G. 文档错误
目前没有新的信息。
版权所有 © 2004 Sun Microsystems, Inc. 保留所有权利。必须依据许可证条款使用。