编译c文件后会得到什么?

时间:2019-08-02 03:00:38

标签: c compilation

我使用gcc编译了hello.c

dele-MBP:temp ldl$ ls
a.out   hello.c

现在,当我cat a.out

$ cat a.out 
??????? H__PAGEZERO?__TEXT__text__TEXTP1P?__stubs__TEXT??__stub_helper__TEXT???__cstring__TEXT??__unwind_info__TEXT?H??__DATA__nl_symbol_ptr__DATA__la_symbol_ptr__DATH__LINKEDIT  ?"?   0 0h ? 8
                                 P?  
                                     /usr/lib/dyldס??;K????t22 

?*(?P
     8??/usr/lib/libSystem.B.dylib&`)h UH??H?? ?E??}?H?u?H?=5??1ɉE??H?? ]Ð?%?L?yAS?%i?h?????Hello
P44?4

显示混乱的代码。

我想知道什么类型的a.out?是assembly language吗?如果是为什么会有这么多的???%%%

1 个答案:

答案 0 :(得分:2)

有几种中间文件格式,具体取决于您使用的编译器系统。大多数系统使用以下步骤,此处以GCC为例显示:

  1. 经过预处理的C源代码(gcc -E test.c -o test.i),但严格来说,这是在编译之前
  2. 组装源(gcc -S test.c -o test.s
  3. 包含机器代码的目标文件,不可执行,因为无法解析对外部函数的调用(gcc -c test.c -o test.o
  4. 包含机器代码(gcc test.c -o test)的可执行文件

只有前两个步骤会生成文本文件,您可以通过cat或在文本编辑器中读取这些文件。这是BTW深入了解的宝贵资源。但是,您可以使用objdump查看其他格式中包含的大多数信息。请阅读其documentation

每个步骤还执行之前的所有步骤。因此(gcc test.c -o test)会在临时文件中生成程序集源文件和目标文件,这些文件会自动删除。您可以通过为GCC提供选项-v来观看该过程。

使用gcc --help查看一些进一步研究的切入点。

关于此过程,还有很多要说的,但这会填满一本书。