目录
一、示例一
1.简单编译
1.1预处理
1.2编译为汇编代码
1.3汇编
1.4连接
2.多个程序文件的编译
3检错
4库文件连接
二、示例二
1.准备hello.c
2.预处理
3.编译
4.汇编
5.链接
6.分析ELF文件
6.1ELF文件的段
6.2反汇编ELF
一、示例一
1.简单编译
创建文件mkdir test4
cd test4
gedit test.c
test.c内容如下:
文章来源地址https://www.toymoban.com/news/detail-496686.html
这个程序一步到位的·指令是gcc test.c -o test。这一过程是分为四个阶段进行的,即预处理(也称预编译)、编译、汇编和连接。
1.1预处理
gcc -E test.c -o test.i 或者gcc -E test.c
gcc 的-E选项 可以让编译器在预处理后停止,并输出与处理结果。在本例中,预处理结果就是将stdio.h文件中的内容插入到test.c中
1.2编译为汇编代码
gcc -S test.i -o test.s
gcc的-S选项表示程序编译期间,在生成汇编代码之后停止,-o输出汇编代码文件。
1.3汇编
gcc -c test.s -o test.o
对于上一小节生成的汇编代码文件test.s,gas汇编器负责将其编译为目标文件
1.4连接
gcc test.o -o test
文章来源:https://www.toymoban.com/news/detail-496686.html
对于上一小节中生成的test.o,将其与C标准输入输出库进行连接,最终生成程序test,然后执行
2.多个程序文件的编译
该处内容有在上上一篇博客中编写,有需要可前往。
3检错
gcc -pedantic test.c -o test
-pedantic选项能够帮助程序员发现一些不符合ANSI/ISO C标准的代码,但不是全部,事实上只有ANSI/ISO C语言标准中要求进行编译器诊断的情况才有可能被GCC发现并警告。
gcc -Wall test.c -o test
-Wall能够使GCC产生更多的警告信息
gcc -Werror test.c -o test
-Werror选项会使GCC在所有产生警告的地方停止编译,迫使程序员对代码进行修改。
4库文件连接
函数库实际上就是一些头文件(.h)和库文件(so、lib、dll)的集合,Linux下的大多数函数都默认头文件放到/usr/include目录下,而库文件则放到/usr/lib目录下,但有时候需要用到的库不在这些目录下,所以GCC在编译时必须用自己的办法来查找所需的头文件和库文件。
test.c是在Linux上使用c连接mysql,需要去官网下载MySQL Connectors的C库,里面有一个include文件夹,包含mysql connectors的头文件,还有一个lib文件夹,里面包含二进制so文件libmysqlclient.so
include文件夹路径为/usr/dev/mysql/include.lib
lib文件夹是/usr/dev/mysql/lib
编译成可执行文件
gcc -c -I /usr/dev/mysql/include test.c -o test.o
链接
把所有目标文件链接成可执行文件
gcc -L /usr/dev/mysql/lib -lmysqlclient test.o -o test
强制链接时使用静态库
默认情况下,GCC在链接时会优先使用动态库。为了让GCC在链接时只用到静态库可使用以下命令
gcc -L /usr/dev/mysql/lib -static -lmysqlclient test.o -o test
二、示例二
1.准备hello.c
2.预处理
gcc -E hello.c -o hello.i
3.编译
gcc -S hello.i -o hello.s
4.汇编
gcc -c hello.s -o hello.o或者as -c hello.s -o hello.o
5.链接
若使用命令gcc hello.c -o hello则会使用动态库进行链接,生成的ELF可执行文件大小和链接的动态库如下所示
若使用命令gcc -static hello.c -o hello则会使用静态库进行链接,生成的ELF可执行文件大小和链接的动态库如下所示
6.分析ELF文件
6.1ELF文件的段
readelf -S hello
6.2反汇编ELF
objdump -D hello
使用objdump -S将其反汇编并且将其C语言源代码混合显示出来
gcc -o hello -g hello.c
objdump -S hello
到了这里,关于Linux GCC常用命令的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!