对齐 x86-64 和 AArch64 调用站点

问题描述

我想要你的见解。 假设我有一个调用 main函数 foo。假设我为 x86-64AArch64 编译了相同的代码。并且函数符号位于两个二进制文件中的相同(虚拟)地址。 例如,对于 x86-64

0000000000501060 <main>:
  501060:    55                     push   rbp
  501061:    48 89 e5               mov    rbp,rsp
  501064:    48 83 ec 10            sub    rsp,0x10
  ...
  50108f:    e8 9c ff ff ff         call   501030 <foo>
  ...

对于AArch64

0000000000501060 <main>:
  501060:    d10083ff     sub    sp,sp,#0x20
  501064:    a9017bfd     stp    x29,x30,[sp,#16]
   ...
  50108c:    97ffffe9     bl     501030 <foo>
  ...

我还想以某种方式对齐调用站点,即 50108f50108c,以便 foo 返回后的返回地址相同。

我正在尝试修改两个目标的 LLVM 后端,并认为也许我可以覆盖一个生成调用站点MCInst 方法,并在两个调用站点之一之前添加一些填充(使用 nop),在以对齐它们。

但是,我不确定这是否是要走的路,并且正在寻找想法。另外,我知道有 MCCodePadder 可以处理我的指令的填充,但我仍然不确定一个后端(x86-64)如何获得另一个发出的地址位置的信息后端 (AArch64)。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)