背景
在之后的學(xué)習(xí)中概而,需要在自己的mips架構(gòu)cpu上編寫一系列工具。不想使用mips匯編代碼編寫這些工具囱修,希望使用c語言編寫赎瑰,并編譯為mips機(jī)器語言。所以這次編譯沒有編譯c庫(不能使用自帶的頭文件)蔚袍,僅僅編譯了gcc編譯器乡范。
搭建環(huán)境
系統(tǒng):Ubuntu 16.04 LTS版本
前期準(zhǔn)備
在主目錄~下進(jìn)行編譯。
編譯好的文件放在(安裝在)~/gcc-mips文件夾下
1啤咽、從鏡像源上下載binutils
使用中科大鏡像源
sudo wget http://mirrors.ustc.edu.cn/gnu/binutils/binutils-2.29.tar.xz
(一開始以為2.9版本是最高的晋辆,因?yàn)樗帕性阽R像源文件列表的最后,后來發(fā)現(xiàn)是98年的......宇整,編譯時(shí)會出錯(cuò))
binutils包括as瓶佳, ld, objdump鳞青,objcopy等有用的工具霸饲,as是Assembler,ld是linker臂拓,由于我們想要將c語言編譯為mips機(jī)器碼厚脉,我們需要as和ld支持mips架構(gòu),而系統(tǒng)自帶的僅支持x86
2胶惰、從鏡像源上下載gcc源代碼
sudo wget http://mirrors.ustc.edu.cn/gnu/gcc/gcc-7.2.0/gcc-7.2.0.tar.xz
3傻工、從鏡像源上下載gmp,mpc孵滞,mpfr
編譯gcc時(shí)需要這些源代碼(否則編譯gcc時(shí)在configure會出錯(cuò))中捆,可以在編譯完binutils后做
sudo wget http://mirrors.ustc.edu.cn/gnu/gmp/gmp-6.1.2.tar.xz
sudo wget http://mirrors.ustc.edu.cn/gnu/mpc/mpc-1.0.3.tar.gz
sudo wget http://mirrors.ustc.edu.cn/gnu/mpfr/mpfr-3.1.6.tar.xz
4、解壓
tar -xvf gcc-7.2.0.tar.xz
tar -xvf binutils-2.29.tar.xz
tar -xvf gmp-6.1.2.tar.xz
tar -xvf mpc-1.0.3.tar.gz
tar -xvf mpfr-3.1.6.tar.xz
編譯binutils
1坊饶、進(jìn)入binutils文件夾泄伪,并進(jìn)行配置
cd binutils-2.29
./configure --target=mips --prefix=主目錄/mips-gcc (主目錄替換為具體的主目錄/home/xxx)
--target指定了目標(biāo)的架構(gòu),--prefix指定了make install安裝的地址匿级。最后可執(zhí)行程序會放在prefix/target/目錄下蟋滴,在這里是主目錄/mips-gcc/mips目錄下
如果configure階段顯示出錯(cuò)染厅,可能是缺少某些程序,可以嘗試根據(jù)錯(cuò)誤信息用apt-get獲取相應(yīng)的程序
2津函、編譯與安裝
make -jN (N替換為CPU核數(shù)*2)
make install
make所花時(shí)間大概在10分鐘以內(nèi)
完成后可以在/gcc-mips/mips中看到as糟秘,ar等程序
編譯gcc
1、準(zhǔn)備工作
我們先進(jìn)入解壓出來的gcc目錄
cd gcc-7.2.0
gcc編譯的過程中球散,會在gcc-7.2.0這個(gè)文件夾下尋找一系列程序的源代碼進(jìn)行編譯尿赚,比如我們之前下載的gmp,mpc蕉堰,mpfr等凌净。接下來我們把之前解壓出來的文件夾放到gcc-7.2.0目錄下
mv -v ../gmp-6.1.2 gmp
mv -v ../mpfr-3.1.6 mpfr
mv -v ../mpc-1.0.3 mpc
2、配置
./configure --target=mips --prefix=主目錄/mips-gcc
注意之前編譯binutils生成的as屋讶,ar等執(zhí)行文件需要放在prefix/target/bin目錄下冰寻,在這里為主目錄/mips-gcc/mips/bin目錄下
3、編譯
make的過程分為4部分
- Build host tools necessary to build the compiler.
- Build target tools for use by the compiler such as binutils (bfd, binutils, gas, gprof, ld, and opcodes) if they have been individually linked or moved into the top level GCC source tree before configuring.
- Build the compiler (single stage only).
- Build runtime libraries using the compiler from the previous step.
我們?nèi)绻恍枰狢語言庫文件的話只需要進(jìn)行前3步
第一步ubuntu系統(tǒng)已經(jīng)幫我們準(zhǔn)備好了編譯gcc需要的一系列程序
第二步在編譯binutils時(shí)已經(jīng)完成
我們僅需要編譯compiler
make all-gcc -jN (N為CPU核數(shù)*2)
make install-gcc
make所花時(shí)間很長大概要一個(gè)小時(shí)多
之后在主目錄/mips-gcc/bin下可以看見mips-gcc等工具
測試
測試用程序:
//a.c
void _start()
{
}
cd 主目錄/mips-gcc/bin
mips-gcc a.c -S a.s
//將C語言轉(zhuǎn)為at&t格式的匯編程序
mips-gcc a.c -o a.out
//將C語言轉(zhuǎn)為elf格式的可執(zhí)行文件
mips-objcopy -O binary -j.text a.out a.bin
//將可執(zhí)行文件中程序段提取出來以2進(jìn)制形式放入a.bin文件中
可以使用軟件查看a.s皿渗,a.bin中的內(nèi)容
遺留問題
繼續(xù)編譯c語言運(yùn)行庫時(shí)出現(xiàn)了問題斩芭,懷疑是沒有下載glibc。
參考資料:
https://gcc.gnu.org/install/
http://blog.csdn.net/poxiaozi6264/article/details/8041160