Бинарная зачистка в двух словах - PullRequest
3 голосов
/ 11 февраля 2012

Может кто-нибудь объяснить мне бинарную разборку? Насколько это эффективно (насколько это уменьшает ваш двоичный файл)? Как ты это применяешь?

1 Ответ

8 голосов
/ 11 февраля 2012

На самом деле существует два вида удаления.

Удаление двоичного файла удаляет ненужные символы из таблицы символов вашего двоичного кода.Таблица символов содержит имя каждого объекта в вашей программе, а также информацию об отладке.Это не обязательно для запуска вашей программы, так как программы обычно не имеют доступа к своим собственным функциям через таблицу символов.

Таблица символов предоставляет полезную информацию об отладке при сбое вашей программы, так что вы можете получить обратную трассировку, показывающую, какиефункции вызывались при сбое программы.Если вы удалите символы, обратная трассировка будет содержать только адреса памяти, но не имена функций.Вы никогда не должны лишать приложение, которое вы отлаживаете.

Удаление двоичного файла также немного затрудняет обратный инжиниринг исполняемого файла, но я надеюсь, что вы не настолько параноик.

Удаление двоичного файлане заставляет вашу программу загружаться быстрее.Таблица символов не будет загружена в память, если она не требуется для возврата в случае сбоя вашей программы.

Вы можете удалить двоичный файл из командной строки, используя команду strip.Я не совсем уверен, как вызвать это из XCode.

strip MyExecutable

Dead stripping - это другой процесс, который удаляет неиспользуемые функции и данные из вашего кода.Это происходит на этапе соединения, когда создается двоичный файл.Это может уменьшить размер вашего кода.Разница будет зависеть от того, сколько неиспользуемых данных содержится в вашей программе;это может быть много, и это может быть вообще ничего.Мертвая зачистка может сделать ваше приложение немного быстрее, так как увеличивает локальность горячего кода.(Если это имеет большое значение, то в вашем приложении что-то серьезно не так.)

Нет никаких общих недостатков мертвого вскрытия, поэтому я всегда включал бы его.Вы можете включить мертвую очистку через Xcode, она соответствует флагу компоновщика -dead_strip.

gcc -o MyExecutable -Wl,-dead_strip ....

Примечание: Полная очистка работает, помещая каждую функцию в отдельный подраздел.Если вы пишете файлы сборки, вы можете использовать директиву .subsections_via_symbols, чтобы поместить каждый символ в отдельный подраздел, позволяя компоновщику убирать отдельные символы.Насколько я могу судить, GCC всегда выдает эту директиву при выводе сборки.

Ссылки:

https://developer.apple.com/library/mac/#documentation/General/Conceptual/MOSXAppProgrammingGuide/Performance/Performance.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...