Adding a New Target to GDB (1)

为 GDB 添加新的目标机 (1)

工作基本结束,留下些文字,希望能对别人有些用处。本文遵从 GNU Free Documentation License (see http://www.gnu.org/copyleft/fdl.html ),并特别对 冒充另类(TeaWater) 的《移植GDB》一文表示感谢 (see http://teawater.spaces.live.com/ )。由于大体和细节的东西在《GDB Internal》和《移植 GDB》一文中已经有了很多描述,所以本文的目的在于 Howto,step by step 地描述如何为 GDB 添加新的目标机,并对某些以上两文中阐释不清的地方做出自己的解释。

为 GDB 添加新的目标机的意思就是让 GDB 支持一个新的 CPU 体系架构。这点从 GDB 的编译选项中可以看出来,在./configure 命令后有一个 --target= 的选项,这个等号后面就是 GDB 调试的二进制文件应该在什么目标机上运行,可以是: mips-elf,arm-elf 等等,在 config.sub 文件中你可以看到这些选项是如何工作的。

下面我们假设要添加的新 target 为 solrex-elf。

1.如何配置编译环境

当你为一个 GDB 添加 target solrex-elf 的时候,至少需要让 GDB 在 configure 为 solrex-elf 时候能够编译通过,为此你需要添加和修改一些文件。

GDB 其实由很多部分共同组成,GDB 源文件目录下有几个目录,bfd 目录下是 LIB BFD (Binary File Descriptor Library),opcodes 目录下是 opcode library,这两个 library 都是跟随 binutils 分发的; libiberty 目录下是 libiberty library,它给许多 GNU 软件提供一些通用的子程序,好像是跟随 gcc 分发的;readline 目录下是 readline library,提供一些命令行功能,比如<tab>补全,它好像是独立分发的;最关键的 gdb 目录,这个下面才是 GDB 的主体。

是想让 GDB 编译通过,不能只修改 gdb 的东西。要调试程序,必须要有先编译出来二进制代码,所以对 BFD 和 opcodes 的修改应该是最早的,binutils 依赖这些库来编译出来二进制工具,比如ar, as, ld, objdump, readelf 等,然后 gcc 利用这些二进制工具把它编译出来的汇编码最终组合成目标文件和可执行文件。

但是,在某些阶段,比如编译器尚未完善之际,可以先 cheating GDB,就是拿来一个已有 target 的 BFD lib 和 opcode lib,修改成自己的 target。

下面是要编译 target=solrex-elf 需要修改的文件:

Key source files:
gdb
* gdb/config/solrex/tm-solrex.h: New file.
* gdb/solrex-tdep.h: New file.
* gdb/solrex-tdep.c: New file.
bfd
* include/elf/solrex.h: New file.
* bfd/cpu-solrex.c: New file.
* bfd/elf32-solrex.c: New file.
* bfd/archures.c: New arch.
* bfd/bfd-in2.h: New arch.
* bfd/targets.c: New target.
opcodes
* opcodes/solrex-dis.c: New file.
* include/dis-asm.h (print_insn_solrex): New function.
* opcodes/disassemble.c (ARCH_solrex): New arch.
Config files:
gdb
* gdb/config/solrex/solrex.mt: New file.
* gdb/Makefile.in (solrex-tdep*): New target.
* gdb/configure.host (solrex*, solrex*-*-elf*): New target.
* gdb/configure.tgt (solrex*, solrex*-*-elf*): New target.
bfd
* bfd/config.bfd: New target.
* bfd/configure.in: New target.
* bfd/Makefile.am: New target.
opcodes
* opcodes/configure.in (bfd_solrex_arch): New target.
* opcodes/Makefile.am (solrex-dis*): New target.
general
* configure.in (solrex*-*-elf*): New target.
* config.sub (solrex, solrex*-*): New target.
* readline/support/config.sub (solrex, solrex*-*): New target.
Auto Generated files:
* configure (solrex*-*-elf*): New.
* bfd/configure: New.
* bfd/Makefile.in: New.
* bfd/doc/bfd.info: New.
* opcodes/configure (bfd_solrex_arch): New.
* opcodes/Makefile.in (solrex-dis*): New.

上面列出的是想成功编译出 solrex-elf target 需要修改的最少的文件。至于如何修改 config 和 makefile 文件,只需要查看一下某个特定的 target,比如:mips,或者简单点的 xtensa,就知道该怎样改了。

在 bfd 和 opcodes 里的文件不是这篇文章中讲的重点,想 cheat GDB 最简单的办法就是把另外一个 target 的名字,比如:mips, xtensa 全部换成 solrex 就行了,使用另一种 target 的 binary file descriptor 会影响 GDB 的某些功能而不是全部。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注