Отсутствует символ ELF "var" при использовании GDB? - PullRequest
1 голос
/ 02 октября 2019

Я могу успешно скомпилировать свою программу, используя ARM GCC. Я также могу программировать и запускать свою программу успешно.

Проблема возникает, когда я пытаюсь проверить содержимое переменной. GDB жалуется, что для рассматриваемой переменной отсутствует символ.

Когда я проверяю файл .lst из objdump, я вижу, что для переменной нет символа.

Здесьмой файл main.c:

#include "project.h"

const char *my_string = "tired!";

int main(void) {
    while(1)
    {
        // do nothing;
    }

    return 0;
}

Когда я проверяю содержимое my_string или, по крайней мере, печатаю адрес указателя, я получаю следующую ошибку:

Missing ELF symbol "my_string".

Iпопытался распечатать переменные, выполнив команду: info variables.

Переменная my_string не отображается.

Я знаю, что файл main.c компилируется, потому что я могу запуститьнекоторые программы в цикле while, и если я намеренно добавлю синтаксическую ошибку, компилятор пожалуется на это.

Если я проверю файл ассемблера, я увижу переменную my_string.

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

1 Ответ

1 голос
/ 02 октября 2019

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

У меня есть две прошивки платформы. Каждый использует свою версию GDB.

Платформа A использует: GNU gdb (GNU Tools for ARM Embedded Processors) 7.4.1.20130913-cvs.

Платформа B использует: GNU gdb (GNU Tools for Arm Embedded Processors 8-2019-q3-update) 8.3.0.20190703-git.

Первым моим предположением было то, что компилятор оптимизировал переменную. Поэтому я проверил мои настройки оптимизации, и они были установлены на -O2. Я изменил его на -O0 и перекомпилировал. Проблема все еще была.

Затем я кое-что заметил, когда сравнил выходные данные обеих версий GDB, когда выполнил команду load, чтобы перенести мой файл elf в мой MCU. v7.4.1 скажет:

"/build/debug.elf" has changed; re-reading symbols.

v8.3.0 скажет:

"/build/myProject_v53.elf" has disappeared; keeping its symbols.

Мой файл эльфа переименовывается после каждой сборкис номером сборки, встроенным в имя. Это число увеличивается каждый раз при компиляции. У меня есть символическая ссылка на недавно созданный файл эльфа, и он называется debug.elf. Поэтому debug.elf указывает на новый файл elf каждый раз.

В предыдущей версии GDB было нормально использовать символическую ссылку. GDB не волновало, что имя файла изменилось, так как это была просто символическая ссылка. В новой версии GDB это не тот случай. GDB читает имя файла, на который указывает символическая ссылка, чтобы определить, изменилась ли таблица символов.

Я исправил это, изменив командный файл, который передается в GDB при запуске.

Я запускаю GDBиспользуя следующую команду в моем файле Makefile:

$(GDB) build/debug.elf --command=cfg/launch.gdb

В этом файле у меня есть ловушка для выполнения команды загрузки.

define hook-load
    mon reset halt
end

Это позволяет мнесбросить и остановить устройство после программирования MCU.

Я изменил его, чтобы заставить таблицу символов обновляться каждый раз, когда я прошиваю MCU.

define hook-load
    file build/debug.elf
    mon reset halt
end

И это все.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...