Linux工具鏈通常來源于GNU project或Clang/LLVM project尸折。其中LLVM使用BSD license订咸,而GNU使用GPL license。
一個(gè)標(biāo)準(zhǔn)的GNU工具鏈包括三個(gè)部分:
- Binutils:二進(jìn)制工具包括assembler和linker歼捏。
- GCC:編譯器处嫌。
- C庫(kù)(run-time libraries):基于POSIX的標(biāo)準(zhǔn)化API。
GNU工具鏈的前綴通常由四部分組成:
- CPU架構(gòu):CPU架構(gòu)和大小端偎球,如MIPS小端是mipsel洒扎,ARM大端是armeb。
- 供應(yīng)商:buildroot衰絮,poky袍冷,none,unknown等猫牡。
- 內(nèi)核:linux(對(duì)于我們來說胡诗,這項(xiàng)一定是linux)。
-
操作系統(tǒng):用戶態(tài)組件的名字淌友,如gnu或musl煌恢。還有ABI(Application Binary Interface)和浮點(diǎn)支持。所以常見有g(shù)nueabi震庭,gnueabihf瑰抵,musleabi,musleabihf等器联。
C庫(kù)的種類:
- glibc:標(biāo)準(zhǔn)的GNU C庫(kù)二汛。非常大,但它是最完整的POSIX API實(shí)現(xiàn)拨拓。
- musl libc:輕小肴颊,對(duì)于RAM和存儲(chǔ)有限的系統(tǒng)來說是一個(gè)非常好的選擇。
- uClibc-ng:微控制器的C庫(kù)千元,早期用于uClinux苫昌。
- eglibc:glibc的一個(gè)分支,適用于嵌入式應(yīng)用幸海。
使用crosstool-NG(https://github.com/crosstool-ng/crosstool-ng)可以編譯出交叉編譯工具鏈
- 安裝crosstool-NG
git clone https://github.com/crosstool-ng/crosstool-ng/crosstool-ng.git
cd crosstool-ng
git checkout crosstool-ng-1.24.0
./bootstrap
./configure --enable-local
make
make install
- 查看工具鏈信息
./ct-ng show-arm-unknown-linux-gnueabi
- 編譯工具鏈
./ct-ng arm-unknown-linux-gnueabi
./ct-ng build
C庫(kù)的組成
- libc:最常用的POSIX函數(shù)祟身,如printf,open物独,close袜硫,read,write等挡篓。
- libm:數(shù)學(xué)函數(shù)婉陷,如cos帚称,exp,log秽澳。
- libpthread:所有的POSIX線程函數(shù)闯睹,它們會(huì)以pthread_開頭。
- librt:POSIX的real-time擴(kuò)展担神,包括shared memory和asynchronous I/O楼吃。
C庫(kù)的使用
除了libc,其它都需要在使用時(shí)用-l指明妄讯,如使用libm
arm-unknown-linux-gnueabi-gcc myapp.c -o myapp -lm
使用readelf可以驗(yàn)證myapp使用了libm
arm-unknown-linux-gnueabi-readelf -a myapp
在平常的程序編譯過程中孩锡,除了Linux工具鏈,我們還需要一份Linux內(nèi)核頭文件亥贸,因?yàn)槠渲邪囊恍┒x和常量是訪問內(nèi)核時(shí)所必須的躬窜。我們需要它來編譯C庫(kù),也需要它來編譯一些和設(shè)備打交道的程序和庫(kù)炕置。