0

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 にシフトします。これを防ぐ方法はありますか?そもそもなぜそれが起こっているのですか?

上記の変更を元に戻し、再コンパイルすると元のアドレスが得られるため、アドレス選択の「ランダム性」の問題ではないでしょう。

4

1 に答える 1

0

この場合 (ビットコイン コア)、WJ van der Laan はまさにこの目的のためにツールを作成したようです。他の人が似たようなものを望んでいる場合、それはインスピレーションになるかもしれません. (MITライセンス)

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

于 2016-11-28T07:49:18.777 に答える