以便在多平台上调用和链接printf或任何外部C函数的LLVM IR方法

5

我通过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
1个回答

2

我是否忽略了什么,导致整个问题变得无关紧要?

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


即使我在代码中或上面的命令中没有执行类似于“#include <stdio.h>”和“#include <stdlib.h>”这样的操作,这是否仍然成立?如果是这样,为什么我们要在C中进行包含操作,如果它们已经被clang自动添加了呢?对于这些初学者问题,我感到抱歉。 - diegoperini

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接