C 编译过程浅析

Posted 青山应回首

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C 编译过程浅析相关的知识,希望对你有一定的参考价值。

 

    From where i stand,

        there are two programmig languages in the world,

            which is C lang and the other.

 

编译(compile)

  • 预处理(也称预编译,Preprocessing)
  • 编译(Compilation)
  • 汇编 (Assembly)
  • 连接(Linking)

GCC参考

gcc - GNU project C and C++ compiler

If you only want some of the stages of compilation, you can use -x (or filename suffixes) to tell gcc where to start, and one of the options -c, -S, or -E to say where gcc is to stop. Note that some combinations (for example, -x cpp-output -E) instruct gcc to do nothing at all.

  • -E Stop after the preprocessing stage; do not run the compiler proper.
  • -S Stop after the stage of compilation proper; do not assemble.
  • -c Compile or assemble the source files, but do not link.
  • -o targetfile Place output in file targetfile.



 1 [root@standby gcc]# date +%F_%H:%M:%S
 2 2016-11-29_23:31:29
 3 [root@standby gcc]# pwd
 4 /data/gcc
 5 [root@standby gcc]# ll
 6 total 4
 7 -rw-r--r-- 1 root root 82 Nov 29 23:27 hello.c
 8 [root@standby gcc]# cat hello.c 
 9 #include <stdio.h>
10 int main(void)
11 {
12     printf("Hello World!\\n");
13     return 0;
14 }
15 [root@standby gcc]# 
16 [root@standby gcc]# file hello.c
17 hello.c: ASCII C program text
18 [root@standby gcc]#

 

预处理/Preprocessing

\'删除注释和";"、进行宏替换、将头文件插入进来、条件编译等\'
1 [root@standby gcc]# gcc -E hello.c -o hello.i
2 [root@standby gcc]# ll
3 total 24
4 -rw-r--r-- 1 root root    82 Nov 29 23:27 hello.c
5 -rw-r--r-- 1 root root 16742 Nov 29 23:58 hello.i
6 [root@standby gcc]# file hello.i
7 hello.i: ASCII C program text
8 [root@standby gcc]#

 

编译/Compilation

\'生成汇编代码\'
1 [root@standby gcc]# gcc -S hello.i -o hello.s
2 [root@standby gcc]# ll
3 total 28
4 -rw-r--r-- 1 root root    82 Nov 29 23:27 hello.c
5 -rw-r--r-- 1 root root 16742 Nov 29 23:58 hello.i
6 -rw-r--r-- 1 root root   444 Nov 30 00:00 hello.s
7 [root@standby gcc]# file hello.s
8 hello.s: ASCII assembler program text
9 [root@standby gcc]#

 

汇编/Assembly

\'生成目标文件\'
 1 [root@standby gcc]# gcc -c hello.s -o hello.o
 2 [root@standby gcc]# ll
 3 total 32
 4 -rw-r--r-- 1 root root    82 Nov 29 23:27 hello.c
 5 -rw-r--r-- 1 root root 16742 Nov 29 23:58 hello.i
 6 -rw-r--r-- 1 root root  1504 Nov 30 00:03 hello.o
 7 -rw-r--r-- 1 root root   444 Nov 30 00:00 hello.s
 8 [root@standby gcc]# file hello.o 
 9 hello.o: ELF 64-bit LSB relocatable, x86-64, version 1 (SYSV), not stripped
10 [root@standby gcc]#

 

连接/Linking

\'生成可执行文件\'
 1 [root@standby gcc]# gcc hello.o -o helloworld
 2 [root@standby gcc]# ll
 3 total 40
 4 -rw-r--r-- 1 root root    82 Nov 29 23:27 hello.c
 5 -rw-r--r-- 1 root root 16742 Nov 29 23:58 hello.i
 6 -rw-r--r-- 1 root root  1504 Nov 30 00:03 hello.o
 7 -rw-r--r-- 1 root root   444 Nov 30 00:00 hello.s
 8 -rwxr-xr-x 1 root root  6425 Nov 30 00:04 helloworld
 9 [root@standby gcc]# file helloworld 
10 helloworld: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.18, not stripped
11 [root@standby gcc]# 
12 [root@standby gcc]# ./helloworld 
13 Hello World!
14 [root@standby gcc]#

 




汇编代码

 1 [root@standby gcc]# cat hello.s 
 2     .file    "hello.c"
 3     .section    .rodata
 4 .LC0:
 5     .string    "Hello World!"
 6     .text
 7 .globl main
 8     .type    main, @function
 9 main:
10 .LFB0:
11     .cfi_startproc
12     pushq    %rbp
13     .cfi_def_cfa_offset 16
14     .cfi_offset 6, -16
15     movq    %rsp, %rbp
16     .cfi_def_cfa_register 6
17     movl    $.LC0, %edi
18     call    puts
19     movl    $0, %eax
20     leave
21     .cfi_def_cfa 7, 8
22     ret
23     .cfi_endproc
24 .LFE0:
25     .size    main, .-main
26     .ident    "GCC: (GNU) 4.4.7 20120313 (Red Hat 4.4.7-17)"
27     .section    .note.GNU-stack,"",@progbits
28 [root@standby gcc]#

 

以上是关于C 编译过程浅析的主要内容,如果未能解决你的问题,请参考以下文章

C程序编译过程浅析

C 编译过程浅析

RK356x U-Boot研究所(编译篇)2.1 U-Boot编译过程浅析

DLL入门浅析转

浅析V8引擎,让你更懂JavaScript!

如何有条件地将 C 代码片段编译到我的 Perl 模块?