【问题标题】:Using printf in LLVM IR在 LLVM IR 中使用 printf
【发布时间】:2021-05-16 12:46:31
【问题描述】:

所以,我一直在使用 Rust 为简单的 lisp 编写编译器,并使用 Inkwell crate 生成 LLVM IR。在尝试找到一种将值打印到标准输出的方法时,我遇到了许多使用 print 函数的答案,就像在 C/C++ 中一样。它似乎在大多数情况下都可以正常工作。

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

【问题讨论】:

    标签: llvm llvm-ir lli


    【解决方案1】:

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

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

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

    【讨论】:

    • 好的,我想我明白了。我猜标准 io 是否需要为跨平台语言的每个平台定义不同的?
    • @AyushSingh 如果您想放弃对 libc 的依赖,那么是的,您必须为每个平台定义自己的 IO 原语版本。不过,这不一定是可取的。许多语言实现依赖于 libc 的 IO 和其他核心功能。我知道 Go 从使用系统调用切换到在 macos 上链接 libc(我相信它总是在 Windows 上使用 libc),因为操作系统更新不断以破坏 Go 实现的方式更改系统调用,所以 libc 基本上是核心操作系统的唯一稳定接口功能(虽然在 Linux 系统调用上是稳定的)。
    猜你喜欢
    • 1970-01-01
    • 2014-10-11
    • 1970-01-01
    • 2014-07-15
    • 2013-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多