Llvm llc:符号上不支持的重新定位 问题
Llvm llc:符号上不支持的重新定位 问题,llvm,llvm-ir,relocation,llc,position-independent-code,Llvm,Llvm Ir,Relocation,Llc,Position Independent Code,llc给了我以下错误: LLVM错误:符号上不支持的重新定位 详细的编译流程 我正在为编译器的中级IR(MIR)实现一个LLVM前端,在我将各种方法转换为许多位代码文件后,我链接它们(LLVM链接),优化它们(opt),将它们转换为机器代码(llc),使它们成为一个共享库(clang,用于它的链接器包装器),并动态加载它们。 llc对于我正在编译的某些方法,步骤失败 步骤1:llvm链接:合并许多位代码文件 我可能有许多函数相互调用,因此我将链接可能相互交互的不同位代码文件。这一步没有问题。例如
llc
给了我以下错误:
LLVM错误:符号上不支持的重新定位
详细的编译流程
我正在为编译器的中级IR(MIR)实现一个LLVM前端,在我将各种方法转换为许多位代码文件后,我链接它们(LLVM链接
),优化它们(opt
),将它们转换为机器代码(llc
),使它们成为一个共享库(clang
,用于它的链接器包装器),并动态加载它们。
llc
对于我正在编译的某些方法,步骤失败
步骤1:llvm链接
:合并许多位代码文件
我可能有许多函数相互调用,因此我将链接可能相互交互的不同位代码文件。这一步没有问题。例如:
llvm链接function1.bc function2.bc-o lnk.bc
步骤2:opt
:运行优化过程
目前,我使用以下方法:
opt-O3 lnk.bc-o opt.bc
这一步没有任何问题,但正是这一步导致了问题!
另外,这是必要的,因为将来我需要这一步来传递额外的传递,例如循环展开
第3步:llc
:生成机器代码(PIC)
我正在使用以下命令:
llc-march=thumb-arm-reserve-r9-mcpu=cortex-a9-filetype=obj-relocation model pic opt.bc-o obj.o
我保留了我设置的arch特定标志,以防它们导致问题。我正在使用位置独立代码
,因为下一步我将构建一个共享对象
。
这个命令失败,错误我写在这个答案上面
步骤4:clang
:生成共享对象
对于步骤3
失败的情况,不执行此步骤。
如果llc
成功,此步骤也将成功
补充资料
配置
以下代码在llvm3.6上运行,llvm3.6在arm
设备上运行
我注意到的事情
- 如果我用
步骤省略opt
(或任何其他级别),则-O3
将起作用llc
- 如果我不这样做,而是从
中省略它们,llc
仍然会失败。这让我觉得是llc
导致了这个问题opt-O
- 如果我直接使用
,它将起作用,但我将无法运行llc
允许的特定过程,因此这不是我的选项opt
- 到目前为止,我只编译了两个使用循环的函数(从它们最初的MIR开始)来解决这个问题。其他人产生工作代码李>
- 如果我不在
使用llc
模型,它可以生成pic
,但是我在创建obj.o
模型时会遇到问题。因此从它创建
李>
opt
有-重新定位模式
选项?这不应该只是一个llc
的东西吗?我已经尝试在opt
和llc
将其设置为pic
,但仍然失败clang
,因为它有一个链接器的包装器来获取.so
。有没有办法用LLVM工具来完成这一步首先,不要使用llc或opt。这些是开发人员端的工具,不应该在任何生产环境中使用。相反,通过LLVM库实现您自己的适当优化和代码生成运行时 对于这个特定的bug,thumb代码生成器可能包含一些bug。请减少问题并报告。或者根本不使用拇指模式:)