LLVM IR无法访问全局变量

时间:2019-06-04 07:58:18

标签: llvm llvm-ir

我正在尝试使用LLVM编译程序,并生成此代码

@c = common global i32
@d = common global i32

declare i32 @writeln(i32)

define i32 @a() {
entry:
  store i32 2, i32* @c, align 4
  ret i32 2
}

define i32 @main() {
entry:
  %calltmp = call i32 @a()
  ret i32 0
}

并且尝试将其编译为目标文件时出现此错误

Undefined symbols for architecture x86_64:
  "_c", referenced from:
      _a in a.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

有人知道我在做什么错吗?

1 个答案:

答案 0 :(得分:1)

要引用《 LLVM-IR语言参考》:

  

必须初始化全局变量定义。

所有全局变量声明都定义了一个指向内存区域的指针,并且通过指针访问LLVM中的所有内存对象。

如果您出于明显的原因而定义了指向外部值的指针,则可以放宽此要求:

@G = external global i32