CSAPP - 第七章:链接

概述

链接是将各种代码和数据片段收集并组合称为一个单一文件的过程,这个文件可以被加载(复制)到内存中并执行。

  • 编译(compile time)时链接:源代码被翻译为机器代码时进行链接。传统静态链接
  • 加载(load time)时链接:程序被加载器加载到内存并执行是链接。加载时的共享库动态链接
  • 运行(run time)时链接:由应用程序来执行链接。运行时的共享库动态链接

1. 链接错误可能的原因

2. lib和dll的区别

3. GCC优化选项

1节讲述的是 编译器是如何编译程序的
3-6 节讲述的是 符号解析 的相关内容
7 节 讲述的是 重定位 的相关内容

1. 编译器驱动程序

// 	main.c
1  	int sum(int *a, int n);
2  	int array[2] = {
   1, 2};
3
4  	int main()
5  	{
   
6 	   	int val = sum(array, 2);
7      	return val;
8 	}
// 	sum.c
1 	int sum(int *a, int n)
2 	{
   
3 		int i, s = 0;
4 
5		for (i = 0; i < n; i++) {
   
6 			s += a[i];
7 		}
8 		return s;
9 	}

大多数编译系统提供 编译器驱动程序(compiler driver),它代表用户在需要时调用语言处理器,编译器,汇编器,链接器。比如使用 GNU 编译系统构造实例程序:

linux> gcc -Og -o prog main.c sum.c

下图概括了驱动程序将示例程序从 ASCII 码源文件翻译为可执行目标文件的过程。

  • 步骤1:驱动程序运行C预处理器(cpp),它将C源程序 main.c 翻译成一个 ASCII 码中间文件:main.i
cpp [other arguments] main.c /tmp/main.i
  • 步骤2:驱动程序运行C编译器(cc/cc1),将 main.i 文件翻译为汇编文件 main.s
cc1 /tmp/main.i -Og [other arguments] -o /tmp/main.s
  • 步骤3:驱动程序运行汇编器(as),将 main.s 翻译为可重定位目标文件 main.o
as [other arguments] -
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值