我正在为我的语言编写一个小程序加载器,因为我放弃了理解 ELF 格式(在这样做的同时,我最终可能会更好地理解它)。我将文件映射到内存中,然后无尾礼服欢欣鼓舞。
我不想通过对其进行任何更改来阻碍程序的共享。因此,我最终做了与 C 和 elf 相同的操作:全局偏移表。
问题是:我怎样才能通过我的程序的 GOT?
首先想到的是在寄存器或堆栈参数中提供它。在寄存器中它会很棒,但是 x86 被它的寄存器数量所阻碍。这可能意味着我将失去 ebx 或 ebp 或类似的东西。在一个合理的架构中,这将是一个公平的权衡。在 x86 中感觉有点失败。
共享库的反汇编显示 gcc 正在将其作为 IP 相对寻址。如果我这样做,那将是:
call 0
here:
pop eax
; do something with [eax + (got - here) + index*4]
虽然,这在一定程度上感觉很复杂。我不喜欢这样做。
还有什么想法,有人吗?
编辑:当使用多个库处理此问题时,我意识到:每个应用程序将有多个 GOT,并且某些 GOT 的使用取决于我所在的代码块。因此将 GOT 保存在单独的寄存器中需要一些我不知道的其他技巧。我想知道他们在将 GOT 保存在寄存器中时如何解决这个问题。