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



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




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


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



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



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




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

  • ускорить его бег?

621   4  

4 ответов:

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

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

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

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

что эквивалентно gcc-s с точки зрения полосы с некоторыми из его вариантов?

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

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

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

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

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

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

Comments

    Ничего не найдено.