llvm编译

采用cmake包装,至少有3种方式可以在windows平台上编译:

vs2012及以上       使用cmake-gui配置即可,使用vs库及头文件

mingw/mingw64    可能会出现out of memory错误,使用gcc库及头文件

ninja                      速度快     cmake -G Ninja -DCMAKE_EXPORT_COMPILE_COMMANDS=ON dir


windows/linux/mac上均可编译llvm clang lldb,方法如下:

版本3.8.1          单独工程具体编译方法如上述3种        每一步执行make        make install

1.下载并编译llvm-3.8.1.src到llvm-3.8.1.bin

2.下载cfe-3.8.1.src,这正是clang,可以编译c/c++/oc等语言,支持各种系统。

使用cmake生成的时候会提示错误,此时只要修改CMakeCache.txt或直接在cmake-gui中添加entry即可

这一步需要添加的是第1步中生成的llvm-config.exe路径

再运行cmake即可,编译到cfe-3.8.1.bin

3.下载lldb-3.8.1.src

这一步cmake提示添加 llvm源码路径 llvm编译路径  clang源码路径 clang编译路径,分别设置好即可

如果是mac中这一步可能会提示subversion版本过低,只要按官网方法编译一次即可,还有可能提示无法给lldb-server签名,这里需要在钥匙串访问加入代码签名的lldb-server

编译通过则成功



一些程序:

clang/clang++       编译前端       clang 1.cpp           clang -c -emit-llvm main.c -o main.bc 生成伪代码二进制  clang -S -emit-llvm main.c -o main.ll生成伪代码

clang-cl 兼容msvc

clang-check 语法检查

clang-format 格式化源码

llvm-llc 伪代码生成汇编文本      llc main.bS -o main.asm

llvm-lli 伪代码二进制/伪代码 反汇编为汇编文本 lli main.bc lli main.ll

llvm-ar

llvm-as 伪代码生成伪代码二进制               as -o=main.bc main.ll

llvm-bcanalyzer 伪代码二进制分析器

llvm-config 打印出配置时 LLVM 编译选项、库、等等

llvm-cov

llvm-diff

llvm-dis 可执行文件反汇编为伪代码

llvm-dsymutil

llvm-dwarfdump

llvm-extract

llvm-link

llvm-lto

llvm-mc

llvm-nm

llvm-objdump

llvm-profdata

llvm-ranlib

llvm-readobj

llvm-rtdyld

llvm-size

llvm-stress

llvm-symbolizer

llvm-tblgen

llvm-vtabledump


main.c

#include <stdio.h>
int main(){
	printf("hellloworld");
	return 0;
}

main.asm

@feat.00 = 1
	.def	 _main;
	.scl	2;
	.type	32;
	.endef
	.globl	_main
	.align	16, 0x90
_main:                                  # @main
# BB#0:                                 # %entry
	pushl	%ebp
	movl	%esp, %ebp
	subl	$8, %esp
	movl	$0, -4(%ebp)
	movl	$"??_C@_0M@IMOOCPLP@hellloworld?$AA@", (%esp)
	calll	_printf
	xorl	%eax, %eax
	addl	$8, %esp
	popl	%ebp
	retl

	.section	.rdata,"dr",discard,"??_C@_0M@IMOOCPLP@hellloworld?$AA@"
	.globl	"??_C@_0M@IMOOCPLP@hellloworld?$AA@" # @"\01??_C@_0M@IMOOCPLP@hellloworld?$AA@"
"??_C@_0M@IMOOCPLP@hellloworld?$AA@":
	.asciz	"hellloworld"

main.ll

; ModuleID = '1.cpp'
target datalayout = "e-m:w-p:32:32-i64:64-f80:32-n8:16:32-S32"
target triple = "i686-pc-windows-msvc"

@"\01??_C@_0M@IMOOCPLP@hellloworld?$AA@" = linkonce_odr unnamed_addr constant [12 x i8] c"hellloworld\00", align 1

define i32 @main() #0 {
entry:
  %retval = alloca i32, align 4
  store i32 0, i32* %retval
  %call = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([12 x i8]* @"\01??_C@_0M@IMOOCPLP@hellloworld?$AA@", i32 0, i32 0))
  ret i32 0
}

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

attributes #0 = { "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" "unsafe-fp-math"="false" "use-soft-float"="false" }

!llvm.ident = !{!0}

!0 = !{!"Obfuscator-LLVM clang version 3.6.1 (tags/RELEASE_361/final) (based on Obfuscator-LLVM 3.6.1)"}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值