作者回复: 总结得真好!来,来,来,笔给你,你来写。哈哈哈。
作者回复: S是绝对地址,而S+A-P算出来的是相对地址。使用相对地址的好处是只要引用者和被引用者的相对位置不变,那么它们就可以被安排到任意的位置上。这就可以支持加载地址随机化等安全增强技术啦。
作者回复: very good:)
作者回复: 栈是在用户空间的顶部,这是操作系统决定的位置。对于编译器和链接器来说,栈基址在哪里都是可以的。因为对栈的操作都是通过栈顶指针完成的。只要栈顶的数据是对的,就都是对的。堆的起始边界是brk指针决定的。而brk是代码段长度+数据段长度+bss段长度决定的。当加载器在加载各个段的时候会计算brk指针的。所以答案是文件中不用保存,但加载器会根据文件中的信息去计算brk指针。
作者回复: 这里要记住的是重定位表的作用是描述“需要被重定位”的位置。所以它描述的是“引用”符号的地方,不是符号所在的位置。你可以试试声明一个指针变量,初始化时给他一个外部变量的地址。一定要记住,重定位表描述的是“引用者”,不是被引用者。
作者回复: 已修复,谢谢
作者回复: 从注释里看到的。objdump在反编译的时候,会把地址放在注释里给你看。实际上,反编译的过程就是从文件中把这些信息读出来并展示给你的过程。
作者回复: 一般来说,是为了让栈帧对齐,有利于加速访存速度。
作者回复: java也有符号解析的过程。基本原理和第8课里说的运行时解析比较相似。符号的地址都是运行时得到的。
作者回复: 不如自己动手试一下?你可以通过cat命令,查看/proc/pid/map和/proc/pid/smap文件,看看他们的各个字段的作用。它的信息是非常全面的,我这里无法一一列举。你可以通过man命令进行学习。