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.編譯 優化階段 通過詞法分析 語法分析,在確認所有的指令都符合語法規則之後,將其翻譯成等價的中間 或彙編...