Printf float与LLVM段错误

我试图调用printf从LLVM打印浮点数。 虽然它与int一起工作良好,但在使用double

这里是代码(由clang生成,但稍作修改,以便它可以很好地与llc ):

@.str = private unnamed_addr constant [3 x i8] c"%f0", align 1

; Function Attrs: nounwind uwtable
define i32 @main() #0 {
  %1 = alloca i32, align 4
  store i32 0, i32* %1
  %2 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([3 x i8]* @.str, i32 0, i32 0), double 3.140000e+00)
  ret i32 0
}

declare i32 @printf(i8*, ...) #1

attributes #0 = { nounwind uwtable "disable-tail-calls"="false" "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+sse,+sse2" "unsafe-fp-math"="false" "use-soft-float"="false" }
attributes #1 = { "disable-tail-calls"="false" "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+sse,+sse2" "unsafe-fp-math"="false" "use-soft-float"="false" }

以下是我如何生成可执行文件:

llc main.ll --filetype=obj
ld -lc -e main -dynamic-linker /lib64/ld-linux-x86-64.so.2 main.o -o main

当我在valgrind运行main ,我得到:

Process terminating with default action of signal 11 (SIGSEGV): dumping core
 General Protection Fault

我在这个网站的某个地方阅读,我需要对齐堆栈以使用printf 。 如果这是问题,我怎么能在LLVM中做到这一点。

否则,是什么导致这种段错误?

我运行Linux 64位。


这不是llvm问题。 当你跑步时,

llc main.ll --filetype=obj
ld -lc -e main -dynamic-linker /lib64/ld-linux-x86-64.so.2 main.o -o main

在创建objact文件main.o之后,您正试图链接它,说main是它的执行入口点,这是不正确的。

从C程序员的角度来看,main是我们的程序的入口点,而不是执行,一些额外的启动代码被编译器添加为_start,这是首先执行的函数,然后是实际调用main函数。

启动代码是可重定位对象,编译器将这些对象传递给链接器。 搜索crti.o crtn.o和crt1.o,printf函数也在库libc.so/libc.a中,您需要在链接时提供它。

如果你想要简单的解决方案,那么使用gcc将目标文件转换为可执行文件

gcc main.o -o main

你也可以在这里寻找更多的解释,参考http://blog.techveda.org/building-executables-with-gnu-linker/

链接地址: http://www.djcxy.com/p/68697.html

上一篇: Printf float with LLVM segfaults

下一篇: How to run the Function Pass before the Module Pass in LLVM?