GCC

原创 2015年04月08日 00:45:08

先编写一段程序,以hello.c存储


最一般的gcc用法如下

$ gcc hello.c -o hello

$ ./hello

如果我们分布执行,输入命令

预处理

gcc -E hello.c -o hello.i

预处理的结果是进行宏替换,将include的头文件全部拷贝到该文件中。所以自己写的程序应该位于新生成的文件末尾

.....................
extern int ftrylockfile (FILE *__stream) __attribute__ ((__nothrow__ , __leaf__)) ;


extern void funlockfile (FILE *__stream) __attribute__ ((__nothrow__ , __leaf__));
# 943 "/usr/include/stdio.h" 3 4

# 2 "hello.c" 2
int main(){
 printf("hello,world!");
 return 0;
}



编译

gcc –S hello.i –o hello.s

编译后的结果如下

        .file   "hello.c"
        .section        .rodata     ;;表示程序分段,下面属于只读数据段                                 
.LC0:
        .string "hello,world!"
        .text
        .globl  main
        .type   main, @function
main:
.LFB0:
        .cfi_startproc
        pushl   %ebp
        .cfi_def_cfa_offset 8
        .cfi_offset 5, -8
        movl    %esp, %ebp
        .cfi_def_cfa_register 5
        andl    $-16, %esp
        subl    $16, %esp
        movl    $.LC0, (%esp)
        call    printf
        movl    $0, %eax
        leave
        .cfi_restore 5
        .cfi_def_cfa 4, 4
        ret
        .cfi_endproc
.LFE0:
        .size   main, .-main
        .ident  "GCC: (Ubuntu 4.8.2-19ubuntu1) 4.8.2"
        .section        .note.GNU-stack,"",@progbits


汇编

gcc –c hello.c –o hello.o

链接

ld –static crt1.o crti.o crtbeginT.ohello.o –start-group –lgcc –lgcc_eh –lc-end-group crtend.o crtn.o 

(注意省略了文件路径名)


其中,以.开头的语句不会被翻译成机器语言,他们是给汇编器的指示。(//后面的注释是手工添加的)

上述所输出的可执行文件,和.o文件,都属于ELF文件。推荐使用readelf(linux自带)进行分析。

objdump(linux自带)也可以,而且可以进行反汇编。



gcc选项参数-M

翻译自GCC的帮助文档: -M 不是输出预编译过程的结果,而是输出一个用于make的规则,该规则描述了这个main源文件的依赖关系。预编译器输出的这个make规则包含名字与原文件相同的目标文件,冒号...
  • jingsuxuyilq
  • jingsuxuyilq
  • 2012年11月11日 20:08
  • 3556

深入讲解GCC和Make的区别(有涉及makefile文件哟!!!)

刚接触linux编程,很多概论都比较模糊,今天突然用到makefile文件,想到了make与gcc的关系。于是查阅了一些资料,在此做一个小结: 1.gcc是编译一个文件,make是编译多个源文件的工...
  • haluoluo211
  • haluoluo211
  • 2016年11月23日 20:29
  • 3153

gcc安装教程(windows版本)

windows下的gcc有两个版本mingw和cygwin,二选一就好 已学会C++,做工程,建议用mingw 用cygwin编译后的二进制码在别人机器上用不了,因为其他人的机器没有cyg...
  • u012450329
  • u012450329
  • 2016年12月22日 14:10
  • 9151

gcc选项参数详解

gcc编译命令选项参数详细解释
  • uisoul
  • uisoul
  • 2017年03月03日 11:11
  • 834

初学者,ubuntu下使用GCC

如果你有下列疑问的话:为什么要在终端输命令啊? GCC 是什么东西,怎么在菜单中找不到? GCC 不能有像 VC 那样的窗口吗?作为一个初学者,我也一直有这个疑问,但是其实坚持按照前辈的路先走一遍流程...
  • sinat_18304401
  • sinat_18304401
  • 2015年04月17日 20:14
  • 6452

gcc 源码分析-前端篇1

前年写了 gcc源码分析,感觉写的不好,如果没有源代码读起来很痛苦,基本上是读天书,这一次改了一种写法,用另一种思路来写,希望这一次能好一点: 1.基本数据结构 编译器前端主要的任务就是把输入的源...
  • sstower
  • sstower
  • 2015年08月07日 15:10
  • 1320

GCC选项之-M

大多数的C/C++编译器都支持一个“-M”的选项,即自动找寻源文件中包含的头文件。举个例子,比如mian.c包含有如下头文件。 #include #include "log.h"...
  • benkaoya
  • benkaoya
  • 2013年08月31日 13:21
  • 6598

Linux升级GCC清晰简明教程

前言:   这次我在Ubuntu 12.04 LTS 64位版上更新gcc,发现了原来的一些问题,这次没有什么时间上的压力,我比较认真地去查阅了官方文档,也参考了一些网上的帖子,对整个升级...
  • origin_lee
  • origin_lee
  • 2015年01月31日 15:48
  • 3677

源码安装gcc步骤

准备工作 下载并解压gcc源码包 从http://ftp.gnu.org/gnu/gcc 下载一个你想要编译的gcc源码包。 比如下载的是gcc-4.7.2.tar.bz2,然后用输入解压命令 t...
  • wangqing_12345
  • wangqing_12345
  • 2016年09月09日 10:23
  • 6116

GCC的基本用法

linux下c编程起步一:掌握gcc基本用法    初学时最好从命令行入手,这样可以熟悉从编写程序、编译、调试和执行的整个过程。编写程序可以用vi或其它编辑器编写。 编译则使用gcc命令。...
  • gechangli7
  • gechangli7
  • 2016年05月30日 20:36
  • 5172
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:GCC
举报原因:
原因补充:

(最多只允许输入30个字)