快乐虾
http://blog.csdn.net/lights_joy/
lights@hb165.com
本文适用于
ADI Blackfin系列DSP
gcc- 4.3.1
binutils-2.18
codeblocks-8.02
Skyeye- 1.2.5
bfin-uclinux-2008r1-rc8
Cygwin gcc 3.4.4
Visual studio 2005
Visual DSP++ 5.0
欢迎转载,但请保留作者信息
在准备好gmp和mpfr之后,就可以开始构建gcc编译器了。gcc编译器的构建可以分为host和target两部分,host部分是可以在宿主机下运行的交叉编译器,target部分则是可以在目标板上运行的库。Target部分的生成需要用到host部分生成的交叉编译器。在此我们只生成host部分的编译器。
1.1 libiberty.lib
在cygwin下编译时要求生成的目标为libiberty.a,这是一个静态库,在vs2005下相应的改为libiberty.lib静态库,它的作用是提供一些c library中未提供的辅助函数。其Makefile分析参见《host-i686-pc-cygwin/libiberty/Makefile解析》这篇文章。
在vs2005下编译时,需要根据需要修改动态生成的config.h文件,根据vs2005提供的库函数进行适当修改(其实就是将一些#define语句改为#undef或者直接注释掉就行了)。然后加入一些vs2005下未提供但libiberty目录下提供了的函数代码。比如ffs.c,strcasecmp等等。
编译时未发现有不兼容的代码。
1.2 libz.lib
这是一个静态库,它的作用是提供压缩算法。其Makefile分析参见《host-i686-pc-cygwin/zlib/Makefile分析》这篇文章。
这个库的生成不需要修改任何代码。编译时未发现有不兼容的代码。
1.3 libcpp.lib
这也是一个静态库,其Makefile分析参见《host-i686-pc-cygwin/libcpp/Makefile分析》这篇文章。
在编译这个库时,需要根据需要修改config.h。同时还要使用到一个头文件dirent.h,这个文件在vs2005下没有,但是有移植过的版本。参见《vs2005下的dirent.h》这篇文章。
1.4 libdecnumber.lib
这是一个静态库,其Makefile分析参见《host-i686-pc-cygwin/libdecnumber/Makefile分析》这篇文章。
在编译这个库时,需要根据需要修改config.h,主要是将一些define语句改为undef。然后要在config.h中加上几个定义:
typedef int int32_t;
typedef unsigned int uint32_t;
typedef unsigned char uint8_t;
typedef unsigned short uint16_t;
typedef unsigned __int64 uint64_t;
1.5 backend.lib
gcc编译器的设计将具体语言的语法语义等分析做为前端,它们将生成相同的中间表示,然后共用一个相同的后端,将这些中间表示转换为CPU相关的汇编文件。Backend.lib中就封装了后端处理所需要的文件。
在编译这个库时,需要修改auto-host.h这个文件中的定义。
1.6 cc1.exe
这是个C语言的编译器,它将C代码转换为bfin的汇编。但是它本身不会调用as进行汇编工作。其makefile分析参见《bfin-xxx-gcc中cc1.exe的生成》。
在编译这个目标时,需要修改auto-host.h这个文件中的定义。
1.7 cc1plus.exe
这是个C++语言的编译器,它将C++代码转换为bfin的汇编代码。但是它本身不会调用as进行汇编工作。其makefile分析参见《bfin-xxx-gcc中cc1plus.exe的生成》。
在编译这个目标时,需要修改auto-host.h这个文件中的定义。
1.8 f951.exe
这是个fortran语言的编译器,它将fortran代码转换为bfin的汇编代码。但是它本身不会调用as进行汇编工作。其makefile分析参见《bfin-xxx-gcc中fortran目标的生成》。
在编译这个目标时,需要修改auto-host.h这个文件中的定义。
1.9 gcov.exe
gcov程序可以用来测试代码的覆盖度,其生成比较简单。仅需要gcov.c,errors.c和version.c即可,没什么可说的。也不需要做什么修改。
1.10 collect2.exe
这个程序的生成也比较简单,但是需要修改auto-host.h。其生成过程参见《bfin-xxx-gcc中collect2目标的生成》。
1.11 xgcc.exe
这个程序可以提供编译,汇编,链接的一条龙服务,但是在vs2005下编译时会有一个问题。
在gcc.c中定义了一些模板:
static const struct compiler default_compilers[] =
{
/* Add lists of suffixes of known languages here. If those languages
were not present when we built the driver, we will hit these copies
and be given a more meaningful error than "file not used since
linking is not done". */
{".m", "#Objective-C", 0, 0, 0}, {".mi", "#Objective-C", 0, 0, 0},
{".mm", "#Objective-C++", 0, 0, 0}, {".M", "#Objective-C++", 0, 0, 0},
{".mii", "#Objective-C++", 0, 0, 0},
{".cc", "#C++", 0, 0, 0}, {".cxx", "#C++", 0, 0, 0},
{".cpp", "#C++", 0, 0, 0}, {".cp", "#C++", 0, 0, 0},
{".c++", "#C++", 0, 0, 0}, {".C", "#C++", 0, 0, 0},
{".CPP", "#C++", 0, 0, 0}, {".ii", "#C++", 0, 0, 0},
{".ads", "# Ada ", 0, 0, 0}, {".adb", "# Ada ", 0, 0, 0},
{".f", "#Fortran", 0, 0, 0}, {".for", "#Fortran", 0, 0, 0},
{".fpp", "#Fortran", 0, 0, 0}, {".F", "#Fortran", 0, 0, 0},
{".FOR", "#Fortran", 0, 0, 0}, {".FPP", "#Fortran", 0, 0, 0},
{".f90", "#Fortran", 0, 0, 0}, {".f95", "#Fortran", 0, 0, 0},
{".F90", "#Fortran", 0, 0, 0}, {".F95", "#Fortran", 0, 0, 0},
{".r", "#Ratfor", 0, 0, 0},
{".p", "#Pascal", 0, 0, 0}, {".pas", "#Pascal", 0, 0, 0},
{".java", "#Java", 0, 0, 0}, {".class", "#Java", 0, 0, 0},
{".zip", "#Java", 0, 0, 0}, {".jar", "#Java", 0, 0, 0},
/* Next come the entries for C. */
{".c", "@c", 0, 1, 1},
{"@c",
/* cc1.exe has an integrated ISO C preprocessor. We should invoke the
external preprocessor if -save-temps is given. */
"%{E|M|MM:%(trad_capable_cpp) %(cpp_options) %(cpp_debug_options)}/
%{!E:%{!M:%{!MM:/
%{traditional|ftraditional:/
%eGNU C no longer supports -traditional without -E}/
%{!combine:/
%{save-temps|traditional-cpp|no-integrated-cpp:%(trad_capable_cpp) /
%(cpp_options) -o %{save-temps:%b.i} %{!save-temps:%g.i} /n/
cc1.exe -fpreprocessed %{save-temps:%b.i} %{!save-temps:%g.i} /
%(cc1_options)}/
%{!save-temps:%{!traditional-cpp:%{!no-integrated-cpp:/
cc1.exe %(cpp_unique_options) %(cc1_options)}}}/
%{!fsyntax-only:%(invoke_as)}} /
%{combine:/
%{save-temps|traditional-cpp|no-integrated-cpp:%(trad_capable_cpp) /
%(cpp_options) -o %{save-temps:%b.i} %{!save-temps:%g.i}}/
%{!save-temps:%{!traditional-cpp:%{!no-integrated-cpp:/
cc1.exe %(cpp_unique_options) %(cc1_options)}}/
%{!fsyntax-only:%(invoke_as)}}}}}}", 0, 1, 1},
{"-",
"%{!E:%e-E or -x required when input is from standard input}/
%(trad_capable_cpp) %(cpp_options) %(cpp_debug_options)", 0, 0, 0},
{".h", "@c-header", 0, 0, 0},
{"@c-header",
/* cc1.exe has an integrated ISO C preprocessor. We should invoke the
external preprocessor if -save-temps is given. */
"%{E|M|MM:%(trad_capable_cpp) %(cpp_options) %(cpp_debug_options)}/
%{!E:%{!M:%{!MM:/
%{save-temps|traditional-cpp|no-integrated-cpp:%(trad_capable_cpp) /
%(cpp_options) -o %{save-temps:%b.i} %{!save-temps:%g.i} /n/
cc1.exe -fpreprocessed %{save-temps:%b.i} %{!save-temps:%g.i} /
%(cc1_options)/
-o %g.s %{!o*:--output-pch=%i.gch}/
%W{o*:--output-pch=%*}%V}/
%{!save-temps:%{!traditional-cpp:%{!no-integrated-cpp:/
cc1.exe %(cpp_unique_options) %(cc1_options)/
-o %g.s %{!o*:--output-pch=%i.gch}/
%W{o*:--output-pch=%*}%V}}}}}}", 0, 0, 0},
{".i", "@cpp-output", 0, 1, 0},
{"@cpp-output",
"%{!M:%{!MM:%{!E:cc1.exe -fpreprocessed %i %(cc1_options) %{!fsyntax-only:%(invoke_as)}}}}", 0, 1, 0},
{".s", "@assembler", 0, 1, 0},
{"@assembler",
"%{!M:%{!MM:%{!E:%{!S:as.exe %(asm_debug) %(asm_options) %i %A }}}}", 0, 1, 0},
{".sx", "@assembler-with-cpp", 0, 1, 0},
{".S", "@assembler-with-cpp", 0, 1, 0},
{"@assembler-with-cpp",
#ifdef AS_NEEDS_DASH_FOR_PIPED_INPUT
"%(trad_capable_cpp) -lang-asm %(cpp_options) -fno-directives-only/
%{E|M|MM:%(cpp_debug_options)}/
%{!M:%{!MM:%{!E:%{!S:-o %|.s |/n/
as.exe %(asm_debug) %(asm_options) %|.s %A }}}}"
#else
"%(trad_capable_cpp) -lang-asm %(cpp_options) -fno-directives-only/
%{E|M|MM:%(cpp_debug_options)}/
%{!M:%{!MM:%{!E:%{!S:-o %|.s |/n/
as.exe %(asm_debug) %(asm_options) %m.s %A }}}}"
#endif
, 0, 1, 0},
#include "specs.h"
/* Mark end of table. */
{0, 0, 0, 0, 0}
};
当xgcc检测到不同的参数时,它将套用这些模板调用cc1.exe,as.exe等文件,但是在原来的代码中只使用了cc1,as这样的名称,而没有使用完整的文件名,这样导致在后面使用CreateProcess创建进程时失败。将模板中的cc1,as这样的名称改为cc1.exe,as.exe可以解决这个问题。
参考资料
host-i686-pc-cygwin/libiberty/Makefile解析( 2008-8-19 )
host-i686-pc-cygwin/fixincludes/Makefile分析( 2008-8-19 )
host-i686-pc-cygwin/zlib/Makefile分析( 2008-8-19 )
host-i686-pc-cygwin/libcpp/Makefile分析( 2008-8-19 )
host-i686-pc-cygwin/libdecnumber/Makefile分析( 2008-8-19 )
bfin-xxx-gcc中cc1.exe的生成( 2008-8-22 )
bfin-xxx-gcc中cc1plus.exe的生成( 2008-08-23 )
bfin-xxx-gcc中fortran目标的生成( 2008-8-24 )
bfin-xxx-gcc中java目标的生成( 2008-8-24 )
bfin-xxx-gcc中objc目标的生成( 2008-8-26 )
bfin-xxx-gcc中collect2目标的生成( 2008-8-26 )
打造windows下的嵌入式开发工具(1):目标( 2008-9-3 )
打造windows下的嵌入式开发工具(2):binutils-2.18( 2008-9-3 )
打造windows下的嵌入式开发工具(3):gmp-4.2.3( 2008-9-3 )
打造windows下的嵌入式开发工具(4):mpfr-2.3.1( 2008-9-4 )