В чем разница между "gcc -s" и командой "strip"?
Интересно, в чем разница между этими двумя:
Имеют ли они то же значение?
Какой из них вы используете для:
- уменьшить размер исполняемого файла?
- ускорить работу?
Ответы
Ответ 1
gcc
является компилятором/компоновщиком, его параметр -s
- это что-то, что делается при компиляции и компоновке. Он также не настраивается - он имеет набор информации, который он удаляет, не более того.
strip
- это то, что можно запустить в объектном файле, который уже скомпилирован. Он также имеет множество параметров командной строки, которые вы можете использовать для настройки того, какая информация будет удалена. Например, -g
разделяет только отладочную информацию, добавляемую gcc -g
.
Обратите внимание, что strip
не является командой bash, хотя вы можете запускать ее из оболочки bash. Это команда, полностью разделенная на bash, часть набора служебных программ GNU.
Ответ 2
Принятый ответ очень хорош, но только для того, чтобы дополнить ваши дальнейшие вопросы (а также как ссылку для всех, кто здесь).
Что эквивалентно gcc -s в терминах полосы с некоторыми ее параметрами?
Они оба делают то же самое, полностью удаляя таблицу символов. Однако, как пояснил @JimLewis, полоса допускает более тонкое управление. Например, в перемещаемом объекте strip --strip-unneeded
не удалит свои глобальные символы. Однако strip
или strip --strip-all
удалят полную таблицу символов.
Какой из них вы используете для уменьшения размера исполняемого файла и ускорения его запуска
Таблица символов - это нераспределяемый раздел двоичного файла. Это означает, что он никогда не загружается в оперативную память. Он хранит информацию, которая может быть полезна для отладки фиоритов, например, для печати стоп-кадра при сбое. Случай, когда было бы целесообразно удалить таблицу символов, будет сценарием, где у вас есть серьезные ограничения емкости хранилища (в этом отношении полезно использовать gcc -Os -s
или make CXXFLAGS="-Os -s" ...
, поскольку это приведет к более медленному двоичному алгоритму, который также лишенный дальнейшего уменьшения размера). Я не думаю, что удаление таблицы символов приведет к увеличению скорости по причинам, прокомментированным.
Наконец, я рекомендую эту ссылку об удалении общих объектов: http://www.technovelty.org/linux/stripping-shared-libraries.html
Ответ 3
"gcc -s" удаляет информацию о перемещении вместе с таблицей символов, которая не выполняется "strip". Обратите внимание, что удаление информации о перемещении повлияет на рандомизация расположения пространства адреса. См. эту ссылку.
Ответ 4
Они делают подобные вещи, но полоска позволяет более мелкозернистый контроль над тем, что удаляется из
файл.