我在这里特别从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个操作数部分的部分。谢谢。
我在理解所有背景方面遇到了一些麻烦。
CALL x相当于PUSH RIP,JMP x
所以下一条指令就是你得到当前的RIP。
注意:此代码是链接器的源代码,因此链接器将读取代码并放入正确的CALL地址,但NASM在汇编时无法知道此类地址。
最后一条指令是ADD:我们将EBX添加到常量。是的,常数将在汇编时计算。
我们缺乏足够的信息来详细说明,但正如您所见,我们从RIP(在ebx中)添加了一个偏移量。
$$评估到当前部分的开头; section 3.5
对于wrt运算符:section 7.6,可能本节将更好地解释您正在寻找的代码。
我在NASM上生锈太多,无法继续前进。