跳转至

huawei/bisheng⚓︎

仓库地址⚓︎

https://repo.oepkgs.net/bisheng/

仓库定位⚓︎

鲲鹏开发套件-毕昇编译器仓库

概述⚓︎

毕昇编译器是华为编译器实验室针对鲲鹏等通用处理器架构场景,打造的一款高性能、高可信及易扩展的编译器工具链,增强和引入了多种编译优化技术,支持C/C++/Fortran等编程语言。

除LLVM通用功能和优化外,毕昇编译器的工具链对中端及后端的关键技术点进行了深度优化,并集成Auto-tuner特性支持编译器自动调优。

部分通用信息请参考LLVM的用户指导 https://llvm.org/docs/UserGuides.html,毕昇编译器新增的自定义选项参考自定义优化选项章节。

LLVM是一种涵盖多种编程语言和目标处理器的编译器,毕昇编译器聚焦于对C、C++、Fortran语言的支持,利用LLVM的Clang作为C和C++的编译和驱动程序,Flang作为Fortran语言的编译和驱动程序。

  • C,C++程序

    • Clang不仅仅是可以将C, C++程序编译为LLVM中间表示的IR,它也是一个驱动程序,会调用所有以代码生成为目标的LLVM优化遍,直到生成最终的二进制文件。毕昇编译器提供了端到端编译程序所需的所有工具和库。
  • Fortran程序

    • Flang是专为LLVM集成而设计的Fortran前端,由两个组件flang1和flang2组成。它也是一个驱动程序,将源代码转换为LLVM IR,前端驱动程序将IR传输下去进行优化和目标代码生成。

安装使用⚓︎

环境依赖⚓︎

  • 内存:8GB以上
  • 操作系统:openEuler21.03、openEuler 20.03 (LTS)、CentOS 7.6、Ubuntu 18.04、Ubuntu 20、麒麟V10、UOS 20
  • 架构:AArch64
  • GCC 版本:4.8.5以上
  • glibc 版本:2.17以上
  • libatomic 版本:1.2及以上
  • libstdc++ 版本:6及以上

安装毕昇编译器⚓︎

Info

以下操作均使用root用户执行。

毕昇编译器已经融入openEuler源,在openEuler操作系统中,可以使用yum源方式安装毕昇编译器;在非openEuler操作系统中,可以通过软件包方式安装毕昇编译器。

  • 在/etc/yum.repos.d/目录下增加配置文件bisheng-compiler.repo,运行如下命令:
cat > /etc/yum.repos.d/bisheng-compiler.repo << EOF
[bisheng-compiler]
name=bisheng-compiler
baseurl=https://repo.oepkgs.net/bisheng/aarch64/
enabled=1
gpgcheck=0
priority=100
EOF
  • 从yum源仓库下载和安装毕昇编译器rpm包
yum update
yum install bisheng-compiler
  • (可选)清空当前窗口的hash缓存表,如果系统中有其他版本的 LLVM 编译器,请在安装毕昇编译器之后立即运行如下命令
hash -r
  • 验证安装是否成功
clang -v

使用毕昇编译器⚓︎

  • 编译运行C/C++程序
clang  [command line flags]  hello.c  -o  hello.o 
./hello.o
clang++  [command line flags]  hello.cpp  -o  hello.o 
./hello.o
  • 编译运行Fortran程序
flang  [command line flags]  hello.f90  -o  hello.o 
./hello.o
  • 指定链接器,毕昇编译器指定的链接器是 LLVM 的 lld,若不指定它则使用默认的 ld。
clang  [command line flags]  -fuse-ld=lld  hello.c  -o  hello.o 
./hello.o

安全加固⚓︎

  • 目的

    • 缓冲区溢出攻击是利用缓冲区溢出漏洞所进行的攻击行动。缓冲区溢出是一种非常普遍、非常危险的漏洞,在各种操作系统、应用软件中广泛存在。利用缓冲区溢出攻击,可以导致程序运行失败、系统关机、重新启动等后果。
    • 在当前网络与分布式系统安全中,被广泛利用的50%以上都是缓冲区溢出,而缓冲区溢出中,最为危险的是堆栈溢出,因为入侵者可以利用堆栈溢出,在函数返回时改变返回程序的地址,让其跳转到任意地址,带来的危害一种是程序崩溃导致拒绝服务,另外一种就是跳转并且执行一段恶意代码,例如跳转到shell执行恶意代码。
  • 方案

    -提供栈保护编译选项进行加固软件的安全性,防范堆栈溢出攻击。关于栈保护选项可以使用命令 clang --help | grep stack-protector 查看。