建立QQ2440的交叉工具链(cygwin环境)

来源:互联网 发布:javascript !== 编辑:程序博客网 时间:2024/05/01 16:36

本文使用crosstool工具来生成cygwin环境下的工具链,这是最方便的方法,linux环境下的工具
链生成方法也是类似的。

因为光盘里提供了gcc-3.4.1和glibc-2.3.2的工具链(linux环境),为了保持兼容性,
这里使用相同版本的gcc/glibc,当然你也可以建立其他gcc/glibc版本的工具链。

 

1、安装软件
(1) cygwin-1.5.24
(2) crosstool-0.43.tar.gz

下载地址:
http://cygwin.com/
http://kegel.com/crosstool/

你可以在线安装cygwin,也可以下载到本地,然后从本地安装,
如何下载和安装请参考网上文章《Cygwin完全下载指南》。

成功安装cygwin后安装crosstool:
tar zxvf crosstool-0.43.tar.gz -C /cygdrive/s/DevBoard/work


2、下载软件
(1) binutils-2.15.tar.bz2
(2) gcc-3.4.1.tar.bz2
(3) glibc-2.3.2.tar.bz2
(4) glibc-linuxthreads-2.3.2.tar.bz2
(5) gdb-6.7.1.tar.bz2
(6) linux-2.6.8.tar.bz2

下载地址:
http://ftp.gnu.org/
http://www.kernel.org/

注意,你需要下载修改后的gcc-3.4.1-glibc-2.3.2.dat中对应工具的tar.bz2文件。
当然你也可以不手动下载这些软件,因为可以在编译工具链的时候自动下载。这里我
添加了一项gdb。


3、修改crosstool配置
假设某个软件编译出现错误,你需要在patches对应目录中添加相应的patch

(1) 修改工具链对应版本的gcc-glibc数据文件gcc-3.4.1-glibc-2.3.2.dat
GDB_DIR=gdb-6.7.1 ==>增加gdb目录gdb-6.7.1

(2) 创建arm920t.dat文件(以arm.dat为模板)
内容如下:
KERNELCONFIG=`pwd`/arm.config
TARGET=arm-linux
TARGET_CFLAGS="-O"

(3) 创建demo-arm920t.sh文件(以demo-arm.sh为模板)
内容如下:
#//////////////////////////////////////////////////////////////////////////////////
#!/bin/sh
# This script has one line for each known working toolchain
# for this architecture.  Uncomment the one you want.
# Generated by generate-demo.pl from buildlogs/all.dats.txt

set -ex
CROSSTOOL_DIR=`pwd`
TARBALLS_DIR=$CROSSTOOL_DIR/downloads
RESULT_TOP=$CROSSTOOL_DIR/gcc-arm920t
export TARBALLS_DIR RESULT_TOP
GCC_LANGUAGES="c,c++"
export GCC_LANGUAGES

# Really, you should do the mkdir before running this,
# and chown /opt/crosstool to yourself so you don't need to run as root.
mkdir -p $RESULT_TOP

