分类: LINUX
2009-09-27 09:34:50
本次SI工具需要将Linux相关模块统一到windows下编译,经过调查,cygwin可以做到这一点,但需要将gcc、as等编译链接工具和glibc、libpthread等库文件在cygwin环境下交叉编译,使之可以在windows平台做到如下两点:
Ø
生成Linux平台上的可执行文件(即生成ELF格式的可执行文件,而不是windows平台的PE格式)。
Ø
在ia32平台上可以编译出ia32平台和ipf(ia64)平台相应的可执行文件。
背景知识:
Gcc项目本身编译时即支持不同目标平台,但是配置复制,一般生成有两条途径:
Ø
如果目标平台已经有现成的编译链接工具和库文件,可以直接拷贝过来使用,但是要求生成目标2进制格式兼容,即两者应该是同一操作系统。实例:
Ø
重新编译gcc、as等编译链接工具和glibc、libpthread等库文件使之支持目标平台,为了简化过程,使用工具crosstool()。
Crosstool支持很多平台,其中也包括cygwin,cygwin既可以做host平台和build平台也可以做target平台。
操作系统:Windows2003EE-JP-R2-SP2。
使用的cygwin版本为
使用的crosstool
版本为0.43,放在cygwin环境下的/opt目录下。
我们的Linux模块目前主要编译环境是RHEL3 Update8,其中的gcc版本为
使用demo-i686.sh可以启动相应的编译过程,但要做修改,修改处如下:
Ø
TARBALLS_DIR变更为/opt/downloads,为了简便起见,将下载的模块放在这个目录。
Ø
GCC_LANGUAGES变更为”C”,因为在编译STL库的时候发生的错误,目前还没有找到对应方法。所以把”C++”去掉,生成的编译器只能编译C语言源码,不支持C++。
Ø
eval `cat i686.dat
gcc-
其他文件不用修改,在cygwin下执行./demo-i686.sh就可以开始编译过程,整个完成大概需要6小时左右。
生成的交叉编译器会放在/opt/crosstool/gcc-
Ø
TARBALLS_DIR变更为/opt/downloads,为了简便起见,将下载的模块放在这个目录。
Ø GCC_LANGUAGES变更为”C”,因为在编译STL库的时候发生的错误,目前还没有找到对应方法。所以把”C++”去掉,生成的编译器只能编译C语言源码,不支持C++。
Ø
eval `cat ia64.dat
gcc-
ia64.dat的变更,把其中的TARTGET由ia64-unknown-linux-gnu变更为ia64-Linux。
具体解释:http://www.kegel.com/crosstool/current/doc/crosstool-howto.html#cygwin
编译过程中还有一处修改,在启动demo-ia64.sh之后,会逐个解压上面提到的下载模块,在解压完glibc-
其他文件不用修改,整个编译完成大概需要6小时左右。
生成的交叉编译器会放在/opt/crosstool/go/ia64-linux/bin目录下。
#!/bin/sh
/opt/crosstool/gcc-3.2.3-glibc-2.3.2/i686-unknown-linux-gnu/bin/i686-unknown-linux-gnu-gcc $*
生成之后就可以在命令行直接以gcc-linux-
然后修改我们Linux模块相应的makefile文件,将LD和CC两个变量变为相应的刚才生产的脚本名,就可以按正常手顺编译模块。