x210-2021-08-22

1、将.c源文件用gcc编译之后得到的可执行文件,./XXX这条语句在前面需要加上./是为了告诉编译器要执行当前目录下的XXX文件,然后再一个有区分度的现象就是-v加在-o前面还是后面的问题,一般来说,将-v放到-o后面会得到一些错误提示,如下图(注意:前一步的编译过程写成,gcc -o “目标文件名(输出)” “源文件名(输入)”,这种格式也是可以的,而且对于理解后面提的编译执行过程也有帮助)。而将-v放到-o前面一般才能看到一个正确的执行过程所包含的流程信息,这些提示信息很繁杂,但是要区分开也不是没有办法,按下图二中所示,先把输出的关于版本的信息忽略掉,然后找到开头带有空格的,一般就是编译执行过程所调用的不同内容。2、整个的编译执行过程分析(只摘取关键部分,方便梳理脉络),除了前面说过的找起始空格,第二个分析技巧就是抓住-o:

2.1、编译:/usr/lib/gcc/i686-linux-gnu/4.8/cc1 test.c -o /tmp/ccMxRdlx.s(实际就是平常看到的gcc -S命令的执行过程,即输出汇编文件)2.2、汇编:as -v --32 -o /tmp/cchTOa3P.o /tmp/ccMxRdlx.s(实际就是平常看到的gcc -c命令的执行过程,即输出.o文件)2.3、链接:/usr/lib/gcc/i686-linux-gnu/4.8/collect2 -o test /tmp/cchTOa3P.o + xxx.o(实际就是平常看到的gcc -o命令的执行过程,即输出可执行文件)3、以上的整个编译执行过程如果想得到中间输出的.s文件,可以按下图语句执行,然后再使用vim打开对应想要看的文件。4、以上的整个编译执行过程如果想得到中间输出的.o文件,可以按下图语句执行,然后再使用vim打开对应想要看的文件。5、以上的整个编译执行过程如果想得到最后输出的可执行文件,可以按下图语句执行(但实际上应该也要把其它未知的.o文件也链接进来的,但是只是因为编译器知道要链接哪个而我们不知道),然后再使用vim打开对应想要看的文件。 6、如果程序中使用到了预编译选项(即带入了“预处理”过程),例如#define,使用vim打开得到的.i文件,并拉到最后找到main函数相关内容,会发现前面使用了define宏的地方已经被实际的值给替代掉了,原来的define字眼已经找不着了,从这里也可以得出结论,像define、include因为是被预处理阶段所处理了,所以他们并不属于关键字。

posted @ 2021-08-22 17:30  migui  阅读(29)  评论(0编辑  收藏  举报