C 编译过程浅析

  From where i stand, there are two programmig languages in the world, which is C lang and the other.

                                                                    --- standby

编译(compile)

  • 预处理(也称预编译,Preprocessing)
  • 编译(Compilation)
  • 汇编 (Assembly)
  • 连接(Linking)

GCC参考

gcc - GNU project C and C++ compiler

If you only want some of the stages of compilation, you can use -x (or filename suffixes) to tell gcc where to start, and one of the options -c, -S, or -E to say where gcc is to stop. Note that some combinations (for example, -x cpp-output -E) instruct gcc to do nothing at all.

  • -E Stop after the preprocessing stage; do not run the compiler proper.
  • -S Stop after the stage of compilation proper; do not assemble.
  • -c Compile or assemble the source files, but do not link.
  • -o targetfile Place output in file targetfile.



 1 [[email protected] gcc]# date +%F_%H:%M:%S
 2 2016-11-29_23:31:29
 3 [[email protected] gcc]# pwd
 4 /data/gcc
 5 [[email protected] gcc]# ll
 6 total 4
 7 -rw-r--r-- 1 root root 82 Nov 29 23:27 hello.c
 8 [[email protected] gcc]# cat hello.c
 9 #include <stdio.h>
10 int main(void)
11 {
12     printf("Hello World!\n");
13     return 0;
14 }
15 [[email protected] gcc]#
16 [[email protected] gcc]# file hello.c
17 hello.c: ASCII C program text
18 [[email protected] gcc]#

预处理/Preprocessing

‘删除注释和";"、进行宏替换、将头文件插入进来、条件编译等‘
1 [[email protected] gcc]# gcc -E hello.c -o hello.i
2 [[email protected] gcc]# ll
3 total 24
4 -rw-r--r-- 1 root root    82 Nov 29 23:27 hello.c
5 -rw-r--r-- 1 root root 16742 Nov 29 23:58 hello.i
6 [[email protected] gcc]# file hello.i
7 hello.i: ASCII C program text
8 [[email protected] gcc]#

编译/Compilation

‘生成汇编代码‘
1 [[email protected] gcc]# gcc -S hello.i -o hello.s
2 [[email protected] gcc]# ll
3 total 28
4 -rw-r--r-- 1 root root    82 Nov 29 23:27 hello.c
5 -rw-r--r-- 1 root root 16742 Nov 29 23:58 hello.i
6 -rw-r--r-- 1 root root   444 Nov 30 00:00 hello.s
7 [[email protected] gcc]# file hello.s
8 hello.s: ASCII assembler program text
9 [[email protected] gcc]#

汇编/Assembly

‘生成目标文件‘
 1 [[email protected] gcc]# gcc -c hello.s -o hello.o
 2 [[email protected] gcc]# ll
 3 total 32
 4 -rw-r--r-- 1 root root    82 Nov 29 23:27 hello.c
 5 -rw-r--r-- 1 root root 16742 Nov 29 23:58 hello.i
 6 -rw-r--r-- 1 root root  1504 Nov 30 00:03 hello.o
 7 -rw-r--r-- 1 root root   444 Nov 30 00:00 hello.s
 8 [[email protected] gcc]# file hello.o
 9 hello.o: ELF 64-bit LSB relocatable, x86-64, version 1 (SYSV), not stripped
10 [[email protected] gcc]#

连接/Linking

‘生成可执行文件‘
 1 [[email protected] gcc]# gcc hello.o -o helloworld
 2 [[email protected] gcc]# ll
 3 total 40
 4 -rw-r--r-- 1 root root    82 Nov 29 23:27 hello.c
 5 -rw-r--r-- 1 root root 16742 Nov 29 23:58 hello.i
 6 -rw-r--r-- 1 root root  1504 Nov 30 00:03 hello.o
 7 -rw-r--r-- 1 root root   444 Nov 30 00:00 hello.s
 8 -rwxr-xr-x 1 root root  6425 Nov 30 00:04 helloworld
 9 [[email protected] gcc]# file helloworld
10 helloworld: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.18, not stripped
11 [[email protected] gcc]#
12 [[email protected] gcc]# ./helloworld
13 Hello World!
14 [[email protected] gcc]#



汇编代码

 1 [[email protected] gcc]# cat hello.s
 2     .file    "hello.c"
 3     .section    .rodata
 4 .LC0:
 5     .string    "Hello World!"
 6     .text
 7 .globl main
 8     .type    main, @function
 9 main:
10 .LFB0:
11     .cfi_startproc
12     pushq    %rbp
13     .cfi_def_cfa_offset 16
14     .cfi_offset 6, -16
15     movq    %rsp, %rbp
16     .cfi_def_cfa_register 6
17     movl    $.LC0, %edi
18     call    puts
19     movl    $0, %eax
20     leave
21     .cfi_def_cfa 7, 8
22     ret
23     .cfi_endproc
24 .LFE0:
25     .size    main, .-main
26     .ident    "GCC: (GNU) 4.4.7 20120313 (Red Hat 4.4.7-17)"
27     .section    .note.GNU-stack,"",@progbits
28 [[email protected] gcc]#
时间: 2025-01-17 15:59:20

