後端工坊 2026 年 8 月 7 日

2026-08-07 — Linux 核心擬用 BPF 改寫 binfmt_misc、uutils/coreutils 0.10 測試通過率衝上 93%、CppCon 揭露 C++ Contracts 下一步擴充方向

primary=https://lore.kernel.org/linux-fsdevel/20260720-work-bpf-binfmt_misc-ptinterp-v1-0-ddb76c9a508e@kernel.org/ primary=https://lore.kernel.org/linux-fsdevel/20260714-work-bpf-binfmt_misc-v2-0-57b7529c002c@kernel.org/ primary=https://github.com/uutils/coreutils/releases/tag/0.10.0 primary=https://cppcon2026.sched.com/event/2RT7w primary=https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2025/p3846r0.pdf

Linux 核心提案:用 BPF 讓 binfmt_misc 自己決定該交給誰執行

Linux kernel mailing list (linux-fsdevel) · 2026-07-20

Linux 檔案系統維護者 Christian Brauner 於 2026 年 7 月 20 日送出 [PATCH 00/21] binfmt_misc: transparent interpreters and PT_INTERP loader substitution,銜接他 7 月 14 日提出的 [PATCH v2 0/9] binfmt_misc: bpf-backed binary type handlers。兩組 patch series 要讓沿用數十年的 binfmt_misc 子系統,改用 BPF 程式在執行期判斷該把執行檔交給哪個直譯器,而非只能靠註冊時寫死的 magic bytes 比對。LWN.net 8 月 6 日的報導把它形容為 binfmt_misc 近年最大的一次改造。

背景

問題源自 Nix 一類可重定位(relocatable)的 hermetic binary:正確的動態載入器只能相對於執行檔自身位置決定,而 PT_INTERPbinfmt_misc 現有的固定字串都無法表達這種關係。讓 PT_INTERP 支援 $ORIGIN 展開的第一個方案被 Brauner 否決:核心得依執行檔型別決定載入器,等於替 loader injection 開後門,且 bprm->file 未必有可用路徑(memfd、已刪除檔案)。打造可插拔 ELF 直譯器登記機制的第二個方案也被否決,因為那等同要為自訂格式各寫一個核心模組——binfmt_misc 當初就是為了終結這種做法而生。Farid Zakaria 先用一支跑在 SOCKET_FILTER 上的 eBPF 原型驗證可行性,Brauner 這次把它重寫成正式提案雛型。

核心改動

新提案把處理常式定義成一份 struct_ops:

struct binfmt_misc_ops {
    bool (*match)(struct linux_binprm *bprm);
    int  (*load)(struct linux_binprm *bprm);
    char name[BINFMT_MISC_OPS_NAME_MAX];
};

matchload 都是 sleepable 程式,可用 bpf_dynptr_from_file() 讀整個檔案,不再受限於 bprm->buf 預抓的前 256 bytes,entry walk 也因此改成 SRCU read-side critical section。新增的 kfunc 如 bpf_binprm_set_interp()bpf_binprm_set_flags()load 程式回填選定的直譯器路徑與旗標,驗證器則限制這些 kfunc 只能在 load 階段呼叫。註冊介面沿用既有文字介面並新增 B 旗標,例如 echo ':origin:B::::nix:' > /proc/sys/fs/binfmt_misc/register,nix 對應到已 attach 的 handler 名稱。

規格細節

7 月 20 日的系列加入兩種派送模式,解決「直譯器接管整個 process identity」的老問題:transparent dispatch(T 旗標)讓執行檔透過 AT_EXECFD 交給直譯器,argv 維持原樣,核心把 mm->exe_filecomm 標記為真正的執行檔;loader substitution(L 旗標)則是核心原生執行匹配到的 ELF 主體,只替換它 PT_INTERP 指名的載入器,一般動態載入器完全不必修改即可運作。兩種模式可並用,由同一支 handler 讀 ELF header 逐一判斷。

影響範圍

這組 21 個 patch 動到 fs/binfmt_misc.cfs/exec.cfs/binfmt_elf.c 與對應 selftests、文件,base-commit 為 34296289b1a6,目標分支 vfs-7.3.binfmt。Brauner 表示這仍是概念驗證,設計細節留給 Nix 社群的 Zakaria 與 John Ericson 接手,同時把 bpf 維護者 Daniel Borkmann、Alexei Starovoitov 與安全維護者 Kees Cook 都列進收件人,顯示這次改動需要 fs、bpf、security 三個子系統一起點頭才可能進 mainline。

原始來源:PATCH 00/21 binfmt_misc: transparent interpreters and PT_INTERP loader substitutionPATCH v2 0/9 binfmt_misc: bpf-backed binary type handlers


uutils/coreutils 0.10 發布,GNU 相容測試通過率衝上 93.48%

uutils/coreutils GitHub Releases · 2026-08-05

