📄 如何为嵌入式开发建立交叉编译环境.htm
字号:
<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD><IMG height=1 alt=""
src="如何为嵌入式开发建立交叉编译环境.files/blue_rule.gif"
width="100%"><BR><IMG height=6 alt=""
src="如何为嵌入式开发建立交叉编译环境.files/c.gif" width=8
border=0></TD></TR></TBODY></TABLE>
<TABLE class=no-print cellSpacing=0 cellPadding=0 align=right>
<TBODY>
<TR align=right>
<TD><IMG height=4 alt="" src="如何为嵌入式开发建立交叉编译环境.files/c.gif"
width="100%"><BR>
<TABLE cellSpacing=0 cellPadding=0 border=0>
<TBODY>
<TR>
<TD vAlign=center><IMG height=16 alt=""
src="如何为嵌入式开发建立交叉编译环境.files/u_bold.gif" width=16
border=0><BR></TD>
<TD vAlign=top align=right><A class=fbox
href="http://www.ibm.com/developerworks/cn/linux/l-embcmpl/#main"><B>回页首</B></A></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE><BR><BR>
<P><A name=N10088><SPAN class=atitle>2. 建立工作目录</SPAN></A></P>
<P>首先,我们建立几个用来工作的目录:</P>
<P>在你的用户目录,我用的是用户liang,因此用户目录为
/home/liang,先建立一个项目目录embedded。</P><BR>
<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD class=code-outline><PRE class=displaycode>$pwd
/home/liang
$mkdir embedded
</PRE></TD></TR></TBODY></TABLE><BR>
<P>再在这个项目目录 embedded 下建立三个目录 build-tools、kernel 和 tools。</P>
<P>build-tools-用来存放你下载的 binutils、gcc 和 glibc 的源代码和用来编译这些源代码的目录。</P>
<P>kernel-用来存放你的内核源代码和内核补丁。</P>
<P>tools-用来存放编译好的交叉编译工具和库文件。</P><BR>
<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD class=code-outline><PRE class=displaycode>$cd embedded
$mkdir build-tools kernel tools
</PRE></TD></TR></TBODY></TABLE><BR>
<P>执行完后目录结构如下:</P><BR>
<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD class=code-outline><PRE class=displaycode>$ls embedded
build-tools kernel tools
</PRE></TD></TR></TBODY></TABLE><BR>
<P>3. 输出和环境变量</P>
<P>我们输出如下的环境变量方便我们编译。</P><BR>
<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD class=code-outline><PRE class=displaycode>$export PRJROOT=/home/liang/embedded
$export TARGET=arm-linux
$export PREFIX=$PRJROOT/tools
$export TARGET_PREFIX=$PREFIX/$TARGET
$export PATH=$PREFIX/bin:$PATH
</PRE></TD></TR></TBODY></TABLE><BR>
<P>如果你不惯用环境变量的,你可以直接用绝对或相对路径。我如果不用环境变量,一般都用绝对路径,相对路径有时会失败。环境变量也可以定义在.bashrc文件中,这样当你logout或换了控制台时,就不用老是export这些变量了。</P>
<P>体系结构和你的TAEGET变量的对应如下表</P><BR><IMG height=332 alt=""
src="如何为嵌入式开发建立交叉编译环境.files/table1.gif" width=580 border=0> <BR>
<P>你可以在通过glibc下的config.sub脚本来知道,你的TARGET变量是否被支持,例如:</P><BR>
<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD class=code-outline><PRE class=displaycode>$./config.sub arm-linux
arm-unknown-linux-gnu
</PRE></TD></TR></TBODY></TABLE><BR>
<P>在我的环境中,config.sub 在 glibc-2.2.3/scripts 目录下。</P>
<P>网上还有一些 HOWTO 可以参考,ARM 体系结构的《The GNU Toolchain for ARM Target
HOWTO》,PowerPC 体系结构的《Linux for PowerPC Embedded Systems
HOWTO》等。对TARGET的选取可能有帮助。</P>
<P>4. 建立编译目录</P>
<P>为了把源码和编译时生成的文件分开,一般的编译工作不在的源码目录中,要另建一个目录来专门用于编译。用以下的命令来建立编译你下载的binutils、gcc和glibc的源代码的目录。</P><BR>
<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD class=code-outline><PRE class=displaycode>$cd $PRJROOT/build-tools
$mkdir build-binutils build-boot-gcc build-gcc build-glibc gcc-patch
</PRE></TD></TR></TBODY></TABLE><BR>
<P>build-binutils-编译binutils的目录<BR>build-boot-gcc-编译gcc
启动部分的目录<BR>build-glibc-编译glibc的目录<BR>build-gcc-编译gcc
全部的目录<BR>gcc-patch-放gcc的补丁的目录</P>
<P>gcc-2.95.3 的补丁有 gcc-2.95.3-2.patch、gcc-2.95.3-no-fixinc.patch
和gcc-2.95.3-returntype-fix.patch,可以从 <A
href="http://www.linuxfromscratch.org/">http://www.linuxfromscratch.org/</A>
下载到这些补丁。</P>
<P>再将你下载的 binutils-2.10.1、gcc-2.95.3、glibc-2.2.3 和
glibc-linuxthreads-2.2.3 的源代码放入 build-tools 目录中</P>
<P>看一下你的 build-tools 目录,有以下内容:</P><BR>
<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD class=code-outline><PRE class=displaycode>$ls
binutils-2.10.1.tar.bz2 build-gcc gcc-patch
build-binutls build-glibc glibc-2.2.3.tar.gz
build-boot-gcc gcc-2.95.3.tar.gz glibc-linuxthreads-2.2.3.tar.gz
</PRE></TD></TR></TBODY></TABLE><BR><BR>
<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD><IMG height=1 alt=""
src="如何为嵌入式开发建立交叉编译环境.files/blue_rule.gif"
width="100%"><BR><IMG height=6 alt=""
src="如何为嵌入式开发建立交叉编译环境.files/c.gif" width=8
border=0></TD></TR></TBODY></TABLE>
<TABLE class=no-print cellSpacing=0 cellPadding=0 align=right>
<TBODY>
<TR align=right>
<TD><IMG height=4 alt="" src="如何为嵌入式开发建立交叉编译环境.files/c.gif"
width="100%"><BR>
<TABLE cellSpacing=0 cellPadding=0 border=0>
<TBODY>
<TR>
<TD vAlign=center><IMG height=16 alt=""
src="如何为嵌入式开发建立交叉编译环境.files/u_bold.gif" width=16
border=0><BR></TD>
<TD vAlign=top align=right><A class=fbox
href="http://www.ibm.com/developerworks/cn/linux/l-embcmpl/#main"><B>回页首</B></A></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE><BR><BR>
<P><A name=N10126><SPAN class=atitle>建立内核头文件</SPAN></A></P>
<P>把你从 <A href="http://www.kernel.org/">http://www.kernel.org/</A>
下载的内核源代码放入 $PRJROOT /kernel 目录</P>
<P>进入你的 kernel 目录:</P><BR>
<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD class=code-outline><PRE class=displaycode>$cd $PRJROOT /kernel
</PRE></TD></TR></TBODY></TABLE><BR>
<P>解开内核源代码</P><BR>
<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD class=code-outline><PRE class=displaycode>$tar -xzvf linux-2.4.21.tar.gz
</PRE></TD></TR></TBODY></TABLE><BR>
<P>或</P><BR>
<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD class=code-outline><PRE class=displaycode>$tar -xjvf linux-2.4.21.tar.bz2
</PRE></TD></TR></TBODY></TABLE><BR>
<P>小于 2.4.19 的内核版本解开会生成一个 linux 目录,没带版本号,就将其改名。</P><BR>
<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD class=code-outline><PRE class=displaycode>$mv linux linux-2.4.x
</PRE></TD></TR></TBODY></TABLE><BR>
<P>给 Linux 内核打上你的补丁</P><BR>
<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD class=code-outline><PRE class=displaycode>$cd linux-2.4.21
$patch -p1 < ../patch-2.4.21-rmk2
</PRE></TD></TR></TBODY></TABLE><BR>
<P>编译内核生成头文件</P>
<P>$make ARCH=arm CROSS_COMPILE=arm-linux- menuconfig</P>
<P>你也可以用 config 和 xconfig 来代替
menuconfig,但这样用可能会没有设置某些配置文件选项和没有生成下面编译所需的头文件。推荐大家用 make
menuconfig,这也是内核开发人员用的最多的配置方法。配置完退出并保存,检查一下的内核目录中的
include/linux/version.h 和 include/linux/autoconf.h 文件是不是生成了,这是编译
glibc 是要用到的,version.h 和 autoconf.h 文件的存在,也说明了你生成了正确的头文件。</P>
<P>还要建立几个正确的链接</P><BR>
<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD class=code-outline><PRE class=displaycode>$cd include
$ln -s asm-arm asm
$cd asm
$ln -s arch-epxa arch
$ln -s proc-armv proc
</PRE></TD></TR></TBODY></TABLE><BR>
<P>接下来为你的交叉编译环境建立你的内核头文件的链接</P><BR>
<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD class=code-outline><PRE class=displaycode>$mkdir -p $TARGET_PREFIX/include
$ln -s $PRJROOT/kernel/linux-2.4.21/include/linux $TARGET_PREFIX/include/linux
$in -s $PRJROOT/kernel/linux-2.4.21/include/asm-arm $TARGET_PREFIX/include/asm
</PRE></TD></TR></TBODY></TABLE><BR>
<P>也可以把 Linux 内核头文件拷贝过来用</P><BR>
<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD class=code-outline><PRE class=displaycode>$mkdir -p $TARGET_PREFIX/include
$cp -r $PRJROOT/kernel/linux-2.4.21/include/linux $TARGET_PREFIX/include
$cp -r $PRJROOT/kernel/linux-2.4.21/include/asm-arm $TARGET_PREFIX/include
</PRE></TD></TR></TBODY></TABLE><BR><BR>
<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD><IMG height=1 alt=""
src="如何为嵌入式开发建立交叉编译环境.files/blue_rule.gif"
width="100%"><BR><IMG height=6 alt=""
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -