"); //-->
在恰逢GCC6.0发布的日子里,刚好前两天在折腾GCC Build自己的GCC
GCC的Source Code 是从ARM分支获取的,具体HOST的环境配置,ARM给的手册说毕竟清楚,我主要是使用该ource Code Build 自己的MIPS GCC
当前MIPS这块主要参考的是mips-sde-elf文档
中间修改的主要内容就不做多的叙述,主要说一下t-sde(src/gcc/gcc/config/mips-tsde)文件里面的内容:
MULTILIB_OPTIONS
对于一些目标机,使用不同方式调用GCC所产生的目标对象不能被一起连接。
例如,对于一些目标机,GCC可产生大端(EB)和小端(EL)代码。对于这些目标机,必须安排编译多个版本的libgcc.a,对应于每个不相兼容的选项集。
当GCC调用连接器时,它会根据使用的命令行选项来安排连接正确版本的libgcc.a。
MULTILIB_OPTIONS宏列出了必须构建特定版本libgcc.a的选项集。将互不兼容的选项并排写出,并由斜线分隔。将可以一起使用的选项由空格分开。构建程序将会构建所有兼容选项的组合。
例如,如果将MULTILIB_OPTIONS设置为‘ EL/EB msoft-float’,
Makefile将会使用下列选项集来构建特定版本的libgcc.a:-mel, -meb, -msoft-float, ‘-mel -msoft-float’, 和‘-meb -msoft-float’。
也就是说大小端都有软浮点
针对MIPS MULTILIB_OPTIONS = EL/EB mips32/mips32r2/mips64/mips64r2 msoft-float/mfp64
看得比较清晰分的是 大小端 、指令集、浮点
MULTILIB_DIRNAMES
如果使用了MULTILIB_OPTIONS,该变量指定了用于存放不同库的目录名。MULTILIB_OPTIONS中的每个元素,对应于MULTILIB_DIRNAMES中的每个元素。
如果没有使用MULTILIB_DIRNAMES,缺省值将为MULTILIB_OPTIONS,并使用斜线来替代空格。
例如,如果MULTILIB_OPTIONS设置为‘EL/EB msoft-float’,则MULTILIB_DIRNAMES的缺省值为‘el eb msoft-float’。如果需要不同的目录名时,可以指定不同的值。
实际上目录的个数是遵顼{-mips2,-mips3} x {-EB,-EL} x {-mhard-float,-msoft-float}
抛开有些不可以组合不说 MULTILIB_DIRNAMES中的目录,左边目录都必须包含右边的目录,也就是右边的都是左边的子集MULTILIB_OPTIONS 实际已经可以决定有多少目录了
针对MIPS MULTILIB_DIRNAMES = el eb mips32 mips32r2 mips64 mips64r2 sof f64
MULTILIB_MATCHES
有时,相同的选项可以被写成两种不同的方式。如果一个选项在MULTILIB_OPTIONS式列出,GCC需要知道它的任何同义形式。
这种情况下,将MULTILIB_MATCHES设置为‘option=option’形式的列表来描述所有相关的同义词。例如,‘EL=mel EB=meb fPIC=fpic’。
MULTILIB_EXCEPTIONS
有时,当MULTILIB_OPTIONS中指定了多个选项集时,会有些组合不能被构建,刚才前面也提到过。这种情况下,将MULTILIB_EXCEPTIONS设置为所有不被构建的例外。
比如MIPS处理器,只有mips32r2支持mfp64,这样就可以写 MULTILIB_EXCLUSIONS = !mips32r2/mfp64
还有,我在Build时候Add的abi & pic模块,我需要这样两个用的时候是一起用的,所以我的组合有:
MULTILIB_EXCEPTIONS = EL/fPIC*
MULTILIB_EXCEPTIONS += fPIC*
这就是大小端都不出现PIC,因为我们说PIC仅仅出现在ABI模块里,当然'*'通配符就不说
当前GCC也是博大精深,对我来说也就是仅仅知道其中的一部分,上面说的也是比较核心的内容
当前要Build自己合适GCC,中间还有好多步骤要注意,不仅仅就那么简单而已,中间包括,Build 脚本的修改,Link一些自己的内容等,还有好多都需要注意的
*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。