关闭

GCC

244人阅读 评论(0) 收藏 举报
分类:

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



0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:58105次
    • 积分:2021
    • 等级:
    • 排名:第19771名
    • 原创:140篇
    • 转载:57篇
    • 译文:3篇
    • 评论:0条