wget http://crosstool-ng.org/download/crosstool-ng/crosstool-ng-1.27.0.tar.bz2 tar -xf crosstool-ng-1.27.0.tar.bz2 crosstool-ng-1.27.0/ cd crosstool-ng-1.27.0
安装必要的依赖(或者,也可安装发行版提供的开发工具包组,例如Debian的build-essential,Arch Linux 的base-devel):
$ make /usr/bin/gmake all-recursive gmake[1]: Entering directory '/home/saite/build/crosstool-ng-1.27.0' Making all in kconfig gmake[2]: Entering directory '/home/saite/build/crosstool-ng-1.27.0/kconfig' LEX lexer.lex.c YACC parser.tab.c /usr/bin/gmake all-am gmake[3]: Entering directory '/home/saite/build/crosstool-ng-1.27.0/kconfig' CC conf.o CC confdata.o CC expr.o CC symbol.o CC preprocess.o CC util.o CC parser.tab.o CC lexer.lex.o CCLD conf CC nconf-nconf.o CC nconf-nconf.gui.o CC nconf-confdata.o CC nconf-expr.o CC nconf-symbol.o CC nconf-preprocess.o CC nconf-util.o CC nconf-parser.tab.o CC nconf-lexer.lex.o CCLD nconf CC mconf.o CC lxdialog/checklist.o CC lxdialog/inputbox.o CC lxdialog/menubox.o CC lxdialog/textbox.o CC lxdialog/util.o CC lxdialog/yesno.o CCLD mconf/home/saite/build/cross-mips/src gmake[3]: Leaving directory '/home/saite/build/crosstool-ng-1.27.0/kconfig' gmake[2]: Leaving directory '/home/saite/build/crosstool-ng-1.27.0/kconfig' gmake[2]: Entering directory '/home/saite/build/crosstool-ng-1.27.0' GEN ct-ng GEN bash-completion/ct-ng GEN docs/ct-ng.1 gmake[2]: Leaving directory '/home/saite/build/crosstool-ng-1.27.0' gmake[1]: Leaving directory '/home/saite/build/crosstool-ng-1.27.0'
$ ct-ng version This is crosstool-NG version 1.27.0
Copyright (C) 2008 Yann E. MORIN <yann.morin.1998@free.fr> This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
$ ct-ng list-samples Status Sample name ... [G...] mips64el-multilib-linux-uclibc [G...] mips64-unknown-linux-gnu [G...] mips-ar2315-linux-gnu [G...] mipsel-multilib-linux-gnu [G...] mipsel-sde-elf [G...] mipsel-unknown-linux-gnu [G...] mips-malta-linux-gnu [G...] mips-unknown-elf [G...] mips-unknown-linux-gnu [G...] mips-unknown-linux-uclibc ... L (Local) : sample was found in current directory G (Global) : sample was installed with crosstool-NG X (EXPERIMENTAL): sample may use EXPERIMENTAL features B (BROKEN) : sample is currently broken O (OBSOLETE) : sample needs to be upgraded
[INFO ] Finalizing the toolchain's directory [INFO ] Stripping all toolchain executables [EXTRA] Creating toolchain aliases [EXTRA] Removing installed documentation [EXTRA] Collect license information from: /home/saite/build/cross-mips/.build/mips-unknown-elf/src [EXTRA] Put the license information to: /home/saite/x-tools/mips-unknown-elf/share/licenses [INFO ] Finalizing the toolchain's directory: done in 1.16s (at 07:42) [INFO ] Build completed at 20250309.115259 [INFO ] (elapsed: 7:41.91) [INFO ] Finishing installation (may take a few seconds)...
$ mips-unknown-elf-gcc --version mips-unknown-elf-gcc (crosstool-NG 1.27.0) 14.2.0 Copyright (C) 2024 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
$ make ... writing regular file '../user/init.b' into disk writing regular file '../user/pingpong.b' into disk writing regular file '../user/num.b' into disk writing regular file '../user/sh.b' into disk writing regular file 'rootfs/motd' into disk writing regular file '../user/testbss.b' into disk writing regular file '../user/testpipe.b' into disk writing regular file 'rootfs/newmotd' into disk writing regular file '../user/testptelibrary.b' into disk writing regular file '../user/echo.b' into disk writing regular file '../user/halt.b' into disk writing regular file '../user/testarg.b' into disk writing regular file '../user/testpiperace.b' into disk writing regular file '../user/ls.b' into disk writing regular file '../user/cat.b' into disk writing regular file '../user/testfdsharing.b' into disk make[2]: Leaving directory '/home/saite/code/mos.public/lab-solution/fs' make[1]: Leaving directory '/home/saite/code/mos.public/lab-solution'
$ readelf -h target/mos ELF Header: Magic: 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00 Class: ELF32 Data: 2's complement, little endian Version: 1 (current) OS/ABI: UNIX - System V ABI Version: 0 Type: EXEC (Executable file) Machine: MIPSR3000 Version: 0x1 Entry point address: 0x800214e8 Start of program headers: 52 (bytes into file) Start of section headers: 1027368 (bytes into file) Flags: 0x50001001, noreorder, o32, mips32 Size of this header: 52 (bytes) Size of program headers: 32 (bytes) Number of program headers: 2 Size of section headers: 40 (bytes) Number of section headers: 23 Section header string table index: 22
使用make run,可在QEMU模拟器上运行内核,默认情况下,将得到输出:
init.c: mips_init() is called
1 2 3
$ make run qemu-system-mipsel -cpu 4Kc -m 64 -nographic -M malta -drive id=ide0,file=target/fs.img,if=ide,format=raw -drive id=ide1,file=target/empty.img,if=ide,format=raw -no-reboot -kernel target/mos init.c: mips_init() is called