我通过 API 创建了一个非常简单的 LLVM IR 代码片段。在主 block 内,我想插入对 C 标准库中可用函数的调用,例如 malloc
、printf
或我自己用 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/