在 windows 平台中,我们知道,可执行文件是 exe,但是后文我们在 linux 环境下进行,linux 下的可执行文件之一是 prog,这里我们暂且站在可执行的角度上把它和 exe 划上等号
在这里我们定义两个文件,一个 main.c 一个 sum.c
int sum(int *a, int n);
int array[2] = {1, 2};
int main()
{
int val = sum(array, 2);
return val;
}int sum(int *a, int n)
{
int i, s = 0;
for (i = 0; i < n; i++) {
s += a[i];
}
return s;
}这其中,main.c 文件调用了 sum.c 这个文件,这两个.c 文件要是如果想要合并变为一个可执行文件,计算出结果,需要使用编译器执行对应的指令,这里我们使用 gcc
gcc -Og -o prog main.c sum.c
gcc 使我们使用的编译器,clang 也是一个有名的编译器我们可以选择
-Og 是我们使用的优化策略,它表示告诉编译器要符合原始的 C 代码结构,如果为了使得程序运行更有效率,这个参数还有别的可选优化选项,比如 -O2…
-o 我们可以理解为得到 output,也就是 prog
这样我们就得到了一个可执行文件 prog,然后可以通过 ./prog 来执行这个文件
当然,我们可以将 gcc -Og -o prog main.c sum.c 拆分为更小的步骤来执行,这其中可以被分为 4 步

预处理
cpp -o main.i main.c
cpp 指的是 c 预处理器,当然也可选 gcc
将 main.c 翻译为 main.i,main.i 文件是一个 ASCII 码的中间文件,我们可以在编辑器中直接查看

编译
gcc -S -o main.s main.i
-S 选项表示只对文件进行编译,不做汇编链接的处理,得到的汇编文件也可以通过编辑器查看
编译器将 main.i 翻译为汇编文件 main.s,这其中是翻译的汇编语言代码

汇编
as -o main.o main.s
as 使我们选择的汇编器
将汇编代码文件转化为二进制的重定位文件
对于 sum.c 文件我们也需要做出相同的处理

链接
ld -static -o prog main.o sum.o
ld 链接器,-static 采取静态链接的方式
运行链接器程序,将 main.o 和 sum.o 以及一些必要的系统目标文件组合起来,创建一个可执行目标文件
执行
`linux> ./prog
shell 调用操作系统中一个叫做加载器(loader)的函数,它将可执行文件 prog 中的代码和数据复制到内存,然后将控制转移到这个程序的开头