Подтвердить что ты не робот

Gcc -g vs not -g и strip vs not strip, производительность и использование памяти?

Если размер двоичного файла не является проблемой, существуют ли какие-либо недостатки с использованием -g и не сбрасывать двоичные файлы, которые должны выполняться в критичной для производительности среде? У меня много дискового пространства, но бинарный процессор интенсивный и использует много памяти. Бинарный файл загружается один раз и жив в течение нескольких часов.

EDIT:

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

4b9b3361

Ответ 1

Погрузчик ELF загружает сегменты, а не секции; отображение из секций в сегменты определяется компоновщиком script, используемым для создания исполняемого файла.

Компонент компоновки по умолчанию script не отображает разделы отладки в любом сегменте, поэтому это опущено.

Информация о символах поставляется в двух вариантах: статические символы обрабатываются вне диапазона и никогда не хранятся в виде данных раздела; таблицы динамических символов генерируются компоновщиком и добавляются в специальный сегмент, который загружается вместе с исполняемым файлом, так как он должен быть доступен динамическому компоновщику. Команда strip удаляет только статические символы, которые никогда не упоминаются в сегменте.

Таким образом, вы можете использовать полную отладочную информацию через весь процесс, и это не повлияет на размер исполняемого образа в ОЗУ, так как он не загружен. Это также означает, что информация не включена в основные дампы, поэтому это также не дает вам никакой пользы.

У утилиты objcopy есть специальная опция для копирования только отладочной информации, поэтому вы можете создать второй файл ELF, содержащий эту информацию, и использовать разделенные двоичные файлы; при анализе дампа ядра вы можете загрузить оба файла в отладчик:

objcopy --only-keep-debug myprogram myprogram.debug
strip myprogram