Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1810717
  • 博文数量: 241
  • 博客积分: 9862
  • 博客等级: 中将
  • 技术积分: 5206
  • 用 户 组: 普通用户
  • 注册时间: 2005-02-18 23:23
文章分类
文章存档

2011年(14)

2010年(61)

2009年(48)

2008年(118)

我的朋友

分类: LINUX

2009-09-27 09:34:50

组内要将编译发版统一用一个工具来进行,我的模块也要统一,所以研究了一下cygwin和crosstool。

1概述

本次SI工具需要将Linux相关模块统一到windows下编译,经过调查,cygwin可以做到这一点,但需要将gccas等编译链接工具和glibclibpthread等库文件在cygwin环境下交叉编译,使之可以在windows平台做到如下两点:

Ø         生成Linux平台上的可执行文件(即生成ELF格式的可执行文件,而不是windows平台的PE格式)。

Ø         ia32平台上可以编译出ia32平台和ipf(ia64)平台相应的可执行文件。

背景知识:

 

2、交叉编译器生成

Gcc项目本身编译时即支持不同目标平台,但是配置复制,一般生成有两条途径:

Ø         如果目标平台已经有现成的编译链接工具和库文件,可以直接拷贝过来使用,但是要求生成目标2进制格式兼容,即两者应该是同一操作系统。实例:

Ø         重新编译gccas等编译链接工具和glibclibpthread等库文件使之支持目标平台,为了简化过程,使用工具crosstool()

Crosstool支持很多平台,其中也包括cygwincygwin既可以做host平台和build平台也可以做target平台。

 

操作系统:Windows2003EE-JP-R2-SP2

使用的cygwin版本为1.5.24-1。(使用宗武下载的版本,此处的1.5.24-1指的是cygwin1.dll的版本)。

使用的crosstool 版本为0.43,放在cygwin环境下的/opt目录下。

我们的Linux模块目前主要编译环境是RHEL3 Update8,其中的gcc版本为3.2.3-56glibc版本为2.3.2crosstool有很多预先编译成功留下来的简化操作脚本,其中包括gcc-3.2.3-glibc-2.3.2这一系列,可以继续使用,需要下载的模块有:binutils-2.15.tar.gzgcc-3.2.3.tar.gzglibc-2.3.2.tar.gzglibc-linuxthreads-2.3.2.tar.gzlinux-2.4.26.tar.bz2

 

2.1 IA32平台

使用demo-i686.sh可以启动相应的编译过程,但要做修改,修改处如下:

Ø         TARBALLS_DIR变更为/opt/downloads,为了简便起见,将下载的模块放在这个目录。

Ø         GCC_LANGUAGES变更为”C”,因为在编译STL库的时候发生的错误,目前还没有找到对应方法。所以把”C++去掉,生成的编译器只能编译C语言源码,不支持C++

Ø         eval `cat i686.dat gcc-4.1.0-glibc-2.3.6-tls.dat` sh all.sh –notest变更为eval `cat i686.dat gcc-3.2.3-glibc-2.3.2.dat` sh all.sh –notest

其他文件不用修改,在cygwin下执行./demo-i686.sh就可以开始编译过程,整个完成大概需要6小时左右。

生成的交叉编译器会放在/opt/crosstool/gcc-3.2.3-glibc-2.3.2/i686-unknown-linux-gnu/bin目录下。

2.2 IA64IPF)平台

使用demo-ia64.sh可以启动相应的编译过程,也要做修改,修改处如下

Ø         TARBALLS_DIR变更为/opt/downloads,为了简便起见,将下载的模块放在这个目录。

Ø         GCC_LANGUAGES变更为”C”,因为在编译STL库的时候发生的错误,目前还没有找到对应方法。所以把”C++去掉,生成的编译器只能编译C语言源码,不支持C++

Ø         eval `cat ia64.dat gcc-3.4.5-glibc-2.3.6-tls.dat` sh all.sh --notest变更为eval `cat ia64.dat gcc-3.2.3-glibc-2.3.2.dat` sh all.sh –notest

ia64.dat的变更,把其中的TARTGETia64-unknown-linux-gnu变更为ia64-Linux

all.sh的变更,把其中的TOOLCOMBO$GCC_DIR-$GLIBC_DIR变更为go。原因:如果不缩短,最后生成物件时候由于路径名过长会产生错误,

具体解释:http://www.kegel.com/crosstool/current/doc/crosstool-howto.html#cygwin

 

编译过程中还有一处修改,在启动demo-ia64.sh之后,会逐个解压上面提到的下载模块,在解压完glibc-2.3.2之后,需要马上修改glibc-2.3.2/iconvdata/Makefile,将其中的gb18030相关内容全部删除,必须在编译此模块之前完成。否则会出现错误,错误原因还没有找到,但是因为iconvdatagcc国际化相关模块,而且gb18030是中文相关编码,目前我们的模块用不到,可以去掉。


其他文件不用修改,整个编译完成大概需要6小时左右。

 

生成的交叉编译器会放在/opt/crosstool/go/ia64-linux/bin目录下。

 

交叉编译器使用

首先在cygwin安装目录的bin目录下作一个脚本,以生成的i686-unknown-linux-gnu-gcc.exe为例,脚本名命名为gcc-linux-3.2.3。里面的内容如下:

#!/bin/sh
/opt/crosstool/gcc-3.2.3-glibc-2.3.2/i686-unknown-linux-gnu/bin/i686-unknown-linux-gnu-gcc $*

生成之后就可以在命令行直接以gcc-linux-3.2.3运行此交叉编译器。

 

然后修改我们Linux模块相应的makefile文件,将LDCC两个变量变为相应的刚才生产的脚本名,就可以按正常手顺编译模块。

 

windows下使用make编译模块之前要先设置环境变量,使用命令path %PATH%;c:\cygwin\bin(参看http://www.cppblog.com/wangjs720/archive/2008/09/13/61768.aspx)。之后就可以在windows命令行下边执行cygwin的命令,包括刚才编译出来的gcc。
如果原来编译时用的头文件和库文件cygwin下面没有的话,可以直接把Linux下面的相应文件拷贝过来放置到相应目录就可使用。


阅读(6054) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~