gcc編譯過程檢視彙編程式碼
阿新 • • 發佈:2019-01-27
GCC
gcc大家都很熟悉,是個編譯器,功能強大,全稱是:GUN GCC。
平時大家都簡單的稱為:GCC, 功能強大,能夠編譯很多的語言。包括:c, c++, java, ada等…
GCC引數
gcc平時有很多引數,在平時我編譯小程式的時候,都直接gcc -o object source.c
就可以了。
但是有一次我想檢視我同樣目的但是不同寫法的兩個程式碼是執行效率上是否有差別。所以我就查了下gcc編譯過程中的彙編程式碼的引數。
引數 | 說明 |
---|---|
-c | 只編譯不連結,生成*.o 檔案 |
-S | 生成彙編程式碼*.s |
-E | 預編譯 生成*.i 檔案 |
-g | 在可執行程式裡包含了除錯資訊,可用 gdb 除錯 |
-o | 把輸出檔案輸出到指定檔案裡 |
-static | 連結靜態連結庫 |
-library | 連結名為library的連結庫 |
舉例
使用方法比較簡單:
- 首先預編譯:
gcc -E hello.c -o hello.i
這樣我們就得到了一個預編譯的檔案。
裡面是一些:
# 1 "main.cpp"
# 1 "<built-in>" 1
# 1 "<built-in>" 3
# 175 "<built-in>" 3
# 1 "<command line>" 1
# 1 "<built-in>" 2
# 1 "main.cpp" 2
# 1 "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/iostream" 1 3
# 37 "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/iostream" 3
# 1 "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/__config" 1 3
# 16 "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/__config" 3
# 226 "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/__config" 3
typedef __char16_t char16_t;
typedef __char32_t char32_t;
# 349 "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/__config" 3
...
如這樣的東西,就是把一些標頭檔案放到裡面神馬的。
- 然後可以連結:
gcc -S hello.i -o hello.s
裡面就是彙編程式碼了。如下:
.section __TEXT,__text,regular,pure_instructions
.section __TEXT,__const
.align 4
LCPI0_0:
.long 1127219200 ## 0x43300000
.long 1160773632 ## 0x45300000
.long 0 ## 0x0
.long 0 ## 0x0
LCPI0_1:
.quad 4841369599423283200 ## double 4.503600e+15
.quad 4985484787499139072 ## double 1.934281e+25
.section __TEXT,__text,regular,pure_instructions
.globl _main
.align 4, 0x90
_main: ## @main
.cfi_startproc
## BB#0:
pushq %rbp
Ltmp2:
.cfi_def_cfa_offset 16
Ltmp3:
.cfi_offset %rbp, -16
movq %rsp, %rbp
...
原諒我對彙編比較白痴,我只能看懂很少一點點彙編程式碼,想學都拖了好久了 TT
- 然後進行編譯,不連結生成
.o
檔案。
gcc -c hello.s -o hello.o
這個時候已經沒辦法用文字編輯器開啟查看了。已經是二進位制檔案了。開啟也都是0 1
了
我用sublime text 2 開啟後是一堆16進位制的程式碼了。
- 然後生成可執行檔案:
gcc hello.o -o hello
這個時候,連結成功,編譯為可執行檔案了。
執行的時候只用./hello
就可以了。