前情提要
在学习《家用路由器0day漏洞挖掘技术》一书中修复二进制仿真环境部分的时候,书中采用动态库劫持的方式,重新实现了二进制中仿真失败的函数,并将源文件使用交叉编译链编译为目标架构下的动态库文件。我按照此链接中的方式安装了arm-linux-gnueabi之后,编译生成的so文件无法使用,经过分析发现,路由器固件中二进制是基于uclibc库的,而不是eabi或者glibc,所以我安装的交叉编译工具版本不对!下面就来讲一下如何使用buildroot安装基于uclibc库的交叉编译工具链。
* 下载buildroot
工具下载地址,从这里进去下载,然后解压,并进入buildroot文件夹。
* 配置
configs
文件夹中包含了工具提前配置好的适用于很多平台的配置文件,我们可以从中选择自己需要的。我的目标架构是ARM架构,因此我选择了qemu_arm_vexpress_defconfig
文件,然后将该文件复制到buildroot
文件夹下,并执行make qemu_arm_vexpress_defconfig
命令进行初步配置。- 终端输入
make menuconfig
命令,弹出窗口可以进行进一步的配置,这里可以参考文章最后的链接[1],对Target options
,Build options
,Toolchain
等选项进行设置。
2.1Target options
:
根据目标平台架构进行设置,还有大小端等,最后的use soft-float
给选上(这个不知道是干嘛的,参考资料里选了那我也选)。
2.2Build options
:
这个选项中需要注意Host dir
,这个可以自定义为/usr/local/xxx
,其中xxx
是自己创建的一个文件夹,名字随意。这个选项设置的好处就是方便后续的移植,可以很方便的在其他机器上使用这个编译工具。
2.3Toolchain
:
这个里边需要注意以下几点。①Toolchain type
选择Buildroot toolchain
内部工具链; ②custom toolchain vendor name
就是自定义工具链的名字; ③Kernel Headers
,内核版本号,这个需要根据自己的Linux环境来选择,使用uname -a
显示系统信息,选择一致的版本就可以,如果没选对的话之后可以根据报错再回来改; ④C library
也就是C库,选uclibc
; 剩下的内容可以默认不改。 - 配置好以上信息,保存一下,退出即可。
- 终端中执行
sudo make
命令,等待执行完成。期间可能会出现很多报错,请看下一节。
* 过程中遇到的问题
Unable to find the ncurses libraries
执行以下命令:sudo apt-get install ncurses-dev
。- 提示没有安装
pkg-config
参考此链接,一定要看链接。从wget
命令下载源码,到解压,再到./configure\make\make check\sudo make install
,安装完成。安装好的pkg-config
文件在目录/usr/bin
下,需要将其复制到指定的Host dir
下的某一路径下,应该是/usr/local/xxx/bin
,报错中也会提到相应的路径,安装好复制过去就好了,如果不复制的话还是会报错提示找不到。 - 在安装
pkg-config
时提示configure: error: Either a previously installed pkg-config or "glib-2.0 >= 2.16" could not be found.
解决办法:./configure --with-internal-glib
- 报错
Incorrect selection of kernel headers: expected 3.2.x, got 4.6.x
这种报错中3.2.x
是在上一节2.3中自己选的,重新运行make menuconfig
把选项改成后边这个4.6.x
就行了。要根据自己的报错改成相应的值,我的是改成了4.16.x
(但是我的系统信息明明是4.15.x,不知道为啥会不一致)。
链接中还给了另外一种方法,但是我找不到它里边提到的那个路径下的文件..
参考资料
[1] buildroot之交叉编译环境