Команда загрузки файла Mach-O LC_FUNCTION_STARTS

Кто-нибудь знает, каков формат данных, на которые указывает команда Mach-O LC_FUNCTION_STARTS?

Большая часть информации, которую я смог найти, содержится в заголовочном файле loader.h:

#define LC_FUNCTION_STARTS 0x26 /* compressed table of function start addresses */

Я вижу, что в инструменте dyldinfo есть параметр -function_starts, который анализирует эти данные, и инструмент с открытым исходным кодом, но последняя выпущенная версия инструмента не содержит поддержки:

http://opensource.apple.com/source/ld64/ld64-97.2/src/other/dyldinfo.cpp

Кто-нибудь знает, где я могу получить источник последней версии dyldinfo или где я могу получить больше информации об этой команде загрузки?

Спасибо!


person Locksleyu    schedule 07.03.2012    source источник
comment
Обновление: я нашел ссылку на более новую версию dyldinfo: opensource.apple.com/source/ld64/ld64-127.2/src/other/. Кажется, я всегда нахожу ответы на свои вопросы, как только публикую их здесь (:   -  person Locksleyu    schedule 07.03.2012
comment
Более важный вопрос - действительно ли загрузчик использует эту команду и если да, то почему? Разве у него нет достаточной информации о том, где местоположение start() основано на экспорте?   -  person Locksleyu    schedule 07.03.2012


Ответы (2)


Он используется инструментами, которым необходимо символизировать адреса в журналах сбоев, образцах, спин-дампах и т. д., чтобы определить, попадает ли данный адрес внутрь функции. Это также может быть полезно для отладчиков, поскольку помогает им быстрее находить границы функции, внутри которых находится заданный адрес.

Данные в этом разделе отформатированы как завершающаяся нулем последовательность значений ULEB128 в стиле DWARF. Первое значение — это смещение от начала сегмента __TEXT до начала первой функции. Остальные значения — это смещение до начала следующей функции.

person bdash    schedule 20.01.2013
comment
Это в основном полезно для инструментов, которым необходимо работать с удаленным исполняемым файлом. Например, отладчик, который хочет выполнить обход стека, должен знать, где все функции начинаются в __TEXT, чтобы он мог просмотреть инструкции пролога и увидеть, как был изменен стек и где были сохранены регистры. Но в урезанном исполняемом файле символы для большинства функций отсутствуют. LC_FUNCTION_STARTS предоставляет отладчику эту информацию. - person Jason Molenda; 14.03.2013

Поскольку в течение нескольких дней у меня не было дополнительных ответов или комментариев, я подумал, что мог бы сам ответить на этот вопрос. Решение в основном то, что я написал в комментарии выше:

Самая новая версия dyldinfo находится здесь:

http://opensource.apple.com/source/ld64/ld64-127.2/src/other/dyldinfo.cpp

Однако я до сих пор так и не понял, для чего именно используются функции запуска, если у кого-то есть информация об этом, я все равно буду признателен.

person Locksleyu    schedule 13.03.2012