У чому різниця між “gcc -s” та командою “strip”?


77

Цікаво, у чому різниця між цими двома:

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

  • strip: Видалити символи з об'єктних файлів.

Чи мають вони однакове значення?

Який з них ви використовуєте для:

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

Відповіді:


66

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

stripце те, що можна запустити на об'єктному файлі, який вже скомпільовано. Він також має безліч опцій командного рядка, за допомогою яких ви можете налаштувати, яку інформацію буде видалено. Наприклад, -gвидаляє лише інформацію про налагодження, яка gcc -gдодає.

Зверніть увагу, що stripце не команда bash, хоча, можливо, ви запускаєте її з оболонки bash. Це команда, повністю відокремлена від bash, частина набору двійкових утиліт GNU.


1
Дякую! що еквівалентно gcc -s з точки зору strip з деякими його опціями?
Тім

3
Який з них ви використовуєте, щоб зменшити розмір виконуваного файлу та пришвидшити його роботу.
Тім

Я думаю, що поведінка за замовчуванням stripсхожа на поведінку gcc -s, але я не фахівець. Зачекайте іншої відповіді, якщо вам справді потрібно це знати. Однак особисто я б уникав базікання з усім, чого ви не повністю розумієте в цьому відділі. Я майже впевнений, що слід очікувати зменшення розміру виконуваного файлу, але не суттєвих змін у швидкості виконання.
Cascabel

50

Прийнята відповідь дуже хороша, але лише для доповнення ваших подальших запитань (а також як довідкова інформація для тих, хто опинився тут).

Що еквівалентно 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


3
+1 для "нерозподіленого розділу двійкового
файлу

msgstr "він ніколи не завантажується в оперативну пам'ять". Отже, чому людина зачищає статтю "позбавлений двійковий файл, який займе менше місця в оперативній пам'яті" ?
YvesgereY

@YvesgereY: Я думаю, це дещо оптимістичне твердження. Він займає менше місця на диску та в кеш-пам'яті сторінки в оперативній пам'яті, якщо алгоритм читання файлів ядра тягне ту сторінку замість корисної сторінки. Або якщо є якась частина двійкового файлу, яка потребує завантаження на тій самій 4k-сторінці, що і таблиця символів, тоді сторінка переважно марних даних може потрапити в пам’ять. (наприклад, частина таблиці символів, що використовується для динамічного зв'язування.) Я насправді не впевнений, що символи, необхідні для динамічного зв'язування, згруповані разом, чи змішані з "марними" символами налагодження.
Пітер Кордес,

16

"gcc -s" видаляє інформацію про переїзд разом із таблицею символів, що не робиться за допомогою "strip". Зауважте, що видалення інформації про переїзд матиме певний вплив на рандомізацію розміщення адресного простору . Дивіться це посилання.


Перша відповідь, в якій згадується, що саме видаляється! Точний перелік видалених розділів був би ще кращим, я думаю.
Віктор Сергієнко

7

Вони роблять подібні речі, але стрип дозволяє чіткіше контролювати те, що видаляється з файлу.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.