#eval `cat arm920t.dat gcc-2.95.3-glibc-2.1.3.dat` sh all.sh --notest
#eval `cat arm920t.dat gcc-2.95.3-glibc-2.2.2.dat` sh all.sh --notest
#eval `cat arm920t.dat gcc-2.95.3-glibc-2.2.5.dat` sh all.sh --notest
#eval `cat arm920t.dat gcc-3.2.3-glibc-2.2.5.dat` sh all.sh --notest
#eval `cat arm920t.dat gcc-3.2.3-glibc-2.3.2.dat` sh all.sh --notest
#eval `cat arm920t.dat gcc-3.2.3-glibc-2.3.2-tls.dat` sh all.sh --notest
#eval `cat arm920t.dat gcc-3.3.6-glibc-2.2.2.dat` sh all.sh --notest
#eval `cat arm920t.dat gcc-3.3.6-glibc-2.2.5.dat` sh all.sh --notest
#eval `cat arm920t.dat gcc-3.3.6-glibc-2.3.2.dat` sh all.sh --notest
#eval `cat arm920t.dat gcc-3.3.6-glibc-2.3.2-tls.dat` sh all.sh --notest
eval `cat arm920t.dat gcc-3.4.1-glibc-2.3.2.dat` sh all.sh --notest --gdb
#eval `cat arm920t.dat gcc-3.4.5-glibc-2.2.2.dat` sh all.sh --notest
#eval `cat arm920t.dat gcc-3.4.5-glibc-2.2.5.dat` sh all.sh --notest
#eval `cat arm920t.dat gcc-3.4.5-glibc-2.3.2.dat` sh all.sh --notest
#eval `cat arm920t.dat gcc-3.4.5-glibc-2.3.2-tls.dat` sh all.sh --notest
#eval `cat arm920t.dat gcc-3.4.5-glibc-2.3.5.dat` sh all.sh --notest
#eval `cat arm920t.dat gcc-3.4.5-glibc-2.3.5-tls.dat` sh all.sh --notest
#eval `cat arm920t.dat gcc-3.4.5-glibc-2.3.6.dat` sh all.sh --notest
#eval `cat arm920t.dat gcc-3.4.5-glibc-2.3.6-tls.dat` sh all.sh --notest
#eval `cat arm920t.dat gcc-4.0.2-glibc-2.2.2.dat` sh all.sh --notest
#eval `cat arm920t.dat gcc-4.0.2-glibc-2.3.2.dat` sh all.sh --notest
#eval `cat arm920t.dat gcc-4.0.2-glibc-2.3.2-tls.dat` sh all.sh --notest
#eval `cat arm920t.dat gcc-4.0.2-glibc-2.3.5.dat` sh all.sh --notest
#eval `cat arm920t.dat gcc-4.0.2-glibc-2.3.5-tls.dat` sh all.sh --notest
#eval `cat arm920t.dat gcc-4.0.2-glibc-2.3.6.dat` sh all.sh --notest
#eval `cat arm920t.dat gcc-4.0.2-glibc-2.3.6-tls.dat` sh all.sh --notest
#eval `cat arm920t.dat gcc-4.1.0-glibc-2.2.2.dat` sh all.sh --notest
#eval `cat arm920t.dat gcc-4.1.0-glibc-2.3.2.dat` sh all.sh --notest
#eval `cat arm920t.dat gcc-4.1.0-glibc-2.3.2-tls.dat` sh all.sh --notest

echo Done.
#//////////////////////////////////////////////////////////////////////////////////
参数“--gdb”用于生成arm-linux-gdb。


4、复制下载的binutils、gcc、glibc、glibc-linuxthreads、gdb、kernel文件到$(TARBALLS_DIR)目录

5、编译crosstool
进入crosstool-0.43目录,执行./demo-arm920t.sh,大约2小时后结束编译
(配置是AMD Sempron/64bit/Socket754 2500+ @ 2.70GHz,如果配置是INTEL Celeron-D 330 @ 2.66GHz则大约需要5小时)


6、测试toolchain
(1) 建立开发环境
创建文件setenv.sh,内容如下:
PATH_QQ2440_WORK=/cygdrive/s/DevBoard/work
export PATH_QQ2440_CROSSTOOL=${PATH_QQ2440_WORK}/qq2440-crosstool-0.43${CROSSTOOL_VER}/gcc-arm920t/gcc-3.4.1-glibc-2.3.2/arm-linux/bin
export PATH=${PATH_QQ2440_CROSSTOOL}:${PATH}

执行source setenv.sh
完成后执行echo $PATH查看环境是否已经设置好

(2) 创建文件hello.c,内容如下:
#//////////////////////////////////////////////////////////////////////////////////
#include <stdio.h>
#include <limits.h>
static long x = LONG_MIN;
int main() {
  float myValueA=1.9;
  float myValueB=2.8;
  printf("Hello!  LONG_MIN is %ld, PATH_MAX is %d/n", x, PATH_MAX);

  printf("TestValue:%f/n",myValueA+myValueB);
  return 0;
}

