c - LLVM IR 以可移植的方式调用和链接 printf 或任何外部 C 函数

标签 c llvm llvm-clang llvm-ir

我通过 API 创建了一个非常简单的 LLVM IR 代码片段。在主 block 内,我想插入对 C 标准库中可用函数的调用,例如 mallocprintf 或我自己用 C 编写的其他一些函数。

; ModuleID = 'main.d2'
source_filename = "main.d2"
target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-apple-darwin17.7.0"

define i32 @main() {
  %1 = alloca i32
  store i32 0, i32* %1

在此处插入调用

  %2 = load i32, i32* %1
  ret i32 %2
}
<小时/>

我用

编译位码

llc -filetype=obj -o main.o main.bit

并将对象链接到

clang main.o -o main

命令。

问题

  • 我是否需要在最后一步中将 C stdlib 与编译器标志链接起来和/或我是否需要在 C 中准备一个包装器库,其中包含编译诸如 clib.o< 之类的内容所需的函数 用于外部链接?第二个命令是链接此类外部依赖项的正确方法吗?

  • 此外,如果我使用相同的方法,它在 Windows 上的表现如何(我现在使用的是 Mac 或 Ubuntu)?我的工作流程应该改变什么?

  • 我是否在这里遗漏了一些东西,导致整个问题变得无关紧要?

我的机器:

clang version 7.0.0 (tags/RELEASE_700/final)
Target: x86_64-apple-darwin18.0.0
Thread model: posix
InstalledDir: /opt/local/libexec/llvm-7.0/bin

最佳答案

Am I missing something here that makes the whole problem irrelevant?

是的,您正在使用clang进行链接。它知道如何以及何时链接 C 运行时和所有这些 crt 事物。您甚至可以直接将文本 IR 传递给 clang

关于c - LLVM IR 以可移植的方式调用和链接 printf 或任何外部 C 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53027746/

相关文章:

c++ - clang:没有外联虚方法定义(纯抽象 C++ 类)

c++ - *(char**) 如何理解这个构造?

c - 无法随机洗牌

c - errno 11 [EAGAIN] 来自 read(2)

c - 我不明白这个例子中位移位的行为

clang libtooling : determine macro expansion location

c++ - clang-format:如何将构造函数的初始化列表的每个元素保持在单独的行中

c++ - 在 Mac OS X 上使用 LLVM 安装和编译

llvm - 获取LLVM-IR中调试信息的名称(或编号)

c - Xcode 和 C11 stdatomic.h