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 "<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就可以了。

时间: 2024-10-15 05:24:40

C/C++学习 - gcc编译过程查看汇编代码的相关文章

GCC编译过程与动态链接库和静态链接库

1. 库的介绍 库是写好的现有的,成熟的,可以复用的代码.现实中每个程序都要依赖很多基础的底层库,不可能每个人的代码都从零开始,因此库的存在意义非同寻常. 本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行.库有两种:静态库(.a..lib)和动态库(.so..dll). windows上对应的是.lib .dll linux上对应的是.a .so 在这里先介绍下Linux下的gcc编译的几个选项 g++ -c hellospeak.cpp 会将hellospeak.cpp 选

gcc 编译过程

gcc 编译过程从 hello.c 到 hello(或 a.out)文件, 必须历经 hello.i. hello.s. hello.o,最后才得到 hello(或a.out)文件,分别对应着预处理.编译.汇编和链接 4 个步骤,整个过程如图 10.5 所示. 这 4 步大致的工作内容如下:(1) 预处理, C 编译器对各种预处理命令进行处理,包括头文件包含.宏定义的扩展.条件编译的选择等:(2) 编译,将预处理得到的源代码文件,进行"翻译转换",产生出机器语言的目标程序,得到机器语言

c++ 单步查看汇编代码【转】

form here 用gdb 查看汇编代码, 采用disassemble 和 x 命令. nexti, stepi 可以单步指令执行 如下例: ------------------------------------------------------------源代码:------------------------------------------------------------[[email protected] ~]# cat 1.c#include <stdio.h> int

Linux系统GCC常用命令和GCC编译过程描述

前言: GCC 原名为 GNU C 语言编译器(GNU C Compiler),因为它原本只能处理 C语言.GCC 很快地扩展,变得可处理 C++.后来又 扩展能够支持更多编程语言,如Fortran.Pascal.Objective-C.Java.Ada.Go以及各类处理器架构上的汇编语言等,所以改 名GNU编译器套件(GNU Compiler Collection).(百度百科,想了解自己查询) 一.GCC程序的编译过程大概分四个阶段 预处理(Pre-Processing) 编译(Compil

GCC 编译过程和链接库

GCC 加工程序的过程 在Linux下进行C语言编程,必然要采用GNU GCC来编译C源代码生成可执行程序. 一.GCC使用 Gcc指令的一般格式为:Gcc [选项] 要编译的文件 [选项] [目标文件] 其中,目标文件可缺省,Gcc默认生成可执行的文件名为:a.out 我们来看一下经典入门程序"Hello World!" # vi  main.c #include <stdio.h> void main () { printf("hello world!\n&q

system 系统调用、gcc编译过程

system 库函数的功能是执行操作系统的命令或者运行指定的程序 #include <stdio.h> #include <stdlib.h>//引入库 int main() { //system("notepad");//打开记事本 system("dir");//查看目录 system("ipconfig");查看ip return 0; } 多线程 pthread_create thread_create POSIX

gcc编译过程简述

在linux系统上,从源文件到目标文件的转化是由编译器完成的.以hello.c程序的编译为例,如下: [email protected]: gcc -o hello hello.c 在这里,gcc编译器读取源文件hello.c,并把它翻译成一个可执行文件 hello. 这个翻译过程可分为四个阶段逐步完成:预处理,编译,汇编,链接,如下图所示. 逐步做下简单分析: 在未编译前,hello.c 的源代码如下 #include <stdio.h> int main() { printf("

GCC编译过程

以下是C程序一般的编译过程: gcc的编译流程分为四个步骤,分别为:· 预处理(Pre-Processing) 对C语言进行预处理,生成*.i文件.· 编译(Compiling) 将上一步生成的*.i文件编译生成汇编语言文件,后缀名为*.s· 汇编(Assembling) 将汇编语言文件*.s经过汇编,生成目标文件,后缀名为*.o· 链接(Linking) 将各个模块的*.o文件链接起来,生成最终的可执行文件 示例代码: 1 //hello.c源代码 2 3 #include<stdio.h>

gcc 编译过程及有关命令详解

用gcc编译.c文件流程 1 预处理阶段,输入c的源文件,编译器分析处理源代码文件中的各种宏指令,如"#ifdef,#endif,#include"等,进行去注释,头文件展开,宏替换等操作 .用户可以用 -E 参数让GCC在预处理结束后停止编译过程(gcc -E [source file(.c)] -o [output file(.i)]. 2 编译阶段,从高级语言转换为汇编语言,GCC在预处理后要检查代码规范,是否有语法错误.无误后翻译为汇编语言. GCC 的 -S 选项让GCC在进