编译c文件后我得到了什么?

编译c文件后我得到了什么?,c,compilation,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__DA

我使用
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
?它是汇编语言吗?如果这就是为什么有这么多的
%%

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

  • 预处理的C源代码(
    gcc-E test.C-o test.i
    ),但严格来说,这是在编译之前
  • 程序集源代码(
    gcc-S test.c-o test.S
  • 包含机器代码的对象文件,不可执行,因为未解析对外部函数的调用(
    gcc-c test.c-o test.o
  • 包含机器代码的可执行文件(
    gcc test.c-o test
  • 只有前两个步骤才能生成可由
    cat
    或在文本编辑器中读取的文本文件。顺便说一句,这是一个有价值的见解来源。但是,您可以使用
    objdump
    查看其他格式中包含的大多数信息。请看它

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

    使用
    gcc--help
    查看一些入口点,以便进一步调查


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

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

  • 预处理的C源代码(
    gcc-E test.C-o test.i
    ),但严格来说,这是在编译之前
  • 程序集源代码(
    gcc-S test.c-o test.S
  • 包含机器代码的对象文件,不可执行,因为未解析对外部函数的调用(
    gcc-c test.c-o test.o
  • 包含机器代码的可执行文件(
    gcc test.c-o test
  • 只有前两个步骤才能生成可由
    cat
    或在文本编辑器中读取的文本文件。顺便说一句,这是一个有价值的见解来源。但是,您可以使用
    objdump
    查看其他格式中包含的大多数信息。请看它

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

    使用
    gcc--help
    查看一些入口点,以便进一步调查


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

    使用
    文件a.out
    它会将文件标识为可执行文件。这意味着它包含机器代码和控制信息。它不适合人类阅读。使用
    文件a.out
    ,它会将该文件标识为可执行文件。这意味着它包含机器代码和控制信息。它不打算被人类阅读。