0

因此,我一直在使用 Rust 为简单的 lisp 编写编译器,并使用Inkwell crate 生成 LLVM IR。在尝试找到一种将值打印到标准输出的方法时,我遇到了许多使用打印函数的答案,就像在 C/C++ 中一样。在大多数情况下,它似乎没有任何问题。

然而,只有函数声明出现在生成的 IR 中,所以这可能意味着定义被 llvm 本身链接到某个地方(目前使用 lli 解释器,因为它更容易测试)。无论如何,我只是想了解这个函数的定义位置。就像在 llvm 中定义的核心模块一样吗?还是使用依赖于类 Unix 平台的 printf 而不是 llvm 的东西,因为大多数 llvm 函数似乎都有“llvm”前缀?

4

1 回答 1

2

printf在 C 标准库 (libc) 中定义。

因此,当您将 llvm IR 编译为目标文件然后链接它们时,您必须链接到 libc 才能使用printf(请注意,使用 C 编译器(例如 gcc)链接 LLVM 生成的目标文件是很常见的或clang,它将自动链接到一个libc)。

使用 时lli,我相信您可以访问任何lli本身链接并包含 libc 的库。

于 2021-05-16T13:50:49.493 回答