Что такое таблица символов и как она интегрируется в исполняемый файл?

Когда я пытался отладить исполняемый файл:

(gdb) break +1
No symbol table is loaded.  Use the "file" command.

Что это означает точно?

Таблица символов добавляется к исполняемому файлу?

16
задан Minh-Triet Pham Tran 15 October 2013 в 03:31
поделиться

3 ответа

GDB использует два набора символов.

Набор -g - это символы отладки, которые значительно упрощают работу, поскольку позволяют видеть ваш код и просматривать переменные во время отладки.

Другой набор символов включается по умолчанию при компиляции. Это связывающие символы, они находятся в таблице символов ELF (исполняемый связываемый формат). Он содержит намного меньше информации, чем символы отладки, но содержит наиболее важные данные, такие как адреса вещей в вашем исполняемом файле (или библиотеке, или объектном файле). Без этой информации gdb даже не узнает, где находится main, поэтому (gdb) break main завершится ошибкой.

Если у вас нет отладочных символов (-g), вы все равно сможете (gdb) сломать основной , но ваш gdb не будет иметь никакого представления о строках кода в вашем исходном коде файл. Когда вы пытаетесь пройти через код, вы будете продвигать только одну машинную инструкцию за раз, а не строку за раз.

Команда удаления часто используется для удаления символов из исполняемого файла (или другого объектного файла). Это часто используется, если вы не хотите, чтобы кто-то мог видеть символы, или если вы хотите сэкономить место в файле. Таблицы символов могут стать большими. 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
$
22
ответ дан 30 November 2019 в 17:15
поделиться

Это потому, что вы не компилировали с включенной отладкой. Попробуйте gcc -g file.c

8
ответ дан 30 November 2019 в 17:15
поделиться

Таблица символов содержит отладочную информацию, которая сообщает отладчику, какие ячейки памяти каким символам соответствуют (например, имена функций и имена переменных) в исходном файле исходного кода. Да, таблица символов обычно хранится внутри исполняемого файла.

GDB сообщает вам, что не может найти эту таблицу. Если вы скомпилировали с помощью gcc, если вы не использовали флаг -g, он не будет включать таблицу символов в файл. Самый простой способ - это перекомпилировать файл с помощью -g. Затем gdb должен автоматически найти информацию о таблице символов.

Добавьте флаг -g к аргументам командной строки gcc или к Makefile, который вы использовали для компиляции программы. (Часто внутри Makefile будет переменная с именем CFLAGS или аналогичная).

Если вы пытаетесь отладить произвольную стороннюю программу, очень часто информация из нее «вырезается». Это сделано для того, чтобы усложнить обратное проектирование и уменьшить размер исполняемого файла. Если у вас нет доступа к исходному коду и вы не можете скомпилировать программу самостоятельно, вам будет очень сложно использовать на ней gdb.

2
ответ дан 30 November 2019 в 17:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: