从头写一个操作系统 10 (cross-compiler i386-elf-gcc)

lesson 11[1]

你需要google:cross-compiler

目标:配置可编译32位内核的开发环境

如果你用Mac,你应该立即着手做,如果使用别的系统可以再等几节课。不过,当用c语言开发时,你一定得有交叉编译环境。为什么?

我会稍微修改以下这个 指南.

Required packages

第一步,你需要安装需求的库。在linux上,用你的包管理软件。在Mac上, install brew,然后使用brew install下载下面的包。

  • gmp
  • mpfr
  • libmpc
  • gcc
    在ubuntu 18 上安装 gmp mpfr libmpc :
cd /usr/local/src
sudo curl -O ftp://gcc.gnu.org/pub/gcc/infrastructure/gmp-4.3.2.tar.bz2

tar xf gmp-4.3.2.tar.bz2
cd gmp-4.3.2 
./configure
make
make install

sudo curl -O ftp://gcc.gnu.org/pub/gcc/infrastructure/mpc-0.8.1.tar.gz
...
sudo curl -O ftp://gcc.gnu.org/pub/gcc/infrastructure/mpfr-2.4.2.tar.bz2
...

当然,我们需要gcc来建立交叉编译环境的目标环境gcc,特别是在替代gccclang的Mac上。

一旦安装好上面的包,找到你的gcc的路径,然后export 这个路径.例如:

export CC=/usr/local/bin/gcc-4.9
export LD=/usr/local/bin/gcc-4.9

我们需要编译binutils 与 cross-compiled gcc,而后我们将他们放在/usr/local/i386elfgcc,现在让我们export几个路径,当然你可以按照需求改变它们。

export PREFIX="/usr/local/i386elfgcc"
export TARGET=i386-elf
export PATH="$PREFIX/bin:$PATH"

binutils

记住,从网上粘贴命令时要小心,建议你一行一样的复制。

mkdir /tmp/src
cd /tmp/src
curl -O http://ftp.gnu.org/gnu/binutils/binutils-2.24.tar.gz # If the link 404's, look for a more recent version
tar xf binutils-2.24.tar.gz
mkdir binutils-build
cd binutils-build
../binutils-2.24/configure --target=$TARGET --enable-interwork --enable-multilib --disable-nls --disable-werror --prefix=$PREFIX 2>&1 | tee configure.log
make all install 2>&1 | tee make.log

gcc

cd /tmp/src
curl -O https://ftp.gnu.org/gnu/gcc/gcc-4.9.1/gcc-4.9.1.tar.bz2
tar xf gcc-4.9.1.tar.bz2
mkdir gcc-build
cd gcc-build
../gcc-4.9.1/configure --target=$TARGET --prefix="$PREFIX" --disable-nls --disable-libssp --enable-languages=c --without-headers
make all-gcc 
make all-target-libgcc 
make install-gcc 
make install-target-libgcc 

如果出现error:configure: error: no termcap library found
ubuntu 18:

apt-get install  libncurses5-dev 

fedora 28:

sudo curl -O https://ftp.gnu.org/gnu/texinfo/texinfo-6.6.tar.xz
./configure & make & make install

好了,你现在有了全套的GNU binutils 并且 交叉编译器在/usr/local/i386elfgcc/bin, 加上 i386-elf-前缀是为了避免与你系统现有的环境冲突。

你应该将这些命令添加到 $PATH中,在.bashrc 中export。以后当我们用到这些命令时都会添加这些前缀。

版权注明:本文所有涉及到:https://github.com/cfenollosa/os-tutorial/ 这个git仓库的内容,全部对应以下开源协议声明:
BSD 3-Clause License Copyright (c) 2018, Carlos Fenollosa


  1. https://github.com/cfenollosa/os-tutorial/tree/master/11-kernel-crosscompiler Copyright:BSD 3-Clause License Copyright (c) 2018, Carlos Fenollosa

H2
H3
H4
3 columns
2 columns
1 column
Join the conversation now