DSP

打造windows下的嵌入式开发工具(5):gcc-4.3.1

2019-07-13 14:47发布

  快乐虾 http://blog.csdn.net/lights_joy/ lights@hb165.com      本文适用于 ADI Blackfin系列DSP 优视科技BV561EVB开发板 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    欢迎转载,但请保留作者信息     在准备好gmpmpfr之后,就可以开始构建gcc编译器了。gcc编译器的构建可以分为hosttarget两部分,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.cstrcasecmp等等。 编译时未发现有不兼容的代码。

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-gcccc1.exe的生成》。 在编译这个目标时,需要修改auto-host.h这个文件中的定义。

1.7    cc1plus.exe

这是个C++语言的编译器,它将C++代码转换为bfin的汇编代码。但是它本身不会调用as进行汇编工作。其makefile分析参见《bfin-xxx-gcccc1plus.exe的生成》。 在编译这个目标时,需要修改auto-host.h这个文件中的定义。

1.8    f951.exe

这是个fortran语言的编译器,它将fortran代码转换为bfin的汇编代码。但是它本身不会调用as进行汇编工作。其makefile分析参见《bfin-xxx-gccfortran目标的生成》。 在编译这个目标时,需要修改auto-host.h这个文件中的定义。

1.9    gcov.exe

gcov程序可以用来测试代码的覆盖度,其生成比较简单。仅需要gcov.cerrors.cversion.c即可,没什么可说的。也不需要做什么修改。

1.10       collect2.exe

这个程序的生成也比较简单,但是需要修改auto-host.h。其生成过程参见《bfin-xxx-gcccollect2目标的生成》。

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.exeas.exe等文件,但是在原来的代码中只使用了cc1as这样的名称,而没有使用完整的文件名,这样导致在后面使用CreateProcess创建进程时失败。将模板中的cc1as这样的名称改为cc1.exeas.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-gcccc1.exe的生成(2008-8-22) bfin-xxx-gcccc1plus.exe的生成2008-08-23 bfin-xxx-gccfortran目标的生成(2008-8-24) bfin-xxx-gccjava目标的生成(2008-8-24) bfin-xxx-gccobjc目标的生成(2008-8-26) bfin-xxx-gcccollect2目标的生成(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)