Почему gcc добавляет символы к неотладочной сборке?

Когда я делаю сборку конечных версий с 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

12
задан Matt Holgate 22 March 2010 в 09:51
поделиться

2 ответа

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

10
ответ дан 2 December 2019 в 20:16
поделиться

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

6
ответ дан 2 December 2019 в 20:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: