feat/symcc-packaging
symcc-build
基于 Gitea Actions 的 SymCC 打包仓库,产出 Ubuntu 24.04 的 symcc 镜像。
镜像内容
| 组件 | 版本 | 说明 |
|---|---|---|
| SymCC | eurecom-s3/symcc@3b8acab |
qsym 后端,Z3 静态嵌入 |
| Z3 | 4.13.3 | 静态链接 (PIC),无动态依赖 |
| LLVM/Clang | 17.0.6 | Ubuntu 24.04 官方包 |
| libc++ | LLVM 17.0.0 | 经 SymCC 插桩编译 |
| AFL | v2.56b | 模糊测试支持 |
| symcc_fuzzing_helper | 随源码 | Rust 实现 |
应用的补丁
| 补丁 | 文件 | 说明 |
|---|---|---|
-O0 默认 |
patches/symcc.in, patches/sym++.in |
默认禁用优化以最大化符号覆盖;用户可 -O1+ 覆盖 |
| 禁用向量化 | 同上 | -fno-vectorize -fno-slp-vectorize;SYMCC_ALLOW_VECTORIZE=1 可开启 |
| SYMCC_IGNORE_FILE | patches/symcc-ignore-feature.patch |
按正则跳过指定函数的符号化 |
| umax/umin/smax/smin | patches/symbolizer-umax-umin.patch |
LLVM 15+ min/max intrinsic 的符号化支持 |
使用方法
拉取镜像
docker pull code.uocat.com/<owner>/symcc:latest
编译 C 程序
docker run --rm -v $(pwd):/work -w /work symcc symcc -o test test.c
编译 C++ 程序
docker run --rm -v $(pwd):/work -w /work symcc sym++ -o test test.cpp
配合 AFL 模糊测试
docker run --rm -v $(pwd):/work -w /work symcc \
symcc_fuzzing_helper -i input -o output -- ./test @@
自定义跳过规则
挂载自己的 symcc_skip.txt 覆盖默认配置:
docker run --rm -v $(pwd):/work -w /work \
-v ./my_skip.txt:/symcc_build/symcc_skip.txt \
symcc symcc -o test test.c
每行一个 POSIX ERE 正则,匹配的函数名跳过符号化。默认规则见 symcc_skip.txt。
本地构建
docker build -t symcc .
可选 build-args:
| 参数 | 默认值 | 说明 |
|---|---|---|
LLVM_VERSION |
17 |
LLVM 主版本号 |
Z3_TAG |
z3-4.13.3 |
Z3 git tag |
SYMCC_REPO_URL |
https://github.com/eurecom-s3/symcc.git |
SymCC 源仓库 |
SYMCC_COMMIT |
3b8acab |
SymCC commit hash |
CI/CD
触发条件
- push 到 master/main:构建镜像,上传为 artifact
- push tag
v*:构建镜像 + 推送到code.uocat.com+ 发布 Release - 手动触发:同 branch push
所需 Secrets
| Secret | 用途 |
|---|---|
REGISTRY_USERNAME |
Gitea Container Registry 用户名(仅 tag 推送时需要) |
REGISTRY_PAT |
Gitea PAT,需 repository + package 权限 |
镜像地址
code.uocat.com/<owner>/symcc:latest # 最新
code.uocat.com/<owner>/symcc:v1.0 # 指定版本
仓库结构
├── Dockerfile # 5阶段多阶段构建
├── .github/workflows/build.yml # Gitea Actions CI
├── patches/
│ ├── symcc.in # C wrapper (-O0 + 禁向量化)
│ ├── sym++.in # C++ wrapper (-O0 + 禁向量化)
│ ├── symcc-ignore-feature.patch # SYMCC_IGNORE_FILE 功能
│ └── symbolizer-umax-umin.patch # min/max intrinsic 符号化
├── symcc_skip.txt # 默认跳过规则
├── .dockerignore
└── .gitignore
Languages
Dockerfile
51.5%
Shell
48.5%