提问者:小点点

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


我正在尝试通过 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::WeakAnyLinkage 或 llvm::GlobalValue::ExternalLinkage linkage 用于全局变量,我得到

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

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

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

...

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

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

(.text 0x20):未定义对“主要”的引用

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

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

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

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

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

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个答案

匿名用户

@x = external global i32*

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

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

另请注意,llvm-as / llc 部分是多余的 - clang 可以很好地编译 .ll / .bc 文件。