C++11 フラグ (-std=c++11) なしでコンパイルされたライブラリと、-std=c++11 でビルドされたそのライブラリにリンクするアプリケーションがあります。ライブラリ内の関数を呼び出すと、プログラムはライブラリ内でさらに深くクラッシュします。クラッシュが発生する関数 (クラス内のポインターを返す単純な関数) の逆アセンブリは、コールスタックがこのプログラムから発生した場合と、ライブラリのテスト プログラムから発生した場合とでは異なることがわかりました。 C++11 フラグを使用してビルドされていません。
OSはOS X Mountain Lion、コンパイラはClang++です。
C++11 アプリと C++11 以外のライブラリの間に機能がないのはなぜですか? また、異なる生成コードがライブラリ内にあるために逆アセンブリが生成されるのはいつですか?
2 つの異なる分解:
TestApplication`Core::GetPointer() const at System.h:xxx:
0x100009690: pushq %rbp
0x100009691: movq %rsp, %rbp
0x100009694: movq %rdi, -8(%rbp)
0x100009698: movq -8(%rbp), %rdi
0x10000969c: movq 64(%rdi), %rax ;<-------Difference
0x1000096a0: popq %rbp
0x1000096a1: ret
Lib1Prototype`Core::GetPointer() const at System.h:xxx:
0x100019c10: pushq %rbp
0x100019c11: movq %rsp, %rbp
0x100019c14: movq %rdi, -8(%rbp)
0x100019c18: movq -8(%rbp), %rdi
0x100019c1c: movq 40(%rdi), %rax ;<------Difference
0x100019c20: popq %rbp
0x100019c21: ret