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。请减少问题并报告。或者根本不使用拇指模式:)