Что означает "компактная информация о раскрутке" в синтезаторе линкера

Когда я анализирую файл карты ссылок, который был сгенерирован xcode, в секции синтезатора компоновщика появляются данные, называемые "информация компактного размотки".

compact unwind info 858.57KB    858572  Unchecked

это займет около 858 КБ пространства. Я хочу знать, какие фактические данные в этом пространстве. Есть ли способ уменьшить этот размер?

Суммарный выход линкера синтезированного раздела:

compact unwind info 858.57KB
helper helper   24B
objc image info 8B
non-lazy-pointer    8B
non-lazy-pointer-to-local: dyld_stub_binder 8B
non-lazy-pointer-to-local: _vm_page_size    8B
non-lazy-pointer-to-local: _tanh    8B
non-lazy-pointer-to-local: _tan 8B
non-lazy-pointer-to-local: _strdup  8B
non-lazy-pointer-to-local: _strcmp  8B
non-lazy-pointer-to-local: _sinh    8B
non-lazy-pointer-to-local: _sin 8B
non-lazy-pointer-to-local: _realloc 8B
non-lazy-pointer-to-local: _protocol_getName    8B
non-lazy-pointer-to-local: _object_getIndexedIvars  8B
non-lazy-pointer-to-local: _objc_readClassPair  8B
non-lazy-pointer-to-local: _objc_lookUpClass    8B
non-lazy-pointer-to-local: _objc_getRequiredClass   8B
non-lazy-pointer-to-local: _objc_getProtocol    8B
non-lazy-pointer-to-local: _objc_getMetaClass   8B
non-lazy-pointer-to-local: _objc_getClass   8B
non-lazy-pointer-to-local: _objc_copyClassNamesForImage 8B
non-lazy-pointer-to-local: _objc_allocateClassPair  8B
non-lazy-pointer-to-local: _malloc  8B
non-lazy-pointer-to-local: _mach_task_self_ 8B
.....

1 ответ

Информация о размотке - это информация, необходимая для размотки стека при возникновении / возбуждении исключения. Разматывание стека включает в себя определение того, где были сохранены указатель кадра, указатель стека, адрес возврата и все сохраненные регистры, чтобы можно было восстановить состояние для предыдущего кадра. Он также определяет, для любого заданного стекового фрейма, есть ли функция-обработчик для перемотки, обрабатывать "catch" и "finally" функции обработки исключений в таких языках, как C++ и Objective-C.

Вся эта информация для текущего кадра определяется из указателя инструкции. Поскольку выполнение продолжается через функцию от самой ее первой инструкции, детали меняются, потому что каждая инструкция может модифицировать соответствующие регистры и / или выдвигать или выдвигать сохраненные значения регистров в стек и из стека.

Информация по размотке описывает, как определить из указателя инструкции, где найти все эти значения.

Существуют различные формы раскручивания информации, которые могут быть встроены в двоичный файл. Одна распространенная форма - DWARF, раскручивает информацию. Это довольно неэффективное пространство. Apple разработала компактную раскручиваемую информацию, потому что, хотите верьте, хотите нет, на самом деле она занимает гораздо меньше места.

Подробности о компактном формате раскрутки можно найти здесь.

Другие вопросы по тегам