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

Почему 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

4b9b3361

Ответ 1

Существует большая разница между символами отладки и символами линкера. Отладочные символы отображают местоположения кодов кода и т.д., Чтобы имена файлов и номера строк и различные другие полезные вещи, чтобы помочь отладчикам, профайлерам и т.д. Символы компоновщика просто определяют адреса различных точек входа и других важных мест в вашем коде. Если вы хотите сделать исполняемый файл полностью анонимным, вам нужно использовать strip, как вы видели.

Ответ 2

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