目录

一、gcc的一些“战友”

二、gcc常用命令

1.准备工作

2.简单编译

3.实际编译

4.多个程序文件编译

5.检错

6.库文件连接

7.查看ELF

8.反汇编ELF

三、总结

四、参考资料


一、gcc的一些“战友”

  1. addr21line
    帮助调试器在调试过程中定位对应的源代码。
  2. ar
    用于创建静态链接库。
  3. ld
    用于链接。
  4. as
    用于汇编。
  5. ldd
    查看执行文件所用到的链接库。
  6. size
    查看执行文件中各部分的大小。
  7. readelf
    查看ELF各个部分的内容。
  8. objdump
    进行反汇编。

二、gcc常用命令

1.准备工作

hello.c

#include<stdio.h>
int main(void)
{
	printf("Hello World!\n");
	return 0;
}

2.简单编译

gcc hello.c -o hello 

 

3.实际编译

(1)预编译

gcc -E hello.c -o hello.i

hello.i的代码片段

 (2)编译为汇编代码

gcc -S hello.i -o hello.s

 hello.s的代码

 (3)汇编

gcc -c hello.s -o hello.o

(4)连接

gcc hello.o -o hello 

4.多个程序文件编译

例:

 gcc main.c sub1.c sub2.c -o test

 

5.检错

gcc -pedantic hello.c -o hello

-pedantic:帮助发现一些不符合ANSI/ISO C标准的代码,当出现不符合的代码,会发出警告信息

 gcc -Wall hello.c -o hello

-Wall:帮助发现一些不符合ANSI/ISO C标准的代码,当出现不符合的代码,gcc会发出尽可能多的警告信息

gcc -Werror hello.c -o hello

-Werror:gcc会在所有产生警告的地方停止编译,迫使进行代码的修改

6.库文件连接

库文件:动态链接库(.so),静态链接库(.a)
函数库:头文件(.h),库文件(.so)

注意:头文件一般放在/usr/include目录下,库文件一般放在/usr/lib目录下

(1)编译
gcc -c -I /usr/include 源文件 -o 生成.o文件
(2)链接
gcc -L /usr/lib 动态链接库文件名 生成.o文件 -o 生成可执行文件
(3)强制性使用静态链接库
gcc链接时会优先使用动态链接库,想强制使用静态链接库执行在命令中加-static
gcc -L /usr/lib -static 静态链接库文件名 生成.o文件 -o 生成可执行文件

静态链接时搜索路径顺序:
a、ld会去找gcc命令中的参数-L
b、gcc的环境变量LBRARY_PATH(指定程序静态链接库文件的搜索路径)
c、内定目录/lib /usr/lib /usr/local/lib


动态链接时搜索路径顺序:
a、编译目标代码时指定的动态库搜索路径
b、环境变量LD_LIBRARY_PATH(指定程序动态链接库文件的搜索路径)
c、配置文件/etc/ld.so.conf中指定的动态库搜索路径
d、默认的动态库搜索路径/lib
e、默认的动态库搜索路径/usr/lib

7.查看ELF

readelf -S hello

 

 

8.反汇编ELF

objdump -D hello

三、总结

通过此次练习,我了解了gcc的一些常用命令以及一些与gcc有关的工具的使用方式与用途。同时,也使得我对gcc编译方法及其编译过程更加的熟悉。

四、参考资料

(5条消息) 使用gcc和gcc的伙伴_Harriet的博客-CSDN博客icon-default.png?t=L892https://blog.csdn.net/qq_43279579/article/details/109033254

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