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 文件为后续跨平台适配与微架构优化提供了统一的基础表示.

