Clang CFI 展示项目教程
1. 项目的目录结构及介绍
clang-cfi-showcase/
├── .gitignore
├── LICENSE
├── Makefile
├── README.md
├── cfi_cast_strict.cpp
├── cfi_derived_cast.cpp
├── cfi_icall.c
├── cfi_nvcall.cpp
├── cfi_unrelated_cast.cpp
└── cfi_vcall.cpp
- .gitignore: 用于指定Git版本控制系统忽略的文件和目录。
- LICENSE: 项目的许可证文件,采用NCSA许可证。
- Makefile: 用于编译项目的Makefile文件。
- README.md: 项目的主要说明文档。
- cfi_cast_strict.cpp: 展示Clang如何防止特定情况下的非法类型转换。
- cfi_derived_cast.cpp: 展示Clang如何防止从基类对象到派生类对象的非法类型转换。
- cfi_icall.c: 展示Clang如何防止间接函数调用中的非法调用。
- cfi_nvcall.cpp: 展示Clang如何防止非虚拟函数调用中的非法调用。
- cfi_unrelated_cast.cpp: 展示Clang如何防止无关类型之间的非法类型转换。
- cfi_vcall.cpp: 展示Clang如何防止虚拟函数调用中的非法调用。
2. 项目的启动文件介绍
项目的启动文件主要是Makefile。Makefile包含了编译和运行项目所需的所有指令。通过运行make
命令,可以编译所有示例程序。
3. 项目的配置文件介绍
项目的配置文件主要是Makefile。Makefile中定义了编译选项、链接选项以及依赖关系。以下是Makefile的部分内容:
# 编译器和链接器
CC = clang
CXX = clang++
LD = ld.gold
# 编译选项
CFLAGS = -flto -fvisibility=hidden -fno-sanitize=all
CXXFLAGS = -flto -fvisibility=hidden -fno-sanitize=all
# 链接选项
LDFLAGS = -flto -fuse-ld=$(LD)
# 目标文件
TARGETS = cfi_cast_strict cfi_derived_cast cfi_icall cfi_nvcall cfi_unrelated_cast cfi_vcall
all: $(TARGETS)
# 编译规则
%: %.c
$(CC) $(CFLAGS) $< -o $@ $(LDFLAGS)
%: %.cpp
$(CXX) $(CXXFLAGS) $< -o $@ $(LDFLAGS)
clean:
rm -f $(TARGETS)
Makefile中定义了编译器(clang和clang++)、链接器(ld.gold)、编译选项(CFLAGS和CXXFLAGS)以及链接选项(LDFLAGS)。通过这些配置,可以确保项目在不同的环境中正确编译和运行。