...
...

Еще раз про оптимизацию

Еще раз про оптимизацию Лазая по необъятным просторам Интернета, как-то раз я напоролся на довольно интересную информацию. Я уже говорил, как сделать запускаемые файлы в Linux меньше, при помощи утилиты strip. Но оказывается, что это еще не все лишнее, что можно удалить!

Меня всегда интересовал вопрос уменьшения кода программ, для чего я не раз использовал всем известную утилиту upx, которая является кросс-платформенным упаковщиком исполняемых файлов, но ведь здесь совсем другое дело! В результате поисков выяснились очень интересные вещи. Как известно, исполняемый файл состоит из так называемых секций. ELF формат (самый распространенный формат исполняемых файлов под *nix) имеет два типа секций: одни обычные, используемые линковщиком и подобными программами, а другие — так называемые программные, т.е. которые используются ядром при загрузке файла на исполнение. Более того, если, скажем, для объектных файлов и разделяемых библиотек необходимы первые (символьные) — по достаточно очевидным причинам, ведь эти файлы предназначены для их дальнейшей обработки (линковка или динамическая загрузка), то для обычных исполняемых файлов необходимы ТОЛЬКО программные секции. Ни код запуска ELFов, ни ELF interpretor в своей работе не используют символьных секций! Тем не менее, линковщик честно помещает их в каждый генерируемый файл.

Далее выяснились еще более забавные вещи. При создании ELF-файлов, скажем, линуксовым компилятором ассемблера Nasm (и другими программами) он вставляет в каждый объектный файл секцию с комментариями, что данный файл был произведен Nasm'ом версии такой-то. Но ведь я и так знаю это! Зачем мне нужна в каждом объектном файле такая секция? Кроме того, содержимое всех этих секций аккумулируется при линковке в секции комментариев исполнимого файла!

Но, оказывается, упомянутая секция с комментариями, а также секции с символьной таблицей (та, что удаляется, когда вы используете утилиту strip) вообще не грузятся кернелом для исполнения. Т.е. программа может легко обойтись без них.

Как же избавиться от этой кучи ненужностей? Можно, конечно, написать собственными ручками такую программу, использовав описание ELF-формата (это можно почитать здесь: http://www.muppetlabs.com/~breadbox/software/ELF.txt ). Но для вырезания кучи ненужной информации уже написано несколько программ. Я хочу посоветовать набор подобных утилит Kickers of ELF. Взять пакет исходных текстов этих программ можно здесь: http://www.muppetlabs.com/~breadbox/pub/software/ELFkickers-2.0a.tar.gz .

Что включает в себя данный пакет программ?
— sstrip — маленькая утилита, которая удаляет ненужную информацию из запускаемых файлов;
— rebind — утилита для тех же целей, но работает с объектными файлами;
— elfls — программа отображает таблицу секций и заголовка ELF-файлов;
— elftoc — программа, которая берет ELF-файл и генерит Cишный код, который описывает структуру использования памяти;
— ebfc — компилятор маленького программного кода. Компилятор может создавать исполняемые ELF-файлы, объектные файлы и библиотеки;
— также содержится коллекция маленьких ELF-файлов.

Существует также набор утилит, написанный Red Plait (redplait@usa.net ), вот только где их достать, пока не знаю. Но, как известно, на просторах Интернета можно найти все, что угодно.

X-Stranger, xstranger@tut.by

(c) компьютерная газета


© Компьютерная газета

полезные ссылки
IP камеры видеонаблюдения