ELF文件动态链接时 GOT,PLT 的变化过程
来源:互联网 发布:黑客帝国尼奥问程序员 编辑:程序博客网 时间:2024/05/13 21:13
http://www.ibm.com/developerworks/cn/linux/l-elf/part1/index.html
Intel平台下linux中ELF文件动态链接的加载、解析及实例分析(二): 函数解析与卸载
http://www.ibm.com/developerworks/cn/linux/l-elf/part2/index.html
http://linux.chinaunix.net/doc/system/2005-01-13/777.shtml
最后我们讨论ELF文件的动态连接机制。每一个外部定义的符号在全局偏移表 (Global Offset Table GOT)中有相应的条目,如果符号是函数则在过程连接表(Procedure Linkage Table PLT)中也有相应的条目,且一个PLT条目对应一个GOT条目。对外部定义函数解析可能是整个ELF文件规范中最复杂的,下面是函数符号解析过程的一个 描述。
1:代码中调用外部函数func,语句形式为call 0xaabbccdd,地址0xaabbccdd实际上就是符号func在PLT表中对应的条目地址(假设地址为标号.PLT2)。
2:PLT表的形式如下
.PLT0: pushl 4(%ebx) /* GOT表的地址保存在寄存器ebx中 */
jmp *8(%ebx)
nop; nop
nop; nop
.PLT1: jmp )
pushl $offset
jmp
.PLT2: jmp )
pushl $offset
jmp
3:查看标号.PLT2的语句,实际上是跳转到符号func在GOT表中对应的条目。
4:在符号没有重定位前,GOT表中此符号对应的地址为标号.PLT2的下一条语句,即是pushl $offset,其中$offset是符号func的重定位偏移量。注意到这是一个二次跳转。
5:在符号func的重定位偏移量压栈后,控制跳到PLT表的第一条目(.PLT0),把GOT[1]的内容(放置了用来标识特定库的代码)压栈,并跳转到GOT[2]对应的地址。
6:GOT[2]对应的实际上是动态符号解析函数的代码,在对符号func的地址解析后,会把func在内存中的地址设置到GOT表中此符号对应的条目中。
7:当第二次调用此符号时,GOT表中对应的条目已经包含了此符号的地址,就可直接调用而不需要利用PLT表进行跳转。
动态连接是比较复杂的,但为了获得灵活性的代价通常就是复杂性。其最终目的是把GOT表中条目的值修改为符号的真实地址,这也可解释节.got包含在可读可写段中。
- ELF文件动态链接时 GOT,PLT 的变化过程
- ELF文件动态链接时 GOT,PLT 的变化过程
- ELF文件动态链接时 GOT,PLT 的变化过程
- ELF文件动态链接时 GOT,PLT 的变化过程
- 理解ELF动态链接中GOT与PLT表
- 基于Android的ELF PLT/GOT符号重定向过程
- Android ELF文件中.got .plt .rel.plt .rel.dyn节的区别和联系
- 基于Android的ELF PLT/GOT符号重定向过程及ELF Hook实现
- 基于Android的ELF PLT/GOT符号重定向过程及ELF Hook实现
- 基于Android的ELF PLT/GOT符号重定向过程及ELF Hook实现
- ELF的GOT和PLT以及PIC
- ELF的GOT和PLT以及PIC
- ELF的GOT和PLT以及PIC
- ELF的GOT和PLT以及PIC
- Linux动态链接之GOT与PLT
- Linux动态链接之GOT与PLT
- Linux动态链接之GOT与PLT
- Linux动态链接之GOT与PLT
- 精图规范1.0----2 概念 Concepts
- IOS_AudioToolbox音效
- “用最小堆将k个已排序链表合并为一个排序链表”(算法导论 练习6.5-9)
- 在runleve3的tty下显示汉字 centos6
- 根据AWR快照查看等待事件的变化趋势。不记得是哪里看到的了。非原创。
- ELF文件动态链接时 GOT,PLT 的变化过程
- java实现<爬梯子>问题
- 第十五周工作周报-----龙行
- 精图规范1.0----3 渲染模型 Rendering Model
- 通过一个具体的实例来学习hive
- Lunix从零开始(1)-vi使用方法
- android应用Theme(二)
- 查看死事务的回滚情况
- 黑马程序员_我认为这样的数组排序会更有效,自己琢磨的