2012-03-19 66 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++中可能發生的一種方式是,如果您聲明瞭具有構造函數的全局對象。