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

时间:2017-07-25 14:56:13

标签: llvm llvm-ir relocation llc position-independent-code

问题

llc给了我以下错误:

  

LLVM错误:符号

上的不支持重定位

详细的编译流程

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

第1步:llc:合并许多bitcode文件

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

llvm-link

第2步:llvm-link function1.bc function2.bc -o lnk.bc:运行优化传递

目前我正在使用以下内容:

opt

此步骤没有任何问题,但那是 CAUSES 问题! 此外,这是必要的,因为将来我需要这一步来传递额外的通行证,例如opt -O3 lnk.bc -o opt.bc

第3步:loop-unroll:生成机器代码(PIC)

我使用以下命令:

llc

我保留了我设置的特定于拱的标志,以防他们对此问题做出贡献。我正在使用llc -march=thumb -arm-reserve-r9 -mcpu=cortex-a9 -filetype=obj -relocation-model pic opt.bc -o obj.o,因为下一步我将构建Position Independent Code。 这个命令失败了,我在这个答案之上写了错误。

第4步:shared object:生成共享对象

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

其他信息

配置

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

我注意到的事情

  • 如果我在arm步骤中省略-O3(或任何其他级别),则opt将起作用。
  • 如果我不这样做,而是从llc省略它们,llc仍然会失败。这让我觉得llc导致了这个问题。
  • 如果我直接使用opt -O<level>它会有效,但我无法运行llc允许我的特定传递,所以这不适合我。
  • 我已经遇到了这个问题 ONLY ,其中包含我迄今为止编译过的2个函数(来自原始的MIR),它们使用了循环。其他人制作工作代码!
  • 如果我在opt处不使用pic模型,则可以生成llc,但之后我将无法从中创建obj.o

问题

  1. 为什么会这样???

  2. 为什么.soopt选项?这不应该只是一个-relocation-model的东西吗?我已尝试在llcopt设置llc,但仍然失败。

  3. 我正在使用pic,因为它有一个链接器的包装器来获取clang。是否有办法使用LLVM工具执行此步骤?

1 个答案:

答案 0 :(得分:0)

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

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