Hatred's Log Place

DON'T PANIC!

Apr 15, 2019 - 2 minute read - Comments - 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

# 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-build_unknown-linux-gnu --target=microblaze-xilinx-elf --prefix=${HOME}/bin/mb-gdb-python --disable-gdbserver --with-python=/usr/bin/python2 --with-system-readline --with-system-zlib
make -j8
make install

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

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