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

80 篇文章 1 订阅

 

快乐虾

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 )

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵌云阁主

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值