gcc编译C程序的主要过程是:预处理---编译---汇编---连接,其中:(以名为hello.c的源文件为例)

预处理:对各种预处理指令(#开头,如#include,#define)进行处理,以及删除注释和多余空白字符。生成被修改的源程序hello.i

E是通知gcc对hello.c进行预编译;o是对命令输出结果进行导入操作

gcc -E hello.c -o hello.i

编译:对代码进行语法语义分析和错误判断,生成汇编代码文件hello.s

S是通知gcc对目标文件hello.i进行编译

gcc -S hello.i -o hello.s

汇编:将汇编代码转化为计算机可识别的二进制文件,生成可重定位目标程序(二进制)hello.o

c是通知gcc对目标文件hello.s进行指令转换操作

gcc -c hello.s -o hello.o

链接:将多个.o文件合并成一个可执行文件hello

gcc hello.o -o hello

hello文件即最后可以直接运行的可执行文件,通过./hello执行,通过objdump -d hello可以将可执行文件转化为汇编语言

==========

或者可以直接通过执行gcc hello.c就可以直接生成二进制目标文件a.out,通过./a.out也可以执行结果

或者通过gcc hello.c -o hello,这样可以给生成的文件取名为hello

==========

如果是链接两个文件,可以参考:

https://blog.csdn.net/qq_31811537/article/details/79312908

https://www.linuxidc.com/Linux/2016-09/135473.htm

=================================

20190616补

今天在编译gcc时遇到了问题,更新此帖记录。

想了解elf,所以建立了一个简单的hello.c源文件只做printf("hello")。根据别的ELF博客采用如下命令编译:

gcc -c hello.c -o hello.o

想要./hello.o输出的时候报错Permission denied,这个问题可以通过在命令前加bash或chmod更改权限解决:

ly@ubuntu:~/Desktop$ ./hello.o
bash: ./hello.o: Permission denied
ly@ubuntu:~/Desktop$ bash ./hello.o
./hello.o: ./hello.o: cannot execute binary file
ly@ubuntu:~/Desktop$ chmod hello.o
ly@ubuntu:~/Desktop$ ./hello.o
bash: ./hello.o: cannot execute binary file: Exec format error

然后重看这篇之前整理的博客发现直接用gcc命令编译出来的是一个扩展名为out的二进制文件,并不是可以./执行的可执行文件。要直接生成可执行文件还是需要如下:

ly@ubuntu:~/Desktop$ gcc hello.c -o hello
ly@ubuntu:~/Desktop$ ./hello
hello
ly@ubuntu:~/Desktop$ gcc hello.c
ly@ubuntu:~/Desktop$ ./a.out
hello

之前整理的三种方式都可以生成可执行文件。

总结起来就是:带了-c编译时,-o生成的是.o文件。(毕竟-c只编译生成目标文件,不链接)

ly@ubuntu:~/Desktop$ file ./a.out
./a.out: ELF -bit LSB executable, x86-, version (SYSV), dynamically linked, interpreter /lib64/l, for GNU/Linux 2.6., BuildID[sha1]=2cf583ee1d914378202ee3968923649fcbb01514, not stripped
ly@ubuntu:~/Desktop$ file ./hello.o
./hello.o: ELF -bit LSB relocatable, x86-, version (SYSV), not stripped
ly@ubuntu:~/Desktop$ file ./hello
./hello: ELF -bit LSB executable, x86-, version (SYSV), dynamically linked, interpreter /lib64/l, for GNU/Linux 2.6., BuildID[sha1]=2cf583ee1d914378202ee3968923649fcbb01514, not stripped

gcc编译C源文件的更多相关文章

  1. GCC编译C程序源代码

    编译简单的 C 程序 C 语言经典的入门例子是 Hello World,下面是一示例代码: #include <stdio.h>  int main(void)  {     printf ...

  2. gcc编译基本用法~2

    编译简单的 C 程序 C 语言经典的入门例子是 Hello World,下面是一示例代码: ;} 我们假定该代码存为文件‘hello.c’.要用 gcc 编译该文件,使用下面的命令: $ gcc -g ...

  3. gcc 编译多个源文件

    序 Linux 内核和许多其他自由软件以及开放源码应用程序都是用 C 语言编写并使用 GCC 编译的. 编译C++程序 编译.链接命令 -c 只编译不里链接 -o链接 例: g++ file1 -c ...

  4. gcc编译过程简述

    在linux系统上,从源文件到目标文件的转化是由编译器完成的.以hello.c程序的编译为例,如下: dfcao@linux: gcc -o hello hello.c 在这里,gcc编译器读取源文件 ...

  5. GCC 编译优化指南(转)

    GCC 编译优化指南(转) http://www.jinbuguo.com/linux/optimize_guide.html 作者:金步国 版权声明 本文作者是一位开源理念的坚定支持者,所以本文虽然 ...

  6. GCC 编译详解

    GNU CC(简称为Gcc)是GNU项目中符合ANSI C标准的编译系统,能够编译用C.C++和Object C等语言编写的程序.Gcc不仅功能强大,而且可以编译如C.C++.Object C.Jav ...

  7. gcc编译, gdb调试, makefile写法

    //test.c: #include <stdio.h> int main(void) { printf("hello world!"); return 0; } == ...

  8. gcc编译代码报错及编译方式

    一.error: 'for' loop initial declarations are only allowed in C99 mode 前段时间写了一个小C程序,放在linux下用gcc编译出错, ...

  9. GCC 编译优化指南

    转自: http://www.jinbuguo.com/linux/optimize_guide.html GCC 编译优化指南 作者:金步国[www.jinbuguo.com] 版权声明 本文作者是 ...

