llc:符号上不支持的重定位
llc: unsupported relocation on symbol
问题
llc
给我以下错误:
LLVM ERROR: unsupported relocation on symbol
详细编译流程
我正在为编译器的中级 IR (MIR) 实现 LLVM 前端,在将各种方法转换为许多位码文件后,我 link 它们 (llvm-link
),优化它们 (opt
),将它们转换为机器代码 (llc
),使它们成为共享库(clang
因为它是 linker 包装器),并动态加载它们。
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
第 3 步:llc
:生成机器码 (PIC)
我正在使用以下命令:
llc -march=thumb -arm-reserve-r9 -mcpu=cortex-a9 -filetype=obj -relocation-model pic opt.bc -o obj.o
我保留了我设置的 arch 特定标志,以防它们导致问题。我正在使用 Position Independent Code
,因为下一步我将构建一个 shared object
。
此命令失败,出现我在此答案之上写的错误。
第 4 步:clang
:生成共享对象
对于Step 3
失败的情况,则未达到此步骤。
如果llc
成功,则此步骤也成功!
附加信息
配置
以下 运行 在 llvm3.6 上,运行 在 arm
设备上。
我注意到的事情
- 如果我在
opt
步骤中省略 -O3
(或任何其他级别),那么 llc
就可以了。
- 如果我不这样做,而是从
llc
中省略它们,llc
仍然会失败。这让我认为 opt -O<level>
导致了这个问题。
- 如果我直接使用
llc
它会起作用,但我无法 运行 特定的通行证 opt
允许我,所以这不是我的选择.
- 我仅遇到过这个问题,目前我已经编译了 2 个使用循环的函数(来自它们的原始 MIR)。其他人生成工作代码!
- 如果我不在
llc
处使用 pic
模型,它可以生成 obj.o
,但是我从中创建 .so
时会遇到问题!
问题
为什么会这样??!!
为什么 opt
有 -relocation-model
选项?这不应该只是一个 llc
的事情吗?我已经尝试将 opt
和 llc
都设置为 pic
,但仍然失败。
我正在使用 clang
因为它有一个 linker 的包装器来获得 .so
。有没有办法使用 LLVM 工具来执行此步骤?
首先,不要使用 llc 和 opt。这些是不应在任何生产环境中使用的开发人员端工具。取而代之的是,通过 LLVM 库实现您自己的适当优化和代码生成运行时。
至于这个特殊的错误 - 拇指代码生成器可能包含一些错误。请减少问题并报告。或者根本不使用 Thumb 模式 :)
问题
llc
给我以下错误:
LLVM ERROR: unsupported relocation on symbol
详细编译流程
我正在为编译器的中级 IR (MIR) 实现 LLVM 前端,在将各种方法转换为许多位码文件后,我 link 它们 (llvm-link
),优化它们 (opt
),将它们转换为机器代码 (llc
),使它们成为共享库(clang
因为它是 linker 包装器),并动态加载它们。
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
第 3 步:llc
:生成机器码 (PIC)
我正在使用以下命令:
llc -march=thumb -arm-reserve-r9 -mcpu=cortex-a9 -filetype=obj -relocation-model pic opt.bc -o obj.o
我保留了我设置的 arch 特定标志,以防它们导致问题。我正在使用 Position Independent Code
,因为下一步我将构建一个 shared object
。
此命令失败,出现我在此答案之上写的错误。
第 4 步:clang
:生成共享对象
对于Step 3
失败的情况,则未达到此步骤。
如果llc
成功,则此步骤也成功!
附加信息
配置
以下 运行 在 llvm3.6 上,运行 在 arm
设备上。
我注意到的事情
- 如果我在
opt
步骤中省略-O3
(或任何其他级别),那么llc
就可以了。 - 如果我不这样做,而是从
llc
中省略它们,llc
仍然会失败。这让我认为opt -O<level>
导致了这个问题。 - 如果我直接使用
llc
它会起作用,但我无法 运行 特定的通行证opt
允许我,所以这不是我的选择. - 我仅遇到过这个问题,目前我已经编译了 2 个使用循环的函数(来自它们的原始 MIR)。其他人生成工作代码!
- 如果我不在
llc
处使用pic
模型,它可以生成obj.o
,但是我从中创建.so
时会遇到问题!
问题
为什么会这样??!!
为什么
opt
有-relocation-model
选项?这不应该只是一个llc
的事情吗?我已经尝试将opt
和llc
都设置为pic
,但仍然失败。我正在使用
clang
因为它有一个 linker 的包装器来获得.so
。有没有办法使用 LLVM 工具来执行此步骤?
首先,不要使用 llc 和 opt。这些是不应在任何生产环境中使用的开发人员端工具。取而代之的是,通过 LLVM 库实现您自己的适当优化和代码生成运行时。
至于这个特殊的错误 - 拇指代码生成器可能包含一些错误。请减少问题并报告。或者根本不使用 Thumb 模式 :)