gcc编译C源文件

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 777 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 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/l, for GNU/Linux 2.6.32, BuildID[sha1]=2cf583ee1d914378202ee3968923649fcbb01514, not stripped
ly@ubuntu:~/Desktop$ file ./hello.o
./hello.o: ELF 64-bit LSB relocatable, x86-64, version 1 (SYSV), not stripped
ly@ubuntu:~/Desktop$ file ./hello
./hello: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/l, for GNU/Linux 2.6.32, BuildID[sha1]=2cf583ee1d914378202ee3968923649fcbb01514, not stripped

 

转载于:https://www.cnblogs.com/lyeeer/p/10508924.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值