2011-05-09 3 views
34

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

EDIT:

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

+0

Я думаю, что вопрос сводится к тому, загружены ли символы в память по умолчанию или нет. Если это так, это будет способствовать увеличению времени загрузки и потребления памяти. Интересный вопрос, с нетерпением жду ответа. +1 – 0xC0000022L

+0

Почему бы не попробовать сделать то и другое? –

+0

@unapersson: Трудно сделать такие тесты в нашей среде, так как производительность сильно зависит от внешних факторов, которые быстро меняются. – Johan

ответ

30

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

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

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

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

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

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

Благодарим вас за это объяснение! Чтобы убедиться, что я правильно понял ... Бинарный файл, построенный с -g, будет выполняться так же быстро, как тот, который лишен (построен из того же исходного кода), и оба будут генерировать один и тот же основной дамп в случае ошибки сегментации? – Johan

+0

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