生成BC文件
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文件,如make,cmake等。如果软件使用该方法,需修改相关的配置文件,如makefile。
- 替换编译命令:若构建文件中有gcc、g++、gfortran或ld,需要替换成对应的clang、clang++、flang或llvm-link。
- 调整编译选项:修改优化等级“-O0”,增加“-flto -g -fno-inline-functions”。
完成上述操作后,即可通过构建获得BC文件。

- 在构建项目之前,需将gcc编译器替换成llvm相关的工具。
- 构建时务必替换或增加指定的编译选项,防止部分指令信息缺失,从而影响分析结果准确性。
- 将最终生成的目标文件修改为BC文件。
- 使用make工具完成项目构建。
1 2
[root@localhost test]# ls main.c Makefile test.c
- 修改编译命令并替换编译选项。原始的makefile文件和修改后的makefile文件如下所示:
原始的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文件:
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.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文件。
- 创建目录。
1
mkdir bcfile
- 将bc文件拷贝到目录中。
1
cp case.bc bcfile/
- 将bc文件打包。
1
tar -czvf bcfile.tar.gz bcfile
- 创建目录。
父主题: 常用操作