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

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

(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

Решением будет начать отладку с адреса точки входа плюс один.

Другие вопросы по тегам