随机推荐

  1. CODING 如何使用 CODING 研发管理系统来敏捷开发

    之前我们分享过<CODING 如何使用 CODING 开发 CODING>的文章,时过境迁,现在 CODING 研发管理系统已经上线了如持续集成.缺陷管理.测试管理等 DevOps 中的重 ...

  2. iOS---------获取当前年份

    NSDate *  senddate=[NSDate date]; NSDateFormatter  *dateformatter=[[NSDateFormatter alloc] init]; [d ...

  3. PM过程能力成熟度4级

    话说3级的PM已经非常厉害了,但仍然处于定性阶段.如何才能不动声色的跟BOSS过招?PM 4级就是让数字变成你的嘴巴,开启项目管理的量化大门.因此,4级PM的工作重心(详见上一篇文章中的表格),也会逐 ...

  4. ClickOnce一项Winform部署

    先建一个Winform 控制台程序 建好后从工具箱里拖出来个 文本框 在属性中把TEXT改了 鼠标放到项目上点击右键——>属性 如下图所示,有两个发布位置. 发布位置可以选择本地文件夹,也可以选 ...

  5. Linux(一)—— Unix&Linux 历史

    Linux(一)-- Unix&Linux 历史 Unix =Unix内核+Unix实用工具 Unix Unix 的诞生 Unix的历史可以追溯到20世纪60年代中期,当时麻省理工学院,AT& ...

  6. 【记录】使用在线KMS激活win10系统

    摘要 网上一些激活工具可能捆绑了木马.病毒.使用激活工具有风险.使用在线KMS来激活系统则没有这个风险.(自测至发布日期仍然可用) (有能力的请支持正版windows系统) 将kms服务器地址设置为k ...

  7. Andriod studio 打包aar

    因为项目不同,有些公用库而且还是c++的,还有一些带资源的,简单的复制遇到库升级又是一轮配置,编译成aar则解决这些麻烦. 但是默认andriod studio的make moudle只生成debug ...

  8. 记录一下不能使用let时如何创建局部变量(使用立即执行函数)

    记录一下阮老师提及的立即执行函数模拟let(以前根本没想到可以这样做啊!) // IIFE 写法 (function () { var tmp = ...; ... }()); // 块级作用域写法 ...

  9. opendir函数和readdir函数内涵及用法

    工作中遇到奇怪的事,加载增量的时候加载不上.于是开始分析原因,log里边没有任何错误信息,只有加载完成的标志.增量的数据在目录里边是存在的,但是显示的目录大小却不是4096,而是17,不知道为什么.后 ...

  10. 深度学习识别CIFAR10:pytorch训练LeNet、AlexNet、VGG19实现及比较(二)

    版权声明:本文为博主原创文章,欢迎转载,并请注明出处.联系方式:460356155@qq.com AlexNet在2012年ImageNet图像分类任务竞赛中获得冠军.网络结构如下图所示: 对CIFA ...