Что такое таблица символов и как она интегрирована в исполняемый файл?
Когда я попытался отладить исполняемый файл:
(gdb) break +1
No symbol table is loaded. Use the "file" command.
Что именно это значит?
Таблица символов добавлена в исполняемый файл?
4 ответа
GDB использует два набора символов.
Набор -g - это символы отладки, которые значительно упрощают работу, так как позволяют вам видеть ваш код и смотреть на переменные во время отладки.
Другой набор символов включен по умолчанию при компиляции. Это символы связывания и находятся в таблице символов ELF (исполняемый формат с возможностью связывания). Он содержит намного меньше информации, чем символы отладки, но содержит самые важные вещи, такие как адреса вещей в вашем исполняемом файле (или библиотеке или объектном файле). Без этой информации GDB даже не будет знать, где находится main, поэтому (gdb) break main
потерпит неудачу
Если у вас нет символов отладки ( -g), вы все равно сможете (gdb) break main
но ваш GDB не будет иметь никакого представления о строках кода в вашем исходном файле. Когда вы пытаетесь пройти по коду, вы будете продвигать только 1 машинную инструкцию за раз, а не строку за раз.
Команда полосы часто используется для 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
$
Это потому, что вы не скомпилировали с включенной отладкой. Попробуйте gcc -g file.c
Таблица символов содержит отладочную информацию, которая сообщает отладчику, какие области памяти соответствуют каким символам (таким как имена функций и имена переменных) в исходном файле исходного кода. Таблица символов обычно хранится внутри исполняемого файла, да.
GDB говорит вам, что не может найти эту таблицу. Если вы скомпилировали с помощью gcc, если вы не использовали флаг -g, он не будет включать таблицу символов в файл. Возможно, самый простой способ - перекомпилировать ваш файл с -g. Затем GDB должен автоматически найти информацию таблицы символов.
Либо добавьте флаг -g к аргументам командной строки gcc, либо к Makefile, который вы использовали для компиляции программы. (Часто в Makefile будет переменная CFLAGS или аналогичная).
Если вы пытаетесь отладить произвольную стороннюю программу, часто информация будет "удалена" из нее. Это сделано для того, чтобы сделать реверс-инжиниринг более сложным и уменьшить размер исполняемого файла. Если у вас нет доступа к исходному коду и вы не можете скомпилировать программу самостоятельно, вам будет очень трудно использовать GDB.
Найти точку входа приложения.
objdump -f main
main: file format elf32-i386
architecture: i386, flags 0x00000112:
EXEC_P, HAS_SYMS, D_PAGED
start address 0x08048054
Поместите точку останова с помощью отладчика GNU
gdb
exec-file main
break *0x8048054
set disassemble-next-line on
run
Затем пошагово пройдитесь по коду
gdb
stepi
Особые заметки
Если вы используете последнюю версию Ubuntu, это вас не затронет, но вы можете столкнуться с этой ошибкой, если вы используете Ubuntu 10.04 или более раннюю версию.
https://bugs.launchpad.net/ubuntu/+source/gdb/+bug/151518G
Решением будет начать отладку с адреса точки входа плюс один.