交叉编译php-5.6.30,linux下用arm-none-linux-gnueabi交叉编译arm内核模块
前不久導師要求交叉編譯一個基于arm平臺開發的內核模塊來練手,在網上查了很多資料才弄出來,于是將這些零散的信息綜合起來給和我一樣的入門人員了解。水平有限,請諒解~
1.安裝arm-none-linux-gnueabi交叉編譯器
很多時候我們需要編譯運行在其他平臺的文件,而沒有條件在目標平臺上直接編譯時,我們就用到了交叉編譯。顧名思義就是在現有平臺編譯目標平臺的程序。
在linux編譯arm平臺的內核模塊時,大多采用arm-none-linux-gnueabi交叉編譯器。這個編譯器雖然在官網可以下載但是很難找,在此貼出一個百度云盤的共享地址:http://pan.baidu.com/share/link?shareid=2940135020&uk=1443951890
在ubuntu下,輸入命令:
$tar-xvjfarmarm-2010q1-202-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar
將該文件解壓。然后輸入命令:gedit?~/.bashrc在文件的末尾添加?exportPATH=$PATH:/usr/local/arm/4.4.3/bin
這樣就配置好了環境變量。我們可以輸入arm-none-linux然后按Tab鍵看是否填充來判斷環境變量是否配置完好。
請注意一點,由于arm-none-linux-gnueabi需要運行在32位的linux上,如果按照上述配置完了環境變量后依然無法填充,請檢查linux的版本是32位還是64位(可以輸入:getconf?LONG_BIT查看)如果是64位操作系統那么要么重新安裝32位要么輸入命令:sudo?apt-getinstall?ia32-libs來安裝32位的兼容庫。
2.構造linux內核源碼樹
在編寫內核模塊時需要引用到相應的文件。如果不去構造linux內核源碼樹就進行編譯的話,會提示找不到相應的.h文件。一般來說,要編譯一個內核模塊時一定要知道它是基于哪個內核版本編寫的。然后下載這個版本的內核源碼構造源碼樹。比如說,需要編譯的內核模塊時基于2.6的內核,而現在使用的ubuntu是基于3.2內核的版本。沒有關系,下載2.6的內核,然后放到一個文件夾中進行構造就行。為圖方便,可以直接放在桌面。
內核源碼可以事先下載,然后再linux下解壓。也可以輸入命令:sudo?apt-get?install?linux-source-2.6.27(如果是其他版本只要替換后面的版本數字就可以了)下載源碼,然后到/usr/src里面找到它,并對其進行解壓。
然后我們輸入命令:export?ARCH=arm以及
export?CROSS_COMPILE=arm-none-linux-gnueabi-這里的CROSS_COMPILE環境變量就是指定交叉編譯器。進入解壓后的源碼目錄。假設我們的源碼目錄在~/Desktop/linux-source-2.6.27下,那么我們先進入它的/arch/arm/configs文件夾中找一個config文件,至于選哪個合適說實話我也沒弄清楚,當時我所選的是S3C_2410_defconfig文件。貌似選哪一個文件得和目標平臺有關。當選好config文件后,用cp?命令將其復制到~Desktop/linux-source-2.6.27?也就是我們的源碼目錄下,并更名為.config?更名后的文件需要使用ls?-a才能顯示出來。
做好這一切后,接下來就運行命令?sudo?makemenuconfig,如果不出意外就會看到類似以下界面:
然后作用鍵選擇退出這個界面。需要說明一點,如果在運行sudo?make?menuconfig?命令時出現以下錯誤提示信息:
***?Unable?to?find?the?ncurses?libraries?or?the***?required?header?files.***?‘make?menuconfig’?requires?the?ncurses?libraries.******?Install?ncurses?(ncurses-devel)?and?try?again.
那么就運行命令:sudo?apt-get?insatll?ncurses-dev
sudo?apt-get?install?libncurses5-dev安裝相應的軟件。如果是在CentOS下則運行命令yum?install?-y?ncurses-devel即可。
接下來就依次運行以下命令:
sudo?make?oldconfig
sudo?make(時間比較長)
sudo?make?bzImage
sudomake?modules
sudo?make?modules_install
在網上看到很多人執行這些命令時遇到了些錯誤以及他們解決的辦法。不過由于我試了幾次都沒有問題,在此就不貼出問題了,如果遇到可以“放狗搜一下”。
成功執行上述命令后,我們會在源碼目錄下看到vmlinux.o文件。
3.編譯內核模塊
內核模塊的Makefile文件中,KERN_DIR?=?/lib/modules/$(shell?uname?-r)/build就是引用內核源碼樹的位置。當我們構建好了內核源碼樹后只需要將$(shell?uname?-r)換成安裝好的內核源碼版本就行。具體可以進入/lib/modules下查看。
以上就是我初學交叉編譯arm平臺的內核模塊的總結,其實很多部分也只是知其然不知其所以然,還有很多需要學習。整理出來就是希望其他和我一樣的菜鳥可以少走些彎路。
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的交叉编译php-5.6.30,linux下用arm-none-linux-gnueabi交叉编译arm内核模块的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php异步方案,PHP的异步实现方式
- 下一篇: linux的备份和恢复命令,Linux基