“_dyld_start”在我的分析结果中意味着什么?

时间:2015-01-13 03:29:55

标签: c++ macos c++11 profiling dyld

我正在使用callgrind分析一些C ++代码。这是我第一次这样做。我发现最高级别的函数(我假设它正在调用所有镜头来启动程序运行)被称为_dyld_start。我想知道究竟是什么。

此外,在我的一些需要很长时间才能运行的程序中,main()函数占_dyld_start调用的所有函数的大约99%的时间;然而,在我的程序上运行时间较短(大约半秒钟),我发现main()只占_dyld_start时间的85%左右,剩下的就是dyldbootstrap::start()。我假设这是一个与启动C ++程序相关的函数。花费85%的_dyld_start运行时间是否合理?

我正在使用C ++ 11标准编译我的代码。我在我的OS / X上编译,所以我使用的是clang。我的valgrind版本是3.10.0。

1 个答案:

答案 0 :(得分:2)

约书亚,任何更高级别的功能都是C运行时支持的一部分(广义上讲);如果这些功能的名称包括" ld"或" dyld" - 他们是dynamic linker的一部分。

OSX不支持静态链接的应用程序(https://stackoverflow.com/a/5259427/196561),因此无需加载所需的共享库即可加载每个可执行文件。 dynamic linker加载您的可执行文件,解析它所需的共享库并加载它们。然后链接器应该将库和可执行文件链接在一起(通过填充/编辑一些内存表),然后它才能将控制转移到_start CRT入口点,然后转移到main

"执行Mach-O文件",https://developer.apple.com/library/mac/documentation/DeveloperTools/Conceptual/MachOTopics/1-Articles/executing_files.html

  

Mach-O可执行文件包含由一组加载命令组成的标头。对于使用共享库或框架的程序,其中一个命令指定用于加载程序的链接器的位置。如果使用Xcode,则始终是/ usr / lib / dyld,标准OS X动态链接器。

Dyld man(列出一些调试变量以调试dyld工作):https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man1/dyld.1.html

关于dyld的帖子:https://www.mikeash.com/pyblog/friday-qa-2012-11-09-dyld-dynamic-linking-on-os-x.html 2012-11-09:dyld:OS X上的动态链接 作者:Gwynne Raskind("无论如何,dyld做了什么?")