如何定义库的入口点?

时间:2015-11-02 16:50:27

标签: c linker binary static-libraries mach-o

在跟踪我们在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 ()

我的问题是:这里发生了什么?

  1. 图像加载器如何知道应该执行此方法?查看静态库的汇编程序时,_runOnLoad()看起来像常规方法。如何在启动时执行此方法的信息存储在静态库中?当库链接到我们的主应用程序时,这些信息存储在哪里?
  2. 编译时如何指定?你可以标记一个在加载时执行的方法吗?这是你在代码中做的事情,还是编译器参数?
  3. 运行此方法时,我该怎么办?我假设其他函数和类不能保证加载吗?
  4. 这一切都发生在iOS应用程序中,但在我看来这是非常低级别的功能,所以我认为这适用于每个基于unix的平台?

    我想更多地了解这一点。

0 个答案:

没有答案