Что такое таблица символов и как она интегрирована в исполняемый файл? - PullRequest
16 голосов
/ 05 апреля 2010

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

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

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

Таблица символов добавлена ​​в исполняемый файл?

Ответы [ 4 ]

22 голосов
/ 05 апреля 2010

Существует два набора символов, которые использует 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
$
8 голосов
/ 05 апреля 2010

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

2 голосов
/ 05 апреля 2010

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

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

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

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

1 голос
/ 25 апреля 2011

Найдите точку входа приложения.

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

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

...