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

 

 

 

 

 

 

 

 

 

  • 5
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值