程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> C/C++學習 - gcc編譯過程查看匯編代碼

C/C++學習 - gcc編譯過程查看匯編代碼

編輯:C++入門知識

C/C++學習 - gcc編譯過程查看匯編代碼


GCC GCC參數 舉例

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 "" 1
# 1 "" 3
# 175 "" 3
# 1 " 
" 1
# 1 "" 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就可以了。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved