GCC编译器
由通用计算机编译集(gcc )和GNU开发的一组编程语言编译器。 在GNU编译器集合GPL和LGPL许可证上发布的自由软件是GNU计划的重要部分,也是自由Unix和苹果Mac OS X操作系统的标准编译器。 GCC的真名是GNU C语言编译器,本来只能使用c语言。 GCC很快得到了扩展,可以处理c了。 此后,它还支持Fortran、Pascal、Objective-C、Java、Ada和其他语言。 GCC4.4默认情况下开始支持2F体系结构,GCC4.6默认情况下开始支持3A体系结构。
调谐目标为SPEC CPU2000、coremark、Linux内核等,主要手段是调整编译器后端的目标指令集,综合使用窥视孔、指令分割、寄存器分配约束、指令调度等优化进行过程主要优化方法包括:
默认情况下,安装在Fedora/CentOS系统上的gcc在O32上使用mips1指令集,在N64上使用mips3指令集,使用性能更好的mips64选项编译上述两个系统,通过测试,并通过在N32、N64 ABI下,对于函数程序悍然存在的64位访问指令对,在其地址满足16字节对齐的约束下,进行窥视孔优化,使用处理器核提供的128位访问指令完成相同的功能在程序中出现的64位数组指针的计算中,采用特殊的指令分割,通过使用处理器核提供的64位3操作数乘法,消除hi/lo相关的操作和移位拼接; 修改gcc的寄存器分配覆盖集描述,从覆盖集中去除hi/lo寄存器,避免程序寄存器压力过大时,由于分配hi/lo作为通用寄存器的临时寄存器而导致流水线停止- March 尽快发射长延时操作,如load/mult/div/mod等,减少管线数据关联造成的停顿; 修改gcc编译器在loongson3a/b o32 abi中不使用浮点奇数号寄存器;
gcc常见问题解答:
1、如何查看gcc编译器的版本?
gcc -v
2、如何指定编译的程序为32位或64位?
编译选项-可以用-mabi=xx指定。
gcc -mabi=32 #32位程序(fedora13默认为32位,centos6.4、fedora21需要多库版本。 )
gcc -mabi=64 #64位程序(fedora13是32位系统,无法编译64位程序。 centos6.4、fedora21默认为64位。 )
gcc -mabi=n32 #n32程序(fedora13是32位系统,无法编译n32程序。 必须在centos6.4、fedora21上安装多库版本。 )
3、如何查看二进制程序是32位还是64位?
在linux上可以在命令文件中看到。
$file a.out
elf 32位LSB可执行、MIPS、MIPS版本1 (sysv )、#32位程序
$file a.out
elf 64位LSB可执行、MIPS、MIPS版本1 (sysv )、#64位程序
$file a.out
elf 32位LSB executable,MIPS,n 32m IPS 64版本1 (sysv ),#n32程序
4、什么是多库版本? 如何确定系统是否是多库版本?
多库版本是一个glibc库版本,在64位操作系统中有32位和n32。
$ rpm-QA
glibc-32-xxx #32表示32位库,xxx是版本号。
glibc-n32-xxx #n32表示n32库,xxx是版本号。 调试错误
如何准确、快速地提交有关GCC的错误以尽快解决。
在提交一个错误之前,首先检查代码本身的正确性,然后在编译选项gcc -Wall -Wextra中查看输出错误消息,以确保代码的正确性。
要提交错误,需要以下信息:
步骤
1、GCC版本(通过gcc -v命令查看) :
gcc -v
2、系统类型,版本:
cat /etc/issue
cat /proc/cpuinfo
3、出现错误时的编译选项:
gcc you_options
如果一个项目包含多个源文件,则提交编译的输出日志。 (涉及保密和知识产权时会导致错误的一个命令行将输出视为机密提供。 )
4、编译预处理文件(添加编译选项-v -save-temps,将生成的输出信息重定向到一个文件,将生成的*.i文件和输出信息重定向到文件) :
gcc-v-save-temps your _ options your _ filename.c21|tee compile _ output.txt
源文件无法编译再现的问题是编译时标记-v -save-temps时的输出信息和生成的*.i文件。
维护的3个主要版本的gcc分别为gcc-4.4 (套操作系统为centos 6.4、fedora 13 )、gcc-4.9 )套操作系统为loo
ngnix1.0)和gcc-7(在loongnix1.0中通过devtoolset集成)。不同版本之间的优化性能差别,不同版本之间比较时,用-O2选项或同级别的优化选项。
工具链
优化版本gcc编译器64位是指编译生成的二进制文件是mips 64位的,32位同理gs464核linux交叉编译器(gcc-7.3.1)工具链支持情况
表格中画対号的是支持的库类型
如果不添加编译参数,则默认编译的目标文件为"mips32r2 mabi=32 glibc"
如果想要编译其它类型目标文件需要添加参数.
例如,如果需要编译mips64r2 n64的目标文件:
添加参数"-mips64r2 -mabi=64".
工具链信息
其中,single float是只存在当精度浮点指令.如果代码中出现了双精度浮点运算,则使用软浮点实现.
• 工具链中工具/库版本信息
• 其中指令集和架构支持同mips-201901-loongson-linux
7. gs464核sde elf交叉编译器(gcc-8.3.0)说明
• 工具链支持情况
此工具链为裸板工具链,支持 “mips32r2 o32” 、 “mips32 o32” 与 “mips16 o32”
其中,single float是只存在当精度浮点指令.如果代码中出现了双精度浮点运算,则使用软浮点实现.
• 工具链中工具/库版本信息
其中指令集和架构支持同mips-201901-loongson-linux
8. gs464核linux交叉编译器(gcc-8.3.0)说明
工具链支持情况
ABI: o32 n32 n64
库: glibc
浮点类型: hard float
如果不添加编译参数,则默认编译的目标文件为"mips32r2 mabi=32 glibc"
如果想要编译其它类型目标文件需要添加参数.
例如,如果需要编译mips64r2 n64的目标文件:
添加参数"-mips64r2 -mabi=64".
其它类推
另外,从rc1.1开始支持gdb和gdbserver
mips-loongson-gcc8-linux-gnu-2021-02-08/mips-linux-gnu/libc/usr/lib64/聪慧的手机/gdbservermips-loongson-gcc8-linux-gnu-2021-02-08/mips-linux-gnu/libc/usr/lib/聪慧的手机/gdbservermips-loongson-gcc8-linux-gnu-2021-02-08/mips-linux-gnu/libc/usr/lib32/聪慧的手机/gdbserver根据自己目标系统的ABI选择使用哪个gdbserver
注意事项:
所有的gs464核交叉编译器均运行在x86_64位系统上,32位x86系统暂不支持,
ls232核交叉编译器运行在x86 32位系统上,在64位系统上运行请安装32位库。
运行交叉编译的操作系统为RHEL/centos-6系列,ubuntu-13/14/15等,某些linux发行版无法运行,自行切换操作系统。
修改内容:
在o32 ABI下不使用奇数号浮点寄存器。
在ll与sc之间的跳转指令的目标地址前加sync指令。
参考链接:
http://www.loongnix.org/index.php/Cross-compile