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

时间:2018-10-28 01:47:42

标签: c llvm llvm-clang llvm-ir

我通过API创建了一个非常简单的LLVM IR代码段。在主块内部,我想插入对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

1 个答案:

答案 0 :(得分:2)

  

我在这里错过了一些与整个问题无关的东西吗?

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