我通过API创建了一个非常简单的LLVM IR代码段。在主块内,我想要插入对C标准库中可用的函数的调用,比如malloc
, printf
,或者我自己编写的其他一些函数。
; 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