GCC

先编写一段程序,以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自带)也可以,而且可以进行反汇编。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值