问题
llc
给我以下错误:
LLVM 错误:符号上不支持的重定位
详细编译流程
我正在为编译器的中级 IR (MIR) 实现 LLVM 前端,在将各种方法转换为许多位码文件后,我将它们链接 ( llvm-link
)、优化它们 ( opt
)、将它们转换为机器码 ( llc
)、制作它们是一个共享库(clang
因为它是链接器包装器),并动态加载它们。
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
第三步llc
::生成机器码(PIC)
我正在使用以下命令:
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
允许我的特定通行证,所以这不是我的选择。 - 到目前为止,我只使用我编译的 2 个函数(来自它们的原始 MIR)遇到了这个问题,这些函数使用循环。其他人产生工作代码!
- 如果我不使用
pic
模型 atllc
,它可以生成obj.o
,但是我将无法从中创建一个.so
!
问题
为什么会这样??!!
为什么
opt
有-relocation-model
选项?这不应该只是一llc
件事吗?我已经尝试将其设置为 atopt
和llc
topic
,但仍然失败。我使用它是
clang
因为它有一个链接器的包装器来获取.so
. 有没有办法用 LLVM 工具代替这一步?