先在msys2下gcc编译一个helloworld的C程序,默认没有gcc,
用pacman安装,
安装好;
构建运行hello C程序;
根据网上一些资料,
GCC的编译包括四个阶段:预处理、编译、汇编和链接。分别使用了cc1、as和collect2三个工具。cc1是编译器,对应第一和第二阶段,用于将源文件hello.c编译为hello.s;as是汇编器,对应第三阶段,用于将hello.s汇编为hello.o目标文件;链接器collect2是对ld命令的封装,用于将C语言运行时库(CTR)中的目标文件(crt1.o、crti.o、crtbegin.o、crtn.o)以及所需的动态链接库(libgcc.so、libgcc_s.so、libc.so)链接到可执行hello。
看一下as是个汇编器,bin目录有as.exe;
编译的第一、二阶段用的是cc1,看一下bin目录有cc.exe;
没发现有它前面说的这个collect2,
按前面说的cc1能把.c文件生成.s文件,.s是汇编语言,不是x86的汇编;
输个 cc hello.c看一下;这个cc可能也是编译器,能生成exe文件;
查找一下cc1,在如下目录;
把hello.c也拷贝到此目录,执行 cc1 hello.c 命令,看上去不能运行此命令;
我看了一下资料,编译的第一阶段,用 gcc -E -o hello.i hello.c 先生成 .i 文件;
.i文件生成了,看一下非常大;
然后再用 gcc -S -o hello.s hello.i 命令,由.i文件生成.s文件;生成.s的汇编代码如下图;
下回继续;