gcc不是一个人在战斗
目录一、gcc的一些“战友”二、gcc常用命令1.准备工作2.简单编译3.实际编译4.多个程序文件编译5.检错6.库文件连接7.查看ELF8.反汇编ELF三、总结四、参考资料一、gcc的一些“战友”addr21line帮助调试器在调试过程中定位对应的源代码。ar用于创建静态链接库。ld用于链接。as用于汇编。ldd查看执行文件所用到的链接库。size查看执行文件中各部分的大小。readelf查看E
目录
一、gcc的一些“战友”
- addr21line
帮助调试器在调试过程中定位对应的源代码。- ar
用于创建静态链接库。- ld
用于链接。- as
用于汇编。- ldd
查看执行文件所用到的链接库。- size
查看执行文件中各部分的大小。- readelf
查看ELF各个部分的内容。- 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博客https://blog.csdn.net/qq_43279579/article/details/109033254
更多推荐
所有评论(0)