Почему gcc добавляет символы в не-отладочную сборку?
Когда я делаю сборку release с помощью gcc (т.е. я не указываю -g
), я все еще, кажется, получаю символы в двоичном формате и должен использовать strip
для их удаления. На самом деле, я все еще могу использовать функции останова и получать обратные трассировки в gdb (хотя и без номеров строк).
Это меня удивило - может ли кто-нибудь объяснить, почему это происходит?
например.
#include <stdio.h>
static void blah(void)
{
printf("hello world\n");
}
int main(int argc, char *argv[])
{
blah();
return 0;
}
gcc -o foo foo.c
nm foo | grep blah
:
08048374 t blah
Ответы
Ответ 1
Существует большая разница между символами отладки и символами линкера. Отладочные символы отображают местоположения кодов кода и т.д., Чтобы имена файлов и номера строк и различные другие полезные вещи, чтобы помочь отладчикам, профайлерам и т.д. Символы компоновщика просто определяют адреса различных точек входа и других важных мест в вашем коде. Если вы хотите сделать исполняемый файл полностью анонимным, вам нужно использовать strip
, как вы видели.
Ответ 2
Это просто поведение по умолчанию для GCC. Полу полезный компромисс между включением отладочной информации и отсутствием чего-либо вообще. Разумеется, можно утверждать, что удаление должно быть по умолчанию, но это просто вопрос добавления -s
или использования команды strip
для управления им в любом случае.