Linux下C语言的编译全过程解读

Linux下C语言的编译全过程解读

我们总是在Linux下输入 gcc -o app main.c 即可编译好程序,对于具体的详细过程及流程,相信亲们就不太了解啦!下面给大家展示一下C编译器的解释全过程。

Linux下编辑调试工具: gcc gdb  ,把高级语言编译成二进制可执行代码的工具。

把高级语言编译成二进制可执行文件的过程如下:

需要经历四个步骤:

(1)预处理:去掉注释,进行宏替换(#define相关),头文件(#include)包含等工作。

gcc–E test.c –o test.i

(2)编译:不同平台用的汇编语言是不一样的。编译将高级语言编译成汇编语言

gcc–Stest.c –o test.s

如下:moretest.c

#include <stdio.h>

#define PI 3.14

int main(int argc, char *argv[]){

printf("Hello world! %f \n",PI);

return 0;

}

如下:

gcc–Stest.c –o test.s

moretest.s

.file   "main.c"

.section        .rodata

.LC0:

.string "Hello world! %f \n"

.text

.globl main

.type   main, @function

main:

.LFB0:

.cfi_startproc

pushq   %rbp

.cfi_def_cfa_offset 16

.cfi_offset 6, -16

movq    %rsp, %rbp

.cfi_def_cfa_register 6

subq    $16, %rsp

movl    %edi, -4(%rbp)

movq    %rsi, -16(%rbp)

movl    $.LC0, %eax

movsd   .LC1(%rip), %xmm0

movq    %rax, %rdi

movl    $1, %eax

call    printf

movl    $0, %eax

leave

.cfi_def_cfa 7, 8

ret

.cfi_endproc

.LFE0:

.size   main, .-main

.section        .rodata

.align 8

.LC1:

.long   1374389535

.long   1074339512

.ident  "GCC: (GNU) 4.4.720120313 (Red Hat 4.4.7-3)"

.section       .note.GNU-stack,"",@progbits

(3)汇编:将汇编语言翻译成二进制的目标代码

此过程生成ELF格式的目标代码

gcc–c test.c –o test.o

如下:moretest.o

test.o:ELF 64-bit LSB relocatable, x86-64, version 1 (SYSV), not stripped

注意:relocatable为可重定位

test.o:可重定位文件:就是我们说的目标文件,没有连接之前的

(4)链接:包含各函数库的入口,得到可执行代码

gcc –o test test.c

如下:more test

test:ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (usesshared libs), for GNU/Linux 2.6.18, not strippedt

注意:链接过程。生成可执行代码。

链接分为两种,一种是静态链接,另外一种是动态链接。使用静态链接的好处是,依赖的动态链接库较少,对动态链接库的版本不会很敏感,具有较好的兼容              性;缺点是生成的程序比较大。使用动态链接的好处是,生成的程序比较小,占用较少的内存。

时间: 2024-10-11 11:17:08

Linux下C语言的编译全过程解读的相关文章

Linux下C语言执行过程(预处理,编译,汇编,链接,执行)

1.C语言的执行过程包括5个步骤:分别是:预处理,编译,汇编,链接,执行 第一步:编写C源代码,截图如下: 2.预处理,命令为:gcc -E variable.c -o variable.i(这步的作用是文件的展开和宏替换),生成的文件类型是.i类型的. 3.编译:命令为:gcc -S variable.i -o variable.s,这里的.s文件就成了会变语言,截图如下: 4.汇编,命令是:gcc -c variable.s -o variable.o,截图如下: 5,链接:命令:gcc -

LINUX下C语言编程基础

实验二 Linux下C语言编程基础 一.实验目的 1. 熟悉Linux系统下的开发环境 2. 熟悉vi的基本操作 3. 熟悉gcc编译器的基本原理 4. 熟练使用gcc编译器的常用选项 5 .熟练使用gdb调试技术 6. 熟悉makefile基本原理及语法规范 7. 掌握静态库和动态库的生成 二.实验步骤 1. 快捷键 Ubuntu中: 2. vim VIM是一个非常好的文本编辑器,很多专业程序员使用VIM编辑代码,即使以后你不编写程序,只要跟文本打交道,都应该学学VIM,可以浏览参考一下普通人

UNIX/Linux下C语言的学习路线

一.工具篇 “公欲善其事,必先利其器”.编程是一门实践性很强的工作,在你以后的学习或工作中,你将常常会与以下工具打交道, 下面列出学习C语言编程常常用到的软件和工具. 1.操作系统    在UNIX或Linux系统中学习C很方便,所以在开始您的学习旅程前请先选择一个UNIX或Linux操作系统,目前可供个人免费使用的UNIX或Linux系统有FreeBSD.RedHat Linux.SUSE Linux等,而且在安装包中还提供很多实用的工具,如:gcc, make等. 如果您一直使用Window

笔记整理——Linux下C语言正则表达式

Linux下C语言正则表达式使用详解 - Google Chrome (2013/5/2 16:40:37) Linux下C语言正则表达式使用详解 2012年6月6日Neal627 views发表评论阅读评论 标准的C和C++都不支持正则表达式,但有一些函数库可以辅助C/C++程序员完成这一功能,其中最著名的当数Philip Hazel的Perl-Compatible Regular Expression库,许多Linux发行版本都带有这个函数库. C语言处理正则表达式常用的函数有regcomp

[转]Caffe在Linux下的安装,编译,实验

Caffe在Linux下的安装,编译,实验 原文地址:http://www.cnblogs.com/evansyang/p/6150118.html 第一部分:Caffe 简介 caffe是有伯克利视觉和学习中心(BVLC)开发.作者是伯克利博士贾杨清.caffe是一个深度学习(deep learning)框架.其具有易读.快速和模块化思想. 第二部分:Caffe安装与配置 2.1 配置环境:ubuntu 14.04LTS, 使用Homebrew进行安装.暂不使用GPU,所以使用CPU-ONLY

Linux下C语言编程基础学习记录

VIM的基本使用  LINUX下C语言编程 用gcc命令编译运行C语言文件 预处理阶段:将*.c文件转化为*.i预处理过的C程序. 编译阶段:将*.i文件编译为汇编代码*.s文件. 汇编阶段:将*.s文件转化为*.o的二进制目标代码文件. 链接阶段:将*.o文件转化为可执行文件. 生成可执行文件:将*.o转换为可执行文件. 执行可执行C语言文件. gcc常用选项列表 -c      只编译不链接,生成目标文件“.o” -S      只编译不汇编,生成编码代码 -E      只进行预编译,不做

linux下C语言函数执行时间统计

转载:http://blog.csdn.net/linquidx/article/details/5916701#t5 写好程序,用gcc编译,带上-pg参数,然后运行以后分析gmon.out文件: 命令exp:   gprof ./test-main ./gmon.out >1.log  在1.log中会生成各函数运行情况. gprof 1.1 简介 gprof实际上只是一个用于读取profile结果文件的工具.gprof采用混合方法来收集程序的统计信息,他使用检测方法,在编译过程中在函数入口

linux 下C语言学习路线

转载:http://blog.csdn.net/xdw1985829/article/details/6817403 UNIX/Linux下C语言的学习路线. 一.工具篇 “公欲善其事,必先利其器”.编程是一门实践性很强的工作,在你以后的学习或工作中,你将常常会与以下工具打交道, 下面列出学习C语言编程常常用到的软件和工具. 1.操作系统     在UNIX或Linux系统中学习C很方便,所以在开始您的学习旅程前请先选择一个UNIX或Linux操作系统,目前可供个人免费使用的UNIX或Linux

LINUX下C语言编程调用其他函数、链接头文件以及库文件

LINUX下C语言编程经常需要链接其他函数,而其他函数一般都放在另外.c文件中,或者打包放在一个库文件里面,我需要在main函数中调用这些函数,主要有如下几种方法: 1.当需要调用函数的个数比较少时,可以直接在main函数中包含该文件,比如一个文件夹下包含add.c和main.c文件: 方法一: 文件add.c定义两个整数相加的函数,code如下: #include <stdio.h> #include <math.h> int add(int a,int b) { int z;