#//////////////////////////////////////////////////////////////////////////////////
(3) 编译arm-linux-gcc -g hello.c -o hello
其中-g选项是为了添加调试信息,后面gdb单步调试需要使用该选项
(4) 测试hello程序
将hello复制到目标板(我是通过U盘复制的,FTP可以连接但是传送文件会丢失数据,折腾了好久,才发现传到目标板上的文件大小都不对了,难怪每次都segment fault),执行
  ./hello
显示执行结果:
Hello! LONG_MIN is -2147483648, PATH_MAX is 4096
TestValue:4.700000


7、使用gdb单步调试
假设目标板IP地址为:169.254.132.5,PC机IP地址为:169.254.132.6
(1) 将hello/gdbserver/libthread_db-1.0.so文件复制到目标板中(位于
gcc-arm920t/gcc-3.4.1-glibc-2.3.2/arm-linux/bin和
gcc-arm920t/gcc-3.4.1-glibc-2.3.2/arm-linux/arm-linux/lib)
在目标板中建立libthread_db.so链接:
ln -sf libthread_db-1.0.so libthread_db.so
(2) 启动gdbserver服务
则在目标板执行命令./gdbserver 169.254.132.6:2345 hello
其中169.254.132.5是目标板IP地址,2345是自己指定的端口号
(3) 使用arm-linux-gdb调试
在cygwin下执行以下命令:
  a)arm-linux-gdb hello
    进入gdb调试环境
  b)l
    显示源码
1       #include <stdio.h>
2          #include <limits.h>
3          static long x = LONG_MIN;
4          int main() {
5            float myValueA=1.9;
6            float myValueB=2.8;
7            printf("Hello!  LONG_MIN is %ld, PATH_MAX is %d/n", x, PATH_MAX);
8            printf("TestValue:%f/n",myValueA+myValueB);
9            return 0;
10        }
  c)b 9
    在第9行设置断点
  d)info break
    查看断点设置情况
  e)target remote 169.254.132.5:2345
显示如下信息
Remote debugging using 169.254.132.5:2345
warning: Unable to find dynamic linker breakpoint function.
GDB will be unable to debug shared library initializers
and track explicitly loaded dynamic code.
0x410016b0 in ?? ()
  f)c
    执行程序,并在设置的断点停下,注意这里不能用r命令
  g)p myValueA
    显示$1 = 1.89999998
  h)quit
    退出gdb调试环境,此时目标板上gdbserver自动退出


8、编译内核
(1) 创建文件linux-2.6.13-cygwin-hostloadlibes.patch,内容如下:
#//////////////////////////////////////////////////////////////////////////////////
diff -urN linux-2.6.13-orig/scripts/kconfig/Makefile linux-2.6.13/scripts/kconfig/Makefile
--- linux-2.6.13-orig/scripts/kconfig/Makefile 2005-08-29 07:41:01.000000000 +0800
+++ linux-2.6.13/scripts/kconfig/Makefile 2008-02-27 01:56:52.125000000 +0800
@@ -115,6 +115,12 @@
 HOSTCFLAGS_gconf.o = `pkg-config gtk+-2.0 gmodule-2.0 libglade-2.0 --cflags` /
                           -D LKC_DIRECT_LINK
 
+HOST_OS := $(shell uname -o)
+ifeq ($(HOST_OS),Cygwin)
+ HOSTLOADLIBES_conf += -lintl
+ HOSTLOADLIBES_mconf += -lintl
+endif
+
 $(obj)/conf.o $(obj)/mconf.o $(obj)/qconf.o $(obj)/gconf.o $(obj)/kxgettext: $(obj)/zconf.tab.h
 
 $(obj)/zconf.tab.h: $(src)/zconf.tab.h_shipped

#//////////////////////////////////////////////////////////////////////////////////
放到patches目录下,执行以下命令:
patch -p1 < patches/linux-2.6.13-cygwin-hostloadlibes.patch

(2) 清理工程,否则光盘上提供的内核代码编译会有问题
make distclean

(3) 生成配置文件
cp -f config_cs8900_n35 .config

(4) 编译配置
make oldconfig

(5) 编译zImage
make zImage

(6) 编译模块
make modules

大约7分钟后完成编译(配置是AMD Sempron/64bit/Socket754 2500+ @ 2.70GHz)

 

原创粉丝点击