2012-03-19 10 views
1

MacOSでは、スタックの最上部にあるトラップが問題のコードですが、どうやってそこに着くのかを知りたいのですがMacOSの__dyld__dyld_startのような機能の詳細

(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プロセスの起動シーケンスを記述している文書を知っていますか?それでは、ここで何が起こっているのかを少し分かりやすく説明してくれるでしょうか?

答えて

1

dyldのソースは、オンラインで利用可能です:

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

あなたは単に__dyldプレフィックスを除去することにより、マングルされたシンボル名を復号化することができます。同じC++関数を定義するユーザーコードとの競合を防ぐために、プレフィックスが追加されている可能性があります(たとえば、dyldの一部をコンパイルする場合など)。

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

コンストラクタを持つオブジェクトをグローバルに宣言すると、これがC++で発生する可能性があります。

関連する問題