C 编译过程浅析的相关文章

C程序编译过程浅析【转】

转自:http://blog.csdn.net/koudaidai/article/details/8092647 前几天看了<程序员的自我修养——链接.装载与库>中的第二章“编译和链接”,主要根据其中的内容简单总结一下C程序编译的过程吧. 我现在一般都是用gcc,所以自然以GCC编译hellworld为例,简单总结如下. hello.c源代码如下: ?[Copy to clipboard] C 1 2 3 4 5 6 [c] view plaincopy <span style=&qu

C程序编译过程浅析

前几天看了<程序员的自我修养——链接.装载与库>中的第二章“编译和链接”,主要根据其中的内容简单总结一下C程序编译的过程吧. 我现在一般都是用gcc,所以自然以GCC编译hellworld为例,简单总结如下. hello.c源代码如下: /* 何问起 hovertree.com */ int main() { printf(“Hello, world.\n”); return 0; } 通常我们使用gcc来生成可执行程序,命令为:gcc hello.c,默认生成可执行文件a.out 其实编译(

React Native Android Gradle 编译流程浅析

[工匠若水 http://blog.csdn.net/yanbober 未经允许严禁转载,请尊重作者劳动成果.私信联系我] 1 背景 前面已经发车了一篇<React Native Android 从学车到补胎和成功发车经历>,接着就该好好琢磨一下 React Native 周边了,没看第一篇的可以先去看看:这里我们先从 React Native 的 Android 编译来简单揭晓一下 React Native 在集成的过程中到底干了哪些不可告人的坏事:由于我们项目准备以 Gradle 形式接入

2.4、uboot配置和编译过程详解

2.4.1.uboot主Makefile分析1 2.4.1.1.uboot version分析 (1)uboot版本号分为3个级别: VERSION:主版本号 PATCHLEVEL:次版本号 SUBLEVEL:再次版本号 EXTRAVERSION:另外附加的版本信息 这四个用.隔开共同构成了最终的版本号. (2)Makefile中版本号最终生成了一个变量U_BOOT_VERSION,这个变量记录了Makefile中配置的版本号 (3)include/version_autogenerated.h

FFmpeg在Linux下安装编译过程

转载请把头部出处链接和尾部二维码一起转载,本文出自:http://blog.csdn.net/hejjunlin/article/details/52402759 今天介绍下FFmpeg在Linux下安装编译过程,用的是CentOS, 总体过程比较顺利,就是在ffmpeg等的时间稍长点.没什么技术难点.仅当记录. 关于FFmpeg FFmpeg是一个开源免费跨平台的视频和音频流方案,属于自由软件,采用LGPL或GPL许可证(依据你选择的组件).它提供了录制.转换以及流化音视频的完整解决方案.它包

编译过程中,termcap.h 文件找不到路径 licli.a终于生成

编译过程中,termcap.h      文件找不到路径 查看是linux  源码下找不到termcap.h文件 安装了所有关于*cap*的源码包也不起作用 今天终于解决了这个问题,搜termcap.h  发现一篇文章,如下 ----------------------------------------------------------------------------------------- 安装minicom2.3出现termcap.h错误解决方法 2010-05-06 17:12:

GCC与编译过程

GCC与编译过程   GCC(GNU Compiler Colletion),GUN编译器套装,是一套由GNU开发的编程语言编译器.Linux系统下的GCC编译器实际上是调用其他不同的工具来完成预处理.编译.汇编和链接工作. 一.编译过程 在计算机的眼里,只有1和0.不幸的是,我们用C语言写出来的代码,计算机无法直接看明白.所以一个程序如果需要被计算机执行,那么就必须翻译成能被计算机读懂并执行的1和0.实现这一结果的过程,我们称之为编译. 编译包括以下步骤:预处理.编译.汇编和链接.具体过程如下

Hive SQL的编译过程

Hive是基于Hadoop的一个数据仓库系统,在各大公司都有广泛的应用.美团数据仓库也是基于Hive搭建,每天执行近万次的Hive ETL计算流程,负责每天数百GB的数据存储和分析.Hive的稳定性和性能对我们的数据分析非常关键. 在几次升级Hive的过程中,我们遇到了一些大大小小的问题.通过向社区的咨询和自己的努力,在解决这些问题的同时我们对Hive将SQL编译为MapReduce的过程有了比较深入的理解.对这一过程的理解不仅帮助我们解决了一些Hive的bug,也有利于我们优化Hive SQL

Windows下Caffe在GPU编译过程

Windows下Caffe在GPU编译过程 GeForce8800 GTS512: cc=1.1 CUDA6.5 问题一: src/caffe/layers/conv_layer.cu(20): error : too few arguments in function call Error in in conv_layer.cu :forward_gpu_gemm needs the argument skip_im2col #1962 解决: https://github.com/BVLC/