0,目标
编译 针对x86 的,debug 的 c语言的编译器
1,下载代码
git clone --recursive 。。。llvm-project.git
$ cd llvm-project
2,预备代码
llvm 3.5 版本的源代码,早期版本,可能比较小比较容易debug
$ git checkout llvmorg-3.5.0
$ cp -r ./clang ./llvm/tools/
$ mkdir llvm/tools/clang/tools/extra
$ cp -r ./clang-tools-extra/* llvm/tools/clang/tools/extra/
$ ls llvm/tools/clang/tools/extra/
3,cmake 配置
cmake -G "Unix Makefiles" \
-DCLANG_ENABLE_STATIC_ANALYZER=1 \
-DLLVM_ENABLE_ASSERTIONS=On \
-DCMAKE_BUILD_TYPE=Debug \
-DCMAKE_INSTALL_PREFIX=../../local_x86_3_5 \
-DLLVM_ENABLE_LIBCXX=1 \
-DLLVM_TARGETS_TO_BUILD="X86" \
../llvm
4,修改代码
直接cmake make,会发现如下 error:
bug:
修改代码:
将默认的 private 修改为 pubulic:
5,编译安装
make -j34
make install
6,构建测试
方案:
(1) 用clang 将c文件编译成 object 文件:hello.o
(2)用gcc 做链接 将hello.o 链接上其他 系统库文件,生成 ELF文件:hello
便可以证明 clang 作为编译器的有效性。
(为什么不使用 clang 直接生成hello呢?)
6.1 测试源代码
hello.c
#include <stdio.h>
int addd(int a, int b)
{
return a+b;
}
int main()
{
int x = 0;
x = addd(3,4);
printf("sum = %d\n", x);
return 0;
}
Makefile
EXE := hello
all: $(EXE)
CLANG := ../local_x86_3_5/bin/clang
hello.o: hello.c
$(CLANG) $< -fPIE -c -o $@
hello: hello.o
gcc $< -o $@
.PHONY: clean
clean:
-rm -rf $(EXE) *.o
6.2 编译运行
$ make
./hello
运行效果: