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++ 中发生的一种方式是,如果您在全局范围内声明任何具有构造函数的对象。

于 2012-03-19T22:21:37.200 回答