Когда я делаю сборку конечных версий с 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
Существует большая разница между символами отладки и символами компоновщика. Отладочные символы отображают местоположение кода и т.д. на имена исходных файлов, номера строк и различные другие полезные вещи, помогающие отладчикам, профилировщикам и т.д. Символы компоновщика просто определяют адреса различных точек входа и других важных мест в вашем коде. Если вы хотите сделать исполняемый файл полностью анонимным, то вам нужно использовать strip
, как вы видели.
Это просто поведение по умолчанию для GCC. Полуполезный компромисс между включением отладочной информации и отсутствием чего-либо вообще. Можно, конечно, возразить, что удаление должно быть по умолчанию, но это просто вопрос добавления -s
или использования команды strip
для управления им в любом случае.