C語言編譯鏈結過程(袁春風版)

2021-10-04 14:07:33 字數 2779 閱讀 2424

0x01 乙個典型程式的編譯、鏈結過程圖示

hello.c原始碼

#include

intmain()

gcc命令實際上是具體程式(如cpp、cc1、as等)的包裝命令,使用者通過gcc命令來使用具體的預處理程式cpp、編譯程式cc1、匯程式設計序as等。

0x02 預處理cpp

1、處理原始檔中以「#」開頭的預編譯指令,包括:

2、預處理命令

gcc -e hello.c -o hello.i
cpp hello.c > hello.i
3、檢視生成的hello.i檔案內容(不包含任何巨集定義)

root@kali2020:~# cat hello.i

# 1 "hello.c"

# 1 ""

# 1 ""

# 31 ""

# 1 "/usr/include/stdc-predef.h" 1 3 4

# 32 "" 2

# 1 "hello.c"

# 1 "/usr/include/stdio.h" 1 3 4

...extern int __overflow (file *, int)

;# 873 "/usr/include/stdio.h" 3 4

# 2 "hello.c" 2

# 2 "hello.c"

int main(

)

0x03 編譯cc1

1、編譯過程就是將預處理後得到的預處理檔案(如hello.i)進行詞法分析、語法分析、語義分析並優化,生成彙編檔案**。

2、編譯命令

gcc -s hello.i -o hello.s
gcc -s hello.c -o hello.s
/usr/lib/gcc/x86_64-linux-gnu/9/cc1 hello.c
3、檢視hello.s,其實是文字檔案,組合語言源程式。

root@kali2020:~# cat hello.s

.file "hello.c"

.text

.section .rodata

.lc0:

.string "hello world!"

.text

.globl main

.type main, @function

main:

.lfb0:

.cfi_startproc

pushq %rbp

.cfi_def_cfa_offset 16

.cfi_offset 6, -16

movq %rsp, %rbp

.cfi_def_cfa_register 6

leaq .lc0(%rip), %rdi

movl $0, %eax

call printf@plt

movl $0, %eax

popq %rbp

.cfi_def_cfa 7, 8

ret.cfi_endproc

.lfe0:

.size main, .-main

.ident "gcc: (debian 9.2.1-22) 9.2.1 20200104"

.section .note.gnu-stack,"",@progbits

0x04 彙編

1、將彙編源程式轉換程機器指令序列的過程。

gcc -c hello.s -o hello.o
gcc -c hello.c -o hello.o
as hello.c -o hello.o
2、檢視可重定位的目標檔案hello.o

root@kali2020:~# cat hello.o

elf>�@@

wh��h�=���]�hello world!gcc: (debian 9.2.1-22) 9.2.1 20200104zr�a�c

�� $hello.cmain_global_offset_table_printf��������

�������� .symtab.strtab.shstrtab.rela.text.data.bss.rodata.comment.note.gnu-stack.rela.eh_frame @@0

90i'b�w�r@h

0x05 鏈結ld

1、鏈結過程是將多個可重定位的目標檔案合併生成可執行的目標檔案。

gcc -static -o myproject main.o test.o
ld -static -o myproject main.o test.o
2、鏈結操作的步驟

3、使用鏈結的好處

4、鏈結過程的本質

c語言編譯 鏈結過程

c語言的編譯鏈結過程 把c程式 源 轉換成可以在機器上執行的程式 可執行 需要進行編譯和鏈結的過程。1 編譯 主要包含兩個過程 1 預處理 巨集定義 檔案包含 條件編譯。在正式開始編譯之前根據預處理命令來修改原始檔的內容 2 編譯 優化 通過詞法分析和語法分析將指令翻譯成彙編 2 彙編 把組合語言 ...

C語言的編譯鏈結過程

編寫的乙個c程式 源程式 轉換成可以在硬體上執行的程式 可執行程式 需要進行翻譯環境和執行環境。翻譯環境則包括兩大過程編譯和鏈結,經過編譯和鏈結過程便可形成可執行程式。一 編譯 將文字形式的源 翻譯成計算機認識的機器語言 編譯又分為預處理器處理 編譯 彙編。1.預處理器處理 主要是進行文字操作,包括...

c 編譯鏈結過程

llinux下編譯乙個c 程式的典型過程 1.編譯預處理 預編譯程式完成的工作,可以說成是對源程式的 替換 工作。經過這個過程,生成乙個沒有巨集定義 沒有條件編譯指令 沒有特殊符號的輸出檔案。2.編譯 優化階段 通過詞法分析 語法分析,在確認所有的指令都符合語法規則之後,將其翻譯成等價的中間 或彙編...