第四章,数组和指针不同
第五章,对链接的思考
1. 怎么样在函数库中观察一个符号?
一般有些情况下,我们会在链接程序的时候遇到这样的错误提示:undefined symbol xxx
它提示我们无法找到符号 xxx 的定义,我们可以通过搜索链接库的笨办法来找到它(笨办法,好办法是直接百度)
编写如下的 shell 文件:
cd /usr/lib
foreach i (lib?*)
echo $i
nm $i | grep xxx | grep -v UNDEF
如上的代码可以帮我们找到未定义符号所在链接库,这样我们在编译的时候通过 -lxxx 就可以将库链接进来。
2. 注意自己写的库函数不要和系统库函数重名。
第六章,运行时数据结构
1. 程序经过编译后生成的目标文件格式一般为ELF,其中包含三个重要段:.bss,.data,.text
.bss:存储未初始化的全局及静态变量,实际上,存储的是所有未初始化的全局及静态变量的大小;
.data:存储已初始化的全局及静态变量;
.text:存储程序指令。
2. 在程序准备开始执行的时候,目标文件经过连接,之后将ELF格式的内容基本上算是直接拷贝进内存。其存储顺序和结构也与ELF文件格式类似。
2.1 .text 段原封不动得拷贝进内存进程地址空间的映射区域的最下端;
2.2 .data 段原封不动得拷贝进内存进程地址空间,处于.text 段的上端;
2.3 .bss 段展开成具体的大小,从.data 区域上端割出一块空间来给其使用;
2.4 .bss 段在内存中的上端是堆,由 malloc 函数获取;
2.5 进程地址空间的顶端是栈,由参数传递或其他情况使用。
3. setjump 和 longjump 的使用
这两个函数可以用于程序中的跳转,有点类似于 goto ,但是和 goto 相比又有明显的区别。
3.1 goto 只能实现函数内的跳转,不能实现函数间的随意跳转;longjump 可以跳的很远,也就是可以在函数间进行跳转;
3.2 longjump 只能回到 setjump 出现的地方,即回到过去;而 goto 在函数内部可以所以前后跳转;
3.3 longjump 的返回附带返回值,可以有效进行程序控制,而 goto 却显得乏力。