Hatred's Log Place

DON'T PANIC!

Apr 15, 2019 - 2 minute read - programming embedded

Строим GDB для MicroBlaze

Заметка - часть полёта мысли по написанию кода для MicroBlaze в среде Qt Creator и, возможно, Clion.

Сразу, чем не подошёл родной GDB - в нём нет поддержки Python. Для QtC это критично, поэтому нужно пересобрать, но с поддержкой оного.

Рецепт сборки ниже. Без подробностей, но там всё и так ясно.

Для начала необходимые зависимости. Их не нужно качать отдельно - всё находится в пакете исходников binutils. Порядок отстройки важен. Установку (make install) делать не нужно.

# bfd:
./configure --enable-targets=all && make -j8

# opcodes:
./configure --enable-targets=all && make -j8

# libiberty:
./configure && make -j8

# note: gdb-11.2+, иначе sim не соберётся
# gnulib
chmod +x ./configure && ./configure && make -j8

# sim:
./configure --target=microblaze-xilinx-elf && make -j8

# libdecnumber:
./configure && make -j8

Там где указан --target - это важно. Там где указано --enable-targets=all, вместо all можно указать нужный для MicroBlaze. Но я не вдавался в подробности, тем более, что собирается достаточно быстро. Если не указывать ничего - потом будут проблемы на линковке. А если ещё намешать, сначала собрать opcodes, потом bfd с разным набором целей, то ещё и в рантайме будет эпичный креш ;-)

Ну и собираем сам GDB:

./configure --host=x86_64-pc-linux-gnu --target=microblaze-xilinx-elf --prefix=${HOME}/bin/mb-gdb-python --disable-gdbserver --with-python=/usr/bin/python3 --with-system-readline --with-system-zlib
make -j8
make install

Устанавливаю в домашний каталог пользователя. Если нужно в системный - лучше опакетить или ставить в /opt/. Python можно, теоретически, указать и третий. Потом проверю.

  • UPD: На момент “Февраль 2022” нужно указывать Python 3.

При сборке у себя, проверьте, что использовать в качестве аргумента --host=. Для этого достаточно посмотреть, какой префикс у вашего системного компилятора:

$ gcc -dumpmachine  
x86_64-pc-linux-gnu

значит хост - x86_64-pc-linux-gnu.

Кстати, gdbproxy оказывается не совсем дружит с новыми GDB. Судя по всему причина схожая с этим. Пока вылечил при помощи небольшого хака. Кроме того, эмпирически выяснил, что, похоже, для thread-id используется int32_t, т.е. знаковый 32-битный тип. Просто сейчас базовые адреса оказались за пределами первой половины 32 битного пространства и, внезапно, появились знаки минуса в ID потоков =-)

Tags: programming gdb

MitM-like поддержка RTOS в GDB C++-ниасилятор

comments powered by Disqus