В чем разница между командами "gcc -s" и "strip"? - PullRequest
65 голосов
/ 29 августа 2009

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

  • gcc -s: Удалить всю таблицу символов и информацию о перемещении из исполняемого файла.

  • strip: удалить символы из объектных файлов.

Они имеют одинаковое значение?

Какой из них вы используете:

  • уменьшить размер исполняемого файла?
  • ускорить его работу?

Ответы [ 4 ]

57 голосов
/ 29 августа 2009

gcc, будучи компилятором / компоновщиком, его опция -s - это то, что сделано при компоновке . Он также не настраивается - у него есть набор информации, который он удаляет, не больше и не меньше.

strip - это то, что может быть запущено на объектном файле, который уже скомпилирован. Он также имеет множество параметров командной строки, которые вы можете использовать для настройки того, какая информация будет удалена. Например, -g удаляет только отладочную информацию, которую добавляет gcc -g.

Обратите внимание, что strip не является командой bash, хотя вы можете запускать ее из оболочки bash. Это команда, полностью отделенная от bash, часть набора двоичных утилит GNU.

40 голосов
/ 24 октября 2013

Принятый ответ очень хорош, но только для того, чтобы дополнить ваши дальнейшие вопросы (а также как справку для всех, кто здесь окажется).

Что эквивалентно gcc -s в плане strip с некоторыми из его опций?

Они оба делают одно и то же, полностью удаляя таблицу символов. Однако, как указал @JimLewis, полоса обеспечивает более точное управление. Например, в перемещаемом объекте strip --strip-unneeded не удалит его глобальные символы. Однако strip или strip --strip-all удалили бы полную таблицу символов.

Какой из них вы используете для уменьшения размера исполняемого файла и ускорения его запуска

Таблица символов - это неразмещаемый раздел двоичного файла. Это означает, что он никогда не загружается в оперативную память. Он хранит информацию, которая может быть полезна для отладки целей, например, для распечатки трассировки стека в случае сбоя. Случай, в котором может иметь смысл удалить таблицу символов, будет сценарием, в котором у вас есть серьезные ограничения емкости хранилища (в этом отношении gcc -Os -s или make CXXFLAGS="-Os -s" ... полезно, так как это приведет к меньшему, более медленному двоичному файлу, который также раздели, чтобы уменьшить размер дальше). Я не думаю, что удаление таблицы символов приведет к увеличению скорости по причинам, прокомментированным.

Наконец, я рекомендую эту ссылку для удаления общих объектов: http://www.technovelty.org/linux/stripping-shared-libraries.html

11 голосов
/ 30 апреля 2015

"gcc -s" удаляет информацию о перемещении вместе с таблицей символов, которая не выполняется "strip". Обратите внимание, что удаление информации о перемещении может оказать некоторое влияние на рандомизацию размещения адресного пространства . Смотрите эту ссылку.

5 голосов
/ 29 августа 2009

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

...