电脑技术学习

UNIX 目标文件初探

dn001

  文件格式

  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

    标签: