gcc -g против not -g и strip против not strip, производительности и использования памяти? - PullRequest
36 голосов
/ 09 мая 2011

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

РЕДАКТИРОВАТЬ:

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

1 Ответ

30 голосов
/ 09 мая 2011

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

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

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

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

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

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