1

MacOS では、そのようなスタックが表示されます (スタックの一番上に問題のコードのトラップがありますが、そこに到達する方法を理解したいと思います)。

(gdb) where
...
#4  0x0000000112fdefc8 in appLibInit::appLibInit ()
#5  0x0000000112fdef71 in __sti__$E ()
#6  0x00007fff5fc112f7 in __dyld__ZN16ImageLoaderMachO18doModInitFunctionsERKN11ImageLoader11LinkContextE ()
#7  0x00007fff5fc0d20c in __dyld__ZN11ImageLoader23recursiveInitializationERKNS_11LinkContextEj ()
#8  0x00007fff5fc0d1b0 in __dyld__ZN11ImageLoader23recursiveInitializationERKNS_11LinkContextEj ()
#9  0x00007fff5fc0d1b0 in __dyld__ZN11ImageLoader23recursiveInitializationERKNS_11LinkContextEj ()
#10 0x00007fff5fc0d1b0 in __dyld__ZN11ImageLoader23recursiveInitializationERKNS_11LinkContextEj ()
#11 0x00007fff5fc0d2f4 in __dyld__ZN11ImageLoader15runInitializersERKNS_11LinkContextE ()
#12 0x00007fff5fc038b4 in __dyld__ZN4dyld24initializeMainExecutableEv ()
#13 0x00007fff5fc06ea1 in __dyld__ZN4dyld5_mainEPK11mach_headermiPPKcS5_S5_ ()
#14 0x00007fff5fc01695 in __dyld__ZN13dyldbootstrap5startEPK11mach_headeriPPKcl ()
#15 0x00007fff5fc0103a in __dyld__dyld_start ()
#16 0x0000000100000000 in ?? ()
#17 0x0000000000000001 in ?? ()

関数 appLibInit::appLibInit は、コード内のグローバル オブジェクトの C++ コンストラクターであるため、おそらくリンクされているすべての共有ライブラリを処理している、ある種のプリメイン コードにいると推測しています (奇妙なことに、質問は、他の何かによって引きずり込まれない限り、私たちがリンクしていると期待するものではありません)。

Mac c++filt は、これらの __dyld プレフィックス付きシンボルをデコードしていないようです。

MacOS プロセスの起動シーケンスを説明しているドキュメントを知っている人はいますか?

4

1 に答える 1

1

dyld のソースはオンラインで入手できます。

http://www.opensource.apple.com/source/dyld/

__dyldプレフィックスを削除するだけで、マングルされたシンボル名をデコードできます。プレフィックスはおそらく、同じ C++ 関数を定義するユーザー コードとの競合を防ぐために追加されます (たとえば、自分で dyld の一部をコンパイルしている場合)。

あなたが見ているのは、より一般的には、ライブラリのロードと初期化です。動的ライブラリは、ロード時に関数を実行する必要があることを宣言できます。あなたのappLibInit::appLibInit(). main()(ライブラリがメイン バイナリによってロードされている場合、これは の前に発生する可能性があります。)

これが C++ で発生する可能性のある 1 つの方法は、コンストラクターを持つオブジェクトをグローバルに宣言する場合です。

于 2012-03-19T22:21:37.200 に答える