Существует два набора символов, которые использует GDB.
Набор -g - это символы отладки, которые значительно упрощают процесс, поскольку они позволяют вам видеть ваш код и просматривать переменные во время отладки.
Другой набор символов включен по умолчанию при компиляции. Это символы связывания и находятся в таблице символов ELF (исполняемый формат с возможностью связывания). Он содержит намного меньше информации, чем символы отладки, но содержит самые важные вещи, такие как адреса вещей в вашем исполняемом файле (или библиотеке или объектном файле). Без этой информации GDB даже не будет знать, где находится main, поэтому (gdb) break main
потерпит неудачу.
Если у вас нет символов отладки (-g), вы все равно сможете (gdb) break main
, но у вашего gdb не будет никакого представления о строках кода в вашем исходном файле. Когда вы пытаетесь пройти по коду, вы продвигаете только одну машинную инструкцию за раз, а не строку за раз.
Команда strip часто используется для strip
отключения символов из исполняемого файла (или другого объектного файла).
Это часто используется, если вы не хотите, чтобы кто-то мог видеть символы, или если вы хотите сэкономить место в файле. Таблицы символов могут стать большими. Strip удаляет как символы отладки, так и символы компоновщика, но имеет несколько параметров командной строки, которые могут ограничивать то, что она удаляет.
Если вы запустите команду file
в своей программе, одна из вещей, которая сообщит вам о погоде или об удалении исполняемого файла, будет удалена.
$ gcc my_prog.c -o my_prog
$ file my_prog
my_prog: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.15, not stripped
$ strip my_prog
my_prog: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.15, stripped
$