Linux/Unix系统编程基础解析
1. 应用程序汇编分析
使用 objdump 工具可以对应用程序进行反汇编,查看 .text 节中的代码。例如在某个应用中,代码在调用 std::cout 之前,会将字符串的地址(位于 0x905 )加载到 rsi 寄存器,此地址作为第二个参数。需要注意的是,该应用使用 -pie 命令编译,这意味着应用本身会被重定位,所以字符串的实际地址不是 0x905 ,而是 # + 0x905 。
为避免使用重定位项(即全局偏移表GOT中的项),程序采用指令指针相对偏移。在这个例子中,加载 rsi 的指令位于 0x805 ,使用偏移量 0x100 ,最终得到 0x905 + rip 。这使得无论应用在内存中的加载位置如何,代码都能定位到字符串,无需重定位项。
2. ELF段分析
ELF段将各个节组合成可加载的组件,并描述了如何以及在何处将ELF文件加载到内存中。理想情况下,ELF加载器只需读取ELF段就能加载ELF文件,对于可重定位的ELF文件,还需加载动态节和重定位节。
以下是一个简单示例中ELF文件各段的作用:
| 段序号 | 段作用 |
| ---- | ---- |
| 第一段 | 描述程序头(定义各段),大部分情况下可
超级会员免费看
订阅专栏 解锁全文

被折叠的 条评论
为什么被折叠?



