先编写一段程序,以hello.c存储
最一般的gcc用法如下
$ gcc hello.c -o hello
$ ./hello
如果我们分布执行,输入命令
预处理
gcc -E hello.c -o hello.i
预处理的结果是进行宏替换,将include的头文件全部拷贝到该文件中。所以自己写的程序应该位于新生成的文件末尾
.....................
extern int ftrylockfile (FILE *__stream) __attribute__ ((__nothrow__ , __leaf__)) ;
extern void funlockfile (FILE *__stream) __attribute__ ((__nothrow__ , __leaf__));
# 943 "/usr/include/stdio.h" 3 4
# 2 "hello.c" 2
int main(){
printf("hello,world!");
return 0;
}
编译
gcc –S hello.i –o hello.s
编译后的结果如下
.file "hello.c"
.section .rodata ;;表示程序分段,下面属于只读数据段
.LC0:
.string "hello,world!"
.text
.globl main
.type main, @function
main:
.LFB0:
.cfi_startproc
pushl %ebp
.cfi_def_cfa_offset 8
.cfi_offset 5, -8
movl %esp, %ebp
.cfi_def_cfa_register 5
andl $-16, %esp
subl $16, %esp
movl $.LC0, (%esp)
call printf
movl $0, %eax
leave
.cfi_restore 5
.cfi_def_cfa 4, 4
ret
.cfi_endproc
.LFE0:
.size main, .-main
.ident "GCC: (Ubuntu 4.8.2-19ubuntu1) 4.8.2"
.section .note.GNU-stack,"",@progbits
汇编
gcc –c hello.c –o hello.o
链接
ld –static crt1.o crti.o crtbeginT.ohello.o –start-group –lgcc –lgcc_eh –lc-end-group crtend.o crtn.o
(注意省略了文件路径名)
其中,以.开头的语句不会被翻译成机器语言,他们是给汇编器的指示。(//后面的注释是手工添加的)
上述所输出的可执行文件,和.o文件,都属于ELF文件。推荐使用readelf(linux自带)进行分析。
objdump(linux自带)也可以,而且可以进行反汇编。