300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > Linux GCC常用命令

Linux GCC常用命令

时间:2022-05-19 18:19:54

相关推荐

Linux GCC常用命令

目录

一、示例一

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内容如下:

这个程序一步到位的·指令是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

对于上一小节中生成的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

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。