CSAPP 读书笔记 第七章

链接

链接就是将不同代码,数据文件组合成一个单一文件的过程

在现在系统中,链接是由叫链接器的程序自动执行的

链接过程如下

符号解析: 把符号引用(比如main.c中的swap())和符号定义(比如swap.c中的swap定义)联系起来

重定位:链接器通过把每个符号定义与一个存储器位置(我猜想是内存地址?)联系起来,然后修改所有这些符号引用为对应地址

链接的过程中,用到的.o目标文件会被拷贝到可执行文件中,  最终形成一个文件

 链接器会维持3个集合,如果a调用b,那么gcc a b,否则 gcc b a,a会报错找不到b,就好比a是领导,b是小兵,领导调用小兵,所以领导必须在前,这就是链接的顺序

典型的ELF文件

symtab是符号表,类似于java中的localVariable表和方法表,不过symtab是全局变量和函数

debug是调试符号表,包含的就是局部变量,一些全局变量等

下面是

entry point,其实就是程序的第一条指令

将程序从磁盘拷贝到内存,并运行,就叫加载

堆的分配其实就在读/写段后面,地址分配从小到大,而栈是从0xbfffffff 开始向下递减分配的,0xc0000000往上(大),就是用来内核的代码和数据的

 静态库,比如库中的printf函数,会被重复拷贝到不同的目标文件,然后被分别加载到内存中,这样会造成内存浪费(有好几个printf函数的代码段) 496底部,看不下去了

JNI其实就用了共享库的思想,把c函数编译到共享库中,比如当java调用本地方法foo时,其实是利用dlopen(unix提供的共享库接口)会动态加载和链接共享库foo.so(share object),然后再调用foo

7.7也看完了

7.13和7.14都看完了

就剩7.8-7.10

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值