在跟踪我们在iOS应用程序中使用的静态库中的错误时,我偶然发现了以下问题:
我们使用的库具有在我们的应用程序启动期间自动执行的代码,然后执行我们的应用程序的主要方法。执行函数时的堆栈跟踪如下所示:
#0 0x000000010050ce04 in _runOnLoad ()
#1 0x000000012008ceb0 in ImageLoaderMachO::doModInitFunctions(ImageLoader::LinkContext const&) ()
#2 0x000000012008d050 in ImageLoaderMachO::doInitialization(ImageLoader::LinkContext const&) ()
#3 0x0000000120088808 in ImageLoader::recursiveInitialization(ImageLoader::LinkContext const&, unsigned int, char const*, ImageLoader::InitializerTimingList&, ImageLoader::UninitedUpwards&) ()
#4 0x00000001200879b0 in ImageLoader::processInitializers(ImageLoader::LinkContext const&, unsigned int, ImageLoader::InitializerTimingList&, ImageLoader::UninitedUpwards&) ()
#5 0x0000000120087a64 in ImageLoader::runInitializers(ImageLoader::LinkContext const&, ImageLoader::InitializerTimingList&) ()
#6 0x000000012007a08c in dyld::initializeMainExecutable() ()
#7 0x000000012007e0fc in dyld::_main(macho_header const*, unsigned long, int, char const**, char const**, char const**, unsigned long*) ()
#8 0x0000000120079044 in _dyld_start ()
我的问题是:这里发生了什么?
_runOnLoad()
看起来像常规方法。如何在启动时执行此方法的信息存储在静态库中?当库链接到我们的主应用程序时,这些信息存储在哪里?这一切都发生在iOS应用程序中,但在我看来这是非常低级别的功能,所以我认为这适用于每个基于unix的平台?
我想更多地了解这一点。