Что значит «_dyld_start»? значит в моих результатах профилирования?

Я профилирую некоторый код 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.

3

Решение

Джошуа, любая функция выше 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
Гвинн Раскинд («Что вообще делает Дилд?»)

2

Другие решения


По вопросам рекламы [email protected]