Page 35 - 《软件学报》2026年第6期
P. 35

2354                                                       软件学报  2026  年第  37  卷第  6  期


                 构建系统再次调用       RuyiBuild  提供的  clang  命令对文件进行链接操作: 对于目标文件, clang      正常调用   ld  命令, 将目
                 标文件链接成为真正的动态链接库; 对于              LLVM IR bitcode 文件, RuyiBuild  调用  llvm-link  命令, 将多个  LLVM
                 IR bitcode 文件合并成为同一个     LLVM IR bitcode 文件, 并记录  clang  生成真正的动态链接库文件时使用的命令与
                 使用的   LLVM  版本.

                                                      源码  (a.c, b.c)


                                                      RuyiBuild clang
                                           常规编译                   IR 编译  (--emit-llvm)

                                                                   a.o (实为bitcode)
                                            a.o, b.o
                                                                   b.o (实为bitcode)


                                                      RuyiBuild clang
                                                调用ld
                                                        调用 llvm-link
                                                                    libx.so.1_cmd
                                            libx.so.1
                                                                    libx.so.1
                                                                    (实为bitcode)


                                                      install/ln等命令



                                                                 $LLVMIR_BASE/
                                         $DEST/usr/lib64/        $DEST/
                                         libx.so.1               {/usr/lib64/libx.so.1
                              传统 RPM                                                 IR RPM
                                         $DEST/usr/lib64/          /usr/lib64/libx.so.1_cmd
                                         libx.so                   /usr/lib64/libx.so
                                                                  }
                                                图 2 RuyiBuild  透明化编译方法

                    随后, 如图   2  所示, 软件的构建系统调用       install 或  ln  等命令, 将生成文件安装到某个临时文件夹: 对于目标文
                 件, 这个文件夹由用户      (或  RPM SPEC  文件) 指定; 对于  LLVM IR bitcode 文件, 则被安装到  LLVM IR  输出文件夹
                 中相对应的路径. 在软件的构建系统将所需文件分别按照                   Linux  系统的规范安装到两个临时文件夹后, 可将这两
                 个文件夹打包压缩为两个         RPM  软件包, 其中   LLVM IR  软件包文件将被从/usr/lib64/下移动到/usr/lib64/llvmir/目录
                 下, 以避免文件冲突.
                  3.2   动态链接库  LLVM IR  合并与链接转换机制的实现原理
                    传统上, 程序或动态库等链接是在软件编译时在同一环境中进行的, 这样链接就可以获取和使用编译环境
                 的很多信息, 这些信息包括: 参与链接的文件             (如编译产生的目标文件, 链接器脚本等), 链接的选项               (如优化级别、
                 动态库版本信息等). 将这些信息带入后处理阶段, 将非常复杂. 与单个目标文件的编译不同, 动态链接库的构建通
                 常涉及多个目标文件的链接过程. 为了支持这种复杂的链接场景, RuyiBuild                   专门设计了一套基于        LLVM IR  文件
                 合并与转换的技术机制, 如图         2  所示. 具体地, 当包装脚本识别出编译选项中包含动态链接标志-shared                时, 会首先
                 调用原生   clang  命令, 生成传统的   ELF  格式动态链接库文件. 这一操作确保了原始构建系统的兼容性与有效性. 随
                 后, RuyiBuild  调用  LLVM  工具链中的  llvm-link  工具, 将所有涉及链接的独立     LLVM IR bitcode 文件合并为单一
                 的统一   LLVM IR  模块文件. 这种统一的模块化       IR  文件为后续跨平台适配与微架构优化提供了统一的基础表示.
   30   31   32   33   34   35   36   37   38   39   40