Почему gcc добавляет символы в сборку без отладки? - PullRequest
12 голосов
/ 22 марта 2010

Когда я делаю сборку релиза с помощью 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

Ответы [ 2 ]

10 голосов
/ 22 марта 2010

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

6 голосов
/ 22 марта 2010

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

...