先上图
这是通过gcc编译的总体过程 ,分步查看
首先,创建一个项目,只有一个源文件main.c
打开mingw64.exe文件,在命令行中进入到项目所在的目录中,像这样
执行编译第一步,预处理,命令:
gcc -E main.c -o main.i
执行完成后,命令行中长这样
idea中长这样
多出来一个main.i的文件,这个文件是宏展开以后得文件,就是将main.c中的
#include <stdio.h>
替换成stdio.h文件的内容。
然后进行第二步,将得到的main.i编译成汇编指令,执行命令
gcc -S main.i -o main.s
执行完成以后,命令行里长这样
idea里长这样
多出来一个main.s的文件,这是编译完成的汇编指令。
第三步,将main.s编译成目标文件,命令
gcc -c main.s -o main.o
执行完以后,命令行看长这样
idea里看长这样
多出来一个main.o的文件,这个目标文件main.o还没有链接,不能运行,链接完成以后才能运行。链接就是将函数调用替换成函数真实的地址。
通过file命令查看main.o文件
得到一句话
main.o: Intel amd64 COFF object file, no line number info, not stripped, 7 sections, symbol offset=0x280, 22 symbols, 1st section name ".text"
其中的COFF文件
官方描述:
COFF(Common Object File Format)是一种常见的目标文件格式,用于存储可重定位目标文件、静态库文件和可执行文件。COFF最初由UNIX System Laboratories(USL)定义,现在被广泛地使用在各种操作系统上,包括Windows、Linux和BSD等。
COFF格式的目标文件由多个段(Section)组成,每个段包含一定范围的数据,例如代码、数据和符号表等。每个段都有一个段头(Section Header),它包含有关该段的信息,例如名称、大小、地址、属性等。段头表(Section Header Table)记录了所有段头的信息。
COFF格式的可执行文件由多个段、符号表和重定位表等组成。符号表用于记录程序中的符号信息,例如函数名和变量名,重定位表则用于在程序加载时对代码中的符号和地址进行重定位。可执行文件还包含程序入口点和其他可执行代码相关的元数据。
COFF是一种通用格式,它被多种编译器、链接器和调试器所支持。具体而言,COFF格式在Windows和MS-DOS上得到广泛应用,在Unix/Linux上也有被广泛使用。
第四步,通过ld命令可以查看文件 缺少的文件链接地址
ld main.o
三个函数找不到
第五步,通过gcc -v main.o -o main
得到exe可执行文件