使用 otool 在重构代码中进行二进制比较
Binary comparison in refactored code using otool
我正在重构 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。有没有办法防止这种情况?为什么它首先发生?
还原上述更改并重新编译给出原始地址,因此地址选择可能不是 "randomness" 的问题。
在这种情况下(比特币核心),W.J。 van der Laan 显然为此目的编写了一个工具。如果其他人想要类似的东西,这可能会鼓舞人心。 (麻省理工学院许可)
我正在重构 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。有没有办法防止这种情况?为什么它首先发生?
还原上述更改并重新编译给出原始地址,因此地址选择可能不是 "randomness" 的问题。
在这种情况下(比特币核心),W.J。 van der Laan 显然为此目的编写了一个工具。如果其他人想要类似的东西,这可能会鼓舞人心。 (麻省理工学院许可)