为什么我的反汇编C++代码使用指令指针和偏移来获取字符串文字?

Dov*_*iin 10 c++ assembly x86-64

我有一个我已经拆解的C++程序,看起来程序集正在使用指令指针获取字符串文字.例如:

leaq    0x15468(%rip), %rsi ## literal pool for: "special"
Run Code Online (Sandbox Code Playgroud)

leaq    0x15457(%rip), %rsi ## literal pool for: "ordinary"
Run Code Online (Sandbox Code Playgroud)

为什么编译器使用指令指针获取字符串文字?这似乎会导致任何人类程序员的头痛,尽管对编译器来说可能并不那么难.

不过,我的问题是为什么?有没有基于机器或历史的原因或编译器编写者是否决定%rip任意使用?

Som*_*ude 9

请记住,C++中的字符串文字是常量且不可修改的.确保这一点的一种方法是将它们与代码段中的代码放在一起,代码段被加载到标记为只读的内存页中.

  • @Dovahkiin:"位置独立代码".如果它使用常量地址,则动态加载器在加载非优选基址的库时,必须更改("fixup")所有"常量"地址,这也使得代码段不共享.此外,相对地址往往小于完整指针. (2认同)
  • @Dovahkiin因为编译器可能不确切知道代码段实际加载到哪个地址.这可能是操作系统任务的一部分,以阻止攻击,或者因为代码位于动态加载的库中. (2认同)