我使用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
吗?如果是为什么会有这么多的???
或%%%
?
答案 0 :(得分:2)
有几种中间文件格式,具体取决于您使用的编译器系统。大多数系统使用以下步骤,此处以GCC为例显示:
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
或在文本编辑器中读取这些文件。这是BTW深入了解的宝贵资源。但是,您可以使用objdump
查看其他格式中包含的大多数信息。请阅读其documentation。
每个步骤还执行之前的所有步骤。因此(gcc test.c -o test
)会在临时文件中生成程序集源文件和目标文件,这些文件会自动删除。您可以通过为GCC提供选项-v
来观看该过程。
使用gcc --help
查看一些进一步研究的切入点。
关于此过程,还有很多要说的,但这会填满一本书。