NASM GOT文件在这里意味着什么?

问题描述 投票:0回答:1

我在这里特别从9.2节开始阅读本节:https://www.nasm.us/xdoc/2.14.02/html/nasmdoc8.html#section-8.4

我一整天都在读这篇文章,我想在继续之前确保我理解这里发生了什么。我相信他们说我们需要强制执行与位置无关的代码,因为在使用共享库时,访问某些全局时的重定位不能被硬编码。为此,我们使用全局偏移表。

我还是相信他们会说:

        call    .get_GOT 
.get_GOT: 
        pop     ebx 
        add     ebx,_GLOBAL_OFFSET_TABLE_+$$-.get_GOT wrt ..gotpc 

通过首先将值ebx推入堆栈来实现使用GOT,其中.get_GOT将GOT的位置相对于rip寄存器放置并在ebx中返回。

这就是我相信我理解正确的一切。如果有人能澄清这发生了什么

add     ebx,_GLOBAL_OFFSET_TABLE_+$$-.get_GOT wrt ..gotpc 

我将不胜感激。另外,请将其分解为有关该添加指令中的第2个操作数部分的部分。谢谢。

debian nasm pic relocation
1个回答
-1
投票

我在理解所有背景方面遇到了一些麻烦。

CALL x相当于PUSH RIP,JMP x

所以下一条指令就是你得到当前的RIP。

注意:此代码是链接器的源代码,因此链接器将读取代码并放入正确的CALL地址,但NASM在汇编时无法知道此类地址。

最后一条指令是ADD:我们将EBX添加到常量。是的,常数将在汇编时计算。

我们缺乏足够的信息来详细说明,但正如您所见,我们从RIP(在ebx中)添加了一个偏移量。

$$评估到当前部分的开头; section 3.5

对于wrt运算符:section 7.6,可能本节将更好地解释您正在寻找的代码。

我在NASM上生锈太多,无法继续前进。

© www.soinside.com 2019 - 2024. All rights reserved.