0

问题

llc给我以下错误:

LLVM 错误:符号上不支持的重定位

详细编译流程

我正在为编译器的中级 IR (MIR) 实现 LLVM 前端,在将各种方法转换为许多位码文件后,我将它们链接 ( llvm-link)、优化它们 ( opt)、将它们转换为机器码 ( llc)、制作它们是一个共享库(clang因为它是链接器包装器),并动态加载它们。 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

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

我正在使用以下命令:

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

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

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

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

附加信息

配置

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

我注意到的事情

  • 如果我在步骤中省略-O3(或任何其他级别)opt,那么llc就可以了。
  • 如果我不这样做,而是从 中省略它们llcllc仍然会失败。这让我认为这opt -O<level>是造成问题的原因。
  • 如果我llc直接使用它会起作用,但我将无法运行opt允许我的特定通行证,所以这不是我的选择。
  • 到目前为止,我使用我编译的 2 个函数(来自它们的原始 MIR)遇到了这个问题,这些函数使用循环。其他人产生工作代码!
  • 如果我不使用pic模型 at llc,它可以生成obj.o,但是我将无法从中创建一个.so

问题

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

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

  3. 我使用它是clang因为它有一个链接器的包装器来获取.so. 有没有办法用 LLVM 工具代替这一步?

4

1 回答 1

0

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

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

于 2017-07-25T20:25:55.787 回答