-1

为什么

   push str1

当 str1 在 .text int 同一个文件中定义时,当我们想做位置无关代码时不好吗?当我们将一些标签压入堆栈时,地址是静态时的地址吗?为什么?

4

1 回答 1

0

每当加载二进制文件时,它们就会被虚拟化,这涉及到很多事情,但对于 PIC 来说最重要的是,这意味着二进制文件可以被加载并基于几乎任何地址,所以 PIC 解决这个问题的方法是让它可能使用相对寻址(因为这些不需要为搬迁而修复)。

在上面的示例中,不可能仅使用 a 创建相对地址PUSH,因为将被推送的地址将是 .text/.rodata 部分的偏移量(或由某个首选基地址构成的绝对地址),但它不会调整为二进制文件当前的虚拟地址,因此您需要在推送之前调整地址(最简单的可能是通过 RIP 相对寻址,所以您会这样做PUSH [RIP + <dist from $here to string aka str1 - $>])。

于 2012-07-23T06:01:45.320 回答