You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
error: runtime closure validation failed (proven Linux ELF defect)
runtime closure for …/bin/hostonly cannot be satisfied: libcap.so.2 not found
on the search path this artifact will actually use.
Its PT_INTERP is a private loader, so the host's /usr/lib is NOT
consulted — the program will fail to start with "cannot open shared
object file".
Fix: install the provider into the selected SubOS …
实测环境:mcpp
2026.8.30.1(本分支),gcc 16.1.0,Linux x86_64,SubOS 里装了 Mesa。概述
[build] ldflags = ["-L/usr/lib/...", "-lgbm"]在运行期闭包能被满足时静默通过。产物的 ABI 取自宿主的/usr/include+/usr/lib,而它自己的私有加载器把同一个 soname 解析到 registry 里的另一份构建。链接的是 A,加载的是 B,没有任何东西说一句话。这个守卫本身是好的 —— 它只是按闭包可满足性判,不按宿主路径判,于是当 soname 两边都存在时,它在结构上就不可能触发。
复现
构建输出全文:
exit 0,零告警。
两份库确实不是同一个
soname 都是
libgbm.so.1。产物的DT_NEEDED是libgbm.so.1,RPATH里有subos/default/lib,于是私有加载器拿到的是后者。与现有守卫的关系
守卫在宿主独有的库上工作得很好。同一个工程换成
-lcap(SubOS 里没有):消息很好,出路也点明了。缺口只在两边都有同名 soname的那一格 —— 而那恰好是图形栈这类工程最常落进去的一格。
为什么值得单独修
它是 [Bug & RFC] 系统工具链 build.mcpp 执行失败缺陷、原生宿主模式与工作区继承规范提案 #527 §1 里真正属于 mcpp 的那部分。 docs(examples): 09 —— 系统级图形栈,用推荐方式做完整条链 (#527) #532 的论证里写着「
-L/usr/lib是错误用法,mcpp 在构建期就明说了」;在装了 Mesa 的机器上,mcpp 什么都没说。不该写宿主-L的理由不是 mcpp 会拒,而是 mcpp 拒不了。失败被推迟到最坏的位置。 两份构建的差异要到运行期才显形,可能是崩溃,也可能是行为不同而不崩 —— 而构建日志里没有任何线索指回那一行
ldflags。它让「零 Host 闭包」这类断言不可核验。 在开发机上用私有加载器
--list数出来的闭包,分不开「由声明的包满足」和「由这台机器碰巧装了的东西满足」。可能的方向(未验证,供讨论)
-l实际解析到的文件,与运行期闭包解析到的文件比对,不一致就报。信息在两侧都有,只是从没对过。[build] ldflags里出现宿主搜索路径(/usr/lib、/lib64、/usr/local/lib)时,不论闭包是否可满足都给一条 degraded 诊断,说明产物的 ABI 来源与加载来源可能不是同一份。这条不需要任何新信息。后者更便宜,前者才是判据落在事实上。
相关
-L做完整一条链;其 §「为什么是示例」里那句关于构建期告警的话需要按本 issue 修正).agents/docs/2026-08-30-issues-532-533-534-analysis.md§3