在是用ejtag的时候缺少了gdb工具,因此自己需要手动编译一个gdb工具,编译过程中遇到了一些错误,翻阅了大量的网上资料解决了这些问题,从而也学习了一下交叉编译源码包的方法,这里做一个总结。
首先去官方网站下载gdb的源码包,我下载的7.4.1版本的源码包,解压开来,进入到源码包的根目录下。对于一个源码包,拿到手里首先要阅读的就是README,然后看一下INSTALL文件,这个文件里编译源码包的步骤。
基本上所有的源码包都是三步,configure,make,make install。
首先执行的就是./configure,这是一个配置的脚本。后面2步用到的很多很多配置都是在这里进行的,比如说编译所用的工具之类,所以交叉编译必须要配置这里,可以执行./configure --help查看后面参数的类型,对于交叉编译,主要就是有三个参数:--build --host --target。
System types:
--build=BUILD configure for building on BUILD [guessed]
--host=HOST cross-compile to build programs to run on HOST [BUILD]
--target=TARGET configure for building compilers for TARGET [HOST]
--build参数是指你编译源码包的系统环境,可以通过查看系统的环境变量来获取,执行set命令可以看到 MACHTYPE=i686-pc-linux-gnu,则--build=i686-pc-linux-gnu。
--host参数指的是编译出来的工具运行在什么系统上,我编译出来的gdb是要运行在龙芯1b的开发板上,因此环境就是mipsel-linux的环境,如果你的是arm的开发板,就是arm-linux的环境。
--target参数指的是编译出的工具所要操作的系统,这个必须要理解明白,比如说我编译出来的gdb要在我的电脑上运行,但是要调试交叉编译出来的mips指令集的程序,这个时候呢,--target就要是mipsel-linux,但是--host是i686-pc-linux-gnu。
综上所述,交叉编译第一条命令应该是:
./configure --build=i686-pc-linux-gnu --host=mipsel-linux --target=mipsel-linux --prefix=/install.
第二步就是执行make,交叉编译gdb的时候make会出现下面这样一个错误:
configure: error: no termcap library found
make[1]: *** [configure-gdb] Error 1
make: *** [all] Error 2 很明显这是缺少一个termcap库,这是一个终端数据库,可以从官网下载一个版本的源码包,这里需要注意的是这个源码包也许要交叉编译,那是因为这个是你交叉编译gdb需要的库,在configure时可以指定--prefix指定安装目录,交叉编译安装完成后必须要将这个库放在交叉编译工具gcc(我的是mipsel-linux-gcc)的默认搜索库目录下。到你的交叉编译工具目录下,怎样查看默认搜索库的目录在哪里呢,执行下面的命令:
XXXXXXX-linux-gcc -print-file-name libc.a
就会显示出交叉编译工具所使用的库的默认搜索目录了。
然后将termap.h拷贝到默认目录下的include下,将libtermcap.a拷贝到默认目录下的lib下。
这样make时XXX-linux-gcc就可以找到这个库进行编译,make就可以通过啦!
然后make install,可以在configure时指定安装目录--prefix,这样便于寻找编译生成的工具。
这样我们就可以找到我们需要的gdb工具啦!
如果我们不交叉编译gdb,而是编译在本机上试用的gdb时nake不会碰到这个错误,那是因为本机gcc默认库搜索目录/usr/lib下有这个库libtermcap.a,但是这是一个链接文件,链接到了libncurses.a上,那是因为termcap库是一个比较老的终端数据库,现在都试用ncurses库代替,但是有些程序还是试用termcap库,所以系统中安装ncurses库时默认做一个链接文件,防止gdb的这种编译错误。