main.c:
#include <stdio.h>
int sum(int *a, int n);
int array[2]={1,2};
int main()
{
int val=sum(array,2);
printf("%d\n",val);
return val;
}
sum.c
int sum(int *a, int n)
{
int i,s=0;
for(i=0;i<n;i++)
{
s+=a[i];
}
return s;
}
首先,main.c翻译成一个ASCII码的中间文件main.i
cpp main.c main.i
驱动程序运行C编译器cc1,将main.i翻译成一个ASCII汇编语言文件main.s
但实际实验中会发现cc1命令not found ,可以先查找cc1的路径
gcc -v main.c 2>1&|grep cc1
在查找到的路径下直接运行cc1
./cc1 /home/user/code/computer/link_test/main.i -o /home/user/code/computer/link_test/main.s
驱动程序运行汇编器as,将main.s翻译成一个可重定位目标文件main.o
as -o main.o main.s
sum.o通过同样的过程生成
最后运行链接程序ld,将main.o和sum.o以及一些必要的系统目标文件组合起来,创建一个可执行目标文件prog
ld -m elf_x86_64 -dynamic-linker /lib/x86_64-linux-gnu/ld-linux-x86-64.so.2 "main.o" "sum.o" /usr/lib/x86_64-linux-gnu/crt1.o /usr/lib/x86_64-linux-gnu/crti.o /usr/lib/gcc/x86_64-linux-gnu/7/crtbegin.o /usr/lib/gcc/x86_64-linux-gnu/7/crtend.o /usr/lib/x86_64-linux-gnu/crtn.o -lc -o "prog"
除需连接libc库(-lc)外,还需链接c的运行时库crt*。如果版本不一样,可通过locate命令查找到相应的库文件,并把目录替换。
最后运行prog
./prog
输出结果 3