文件格式
C 编译器的正常输出是用于您所指定的目标处理器的汇编代码 。汇编代码是汇编器的输入,在缺省情况下,汇编器将生成所有目标文件的祖先,即 a.out 文件 。这个名称本身表示汇编输出 (Assembler Output) 。要创建 a.out 文件,可以在 xterm 窗口中输入下面的命令:
cc hw.c
注意:如果出现了任何错误或者没有创建 a.out 文件,那么您可能需要检查自己的系统或源文件 (hw.c),以找出其中的错误 。还需要检查是否已将 cc 定义为运行您的 C/C编译器 。
最新的 C 编译器将编译和汇编步骤组合成一个步骤 。您可以指定不同开关选项以查看 C 编译器的汇编输出 。通过输入下面的命令,您可以看到 C 编译器的汇编输出:
cc -S hw.c
这个命令生成了一个新的文件 hw.s,其中包含您通常无法看到的汇编输入文本,因为编译器在缺省情况下将生成 a.out 文件 。正如所预期的,Unix 汇编程序可以对这种输入文件进行汇编,以生成 a.out 文件 。
UNIX 特定的工具
假定编译过程一切顺利,那么在该目录中就有了一个 a.out 文件,下面让我们来对其进行研究 。有许多可用于研究目标文件的有价值的工具,下面便是其中一组:
nm:列出目标文件中的符号 。objdump:显示目标文件中的详细信息 。readelf:显示关于 ELF 目标文件的信息 。列表中的第一个工具是 nm,它可以列出目标文件中的符号 。如果您输入 nm 命令,您将注意到在缺省情况下,它会寻找一个名为 a.out 的文件 。如果没有找到该文件,这个工具会给出相应的提示 。然而,如果该工具找到了编译器创建的 a.out 文件,它将显示类似清单 2 的清单 。
清单 2. nm 命令的输出08049594 A __bss_start
080482e4 t call_gmon_start
08049594 b completed.4463
08049498 d __CTOR_END__
08049494 d __CTOR_LIST__
08049588 D __data_start
08049588 W data_start
0804842c t __do_global_ctors_aux
0804830c t __do_global_dtors_aux
0804958c D __dso_handle
080494a0 d __DTOR_END__
0804949c d __DTOR_LIST__
080494a8 d _DYNAMIC
08049594 A _edata
08049598 A _end
08048458 T _fini
08049494 a __fini_array_end
08049494 a __fini_array_start
08048478 R _fp_hw
0804833b t frame_dummy
08048490 r __FRAME_END__
08049574 d _GLOBAL_OFFSET_TABLE_
w __gmon_start__
08048308 T __i686.get_pc_thunk.bx
08048278 T _init
08049494 a __init_array_end
08049494 a __init_array_start
0804847c R _IO_stdin_used
080494a4 d __JCR_END__
080494a4 d __JCR_LIST__
w _Jv_RegisterClasses
080483e1 T __libc_csu_fini
08048390 T __libc_csu_init
U __libc_start_main@@GLIBC_2.0
08048360 T main
08049590 d p.4462
U puts@@GLIBC_2.0
080482c0 T _start
这些包含可执行代码的段称为正文段 。同样地,数据段包含了不可执行的信息或数据 。另一种类型的段,称为 BSS 段,它包含以符号数据开头的块 。
对于 nm 命令列出的每个符号,它们的值使用十六进制来表示(缺省行为),并且在该符号前面加上了一个表示符号类型的编码字符 。常见的各种编码包括:A 表示绝对 (absolute),这意味着不能将该值更改为其他的连接;B 表示 BSS 段中的符号;而 C 表示引用未初始化的数据的一般符号 。
可以将目标文件中所包含的不同的部分划分为段 。段可以包含可执行代码、符号名称、初始数据值和许多其他类型的数据 。有关这些类型的数据的详细信息,可以阅读 Unix 中 nm 的 man 页面,其中按照该命令输出中的字符编码分别对每种类型进行了描述 。
细节,细节…
在目标文件阶段,即使是一个简单的 Hello World 程序,其中也包含了大量的细节信息 。nm 程序可用于列举符号及其类型和值,但是,要更仔细地研究目标文件中这些命名段的内容,需要使用功能更强大的工具 。
推荐阅读
- 口令篇 UNIX操作系统的安全命令集
- 进行类Unix小型机系统管理的八项注意
- 类UNIX系统基础:文件安全与权限
- 在SCO Unix系统中实现业务数据的自动备份
- 构建SCO UNIX下的邮件系统
- sco unixware 7.1.1 全面学习资料
- SCO UNIX 系统下搭建电子邮件服务器
- undelete 如何在SCO UNIX下的反删除
- UNIX 常用指令介绍
- 对话 UNIX,第 7 部分: 命令行惯用语