llc:符号上不支持的重定位

llc: unsupported relocation on symbol

问题

llc 给我以下错误:

LLVM ERROR: unsupported relocation on symbol

详细编译流程

我正在为编译器的中级 IR (MIR) 实现 LLVM 前端,在将各种方法转换为许多位码文件后,我 link 它们 (llvm-link),优化它们 (opt),将它们转换为机器代码 (llc),使它们成为共享库(clang 因为它是 linker 包装器),并动态加载它们。 llc 我正在编译的一些方法步骤失败!

第 1 步:llvm-link:合并多个位码文件

我可能有很多函数互相调用,所以我 llvm-link 可能相互交互的不同位码文件。这一步没有问题。示例:

llvm-link function1.bc function2.bc -o lnk.bc

第 2 步:opt:运行 优化通过

目前我使用的是:

opt -O3 lnk.bc -o opt.bc

这一步没有问题,但导致问题的正是这个步骤! 此外,这是必要的,因为将来我将需要此步骤来通过额外的通行证,例如loop-unroll

第 3 步:llc:生成机器码 (PIC)

我正在使用以下命令:

llc -march=thumb -arm-reserve-r9 -mcpu=cortex-a9 -filetype=obj -relocation-model pic opt.bc -o obj.o

我保留了我设置的 arch 特定标志,以防它们导致问题。我正在使用 Position Independent Code,因为下一步我将构建一个 shared object。 此命令失败,出现我在此答案之上写的错误。

第 4 步:clang:生成共享对象

对于Step 3失败的情况,则未达到此步骤。 如果llc成功,则此步骤也成功!

附加信息

配置

以下 运行 在 llvm3.6 上,运行 在 arm 设备上。

我注意到的事情

问题

  1. 为什么会这样??!!

  2. 为什么 opt-relocation-model 选项?这不应该只是一个 llc 的事情吗?我已经尝试将 optllc 都设置为 pic,但仍然失败。

  3. 我正在使用 clang 因为它有一个 linker 的包装器来获得 .so。有没有办法使用 LLVM 工具来执行此步骤?

首先,不要使用 llc 和 opt。这些是不应在任何生产环境中使用的开发人员端工具。取而代之的是,通过 LLVM 库实现您自己的适当优化和代码生成运行时。

至于这个特殊的错误 - 拇指代码生成器可能包含一些错误。请减少问题并报告。或者根本不使用 Thumb 模式 :)