使用OTool进行了重构代码的二进制比较

Binary comparison in refactored code using otool

本文关键字:代码 二进制 比较 重构 OTool 使用      更新时间:2023-10-16

i正在重构C 代码,删除using namespace std;并将std::添加到字符串,向量等。我希望输出是固定的二进制二进制方面的,但是cmp甚至可以为最小变化提供差异。我诉诸使用otool拆卸,但正在地址中遇到怪异的偏移。

例如。使用此更改

diff --git a/src/core_read.cpp b/src/core_read.cpp
@@ -26,7 +26,7 @@ CScript ParseScript(const std::string& s)
{
    CScript result;
-    static map<string, opcodetype> mapOpNames;
+    static std::map<string, opcodetype> mapOpNames;
    if (mapOpNames.empty())
    {

otool -XVt给出了一个奇数偏移:

bench_bitcoin.s:
8c8
<       movq    0x392f7b(%rip), %rbx ## literal pool symbol address: ___stack_chk_guard
---
>       movq    0x392f8b(%rip), %rbx ## literal pool symbol address: ___stack_chk_guard
19c19
<       jne     0x100003fa9
---
>       jne     0x100003f99
25c25
<       callq   0x100229c44 ## symbol stub for: ___stack_chk_fail
---
>       callq   0x100229c34 ## symbol stub for: ___stack_chk_fail
33c33
<       movq    0x392f2b(%rip), %rbx ## literal pool symbol address: ___stack_chk_guard
---
>       movq    0x392f3b(%rip), %rbx ## literal pool symbol address: ___stack_chk_guard
[…]

它实际上会移动所有添加/- 0x10。有没有办法防止这种情况?为什么首先发生?

恢复上述更改和重新编译提供了原始地址,因此在地址选择中可能不是"随机性"的问题。

在这种情况下(比特币核心),W.J. van der laan显然已经为此目的编写了工具。如果其他人想要类似的东西,这可能是鼓舞人心的。(麻省理工学院许可)

https://github.com/laanwj/bitcoin-maintainer-tools