Computer Systems 链接器部分实验

204 阅读1分钟

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