c语言编译过程及对应命令
以前搞編程都是IDE,雖然也知道編譯這么幾個(gè)步驟,但如何實(shí)現(xiàn)還真不是太清楚,工作在搞linux內(nèi)核驅(qū)動(dòng)開發(fā),平時(shí)做個(gè)實(shí)驗(yàn)也只是:gcc hello.c -o hello。
前段時(shí)正好在看些匯編,也就順便學(xué)習(xí)了這些,趁著沒事,分享一下。
0、源代碼
#include <stdio.h> int main(void){printf("hello_world");return 0; }1、預(yù)處理
gcc -E hello.c -o hello.i
實(shí)質(zhì)上是處理“#”,將#include包含的頭文件直接拷貝到hello.c當(dāng)中;將#define定義的宏進(jìn)行替換,同時(shí)將代碼中沒用的注釋部分刪除等
具體做的事兒如下:
- 將所有的#define刪除,并且展開所有的宏定義,說白了就是字符替換
- 處理所有的條件編譯指令,#ifdef #ifndef #endif等,就是帶#的那些
- 處理#include,將#include指向的文件插入到該行處刪除所有注釋
- 添加行號(hào)和文件標(biāo)示,這樣的在調(diào)試和編譯出錯(cuò)的時(shí)候才知道是是哪個(gè)文件的哪一行
- 保留#pragma編譯器指令,因?yàn)榫幾g器需要使用它們。
2、編譯
gcc -S hello.i -o hello.s
這里可以將hello.i換成hello.c
編譯的過程實(shí)質(zhì)上是把高級(jí)語言翻譯成匯編語言的過程,即對(duì)hello.c做了這些事兒
- 詞法分析
- 語法分析
- 語義分析
- 優(yōu)化后生成相應(yīng)的匯編代碼
高級(jí)語言->匯編語言
$ cat hello.s.file "hello.c".text.def __main; .scl 2; .type 32; .endef.section .rdata,"dr" .LC0:.ascii "hello_world\0".text.globl main.def main; .scl 2; .type 32; .endef.seh_proc main main:pushq %rbp.seh_pushreg %rbpmovq %rsp, %rbp.seh_setframe %rbp, 0subq $32, %rsp.seh_stackalloc 32.seh_endprologuecall __mainleaq .LC0(%rip), %rcxcall printfmovl $0, %eaxaddq $32, %rsppopq %rbpret.seh_endproc.ident "GCC: (x86_64-posix-sjlj-rev0, Built by MinGW-W64 project) 8.1.0".def printf; .scl 2; .type 32; .endef3、匯編
gcc -c hello.s -o hello.o
這里可以將hello.s換成hello.c
這個(gè)過程就是把匯編指令翻譯成機(jī)器語言(二進(jìn)制文件)
$ nm -C hello.o 0000000000000000 b .bss 0000000000000000 d .data 0000000000000000 p .pdata 0000000000000000 r .rdata 0000000000000000 r .rdata$zzz 0000000000000000 t .text 0000000000000000 r .xdataU __main 0000000000000000 T mainU printf4、鏈接
gcc hello.o -o hello
最后就是鏈接,也就是把將翻譯成的二進(jìn)制與需要用到庫(kù)綁定在一塊,生成可執(zhí)行文件。這時(shí)間的hello.o是不能執(zhí)行的,hello是可以的。
$ ./hello hello_world總結(jié)
預(yù)處理:gcc -E hello.c -o hello.i
編 譯:gcc -S hello.i -o hello.s
匯 編:gcc -c hello.s -o hello.o
鏈 接:gcc hello.o -o hello
直接編譯:gcc hello.c -o hello
總結(jié)
以上是生活随笔為你收集整理的c语言编译过程及对应命令的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 解决思科 Cisco Packet Tr
- 下一篇: 绘制svg