使用buildroot配置uclibc交叉编译工具链!


前情提要

在学习《家用路由器0day漏洞挖掘技术》一书中修复二进制仿真环境部分的时候,书中采用动态库劫持的方式,重新实现了二进制中仿真失败的函数,并将源文件使用交叉编译链编译为目标架构下的动态库文件。我按照此链接中的方式安装了arm-linux-gnueabi之后,编译生成的so文件无法使用,经过分析发现,路由器固件中二进制是基于uclibc库的,而不是eabi或者glibc,所以我安装的交叉编译工具版本不对!下面就来讲一下如何使用buildroot安装基于uclibc库的交叉编译工具链

* 下载buildroot

工具下载地址,从这里进去下载,然后解压,并进入buildroot文件夹。

* 配置

  1. configs文件夹中包含了工具提前配置好的适用于很多平台的配置文件,我们可以从中选择自己需要的。我的目标架构是ARM架构,因此我选择了qemu_arm_vexpress_defconfig文件,然后将该文件复制到buildroot文件夹下,并执行make qemu_arm_vexpress_defconfig命令进行初步配置。
  2. 终端输入make menuconfig命令,弹出窗口可以进行进一步的配置,这里可以参考文章最后的链接[1],对Target optionsBuild optionsToolchain等选项进行设置。
    2.1 Target options
    根据目标平台架构进行设置,还有大小端等,最后的use soft-float给选上(这个不知道是干嘛的,参考资料里选了那我也选)。
    2.2 Build options
    这个选项中需要注意Host dir,这个可以自定义为/usr/local/xxx,其中xxx是自己创建的一个文件夹,名字随意。这个选项设置的好处就是方便后续的移植,可以很方便的在其他机器上使用这个编译工具。
    2.3 Toolchain
    这个里边需要注意以下几点。① Toolchain type选择Buildroot toolchain内部工具链; ② custom toolchain vendor name就是自定义工具链的名字; ③ Kernel Headers,内核版本号,这个需要根据自己的Linux环境来选择,使用uname -a显示系统信息,选择一致的版本就可以,如果没选对的话之后可以根据报错再回来改; ④ C library也就是C库,选uclibc; 剩下的内容可以默认不改。
  3. 配置好以上信息,保存一下,退出即可。
  4. 终端中执行sudo make命令,等待执行完成。期间可能会出现很多报错,请看下一节。

* 过程中遇到的问题

  1. Unable to find the ncurses libraries
    执行以下命令:sudo apt-get install ncurses-dev
  2. 提示没有安装pkg-config
    参考此链接,一定要看链接。从wget命令下载源码,到解压,再到./configure\make\make check\sudo make install,安装完成。安装好的pkg-config文件在目录/usr/bin下,需要将其复制到指定的Host dir下的某一路径下,应该是/usr/local/xxx/bin,报错中也会提到相应的路径,安装好复制过去就好了,如果不复制的话还是会报错提示找不到。
  3. 在安装pkg-config时提示configure: error: Either a previously installed pkg-config or "glib-2.0 >= 2.16" could not be found.
    解决办法:./configure --with-internal-glib
  4. 报错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之交叉编译环境


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM