首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >llc:符号上不支持的重新定位

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

Stack Overflow用户
提问于 2017-07-25 14:56:13
回答 1查看 993关注 0票数 0

问题

llc给出了以下错误:

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

详细编译流程

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

步骤1:llvm-link:合并多个bitcode文件

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

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

步骤2:opt:运行优化传递

就目前而言,我使用以下方法:

opt -O3 lnk.bc -o opt.bc

这个步骤没有问题,但那是导致问题的原因!此外,这也是必要的,因为在未来我将需要这个步骤来传递额外的通行证,例如loop-unroll

步骤3:llc:生成机器代码

我使用以下命令:

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就可以工作了。
  • 如果我不这样做,而我从llc中忽略了它们,llc仍然会失败。这让我觉得是opt -O<level>引起了这个问题。
  • 如果我直接使用llc,它就能工作,但是我无法运行opt允许的特定传递,所以这对我来说不是一个选项。
  • 到目前为止,我只编译了两个函数(来自它们原来的和平号),它们使用循环,我只遇到了这个问题。其他人产生工作代码!
  • 如果我不在llc上使用llc模型,它可以生成obj.o,但是我将在用它创建.so时遇到问题!

问题

  1. 为什么会这样?!!
  2. 为什么opt-relocation-model选项?这不应该只是llc的事吗?我尝试过在optllc中将其设置为pic,但仍然失败。
  3. 我之所以使用clang,是因为它有一个链接器的包装器来获取.so。有没有办法用LLVM工具来执行这个步骤呢?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-07-25 20:25:55

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45306907

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档