前情提要
在學習《家用路由器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之交叉編譯環境