首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >动态链接:用于索引重定位表的偏移值

动态链接:用于索引重定位表的偏移值
EN

Stack Overflow用户
提问于 2011-08-31 23:52:28
回答 2查看 2.6K关注 0票数 1

我试图理解对库函数(让我们称之为func)的动态链接process...the调用通过plt表传递。我知道,当符号还没有重新定位时,函数的调用将从plt表传递,该表包含一个指令(比如i1),它指向i1之后的下一条指令,该指令看起来像push $offset:在将控制传递给动态链接器之后,该动态链接器使用函数的地址来修复相对的GOT条目。offset应该是重定位表中条目的索引,但是我不是understand...how,这个值可以通过读取可执行文件的elf来找到。是有可能的

代码语言:javascript
运行
复制
objdump --dynamic-reloc prog

去找点什么?例如,我编写了一个非常简单的程序,它只使用printfstrcpy,前一个命令的输出是:

代码语言:javascript
运行
复制
DYNAMIC RELOCATION RECORDS
OFFSET   TYPE              VALUE 
08049ff0 R_386_GLOB_DAT    __gmon_start__
0804a000 R_386_JUMP_SLOT   __gmon_start__
0804a004 R_386_JUMP_SLOT   __libc_start_main
0804a008 R_386_JUMP_SLOT   strcpy
0804a00c R_386_JUMP_SLOT   printf

例如,通过使用gdb读取从printf@plt开始的指令

代码语言:javascript
运行
复制
0x8048324 <printf@plt>: jmp    *0x804a00c
0x804832a <printf@plt+6>:   push   $0x18
0x804832f <printf@plt+11>:  jmp    0x80482e4

我们可以看到offset的值是0x18 (十进制为24),但是读取objdump的输出似乎表明printf从第一个reloc条目开始的偏移量是0x1c

一些想法?

EN

回答 2

Stack Overflow用户

发布于 2011-11-05 16:08:05

这不是PLT的工作方式,真的。要了解它是如何工作的,我建议从reading this article开始。

票数 1
EN

Stack Overflow用户

发布于 2012-09-02 09:19:22

是的,偏移量是文件重定位表上的索引。

从ELF规范1.2版开始:

5.因此,程序在堆栈上推送重定位偏移量( offset )。重定位偏移量是重定位表中的32位非负字节偏移量。指定的重定位条目将具有类型R_386_JMP_SLOT,其偏移量将指定在前一条jmp指令中使用的全局偏移表条目。重定位条目还包含一个符号表索引,从而告诉动态链接器引用哪个符号,在本例中为name1。

但我不知道为什么你的结果会有这样的差异。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7259770

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档