В чем разница между "gcc -s" и командой "strip"?

Интересно, в чем разница между этими двумя:

  • 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

Ответ 4

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