Заметка - часть полёта мысли по написанию кода для 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 потоков =-)