9

Rust + LLVM 调用 C/C++ 模块

 3 years ago
source link: https://www.phodal.com/blog/llvm-rust-call-c-bytecode/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

Rust + LLVM 调用 C/C++ 模块

Posted by: Phodal Huang Nov. 22, 2020, 3:52 p.m.

在上一篇文章『LLVM + Rust JIT hello, world』中,我们介绍了如何使用 Rust + LLVM 编写一个 hello, world。而随着我们继续在这个领域的探索,我还想到了一个非常有意思的问题:如何使用 LLVM 调用三方模块。

最后代码见:https://github.com/phodal/rust-llvm-practises/tree/main/stdlib

从最后的结果来看,要实现这样的功能也相当的简单。只是呢,作为一个 LLVM 新手,我要学习的东西还有蛮多的。

Clang + LLVM 字节码

我们所要做的事情其实还是相对比较简单的:通过 Clang 来编译,并输出 LLVM IR。

Clang 是一个 C、C++、Objective-C 和 Objective-C++ 编程语言的编译器前端。它的目标是提供一个 GNU 编译器套装的替代品,支持了 GNU 编译器大多数的编译设置以及非官方语言的扩展。

clang 的编译参数中,提供了一个 emit-llvm

CC=clang
CFLAGS=--target=$(TARGET) -emit-llvm -O3 -ffreestanding -fno-builtin -Wall -Wno-unused-function

%.bc: %.c
    $(CC) -c $(CFLAGS) $< -o $@

CHARJ=charj.bc

all: $(CHARJ) 
$(CHARJ): TARGET=x86_64-apple-darwin-macho # macos

对应的是一个 C 的 hello, world :

#include <stdio.h>

int main()
{
    printf("Hello, World!");
    return 0;
}

Rust LLVM 调用 LLVM IR

接下来,就是用 Inkwell + LLVM 的 API, 加载这个字节码了:

    let context = Context::create();
    let memory = MemoryBuffer::create_from_memory_range(CHARJ_LIB, "charj");
    let module = Module::parse_bitcode_from_buffer(&memory, &context).unwrap();

这里的 module 改为采用 parse_bitcode_from_buffer 的方式,而不是原来的创建方式。然后我们就可以获取到定义的 main 函数了,然后执行:

    if let Some(_fun) = module.get_function("main") {
        let ee = module
            .create_jit_execution_engine(OptimizationLevel::None)
            .unwrap();
        let maybe_fn = unsafe { ee.get_function::<unsafe extern "C" fn() -> f64>("main") };

        unsafe {
            maybe_fn.unwrap().call();
        }
    }

Github: @phodal     微博:@phodal     知乎:@phodal    

微信公众号(Phodal)
qrcode.jpg

围观我的Github Idea墙, 也许,你会遇到心仪的项目

QQ技术交流群: 321689806

新书《全栈应用开发:精益实践》

这不是一本深入前端、后台、运维、设计、分析等各个领域的书籍。本书以实践的方式,将这一系列的领域及理论知识结合到一起,来帮助读者构建全栈Web 开发的知识体系,并辅以精益及敏捷的思想,来一步步开发Web 应用:从创建一个UI 原型到编写出静态的前端页面;从静态的前端页面到带后台的应用,并部署应用;从Web 后台开发API 到开发移动Web 应用。在这个过程中,我们还将介绍一些相辅相成的步骤:使用构建系统来加速Web 应用的开发;为应用添加数据分析工具来改进产品;使用分析工具来改善应用的性能;通过自动化部署来加快上线流程;从而帮助读者开发出一个真正可用的全栈 Web 应用。同时,我们也将帮助读者把这些步骤应用到现有的系统上,改进现有系统的开发流程。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK