CSAPP笔记

CSAPP学习中所记录的笔记; 第七章 链接 链接是将各种代码和数据片段收集并组合成为一个单一文件的过程,这个文件可被加载(复制)到内存中并执行。 链接可以执行于: 编译时:也就是在源代码被翻译成机器代码时; 加载时:也就是在程序被加载器加载到内存并执行时; 运行时:也就是由应用程序来执行; 在早期系统,链接是手动执行的; 在现代系统,链接是由叫做链接器的程序自动执行的; 链接器使分离编译成为可能; 学习链接的必要性: 理解链接器将帮助你构造大型程序; 理解链接器将帮助你避免一些危险的编程错误(例如,在默认情况下,错误的定义多个全局变量的程序将通过链接器,而不产生任何警告信息); 理解链接器将帮助你理解语言的作用域规则是如何实现的(全局变量和局部变量之间的区别?static属性的变量或者函数到底意味着什么); 理解链接将帮助你理解其他重要的系统概念(比如加载和运行程序、虚拟内存、分页、内存映射等); 理解链接将使你能够利用链接库; 7.1 编译器驱动程序 贯穿本章的示例程序: main.c main函数初始化一个整数数组,然后调用sum函数对数组进行求和; int sum(int *a, int n); int array[2] = {1, 2}; int main() { int val = sum(array, 2); return val; } sum.c int sum(int *a, int n) { int i, s=0; for(i=0;i 以上命令等同于以下命令: > 首先运行预处理器,将main.c翻译成ASCII码的中间文件main.i: > ```bash > cpp main.c /tmp/main.i > ``` > 接下来,驱动程序运行C编译器,将main.i翻译成一个ASCII汇编语言文件main.s: > ```plaintext > cc1 /temp/main.i -Og -o /tmp/main.s > ``` > 然后,驱动程序运行汇编器,它将main.s翻译成一个可重定位目标文件main.o: > ```bash > as -o /temp/main.o /tmp/main.s > ``` > 驱动程序经过相同的过程生成sum.o。 > 最后,运行链接器程序ld,将main.o和sum.o以及一些必要的目标文件组合起来,创建一个可执行目标文件prog: > ```bash > ld -o prog /tmp/main.o /tmp/sum.o > ``` 要运行可执行文件prog,使用以下命令: ```bash ./prog shell调用操作系统中一个叫做加载器的函数,它将可执行文件prog中的代码和数据复制到内存,然后将控制转移到这个程序的开头; ...

November 5, 2022 · 1 min · Rancho