Что такое таблица символов и как она интегрируется в исполняемый файл?
Когда я попытался отладить исполняемый файл:
(gdb) break +1
No symbol table is loaded. Use the "file" command.
Что это значит?
Подключена ли таблица символов к исполняемому файлу?
Ответы
Ответ 1
Существует два набора символов, которые использует gdb.
Набор -g - это отладочные символы, которые упрощают работу, поскольку позволяют просматривать ваш код и просматривать переменные во время отладки.
Еще один набор символов включен по умолчанию при компиляции. Это символы привязки и живут в таблице символов ELF (исполняемый формат). Это содержит намного меньше информации, чем символы отладки, но содержит наиболее важные материалы, такие как адреса вещей в исполняемом файле (или библиотеке или объектном файле). Без этой информации gdb даже не знает, где находится главная, поэтому (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
$
Ответ 2
Это потому, что вы не компилировались с включенной отладкой. Попробуйте gcc -g file.c
Ответ 3
Таблица символов содержит информацию об отладке, которая сообщает отладчику, какие ячейки памяти соответствуют тем символам (например, именам функций и именам переменных) в исходном файле исходного кода. Таблица символов обычно хранится внутри исполняемого файла, да.
gdb сообщает вам, что он не может найти эту таблицу. Если вы скомпилировали gcc, если вы не использовали флаг -g, он не будет содержать таблицу символов в файле. Самый простой способ - перекомпилировать ваш файл с помощью -g. gdb должен автоматически найти информацию таблицы символов.
Добавьте флаг -g в аргументы командной строки gcc или в Makefile, который вы использовали для компиляции программы. (Много раз, в Makefile будет переменная CFLAGS или аналогичная.)
Если вы пытаетесь отладить произвольную стороннюю программу, много раз информация будет "удалена" из нее. Это делается для того, чтобы сделать сложным обратное проектирование и уменьшить размер исполняемого файла. Если у вас нет доступа к исходному коду и вы можете скомпилировать программу самостоятельно, вам будет очень сложно использовать gdb на ней.
Ответ 4
Найдите точку входа приложения.
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
Решение заключалось бы в том, чтобы начать отладку на адрес точки входа плюс один.