最近,我想給一臺跑著精簡Linux系統(tǒng)的3D打印機開發(fā)點小工具,它的處理器還是MIPS架構。擺在我面前有兩條路:要么老老實實自己搭一套交叉編譯工具鏈,要么用Zig語言——它理論上內(nèi)置了MIPS的工具鏈。我首先沖著省事選了Zig,結果發(fā)現(xiàn)該繞的彎子一個不少。于是我又把目光轉(zhuǎn)到了Crosstool-NG上,誰知道上手后才發(fā)現(xiàn),這條路同樣不平坦。
Crosstool-NG到底是什么?它是一套專門用來構建交叉編譯工具鏈的自動化系統(tǒng)。有了它,你就不用再手動去匹配某個GCC版本跟對應的binutils、glibc或musl、Linux內(nèi)核頭文件、各種補丁和配置選項了。只需要選定目標架構,剩下的下載、打補丁、配置、編譯全部由Crosstool-NG包辦。最終它會給你生成一套自包含的工具鏈,像mipsel-linux-musl-gcc或者arm-none-eabi-gcc這樣的命令,可以直接拿來給目標機器編譯可執(zhí)行文件。
![]()
這些命令的名字通常由三到四部分組成,這也是交叉編譯領域的慣例。比如arm-none-eabi-gcc,最后的gcc說明這是GCC編譯器,對應的還有arm-none-eabi-as、arm-none-eabi-ld等等。第一部分arm代表目標架構。第二部分本應是廠商名,但經(jīng)常寫成“none”表示通用,或者在面向Linux時直接寫“l(fā)inux”。第三部分則跟調(diào)用約定和C庫有關,像arm-linux-gnueabihf-gcc里面的gnueabihf就表示用的是GNU庫、ARM EABI接口并且開啟硬件浮點。這類字符串經(jīng)常被叫做“目標三元組”,但現(xiàn)在往往有四五段。光說“Arm”或“MIPS”根本不夠,因為字節(jié)序、浮點約定、指令集變種、線程支持以及C庫選型,這所有選項都得彼此對齊。Crosstool-NG并不能替你決定該選哪個,但它能把你的選擇變成一份可以重現(xiàn)的配置文件,而不是一堆需要手工拼接的散件。
好處聽起來挺美,可我剛上手就撞上了第一個問題。Crosstool-NG的一大優(yōu)點是能自動幫你把各個組件的合適版本都拉下來,但當你通過系統(tǒng)軟件源安裝它本身時,大概率拿到的是一個老舊得嚇人的版本。我就被這個版本坑了:用系統(tǒng)倉庫里那個Crosstool-NG打開配置界面,根本找不到我需要的東西。幾番折騰之后,我最終還是卸載了那個過時的版本,重新從更上游的渠道獲取最新的工具。而這還只是第一個問題,第二個坑已經(jīng)在前面等著我了。
特別聲明:以上內(nèi)容(如有圖片或視頻亦包括在內(nèi))為自媒體平臺“網(wǎng)易號”用戶上傳并發(fā)布,本平臺僅提供信息存儲服務。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.