関数の長さを取得するために、次のように、空の関数を使用して各関数の終了位置をマークしています。
void f()
{
printf("ooga\n");
}
__declspec(noinline, naked) void f_end() { __asm { nop } };
f の長さを取得するには、f_end - f を減算し、パディングとして使用される INT3 をデクリメントします。
しかし、別の機能を追加すると:
void g()
{
printf("booga\n");
}
__declspec(noinline, naked) void g_end() { __asm { nop } };
f_end() と g_end() は 1 つの関数にマージされているように見えます (OllyDbg の逆アセンブリを調べることで確認できます)。各関数を独自のものにすると、それは起こりませんが、これらが大量に必要になります。
これを防ぐためにフリックできる最適化スイッチはありますか?
Visual Studio のメニューで利用可能な設定をざっと見て (f_end と g_end が完全にスキップされないようにするには、/OPT:NOREF を設定する必要がありました)、optimize("", off) を試してみましたが、役に立ちませんでした。
ありがとう