我通过API创建了一个非常简单的LLVM IR代码段。在主块内部,我想插入对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
答案 0 :(得分:2)
我在这里错过了一些与整个问题无关的东西吗?
是的,您正在使用clang
进行链接。它知道如何以及何时链接C运行时以及所有这些crt
事物。您甚至可以直接将文本IR传递到clang
。