gcc大家都很熟悉,是个编译器,功能强大,全称是:GUN GCC。
平时大家都简单的称为:GCC, 功能强大,能够编译很多的语言。包括:c, c++, java, ada等…
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
就可以了。
原文地址:http://blog.csdn.net/alps1992/article/details/44737839