test.c文件内容如下:
#include<stdio.h>
int main(void){
printf("hello world!\n");
return 0;
}
clang是使用LLVM最为后端,所以支持编译成LLVM的字节码
clang -emit-llvm -o test.bc -c test.c
将LLVM bitcode 进一步编译为汇编:
clang -o test test.bc
LLVM-DIS命令是LLVM反汇编。它可以一个LLVM bitcode文件并将其转换为人类可读的LLVM汇编语言。
反编译LLVM 字节码:
zhang@debian:~$ llvm-dis test.bc -o -
; ModuleID = 'test.bc'
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-pc-linux-gnu"
@.str = private unnamed_addr constant [14 x i8] c"hello world!\0A\00", align 1
; Function Attrs: nounwind uwtable
define i32 @main() #0 {
%1 = alloca i32, align 4
store i32 0, i32* %1, align 4
%2 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([14 x i8], [14 x i8]* @.str, i32 0, i32 0))
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"="+fxsr,+mmx,+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"="+fxsr,+mmx,+sse,+sse2" "unsafe-fp-math"="false" "use-soft-float"="false" }
!llvm.ident = !{!0}
!0 = !{!"clang version 3.8.1-24 (tags/RELEASE_381/final)"}
参考文章:c - How to make clang compile to llvm IR - Stack Overflow

本文介绍如何利用clang将C/C++源代码编译成LLVM的中间表示(LLVM IR bitcode),并详细阐述了如何通过LLVM-DIS工具将LLVM bitcode反汇编成可读的LLVM汇编语言,以供进一步分析和理解编译过程。
666

被折叠的 条评论
为什么被折叠?



