BC(BitCode)文件是使用LLVM(Low Level Virtual Machine)编译源代码生成中间文件(IR)的二进制表示,包含了程序编译的中间代码,比源代码文件更加紧凑和高效。DevKit基于LLVM框架,利用BC文件,提高程序的分析效率与分析准确度。
LLVM是一种开源编译器基础设施,它提供了一个通用的编译器框架和工具链,可以用于构建各种编程语言的编译器、解释器、调试器、代码优化器等。
用于生成BC文件的项目需要确保可以在本地使用LLVM(C/C++编译器使用clang、clang++,Fortran编译器使用flang)编译通过并生成动态库(.so)文件或者可执行文件。
clang是一个C、C++、Objective-C和Objective-C++编程语言的开源编译器前端。
在操作之前需要确保已安装亲和分析功能命令行工具,使用命令行BC文件生成功能生成BC文件可参见BC文件生成。
完成上述操作后,即可通过构建获得BC文件。
以make构建项目为例:
1 2 | [root@localhost test]# ls main.c Makefile test.c |
原始的Makefile文件:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | objects=main.o test.o exe=case CFLAGS = -O2 -DAM_CPU_NUMBER=96 -DMAX_PARALLEL_NUMBER=1 all: $(objects) main.o: ./main.c gcc $(CFLAGS) -c $< -o main.o test.o: ./test.c gcc $(CFLAGS) -c $< -o test.o all: $(exe) case: main.o test.o gcc -lpthread main.o test.o -o case clean: rm -f *.o |
修改后的Makefile文件:
objects=main.o test.o exe=case.bc CFLAGS = -O0 -flto -g -fno-inline-functions -DAM_CPU_NUMBER=96 -DMAX_PARALLEL_NUMBER=1 all: $(objects) main.o: ./main.c clang $(CFLAGS) -c $< -o main.o test.o: ./test.c clang $(CFLAGS) -c $< -o test.o all: $(exe) case.bc: main.o test.o llvm-link main.o test.o -o case.bc clean: rm -f *.o
修改后的Makefile文件,将编译工具修改为clang,链接生成目标文件的工具改为llvm-link。
1 2 3 4 5 6 | [root@localhost test]# make clang -O0 -flto -g fno-inline-functions -DAM_CPU_NUNBER=96 -DMAX_PARALLEL_NUMBER=1 -c main.c -o main.o clang -O0 -flto -g fno-inline-functions -DAM_CPU_NUNBER=96 -DMAX_PARALLEL_NUMBER=1 -c test.c -o test.o llvm-link main.o test.o -o case.bc [root@localhost test]# ls case.bc main.c main.o Makefile test.c test.o |
生成的BC文件为case.bc。
1 | mkdir bcfile
|
1 | cp case.bc bcfile/ |
1 | tar -czvf bcfile.tar.gz bcfile |