Bha*_*waj 5 c llvm dynamic-linking llc rust
我是LLVM编译器和基础架构的新手.我有以下想法.Clang是C/C++的LLVM前端,类似Rustc for Rust编程语言.两者都可以发出LLVM IR代码,并且可以将发出的代码编译为可执行应用程序.
我的问题是可以链接不同的编程语言吗?示例如下 -
/* Code in C */
int add(int, int);
int main()
{
printf("%d", add(5 ,6));
}
Run Code Online (Sandbox Code Playgroud)
以Rust中定义的函数为例
// Code in Rust
fn main()
{
println!("{}", add(5, 6));
}
fn add (x: i32, y: i32) -> i32
{
x + y
}
Run Code Online (Sandbox Code Playgroud)
从两个源文件生成IR后,是否可以链接它们并创建单个应用程序?
我很想知道这是否有效,请告诉我.
简短回答:是的.
答案很长:是的,只要满足一些要求.
兼容性有两种:API(应用程序接口)和ABI(应用程序二进制接口).本质上,API指示您的程序是否编译,而ABI指示它是否链接,加载和运行.
由于Rust具有C FFI,因此Rust可以发出通常可以与C交互的代码(对于所考虑的平台,它具有适当的C ABI).这很明显,Rust二进制文件可以调用C库.
如果您使用该Rust二进制文件的LLVM IR,该C库的LLVM IR,将它们合并在一起,并使用LLVM生成新的二进制文件,那么您将获得单个二进制文件(无依赖关系).
因此,"唯一"的要求是您的两段代码必须能够首先独立地链接/加载/运行.
获得独立于LLVM的单个二进制文件的另一种方法是静态链接 ; 在Rust中,您可以使用静态链接与C标准库的musl实现.在LLVM IR上合并的主要优点是,您可以在合并的IR上运行LLVM优化传递,因此可以从跨语言内联(和其他优化)中受益.