Rust 重寫版 GNU 核心工具集專案 uutils/coreutils 在 2026 年 8 月 5 日發布 0.10.0,把 GNU 官方測試套件的通過數從上一版 0.9.0 的 625 項推高到 645 項,總數維持 690 項不變,失敗數則從 56 項降到 29 項,是專案歷來單一版本進步最大的一次。發布公告提到本輪吸收了 0.9.0 把 GNU 對照版本升到 9.11、多出 25 項新測試而暫時墊高的失敗數。這個版本由 50 位新貢獻者共同完成。

核心改動

新版把安全強化列為重點:延續上一版的 TOCTOU 修補,touch 建檔時不再使用 O_TRUNCmkfifo 拿掉以路徑為準的 chmodhead 改成檢查已開啟的 fd 而非路徑本身;chmod/chown 也修了遞迴下降時的 symlink cycle 問題,cp 不再下降進目的地內是 symlink 的子目錄。mkdirmkfifomknod 現在會在建檔當下就套用 SELinux label,而不是事後再補上。專案同時新增了 SECURITY.md 說明威脅模型與回報流程。

規格細節

功能面新增 mv --exchange 可原子交換兩個路徑、install --reflinkinstall -C 搭配 --preserve-timestamps、checksum 系列工具改用 OpenSSL backend 加速、rm --one-file-system,以及 wasm32-wasip2 目標平台支援。效能方面 cksum 系列、sumsplitexpand/unexpand 都加了 read-ahead,tee 換上 zero-copy 路徑,exprindex 運算複雜度從 O(N×M) 降到 O(N+M)。此外移除了 20 多個工具中殘留的 panic/abort,涵蓋整數溢位、多位元組字元邊界、無上限記憶體配置等常見類別。

版本PassFailSkipPass 率
0.9.062556890.58%
0.10.0645291593.48%

影響範圍

此版把 ddkillsyncuptime 等工具底層的系統呼叫從 nix crate 繼續遷往 rustix,並持續清除 unsafe 區塊與 to_string_lossy 用法。相關改動分散在數百個 PR,例如 OpenSSL backend 對應 #12412、cksum 系列的 read-ahead 對應 #12549,發布頁面完整列出各工具對應的 PR 清單可供追蹤。專案也提供以 WebAssembly 執行的線上 Playground,可直接在瀏覽器測試新版行為。

原始來源:uutils/coreutils 0.10.0 Release Notes


CppCon 2026:Doumler 談 C++26 Contracts 之後還缺什麼

CppCon 2026 Schedule · 2026-09-14(議程公告 2026-08-06)

ISO C++ 委員會 SG21(Contracts study group)共同主席 Timur Doumler 將在 2026 年 9 月 14 日的 CppCon 2026 上發表 Towards a Complete Contract-Assertion Facility for C++,主張已定案的 C++26 Contracts 只是「一個經過仔細設計的地基」,並非這個功能的終點。isocpp.org 於 8 月 6 日公告此議程,講題聚焦在 C++26 之後、預計於 C++29 及更後續版本補上的擴充項目。

背景

Contracts 提案 P2900R14 在 2025 年 2 月 Hagenberg 會議上以「strong consensus」(N5007)正式進入 C++26 工作草案,提供三種斷言關鍵字 pre/post/contract_assert,以及四種求值語意 ignore/observe/enforce/quick-enforce。定案後仍有反對聲浪:Doumler、Joshua Berne 等人於 2025 年 10 月提出 P3846R0《C++26 Contract Assertions, Reasserted》,逐條回應 P3829R0P3835R0P3849R0P3851R0 等主張移除或大改 Contracts 的論文,涵蓋安全性、跨 TU 一致性、ODR、模組相容性等 17 項爭議。該文件並指出 GCC 與 Clang 的分支(P3460R0)已有完整實作,正推動 upstream。

規格細節

CppCon 議程摘要列出這場演講要談的擴充方向,全部瞄準 C++29 以後:

  • 在 virtual function 上標註 contract assertion
  • 以群組為單位設定求值語意(group-based evaluation semantics)
  • 限制式(constrained)求值語意
  • postcondition 可以參照函式執行前的舊值
  • 使用者自訂違約診斷訊息
  • 編譯器自動產生、用來防護未定義行為的隱含斷言

更遠的構想還包含 class invariant 與函式指標(function pointer)層級的 contract,議程摘要把它們列為「future ideas」而非已在討論中的正式提案,換句話說連 SG21 內部都還沒有具體 paper 對應。

影響範圍

Doumler 本身共同主持 podcast CppCast,長期主導 Contracts 在 WG21 內的推進;這場演講排在 2026 年 9 月 14 日 14:00–15:00(MDT),是 CppCon 2026 正式議程之一。由於 C++26 的 Contracts 定案過程本身就伴隨多輪爭議與回應論文,這場演講等於是在標準正式出爐前,先把 SG21 下一階段的待辦清單攤開讓社群檢視。

原始來源:CppCon 2026 Schedule: Towards a Complete Contract-Assertion Facility for C++P3846R0: C++26 Contract Assertions, Reasserted


End of article
0
Would love your thoughts, please comment.x
()
x