Я профилирую некоторый код C ++ с callgrind
, Я делаю это впервые. Я обнаружил, что вызывается функция самого высокого уровня (которая, я предполагаю, вызывает все кадры, чтобы запустить программу) _dyld_start
, Мне интересно, что именно это.
Кроме того, на некоторых из моих программ, которые занимают много времени, мой main()
функция занимает около 99% времени всех функций, вызываемых _dyld_start
; Тем не менее, в моей программе, которая занимает меньше времени (около полсекунды), я нахожу, что main()
занимает всего около 85% _dyld_start
пора, остальное собирается dyldbootstrap::start()
, Я предполагаю, что это функция, связанная с запуском программы на C ++. Разумно ли брать 85% _dyld_start
время выполнения?
Я компилирую свой код, используя стандарт C ++ 11. Я компилирую на своем OS / X, поэтому я использую clang
, мой valgrind
версия 3.10.0.
Джошуа, любая функция выше main является частью поддержки C во время выполнения (в широком смысле); и если имя таких функций включает «ld» или «dyld» — они являются частью динамический компоновщик.
OSX не поддерживает статически связанные приложения (https://stackoverflow.com/a/5259427/196561), поэтому каждый исполняемый файл не может быть загружен без необходимых общих библиотек. динамический компоновщик загружает ваш исполняемый файл, анализирует его для необходимых общих библиотек и загружает их. Затем компоновщик должен связать библиотеку и исполняемый файл вместе (путем заполнения / редактирования некоторых таблиц в памяти), и только после этого он может передать управление _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
Пост о Дылде: https://www.mikeash.com/pyblog/friday-qa-2012-11-09-dyld-dynamic-linking-on-os-x.html 2012-11-09: dyld: динамическое связывание в OS X
Гвинн Раскинд («Что вообще делает Дилд?»)