链接
链接就是将不同代码,数据文件组合成一个单一文件的过程
在现在系统中,链接是由叫链接器的程序自动执行的
链接过程如下
符号解析: 把符号引用(比如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