arXiv:2605.21615v1 [cs.CR] 20 May 2026
A SSEMBLAGE -D EEP H ISTORY: A Cross-Build Binary Dataset with Temporal Coverage
Chang Liu1 Noah Fleischmann2 Nicolò Altamura3 Edward Raff4 James Holt4 Kristopher Micinski1 1 Syracuse University, Syracuse, USA 2 Booz Allen Hamilton, McLean, USA 3 Independent Researcher, Italy 4 CrowdStrike, Austin, USA {cliu57, kkmicins}@syr.edu [email protected] [email protected] {edward.raff, james.holt1}@crowdstrike.com
Abstract Existing binary corpora typically capture only one or two axes of binary variation: they either provide cross-compiler builds without a temporal axis, or CVE labels for single-build binaries. None combine cross-build diversity, cross-version history, and CVE labels into a queryable structure. We present A SSEMBLAGE D EEP H ISTORY1 , which consolidates these dimensions into a unified framework where every binary’s compilation context, source code, vulnerable functions, and package version are stored as first-class metadata. A SSEMBLAGE -D EEP H ISTORY comprises 73,610 binaries spanning 248 opensource projects, compiled across GCC, Clang, and MSVC at multiple optimization levels on Linux and Windows, with multi-year historical builds. Each binary is indexed in a database that links it to its source code, functions, debug info, variant builds, historical versions, and vulnerable functions. Three analyses demonstrate this structure’s value: (1) a three-stage LLM benchmark (recognition, strategyguided detection, and cross-build transfer) to test whether LLMs reason about binary vulnerabilities or pattern-match on build-specific artifacts; (2) a comparison of MalConv embeddings, jTrans function embeddings, and TLSH fuzzy hashes quantifying how same-package versions cluster in each space; and (3) a Bayesian regression decomposing binary similarity into contributions from temporal distance, file changes, and commits.
1
Introduction
Binary analysis research is consistently constrained by a structural gap in available datasets: real-world software evolves over time. A project is compiled across various compilers, settings, architectures, and ABIs; additionally, code is patched and refactored across updates. Existing corpora capture only fragments of this life cycle. Cross-build datasets [28, 44, 79] vary compiler settings but remain tied to a fixed version, while multi-version efforts [13, 33, 52, 95] sample many projects but typically retain only a single snapshot of each. CVE-labeled corpora generally associate each vulnerability with a specific build configuration [6, 38]. No existing resource combines cross-build diversity, multi-year version coverage, and CVE labels in a structure where compilation context, source origin, and release history are first-class, queryable metadata. 1 Dataset:
https://huggingface.co/datasets/changliu8541/assemblage-deephistory. Evaluation code: https://github.com/Assemblage-Dataset/DeepHistory-Eval. Build pipeline (integrated in Assemblage): https: //github.com/Assemblage-Dataset/Assemblage. Preprint.
Dataset
Binaries Functions Projects Cross Cross CVE Source Temporal (#) (#, K) (#) Platform Compiler Included Code Coverage
BinKit [44] BinaryCorp-26M [79] BinBench [13] LLM4Decompile [75] αdiff [51] A SSEMBLAGE [52] REALTYPE [21] Decompile-Bench [76] BinPool [6]
243,128 48,130 1,127,479 U 66,823 1,536,171 U 85,000 6,144
75,231 25,877 4,408 U 2,489 783,694 157 100,000 7
51 9,819 U 164 926 220,792 U 3,961 162
73,610
441,858
248
A SSEMBLAGE -D EEP H ISTORY
◦ ◦ ◦ ◦ ◦ • ◦ ◦ ◦ •
• ◦ ◦ ◦ ◦ ◦ ◦ ◦ ◦ •
◦ ◦ ◦ ◦ ◦ ◦ ◦ ◦ • •
◦ ◦ ◦ • ◦ • ◦ • ◦ •
◦ ◦ ◦ ◦ • ◦ ◦ ◦ ◦ •
Table 1: Comparison of binary datasets in reverse engineering, decompilation, and vulnerability research. • indicates the feature is present, ◦ indicates absent. U: undisclosed or unknown. To close this gap, we present A SSEMBLAGE -D EEP H ISTORY, comprising 73,610 binaries (42,188 Windows PE, 31,422 Linux ELF) from 248 open-source C/C++ projects compiled across GCC, Clang, and MSVC at multiple optimization levels. Projects average 5.2 distinct versions and 297 binaries; 140 projects in our corpus span more than two years of development. Every binary is associated via a database schema with its source code, internal functions, sibling builds, subsequent versions, and known vulnerabilities. Our dataset has three axes: (a) cross-build compilation, (b) multi-year version history, and (c) CVE labels. In combination, (a)–(c) enable us to do three new analyses unavailable on previous, single-axis corpora. First, we conduct several LLM reasoning benchmarks over binaries: recognition, strategy-guided detection, and cross-build transfer. The transfer stage replays the strategy authored on a reference build against compilation variants of the identical vulnerable code, separating semantic reasoning from superficial pattern matching [55, 77]. Second, leveraging the multi-version axis, we compare MalConv [64] embeddings, jTrans [79] embeddings, and TLSH [62] fuzzy hashes as signals for clustering same-package binaries. Third, a hierarchical Bayesian regression decomposes binary similarity into contributions from temporal distance, file changes, and commit frequency. In summary, our primary contributions are as follows: • A Multi-Axis Binary Dataset: We release A SSEMBLAGE -D EEP H ISTORY, a cross-platform corpus of 73,610 binaries spanning 248 open-source C/C++ projects. The dataset is indexed in a queryable database that links every binary to its source code, functions, sibling builds, version history, and 329 CVE-labeled vulnerabilities. • A Cross-Build LLM Benchmark: We construct a three-stage LLM benchmark for binary vulnerability identification. This benchmark leverages the dataset’s compilation diversity to explicitly distinguish genuine semantic reasoning from build-specific pattern matching. • Similarity and Evolution Analyses: We characterize the dataset’s similarity structure through two complementary lenses: a comparison of MalConv embeddings, jTrans embeddings, and TLSH fuzzy hashes against a hierarchical Bayesian regression that decomposes cross-version binary similarity into temporal, structural, and commit-driven components.
2
Related Work
Binary Datasets for Reverse Engineering The advancement of binary analysis research is fundamentally dependent on large-scale corpora of compiled programs. Therefore, substantial work has focused on constructing these datasets by crawling open-source repositories and employing automated build drivers (such as Make and CMake) to compile the source code at scale [7, 33, 37, 50, 56, 71, 72]. This methodology yields extensive collections of ELF binaries across different compiler versions and optimization levels, enabling downstream applications like binary similarity, function name recovery, and decompilation [8, 53, 73, 76, 78, 93]. Nevertheless, these automated compilation pipelines remain overwhelmingly restricted to Linux. While standardized build systems and package managers render headless compilation tractable in Linux environments, equivalent uniformity does not exist for Windows. 2
To address this limitation, A SSEMBLAGE [52] expanded corpus collection to Windows by compiling hundreds of thousands of projects across both operating systems, supplementing GitHubderived source code with curated vcpkg [59] packages. Other corpora target highly specific reverse-engineering domains. For instance, in the realm of similarity research, BinKit [44] provides binaries compiled across various optimization variants, while αDiff [51] contributes a massive dataset for cross-version similarity detection, the data only covers the temporal axis without crosscompiler/optimization/platform variants. Similarly, LLM4Decompile [75], NOVA [40], and IDIOMS (REALTYPE dataset) [21] focus on neural decompilation, while EMBER [4, 14, 42] and BODMASstyle malware corpora [13, 41, 69] support classification research. While these datasets significantly advance the field, they typically capture only a single snapshot of each project. Even datasets that include multiple variants fail to capture combined cross-build and cross-version dynamics with comprehensive contextual information. This leaves a critical gap in understanding how compilation choices and version drift interact over years of software evolution. Cross-Build and Multi-Version Binary Analysis Motivated by critical tasks such as patch identification, vulnerability propagation, and malware variant detection, binary similarity research has historically focused on cross-version and cross-build comparisons. Classical approaches rely on graph-matching tools [25, 26, 27, 45, 84, 92] to compare control-flow graphs across compilations. The field later shifted toward neural methods that replace graph isomorphism with learned embeddings, evolving from early architectures (Gemini, a graph-embedding similarity model [85], αDiff [51], SAFE [57], DeepBinDiff [23]) to transformer-based models with extensive pretraining (PalmTree [49], BinProv [34], jTrans [79], SigmaDiff [28]). However, while these methods are evaluated on cross-build pairs, their underlying training corpora remain inherently planar: they either vary compiler settings at a single snapshot or span a minimal version axis (e.g., adjacent releases) under a fixed build configuration. Recent library identification and version fingerprinting models [20, 22, 39, 90, 94] inherit this identical flat structure. A SSEMBLAGE -D EEP H ISTORY closes this planar gap by filling out the third axis of temporal coverage, seamlessly pairing cross-build diversity (compilers, optimization levels, operating systems) with deep, multi-year histories that span more than two years for 140 of our 248 packages. Cross-Build Vulnerability Binary Datasets for LLM Evaluation LLMs are widely suspected of succeeding on benchmarks through memorization or surface pattern matching rather than reasoning over program semantics [36, 54, 66, 83, 89, 91]. To address this, equivalence-style benchmarks such as EquiBench [83] hold program behavior fixed while varying syntactic form. At the source level, this philosophy supports a mature ecosystem: SecVulEval [2], CVE-Bench [80], SafeGenBench [48], and SEC-bench [47] all draw on richly annotated CVE corpora that track vulnerability-fixing commits across versions [9, 19, 24, 61, 67]. At the binary level, however, the landscape is far sparser. BinPool [6] labels 603 Linux CVEs on fixed compilations, and Vul-BinLLM [38] relies on synthetic Juliet cases. Because both tie each vulnerability to a single build, they leave no way to separate vulnerability semantics from build-specific artifacts. A SSEMBLAGE -D EEP H ISTORY extends the equivalence paradigm to compiled code: the underlying flaw retains its semantic identity while the compiler, optimization level, and OS may vary, ensuring that successful detection strategy must generalize across builds.
3
Dataset Details
3.1
Dataset Construction
Our corpus targets foundational C/C++ libraries characterized by well-documented multi-version histories. The selection criteria included popularity, breadth of integration, and sustained maintenance activity. To ensure our dataset remains complementary, we deliberately excluded vcpkg [59] repositories previously compiled by A SSEMBLAGE. To handle historical compilations, we employ two distinct strategies: for Windows, we utilize Conan’s standardized recipes to automate dependency resolution and compilation; for Linux, we build historical versions directly from their upstream GitHub repositories. By compiling across both operating systems, the A SSEMBLAGE -D EEP H ISTORY pipeline systematically generates Windows PE binaries (preserving MSVC PDB debug files) alongside Linux ELF binaries (retaining GCC/Clang DWARF sections). This dual-platform approach resolves two major 3
Projects
Binaries
PE
ELF
Avg ver.
Bins/Proj
By temporal coverage 0–1 year 77 1–2 years 31 2–5 years 118 5–10 years 22
13,529 10,471 42,454 7,156
5,303 7,919 25,473 3,493
8,226 2,552 16,981 3,663
2.2 5.8 6.7 6.9
176 338 360 325
By distinct versions 1 46 2–5 105 6–10 83 11–20 12 20+ 2
2,210 22,216 40,664 7,191 1,329
1,587 11,264 25,260 3,007 1,070
623 10,952 15,404 4,184 259
1.0 3.9 7.6 12.8 27.0
48 212 490 599 664
Total
73,610
42,188
31,422
5.2
297
248
Table 2: Coverage of A SSEMBLAGE -D EEP H ISTORY (library-only binaries) grouped by version span (top) and number of distinct versions per project (bottom). Avg ver. is the mean number of distinct versions per project in the binaries; Bins/Proj is the mean binaries per project.
gaps in prior Linux-centric corpora [37, 52]: it reconstructs historical Windows versions that lack centralized package snapshots (e.g., apt or yum), and natively captures the Windows ecosystem’s heavy reliance on bundled, dynamically linked libraries. 3.2
Dataset Composition
A SSEMBLAGE -D EEP H ISTORY comprises 73,610 compiled library binaries (42,188 Windows PE and 31,422 Linux ELF) sourced from 248 software packages. The corpus contains approximately 442 million functions, all indexed within a central SQLite database that preserves the mapping between source repositories, function metadata, and build configurations. Each binary is compiled across multiple configurations: Windows binaries are built with MSVC under Debug and RelWithDebInfo profiles (generating external PDB files), while Linux binaries utilize GCC and Clang with optimizations from -O0 to -O3 (retaining in-place DWARF sections). This debug information provides high-fidelity ground truth—including function boundaries, symbol names, and source-line mappings—essential for supervised function-level analysis. As detailed in Table 2, the dataset offers significant temporal depth: 140 packages span more than two years of development, with an average of 5.2 versions per project. The symbol information recovered from PDB and DWARF headers demonstrates remarkable cross-version stability; in prominent packages, tens of thousands of functions persist across numerous version pairs. This longitudinal consistency enables rigorous study of function evolution and cross-version matching without the noise introduced by heuristic boundary detection.
4
Evaluations
We demonstrate A SSEMBLAGE -D EEP H ISTORY’s research value through three analyses spanning different aspects of the dataset’s structure: Section 4.1 introduces a three-stage LLM benchmark that uses the cross-build/cross version axis to test vulnerability reasoning; Section 4.2 compares three off-the-shelf binary representations on the multi-version axis; and Section 4.3 decomposes binary similarity into temporal, structural, and activity components. 4.1
LLM Vulnerability Understanding
Experiment Setup Our benchmark contains 329 CVEs across 55 packages from A SSEMBLAGE D EEP H ISTORY, and the design is illustrated in Figure 1. CVEs are fetched by package name from the National Vulnerability Database, the CVE Program, and the GitHub Advisory Database [16, 32, 60] then filtered to the ones that affected versions intersect with compiled binary versions in the dataset. Then, we use the CVE description and patch diff to identify affected functions and we inspect about 4
Binaries
Debug info
Metadata
Source code
Task 1: Recognition
Binary Interact Agent
CVE Report
Assemblage-DeepHistory CVE database
Details
LLMs
CVE ID Strategy
Vulnerable Candidate
Sample code
Task 2: Detection
Code query / search
Task 3: Cross-Build Generalization
Mixture of vulnerable / safe code
Zero-shot / Guided CVE identification
Different binaries built w/ opt/OS/version/compiler
Mixture of source / decompiled code
Same binary as strategy generation
Replay Task 2 strategy on different binaries
Identify vulnerable code
Compare result against CVE functions
Measure accuracy decay
Figure 1: Three-Stage CVE Evaluation Design
25% of the resulting records to verify that each CVE matches the correct library and version in our dataset (manually inspected CVE IDs available in appendix). For each CVE, we chose a reference binary with lowest optimization and grouped other affected binaries to one of five Diff categories: Optimization, Compiler, OS, Version and All (per-category counts in the appendix). Experiments were conducted on a HTCondor managed cluster, and each environment was running Ubuntu 20.04.5 LTS, equipped with an AMD EPYC 9845 160-core CPU, an NVIDIA L40S GPU, and 502 GB of memory. Qwen-3.6 [87] (Qwen/Qwen3.6-35B-A3B) was served via SGLang with FP8 quantization, and Gemma 4[17] (gemma4:26b) was served via Ollama with Q4_K_M quantization ( Gemma 4 had compatibility issues with SGLang at the time of the experiments). Both models were configured with a 256K-token context window and temperature=0. Ghidra [1] version 12.0.3 was used in the evaluations. Evaluations in Section 4.1 consumed roughly 1800 L40S GPU-hours, in 8 days of queued cluster time. The remaining models used in our evaluations, Opus 4.7, GPT-5.4, and Gemini 3.1 Pro Preview (will be later referenced as Opus, GPT, and Gemini) were accessed with their latest version at the time of experiment. Binary CVE Recognition In the first and simplest task, the model selects the vulnerable function from K = 5 candidates from a single binary. The candidates are made from the vulnerable function and four distraction choices, and the four are chosen sorted by CodeBLEU [65] similarity, and shuffled before prompting. K = 5 gives a small 20% random baseline while keeping the large CVE prompts within local agents’ 256K context, avoiding long-context degradation [36, 54]. We evaluate each model under two independent factors: code representation (Ghidra-decompiled vs. original source code) and vulnerability context (zero-shot vs. with the CVE description and patch diff). Table 3 reports accuracy across five models. Note that Gemini 3.1 Pro fails to return a final answer on 1.8% even after several attempts, and these are marked as incorrect. Every model loses accuracy moving from source to binary (-0.05 to -0.20, smaller for frontier models) and gains substantially with the CVE description (+0.46 to +0.60). With description, the three frontier models reach high accuracy on both source and binary inputs; however on zero-shot tasks, all five model answers are near baseline, indicating that recognition without grounding CVE context text is close to random even for the strongest models. Guided CVE Detection In the second task, an agent aims to locate the vulnerable function in a stripped binary by exploring it through BinaryAPI, a read-only 14-method interface we built over Ghidra-based analysis. BinaryAPI exposes three code representations per function (decompiled C, annotated post-SSA p-code, and raw disassembly), bidirectional call-graph navigation, control-flow graphs and regex search across each representation. Each BinaryAPI call is a deterministic lookup against cached analysis (regex call executes at runtime), and calls execute identically across agents. The interface does not allow arbitrary code execution or debug symbols exposure. We initially conducted 100 pilot runs to set time and turn limits that give agents enough room to work without hanging the GPU cluster; 5
Setting
Qwen
Gemma
Opus
GPT
Gemini
Source, zero-shot Source, with-desc Binary, zero-shot Binary, with-desc
0.27 0.85 0.16 0.61
0.26 0.79 0.13 0.52
0.26 0.88 0.20 0.78
0.27 0.87 0.18 0.75
0.27 0.88 0.24 0.82
∆ decompilation ∆ description
−0.18 +0.51
−0.20 +0.46
−0.08 +0.60
−0.10 +0.59
−0.05 +0.60
Table 3: CVE recognition accuracy across models on CVE recognition task. ∆ decompilation is the mean accuracy drop from source to binary, averaged over the zero-shot and with-desc settings; ∆ description is the mean gain from providing the CVE description, averaged over source and binary inputs. Random baseline: 0.20.
Strategy-guided (Hit / ∆)
Solo Agent
Metric (baseline)
Gemma
Qwen
Opus
GPT
Gemini
Gemma-agent
Hit@1 Hit@5
0.00 0.02
0.15 / +0.15 0.32 / +0.32 0.29 / +0.29 0.24 / +0.24 0.29 / +0.29 0.21 / +0.19 0.34 / +0.32 0.31 / +0.29 0.27 / +0.25 0.31 / +0.29
Qwen-agent
Hit@1 Hit@5
0.03 0.12
0.38 / +0.35 0.72 / +0.69 0.83 / +0.80 0.75 / +0.72 0.78 / +0.75 0.53 / +0.41 0.82 / +0.70 0.86 / +0.74 0.81 / +0.69 0.85 / +0.73
Table 4: CVE locating performance on reference binaries (Eval 2). Each cell averages over agent results on 329 CVEs; Solo is the agent’s no-strategy baseline; ∆ is the uplift over the Solo baseline. Values are Hit@k accuracy in [0, 1].
these runs used a 30-minute, 1,000-turn cap and are not included in the final results (running-time and turn count statistics in the appendix). For the full evaluation we loosened these limits to a 1-hour wall-clock budget with no turn cap, so that agents are not cut off early. The agent terminates when the model commits to up to five candidates or returns 10 consecutive empty messages. A task scores Hit@k if any ground-truth function appears in the top-k answers; for multi-function CVEs, the best-ranked match is counted. We evaluate execution agents Gemma 4 and Qwen 3.6 in two settings: solo (locate vulnerable function given no context) and strategy-guided (strategies from five generator LLMs based on CVE, patch). Prompts are provided in the appendix. This way, we measure the generator LLMs’ understanding of vulnerability apart from its tool-calling capabilities, and the solo results provide a baseline to avoid noise introduced by agent execution. Table 4 reports solo Hit@k alongside strategy-guided Hit and uplifts. The Qwen agent benefits substantially more than the Gemma agent, reaching Hit@1 of 0.83 under Opus-authored strategies versus 0.29 for the Gemma agent on the same strategies. Opus produces the most effective strategies for the Qwen agent, leading on both Hit@1 and Hit@5, while Qwen-authored strategies lead for the Gemma agent. The Hit@1 spread across the five generators is also wider for the Qwen agent (0.38–0.83, std ≈ 0.16) than for the Gemma agent (0.15–0.32, std ≈ 0.06). This pattern suggests that tool-calling capability limits the effect of strategy quality: only when an agent can reliably execute the strategy, the strategic differences can affect the outcomes. The Qwen agent’s wider spread therefore reflects its stronger understanding and execution capability on this task. CVE Cross-Build Generalization The third task tests the generalization and understanding of the LLMs on vulnerability. We first verify that the build axes produce genuinely different decompiled code. On decompiled code pairs spanning 100 CVEs (259 Linux ELF and 194 Windows PE binaries; full table in appendix), CodeBLEU [65] drops with build divergence: 0.53–0.69 within-compiler cross-config, 0.45 cross-compiler within Linux, and 0.29 cross-OS. We execute the Eval 2 strategy-guided agents on every cross-build variant (Opt, Compiler, OS, Version, All), reusing the Eval 2 infrastructure. We report only the Qwen agent; Gemma’s reference6