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-vectorizeSYMCC_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
S
Description
No description provided
Readme
49 KiB
Languages
Dockerfile 51.5%
Shell 48.5%