当使用全局变量从llvm字节码编译目标文件时,Clang-3.8未定义对“main”的引用

时间:2016-08-26 18:02:49

标签: clang llvm llvm-clang llvm-ir llvm-c++-api

我正在尝试通过C ++ API在llvm中实现嵌套函数。在我执行语义检查(以确保将要编译的程序具有正确的嵌套引用等)之后,我在llvm中定义相同范围内的所有函数,并将所有变量设置为全局。我期待这个工作,但我发现自己在使用以下命令从.o文件获取可执行文件时遇到了很大的问题:

"llvm-as-3.8 output.ll| llc-3.8 -filetype=obj | clang-3.8 ../library/library.a  -v -o out"

通过对全局变量使用llvm::GlobalValue::WeakAnyLinkagellvm::GlobalValue::ExternalLinkage链接,我得到:

  

/ usr / bin / ld:/usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info):重定位0具有无效的符号索引11

     

/ usr / bin / ld:/usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info):重定位1具有无效符号索引12

     

/ usr / bin / ld:/usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info):重定位8具有无效的符号索引12

     

...

     

/ usr / bin / ld:/usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_line):重定位0具有无效符号索引2

     

/ usr / bin /../ lib / gcc / x86_64-linux-gnu / 4.8 /../../../ x86_64-linux-gnu / crt1.o:在函数`_start'中:

     

(。text + 0x20):对'main'的未定义引用

这似乎与main的定义有关,我在ir代码的定义中代表:

; Function Attrs: nounwind uwtable define void @main() #0 {

事情是,当我不使用全局变量时,相同的命令没有任何问题,当然在子函数中使用变量的情况,这是我试图将alloca更改为全局的原因

帮助找到解决此问题的方法。 提前致谢。 注1:我使用llvm-3.8

更新: 当我从clang命令中删除-v时,结果为:

  

refined_output.o:在函数bsort': refined_output.ll:(.text+0x4): undefined reference to x'中   refined_output.ll :(。text + 0xa):对n' refined_output.ll:(.text+0x10): undefined reference to的未定义引用已更改'   refined_output.ll :(。text + 0x22):对i' refined_output.ll:(.text+0x2c): undefined reference to的未定义引用已更改'   refined_output.ll :(。text + 0x42):对i' refined_output.ll:(.text+0x48): undefined reference to n'的未定义引用   refined_output.ll :(。text + 0x50):对i' refined_output.ll:(.text+0x59): undefined reference to x'的未定义引用   refined_output.ll :(。text + 0x60):对i' refined_output.ll:(.text+0x75): undefined reference to x'的未定义引用   refined_output.ll :(。text + 0x7c):对i' refined_output.ll:(.text+0x95): undefined reference to的未定义引用已更改'   refined_output.ll :(。text + 0xa3):对changed' refined_output.o: In function swap'的未定义引用:   refined_output.ll :(。text + 0xc3):对x.1' refined_output.ll:(.text+0xca): undefined reference to y'的未定义引用   refined_output.ll :(。text + 0xd1):对x.1' refined_output.ll:(.text+0xd9): undefined reference to t'的未定义引用   refined_output.ll :(。text + 0xe0):对x.1' refined_output.ll:(.text+0xe7): undefined reference to y'的未定义引用   refined_output.ll :(。text + 0xf2):对y' refined_output.ll:(.text+0xf8): undefined reference to t'的未定义引用   refined_output.o:在函数main': refined_output.ll:(.text+0x102): undefined reference to i.4'   refined_output.ll :(。text + 0x10c):对seed' refined_output.ll:(.text+0x123): undefined reference to x.2'的未定义引用   refined_output.ll :(。text + 0x12a):对i.4' refined_output.ll:(.text+0x130): undefined reference to种子'的未定义引用   refined_output.ll :(。text + 0x15d):未定义引用seed' refined_output.ll:(.text+0x166): undefined reference to i.4'   refined_output.ll :(。text + 0x16c):对i.4' refined_output.ll:(.text+0x177): undefined reference to x.2'的未定义引用   refined_output.ll :(。text + 0x18d):对x.2' refined_output.ll:(.text+0x19e): undefined reference to x.2'的未定义引用   refined_output.o:在函数printArray': refined_output.ll:(.text+0x1c4): undefined reference to msg'中   refined_output.ll :(。text + 0x1cb):未定义引用x.2' refined_output.ll:(.text+0x1d1): undefined reference to n.3'   refined_output.ll :(。text + 0x1d8):未定义引用msg' refined_output.ll:(.text+0x1e3): undefined reference to i.4'   refined_output.ll :(。text + 0x1f3):未定义引用x.2' refined_output.ll:(.text+0x1fa): undefined reference to i.4'   refined_output.ll :(。text + 0x208):未定义引用i.4' refined_output.ll:(.text+0x20e): undefined reference to i.4'   refined_output.ll :(。text + 0x214):未定义引用n.3' refined_output.ll:(.text+0x21c): undefined reference to i.4'

     

clang:错误:链接器命令失败,退出代码为1(使用-v查看调用)

所有这些变量都是在我的程序开始时在llvm IR中定义的:

@x = external global i32*
@n = external global i32
@i = external global i32
@changed = external global i1
@x.1 = external global i32*
@y = external global i32*
@t = external global i32
@msg = external global i8*
@x.2 = external global i32*
@n.3 = external global i32
@i.4 = external global i32
@const_string_temp = private constant [3 x i8] c", \00", align 1
@const_string_temp.5 = private constant [2 x i8] c"\0A\00", align 1
@i.6 = external global i32
@x.7 = external global i32
@seed = external global i32
@const_string_temp.8 = private constant [16 x i8] c"Initial array: \00", align 1
@const_string_temp.9 = private constant [15 x i8] c"Sorted array: \00", align 1

我希望这有助于您帮助我 - 或者在我的IR代码生成中找到问题。

我很期待..

1 个答案:

答案 0 :(得分:2)

@x = external global i32*

等等是全局变量声明,而不是定义。因此,“未定义的引用”错误是有效的,您确实需要定义它们。

有关详细信息,请参阅http://llvm.org/docs/LangRef.html#global-variables

还要注意llvm-as / llc部分是多余的 - clang可以编译.ll / .bc文件就好了。