Repository navigation
feat(ostool): 支持 ELF/BIN FIT 生成 - #196
Conversation
新增默认关闭的 artifacts.analysis 配置,复用 Rust 工具链 LLVM 和现有 artifact registry 生成反汇编、ELF 信息与符号列表。通过 object 解析架构、 入口、PT_LOAD 与可选 __executable_start,显式请求失败时返回具体错误。 分离原始 ELF 和运行时副本,避免 .elf 输入原地覆盖;添加 BIN 时保留 符号来源与调试产物登记,新构建则清理旧登记。完整 BuildConfig 接入 构建与运行入口,保留 Cargo 选择、hooks 和 Custom runner 配置读取顺序。 同步中英文 README 与公开 API 编译用例。 验证:devbox 原生格式化、workspace clippy/build/test 全部通过; ostool all-targets/all-features clippy -D warnings 通过。新增实际 LLVM 产物、ELF metadata、状态更新和 CLI hook 回归测试。 x86_64 CI 命令已尝试,本地因缺少交叉 sysroot/libudev 与 C 编译器阻塞。 Co-authored-by: OpenAI Codex <codex@openai.com> Signed-off-by: Niu Zhihong <zhihong@nzhnb.com>
复用 tempfile 管理分析产物的临时文件和替换,移除手工暂存路径及重复的 runtime 来源状态。将完整配置运行入口收窄为 cargo_run_with_config, Custom CLI 继续在构建完成后读取 runner 配置,并同步中英文说明。 删除重复成功/路径/默认配置断言和 ELF32 大端专项夹具,合并状态更新与 runner hooks 测试;保留 ELF 元数据、错误处理、strip 来源和构建兼容覆盖。 Co-authored-by: OpenAI Codex <codex@openai.com> Signed-off-by: Niu Zhihong <zhihong@nzhnb.com>
删除 metadata 层重复的非法 ELF 验证,保留分析入口的失败回归。 将 Custom build-only 状态断言并入重建测试,删除配置通用序列化 往返及可由其他检查推出的断言。简化无符号 ELF 与 PT_NOTE 夹具, 保留多段地址区分、符号定义状态和原始 ELF 来源验证。 Co-authored-by: OpenAI Codex <codex@openai.com> Signed-off-by: Niu Zhihong <zhihong@nzhnb.com>
移除独立构建与 CLI 分析验收文件、手工 ELF 测试夹具和假工具测试。 完整场景保留为本地验收,仓库仅新增短配置解析测试,并在已有 runtime/build 用例中验证源 ELF 不被覆写及旧分析登记失效。 移除只用于测试注入的 resolver 包装,直接调用既有 LLVM 定位函数。 产物生成、metadata 解析及错误处理行为保持一致。 Co-authored-by: OpenAI Codex <codex@openai.com> Signed-off-by: Niu Zhihong <zhihong@nzhnb.com>
新增 crate 内部 FIT format、OS、load/entry、FDT 与输出配置,继续复用 fitimage builder 与既有 runtime BIN 转换。原始 ELF 提供符号和入口, runtime ELF 提供实际 payload;拒绝来源布局不一致和无效加载数据。 显式地址优先,auto load 优先采用 __executable_start;缺失符号时, ELF 要求 PT_LOAD 的物理地址减文件偏移具有共同基址,BIN 按实际 file-backed allocated section 的 LMA 推导。合法零地址保留,歧义和 溢出明确报错。小幅补充既有 ELF metadata 的 section 信息,不新增解析器。 默认 U-Boot Linux FIT、LoongArch header 及 unsupported architecture 行为保持兼容。新配置输出原子替换以保护输入硬链接,空 BIN 明确失败。 用户入口留待后续接入,不增加 CLI、公开 Rust API 或配置文件字段。 新增真实 FIT 属性和提取字节检查、地址/来源/错误路径及配置往返测试。 devbox 原生 fmt、workspace clippy/build/test(630 项)以及 ostool all-targets/all-features Clippy -D warnings 通过,FIT 聚焦 26 项通过。 x86_64 CI 三条命令已尝试,受容器交叉 C 编译器和 libudev sysroot 缺失阻塞。 Co-authored-by: OpenAI Codex <codex@openai.com> Signed-off-by: Niu Zhihong <zhihong@nzhnb.com>
保留 ELF/BIN 自动加载地址区别和配置往返两项短测试, 移除独立 FIT 集成测试文件、手写 ELF 和外部工具夹具。 生成逻辑保持不变,完整场景保留为本地验收。 devbox 格式检查、cargo test -p ostool 和严格 Clippy 通过。 Co-authored-by: OpenAI Codex <codex@openai.com> Signed-off-by: Niu Zhihong <zhihong@nzhnb.com>
合入 upstream/main,保留 FIT 所需的 ELF section 元数据及现有解析行为。 Co-authored-by: OpenAI Codex <codex@openai.com> Signed-off-by: Niu Zhihong <zhihong@nzhnb.com>
There was a problem hiding this comment.
审查结论
本 PR 新增 crate-private FitConfig 与 ELF 元数据解析,支持生成 ELF/BIN FIT、自动或显式设置 load/entry、可选 FDT 和输出路径;旧的 Linux U-Boot FIT 生成路径仍保留,且 PR 明确暂不新增 CLI 或用户配置入口。变更主要影响后续 boot-prepare 调用方,不改变当前默认 U-Boot 流程。
验证与上下文
- GitHub check
check (stable, x86_64-unknown-linux-gnu)在目标 headf2bcdaaa73422520483acd8ba3b8fc1f80f91a41上成功。 git diff --check origin/main...HEAD通过,HEAD 与审查目标一致。- 本地
cargo fmt --check、cargo clippy --manifest-path ostool/Cargo.toml --all-features -- -D warnings和cargo test --manifest-path ostool/Cargo.toml --all-features均因审查环境没有cargo(退出码 127)未能运行;这不是 PR 代码导致的失败。 - 当前 PR 没有既有 review、review comment 或 issue comment 需要处理。相近的 PR #193 是本 PR 声明的依赖,相关的 FIT/boot 边界重构 PR #123 仅作为实现模式参考。
需要修复的问题
- 配置化 BIN 路径没有复用 LoongArch Linux 镜像头部的入口地址换算,见行内评论。对于带
MZ头的原始 LoongArch Linux BIN,FIT entry 必须按镜像头部相对偏移计算。 - BIN 自动 entry 直接使用 ELF
e_entry,但 BIN load base 按PT_LOAD.p_paddr/section LMA 推导;VMA 与 LMA 不同的合法 ELF 会被加载到一个地址却跳到另一个地址,见行内评论。
这两项都会导致生成的 FIT 在目标设备上无法正确启动。当前新增测试覆盖了地址解析的简单合成数据和旧生成路径,但没有覆盖 configured BIN/LoongArch 或 VMA/LMA 不同的 ELF;实际 U-Boot/硬件启动也未在本次环境验证。
Powered by gpt-5.6-luna
ZR233
left a comment
There was a problem hiding this comment.
当前 PR 只增加 crate 内部的 FIT 配置和生成入口;.build.toml、.uboot.toml 以及既有 U-Boot runner 的配置解析与调用点均未改动,旧配置仍走原来的 Linux FIT 生成路径。CI 通过证明了现有检查通过,但新增的 generate_configured_fit 尚未被用户入口调用,不能据此认定 ELF/BIN 新路径已经可启动。
请先修复下面两处地址语义问题,并增加从真实 ELF 生成 FIT、检查 FIT 属性与 payload 的回归验证。当前已有审查指出 LoongArch 及 BIN entry 的问题;这里的两处是额外发现。
后续接入用户配置时,建议在父配置使用可选字段,以“未填写继续走旧 generate_fit_image、显式填写才使用新生成路径”为语义。不要仅凭 FitConfig 的字段默认值切换旧流程:Auto 地址和空 FDT 可能覆盖旧的 kernel_load_addr、dtb_file。若字段放入 .uboot.toml,还需同步 UbootConfigWire 的反序列化;若板卡流程也要使用,需同步 .board.toml 到 UbootConfig 的映射。
保留配置化 FIT 生成入口,以及 main 的 ramdisk、Rockchip 兼容和设备树旧 initrd 清理逻辑。适配共享 FIT builder 与现有测试调用,不改变地址解析规则。 验证:ARM64 devbox 格式检查、ostool Clippy、构建及库、CLI、集成和文档测试通过。严格 all-targets Clippy 受 main 已有 axloader 测试模块位置问题阻断;未运行 x86_64 CI matrix。 Co-authored-by: OpenAI Codex <codex@openai.com> Signed-off-by: Niu Zhihong <zhihong@nzhnb.com>
There was a problem hiding this comment.
审查结论
REQUEST_CHANGES。本 PR 在 base 之上新增 crate-private FitConfig(ostool/src/boot/fit_config.rs)、给 ElfMetadata 增加 load_sections、新增 generate_configured_fit,并把 FIT 写文件拆成 write_fit_image,使后续入口能按 ELF 元数据推导 load/entry 并生成 ELF 或 BIN payload 的 FIT;旧的 generate_fit_image(U-Boot Linux 路径)行为未变。
影响面
- 旧路径未变:
generate_fit_image仍是os = "linux",仍对 LoongArch 调resolve_kernel_entry_addr,ostool/src/run/uboot.rs:1327的调用点未改。 - 新增的
generate_configured_fit与fit_config模块本 PR 内仍是#[allow(dead_code)],没有调用方,所以本 PR 不改变任何现有用户可见行为;真正受影响的是“FITload/entry/os如何被 U-Boot 解释”这一契约语义,即下面三个行内问题。
验证
- CI:head
f33dbd5386f42759e79aff110ebb541bf9250be3的check (stable, x86_64-unknown-linux-gnu)为 success(2026-10-09 完成),因此 fmt/clippy/build/test 在该 head 上是通过的。 - 本地:
git diff --check origin/main...HEAD通过,HEAD 与审查目标一致。本审查环境没有cargo(which cargo未找到,退出码 127),未能本地复跑cargo fmt --check、clippy、cargo test;这不是本 PR 导致的失败,但也意味着新增地址推导只由 CI 中的合成单测覆盖。未做任何硬件/U-Boot 实机启动验证。
需要修复(阻塞)
- F-001:
os = "elf"的 FITentry语义不成立(fit_config.rs:24,行内)。 - F-002:BIN 的
load优先采用__executable_start(VMA)(fit_config.rs:83,行内)。 - F-003:BIN 的
entry直接采用e_entry,与 LMA 推导的 load 不在同一地址空间(fit_config.rs:92,行内)。
上一轮 review 的处理情况
两条既有 review 均为 CHANGES_REQUESTED(提交于 f2bcdaa),其行内评论经 GitHub 迁移后仍锚定当前 head,当前 head 既未修复也未回复(f2bcdaa、f33dbd5 两个提交都只是与 main 的合并冲突同步):
- mai-team-app[bot]:LoongArch 入口换算被绕过(
fit.rs:164);BIN Auto entry 用e_entry(fit_config.rs:92)。第二条技术成立,保留为 F-003;第一条按 F-004 记为 advisory,需要作者确认派生 BIN 是否仍带历史 MZ 头。 - ZR233:[P1]
bootelf需要 ELF 头地址而不是e_entry,以及os = "elf"与format = "bin"组合问题;[P2]__executable_start是 VMA 却用于 BIN load。两条我都按 U-Boot 源码复核后确认成立(do_bootm_elf()→bootelf(bmi->images->ep, ...),images->ep来自 FITentry;boot/image.c的uimage_os[]中{IH_OS_ELF, "elf"}被#ifdef CONFIG_CMD_ELF包裹),分别保留为 F-001 与 F-002。唯一需要修正的是“os = "elf"不被 U-Boot 支持”的部分:IH_OS_ELF/"elf"确实存在,但依赖目标 U-Boot 开启CONFIG_CMD_ELF,并且必须给出正确的 entry。 - ZR233 的 review body 还要求补真实 ELF 的回归验证,当前仍未提供(见下)。
遗留风险与测试缺口
- F-004(advisory):配置化路径没有复用
resolve_kernel_entry_addr,两条路径对“以MZ开头的二进制 payload”的 entry 语义可能不一致;请确认派生 BIN 是否仍带该头部,否则应复用同一换算或说明原因。 - F-005(advisory):新增路径没有调用方也没有端到端测试;
fit_config.rs的合成夹具恰好把executable_start设为None、把entry设为按 LMA 推导出的值,正好绕开了 F-002/F-003 的分支。建议在接线 PR 前补“真实 ELF → 生成 FIT → 断言 kernel 的os/load/entry与 payload”的测试,并明确format/os的合法组合矩阵。 - 复核后未发现问题的地方:
NamedTempFile+persist的输出替换、输出与输入同路径/符号链接的保护、validate_elf_load_data的溢出与截断检查、section_lma()与 objcopy/BFD 的 LMA 规则一致性、toml/json往返测试(CI 覆盖)、以及旧路径的兼容性。
相近工作
本 PR 声明依赖 #193;相关既有改动为 FIT 边界重构 #122/#123(其中已说明 os = "elf" 应作为独立功能处理)与 FIT 修复 #194/#201/#207。未发现与本 PR 重复的开放 PR。
Powered by deepseek-flash
ELF OS 仅接受 ELF payload,并要求显式提供安全暂存地址;自动入口使用文件头地址,拒绝不一致的显式入口。LoongArch Linux BIN 自动入口复用已有镜像头换算。 BIN 自动地址核对实际 payload LMA;符号冲突、入口映射不明或加载位置变化时要求显式覆盖。保留合法零地址和现有默认生成流程,不增加用户配置入口。 验证:ARM64 devbox 格式、Clippy、构建及 ostool 测试通过。真实 ELF/FIT 本地验收检查 payload 完整字节、OS、架构和地址。未运行 x86_64 CI matrix 或硬件启动。 Co-authored-by: OpenAI Codex <codex@openai.com> Signed-off-by: Niu Zhihong <zhihong@nzhnb.com>
There was a problem hiding this comment.
审查结论
REQUEST_CHANGES。本 head 修掉了上一轮的三个阻塞项中的两个半,地址语义整体比 f33dbd5 明显更严谨;但 FitFormat::Elf 的自动 load 仍沿用“优先取 VMA 符号”的旧写法,与本次刚在 BIN 分支建立的规则自相矛盾,会在 VMA≠LMA 或首个 PT_LOAD 偏移非零时生成放错位置的 ELF payload,属于同一类会“生成成功但启动不了”的问题,建议一并收敛。
本 PR 做了什么、影响面
- 新增 crate-private
FitConfig/FitAddress/FitFormat/FitOs(ostool/src/boot/fit_config.rs)与ElfMetadata.load_sections,新增内部入口generate_configured_fit,并把写 FIT 的部分拆成write_fit_image;write_fit_image接受os,因此旧路径generate_fit_image依然固定写os = "linux"。 - 影响面:
generate_configured_fit与fit_config模块在本 PR 内仍是#[allow(dead_code)](ostool/src/boot/mod.rs),用户入口、.uboot.toml/.board.toml解析和ostool/src/run/uboot.rs:1327的调用点都未改,所以本 PR 不改变现有用户可见行为;真正被固定下来的是“FIT 的load/entry如何按 ELF 元数据推导”这一契约,供 PR 3 接入时依赖。旧路径行为等价(仅build_default_fit_config→build_fit_config加参、测试同步更新)。
上一轮 review 的处理情况
- mai-team-app[bot](F-001):
os = "elf"的 entry 语义 → 已修。resolve_entry现在对FitOs::Elf返回load,并拒绝与load不一致的显式entry;同时resolve_load拒绝os = elf+format = bin。与 U-Bootdo_bootm_elf()→bootelf()需要“内存中 ELF 头地址”的语义一致。 - mai-team-app[bot](F-002):BIN
load优先用__executable_start(VMA) → 已修。现在先用bin_load_base()(按 section LMA 推导),符号只在与该基址一致时被接受,冲突则报错要求显式load。 - mai-team-app[bot](F-003):BIN
entry直接用e_entry(VMA) → 已修。bin_entry()现在要求load == bin_load_base(),且 entry 必须落在某个 LMA==VMA 的 file-backed section 内,否则要求显式entry。 - mai-team-app[bot](F-004,advisory):LoongArch 入口换算被绕过 → 已修。
generate_configured_fit对 LoongArch64 + BIN +os = linux+ payload 带MZ头且entry = auto时复用resolve_kernel_entry_addr,与旧路径同一公式。 - ZR233 的两条(
bootelf需要 ELF 头地址、__executable_start是 VMA)都已按上面两点修复;其 review body 里“补真实 ELF 生成 FIT 的回归验证”仍未落地(见下 F-103)。
验证
- CI:head
8076e5d40c1e32c148c5c2b6d4daad73896f683d的check (stable, x86_64-unknown-linux-gnu)为 success(2026-10-09T07:06:45Z 完成,check run 113708984995),因此该 head 的cargo fmt/clippy/build/test 在 CI 环境是通过的;未发现与本 PR 相关的失败 CI。 - 本地:
git rev-parse HEAD=8076e5d…、git rev-parse origin/main=787943d…,工作区干净,与审查目标一致;git diff --check origin/main...HEAD通过。本审查环境没有cargo(/bin/sh: 1: cargo: not found,退出码 127),cargo fmt --check、cargo clippy --manifest-path ostool/Cargo.toml --all-features -- -D warnings、cargo test --manifest-path ostool/Cargo.toml --all-features均未能运行,这不是本 PR 导致的失败。未做任何 U-Boot/硬件启动验证,以下地址语义判断基于 U-Bootbootm(FITload为 payload 落点、entry为跳转地址)与objcopy -O binary的 LMA 布局规则。
需要修复(阻塞)
- F-101(
ostool/src/boot/fit_config.rs:101-104,行内):FitFormat::Elf+FitAddress::Auto仍优先采用 VMA 符号__executable_start,只在符号缺失时退回elf_load_base()(=p_paddr - p_offset)。ELF payload 的load必须是“文件首字节地址”,而符号是 VMA;与本次 BIN 分支刚建立的规则不一致。详见行内评论。
遗留风险与建议(均非阻塞)
- F-102(advisory):LoongArch 的 entry 换算在
ostool/src/boot/fit.rs:145-153由调用方完成,FitConfig::resolve_entry()的返回值会被按 payload 字节静默覆盖,“Auto entry”的解析不再有唯一入口;建议收敛到一个函数,避免后续接入时两处不一致。 - F-103(advisory):仍无“真实 ELF → 生成 FIT → 断言
os/load/entry/payload”的端到端回归;现有夹具把executable_start设为None(ostool/src/boot/fit_config.rs:291),恰好跳过 F-101 所在分支。 - F-104(advisory):
write_fit_image从参数取kernel_entry_addr、却从input.kernel_load_addr取 load,并忽略input.kernel_entry_addr;建议统一来源或加断言。 - F-105(advisory):新写出路径用
NamedTempFile+persist,会把image.fit权限固定为0600(旧fs::write路径遵循 umask);请确认下游(TFTP/ostool-server/其它用户)是否需要可读权限。 - 复核后未发现问题的地方:
os = elf/format = bin组合拒绝、validate_elf_load_data的截断与溢出检查、输出与输入同路径/符号链接的保护(含 rename 不破坏硬链接的说明)、bin_load_base/section_lma与 objcopy LMA 规则的一致性、toml/json往返测试、以及旧 U-Boot Linux 路径的兼容性。
相近工作
本 PR 声明依赖 #193;相关既有工作为 FIT 边界重构 #122/#123、FIT 修复 #194/#201/#207。未发现与本 PR 重复的开放 PR。
Powered by gpt-5.6-luna
Powered by deepseek-flash
ELF/Linux 自动加载地址校验完整文件的装载基址;符号地址冲突、入口映射不明或加载位置变化时要求显式覆盖,避免生成不可可靠启动的 FIT。 FIT 输出保留已有文件权限,新文件遵循 umask。最终入口统一由 FitInput 传递,保持默认 Linux 与 LoongArch 镜像头处理兼容。 验证:ARM64 devbox 格式、Clippy、构建及 ostool 测试通过。真实 ELF/BIN FIT 内容、地址、LoongArch 入口、文件权限与原子替换的本地验收通过。未运行 x86_64 CI matrix 或硬件启动。 Co-authored-by: OpenAI Codex <codex@openai.com> Signed-off-by: Niu Zhihong <zhihong@nzhnb.com>
There was a problem hiding this comment.
审查结论
COMMENT(未发现阻塞问题):在 head e7b566e 上未发现阻塞性缺陷——没有 fmt/clippy/test 失败,也没有安全、数据丢失、panic、竞态或行为回退类问题。上一轮唯一的阻塞项(format = "elf" 的 Auto load 仍优先采用 VMA 符号 __executable_start,见 c926f0c0 的 F-101)已在本 head 修复,且比建议更完整:符号只在与 ELF 容器基址一致时才被接受,同时 FitAddress::Auto 的 entry 统一改走 direct_entry(),会校验“entry 落在 LMA==VMA 的 file-backed section 内”。下面 4 条均为 advisory,可作为合并前或接线 PR 中的跟进项。
本 PR 做了什么
- 新增
ostool/src/boot/fit_config.rs:crate-privateFitConfig/FitFormat/FitOs/FitAddress/FitFdt,以及地址推导resolve_load()/resolve_entry()与bin_load_base()/elf_load_base()/section_lma()。 ostool/src/artifact/elf_metadata.rs:新增LoadSection与load_sections(SHF_ALLOC、非 SHT_NOBITS、file_range()存在且 size≠0)。ostool/src/boot/fit.rs:新增内部入口generate_configured_fit()与validate_elf_load_data();写文件部分抽成write_fit_image(..., os);旧generate_fit_image()仍固定os = "linux"、仍对 LoongArch 镜像头调用resolve_kernel_entry_addr(),最终 entry 统一经FitInput.kernel_entry_addr传递。ostool/src/boot/mod.rs:注册fit_config模块并标注#[allow(dead_code)](用户入口由后续 PR 接入)。
影响面
- 旧路径等价:
build_default_fit_config→build_fit_config(..., FitOs::Linux)只是加参数;ostool/src/run/uboot.rs:1327的调用点、.uboot.toml/.board.toml解析与用户可见行为均未改。 - 本 PR 内
generate_configured_fit与fit_config没有调用方,改动完全内部化;真正被固定下来的是“FITload/entry如何由 ELF 元数据推导”这一契约,供下一个接线 PR 依赖。 - 复核后未发现问题的部分:
os = "elf"必须format = "elf"且 entry 必须等于 load(与 U-Bootdo_bootm_elf()→bootelf()需要内存中 ELF 头地址一致);os = "elf"的 Auto load 明确拒绝并要求显式 staging 地址;BIN/ELF 两种 payload 的load都以实际落盘布局为准,符号地址冲突时要求显式指定;validate_elf_load_data()的文件范围/溢出检查;输出用NamedTempFile+persist原子替换,hard link 输入不会被截断(相对旧fs::write是改进),输入别名检查覆盖 source/runtime ELF 与 FDT;Builder::permissions(0o666)在 unix 上受 umask 收窄(tempfile 文档:permissions & !umask),新建输出与fs::write语义一致、已有输出保留原权限;生产路径无unwrap()/expect()/unsafe;BIN 派生使用独立tempdir(),成功/失败路径都会清理。
验证
- CI:head
e7b566e的check (stable, x86_64-unknown-linux-gnu)为 success(check run 113718682003,2026-10-09T07:37:57Z 完成),该工作流包含cargo fmt --all -- --check、cargo clippy、cargo build、cargo test。未发现与本 PR 相关的失败 CI。 - 本地:
git rev-parse HEAD=e7b566e…、git rev-parse origin/main=787943d…,工作区干净,git diff --check origin/main...HEAD通过。本审查环境没有cargo(which cargo未找到,退出码 127),cargo fmt --check/cargo clippy --all-features -- -D warnings/cargo test --all-features未能本地复跑;这不是本 PR 导致的失败。 - 未做 U-Boot/硬件实机启动验证。
上一轮 review 的处理情况
- 3f79b038(F-001/F-002/F-003)与 ZR233 的 [P1]/[P2]:均已修复——
os = "elf"的 entry 语义、BINload按 section LMA 推导、BINentry与load落在同一地址空间。 - c926f0c0(F-101,阻塞):已修复(
elf_load_base()优先,符号不一致则报错要求显式load)。 - c926f0c0 的 F-104(
write_fit_image的 entry 参数与input.kernel_entry_addr来源不一致)与 F-105(NamedTempFile把输出固定为 0600):本 head 一并修掉。 - ZR233 的 review body 仍要求“真实 ELF → 生成 FIT → 断言属性/payload”的回归验证,本 head 未提供(见 F-201;提交信息已记录人工验收,按 /project/repo/AGENTS.md“通过测试或记录过的手动验证覆盖”有人工依据,故不作为阻塞)。
遗留风险与测试缺口(均非阻塞,对应行内评论)
- F-201(无端到端回归,body-only):
generate_configured_fit/fit_config在本 PR 内无调用方,覆盖仅靠合成ElfMetadata夹具与build_fit_config单测;建议在接线 PR 前补“真实 ELF(CI 已装 llvm-objcopy/cargo-binutils)→ 生成 FIT → 断言os/load/entry与 payload”的用例,至少覆盖 format=bin / format=elf / os=elf 三个分支。 - F-202(entry 策略两处解析,
fit.rs:146-155):LoongArch 镜像头换算内联在生成入口,FitConfig::resolve_entry()在该分支不被调用,也跳过 Bin 的落点校验。 - F-203(ELF 容器 Auto load 偏严,
fit_config.rs:101-112):elf_load_base()要求所有 file-backed PT_LOAD 共享同一p_paddr - p_offset,否则要求显式load(fail-closed,但带 gap 的真实内核 ELF 基本无法用 Auto)。 - F-204(
fit_config.rs:144-161):format = "elf"+ 默认os = "linux"下只校验 entry 所在 section 的 LMA==VMA,其余 section 的 VMA≠LMA 不会被拒绝。
相近工作
本 PR 声明依赖 #193;相关既有改动为 FIT 边界重构 #122/#123(其结论已声明“os = "elf" 应作为独立功能处理”)、boot readiness #129、以及 FIT 修复 #194/#201/#207。未发现与本 PR 重复的开放 PR。
Powered by deepseek-flash
原始 ELF 与 runtime ELF 为同一路径时复用已验证的字节和元数据,路径不同时保留完整布局校验。 FIT 成功日志由生成入口在最终输出写入成功后记录,配置化路径显示真实输出地址,避免临时文件写完就提前报告成功。 验证:ARM64 devbox 格式、Clippy、构建及 ostool 测试通过。本地验收覆盖同路径与独立 runtime ELF 的 ELF/BIN 内容、写入失败无成功日志及默认路径日志。未新增测试文件,未本地复现 x86_64 CI matrix。 Co-authored-by: OpenAI Codex <codex@openai.com> Signed-off-by: Niu Zhihong <zhihong@nzhnb.com>
There was a problem hiding this comment.
审查结论
COMMENT(未发现阻塞问题)。 本 head ecfaef5 相对上一轮已审的 e7b566e 只多一个小提交(refactor(ostool): 精简 FIT 输入读取与成功日志,仅 ostool/src/boot/fit.rs,+24/-15):把“source ELF 与 runtime ELF 同路径”时改写为复用已读字节,并把 FIT image ok 日志从 write_fit_image 移到两个生成入口。地址解析、FitConfig 与旧 U-Boot 路径均未改动,因此上一轮结论继续成立:无阻塞问题,剩余 3 条既有 advisory 仍然成立。
本 head 的具体改动与评价
ostool/src/boot/fit.rs:81-100:prepared.source_elf() == prepared.elf()时直接复用source_data,路径不同时保留 arch/entry/load_segments/load_sections 的完整一致性校验。prepare_runtime_artifacts()会对输入 ELF 做canonicalize(ostool/src/artifact/runtime.rs:90),所以同路径判断在两者确为同一文件时可靠;行为等价,省掉一次 ELF 读取。ostool/src/boot/fit.rs:217、ostool/src/boot/fit.rs:280-282:成功日志移出write_fit_image,改为在最终输出persist成功之后由调用入口记录,配置化路径不再显示临时文件路径。这修掉了此前“写到临时文件就报告成功、且打印临时路径”的问题。
影响面
- 旧路径等价:
generate_fit_image仍固定os = linux、仍对 LoongArch 调resolve_kernel_entry_addr;ostool/src/run/uboot.rs:1327的调用点、.uboot.toml/.board.toml解析和用户可见行为均未改。 generate_configured_fit与fit_config模块在本 PR 内仍无调用方(ostool/src/boot/mod.rs:6-7),改动完全内部化;被固定下来的仍是“FITload/entry如何由 ELF 元数据推导”这一契约,供接线 PR 依赖。
验证
- CI:head
ecfaef5的check (stable, x86_64-unknown-linux-gnu)为 success(check run 116208233208,2026-10-15T02:12:49Z 完成),该工作流包含cargo fmt --all -- --check、cargo clippy、cargo build、cargo test。未发现与本 PR 相关的失败 CI。 - 本地:
git rev-parse HEAD=ecfaef5…、git rev-parse origin/main=787943d…、工作区干净、git diff --check origin/main...HEAD通过。本审查环境没有 Rust 工具链(cargo/rustc/objcopy/readelf均不存在),cargo fmt --check、cargo clippy、cargo test未能本地复跑;这不是本 PR 导致的失败,也意味着地址推导目前只由 CI 中的合成单测覆盖。未做任何 U-Boot/硬件启动验证。
上一轮 review 的处理情况
- F-001/F-002/F-003 与 ZR233 的 [P1]/[P2]:均在
8076e5d修复(os = "elf"的 entry 语义、BINload按 section LMA 推导、BINentry与load同地址空间),本 head 未回退。 c926f0c0的 F-101(阻塞)已修复;F-104(entry 参数来源不一致)与 F-105(输出权限)也已修复。- ZR233 要求的“真实 ELF → 生成 FIT → 断言属性/payload”回归仍缺失(见 F-301):ecfaef5 的提交信息记录了本地人工验收(同路径/独立 runtime ELF、写入失败无成功日志),按
/project/repo/AGENTS.md“通过测试或记录过的手动验证覆盖”可以接受,因此不阻塞。
遗留问题(均非阻塞)
- F-301(advisory,
ostool/src/boot/fit.rs:81,行内):本 head 新增的同路径分支与整个generate_configured_fit没有自动化测试覆盖,建议接线前补真实 ELF 的端到端回归。 - F-302(advisory,
ostool/src/boot/fit.rs:153-160,body-only;同一位置的既有行内评论 4227846823 已锚定本 head):LoongArchMZ镜像头的 entry 换算内联在生成入口,FitAddress::Auto有两个解析点,并绕过resolve_entry()对 BIN 的 entry 校验;建议把 payload 相关换算收敛进FitConfig。 - F-303(advisory,
ostool/src/boot/fit_config.rs:101-112,body-only;既有行内评论 4227846828):elf_load_base()要求所有 file-backed PT_LOAD 共享同一p_paddr - p_offset,fail-closed 但偏严,带 gap 的内核 ELF 只能显式load。 - F-304(advisory,
ostool/src/boot/fit_config.rs:144-168,body-only;既有行内评论 4227846833):direct_entry()只校验 entry 所在 section 的LMA == VMA;format = "elf"+ 默认os = "linux"下其余段若 VMA≠LMA 仍会生成成功。 - 复核后未发现问题的地方:
NamedTempFile+persist的原子替换与权限保留(新输出走 umask、已有输出保留原权限)、输出与输入别名/硬链接保护、validate_elf_load_data()的截断与溢出检查、section_lma()与 objcopy/BFD LMA 规则的一致性、toml/json往返测试、以及旧 U-Boot Linux 路径的兼容性。
相近工作
本 PR 声明依赖 #193;相关既有工作为 FIT 边界重构 #122/#123、boot readiness #129、FIT 修复 #194/#201/#207。未发现与本 PR 重复的开放 PR。
Powered by deepseek-flash
ELF 段的文件基址冲突时,报告两段的文件偏移与所需基址,并说明单一 load 无法保持该布局,显式地址不会重排 payload。 补充自动 entry 仅校验入口映射的注释,说明其他段可由启动代码建立映射或重定位。保留现有地址判定及 LoongArch 处理。 验证:ARM64 devbox 格式检查、FIT 聚焦测试、Clippy、构建及 ostool 测试通过;未新增测试,未本地复现 x86_64 CI matrix。 Co-authored-by: OpenAI Codex <codex@openai.com> Signed-off-by: Niu Zhihong <zhihong@nzhnb.com>
There was a problem hiding this comment.
审查结论
COMMENT(未发现阻塞问题)。 本 head 57dab0c 相对上一轮已审的 ecfaef5 只有一个提交(fix(ostool): 明确 FIT 自动地址推导的诊断边界),内容仅为 ostool/src/boot/fit_config.rs 的注释与错误文案调整(direct_entry() 注释、elf_load_base() 的冲突诊断文案、first_segment/first 变量拆分),无逻辑变化。因此上一轮(ecfaef5,review 5527255778)“无阻塞问题”的结论继续成立;本轮在此基础上新增 1 条 advisory(诊断归属),既有 4 条 advisory 仍成立。
本 PR 做了什么、影响面
- 新增
ostool/src/boot/fit_config.rs:crate-privateFitConfig/FitFormat/FitOs/FitAddress/FitFdt,以及resolve_load()/resolve_entry()/bin_load_base()/elf_load_base()/section_lma()地址推导。 ostool/src/artifact/elf_metadata.rs:新增LoadSection与load_sections(SHF_ALLOC、非SHT_NOBITS、file_range()存在且 size≠0)。ostool/src/boot/fit.rs:新增内部入口generate_configured_fit()与validate_elf_load_data(),把写文件拆为write_fit_image(..., os);旧generate_fit_image()语义不变(仍固定os = "linux",仍对 LoongArch 调用resolve_kernel_entry_addr(),ostool/src/run/uboot.rs:1327调用点未改)。ostool/src/boot/mod.rs:注册fit_config模块并保留#[allow(dead_code)](用户入口由后续 PR 接入)。
影响面:generate_configured_fit 与 fit_config 在本 PR 内仍无调用方,.uboot.toml/.board.toml 解析与用户可见行为均未改动,所以本 PR 不改变现有用户可见行为,属于完全内部化的改动;真正被固定下来的是“FIT load/entry 如何由 ELF 元数据推导”这一契约,供接线 PR 依赖。
验证
- CI:head
57dab0c7bbda0ec3b580c25374a4fe706058b504的check (stable, x86_64-unknown-linux-gnu)为 success(check run 116216269135,2026-10-15T02:40:33Z 完成);该工作流包含cargo fmt --all -- --check、cargo clippy、cargo build、cargo test。未发现与本 PR 相关的失败 CI。 - 本地:
git rev-parse HEAD=57dab0c…(与审查目标一致)、git rev-parse origin/main=787943d…,工作区干净,git diff --check origin/main...HEAD通过。本审查环境没有 Rust 工具链(which cargo、which rustc均未找到),cargo fmt --check、cargo clippy --manifest-path ostool/Cargo.toml --all-features -- -D warnings、cargo test --manifest-path ostool/Cargo.toml --all-features未能本地复跑;这不是本 PR 导致的失败。 - 未做 U-Boot/硬件实机启动验证。
section_lma()/bin_load_base()与objcopy -O binary的 LMA 布局一致性本轮仅做代码复核(环境无 llvm-objcopy/cargo-binutils)。
上一轮 review 的处理情况
- 3f79b038(F-001/F-002/F-003)与 ZR233 的 [P1]/[P2]:已在
8076e5d修复——os = "elf"的 entry 语义改为等于 payload load,并拒绝与 load 不一致的显式 entry;BINload改为按 section LMA 推导、符号仅在与之一致时被接受;BINentry要求落在LMA == VMA的 file-backed section 内。 - c926f0c0 的 F-101(阻塞)已在
e7b566e修复;其 F-104(entry 参数来源不一致)、F-105(输出权限)同期修掉。 fit.rs:81(评论 4278335719)、fit.rs:153(4227846823)、fit_config.rs:102(4227846828)、fit_config.rs:155(4227846833)四处既有行内评论在本 head 未回复、未改动,技术判断仍然成立;为避免重复提交同位置评论,状态汇总见下(F-002 ~ F-005),本轮只为新增发现提交 1 条行内评论。
遗留问题(均非阻塞)
- F-001(新增,advisory,行内
ostool/src/boot/fit_config.rs:263):错误诊断把调用上下文硬编码为 BIN/load。详见行内评论。 - F-002(advisory,沿用行内评论 4227846823,
ostool/src/boot/fit.rs:153-160):LoongArchMZ镜像头 entry 换算仍内联在generate_configured_fit(),FitAddress::Auto出现两个解析点,并绕过direct_entry()的落点校验。建议在接线 PR 前收敛进FitConfig。 - F-003(advisory,沿用行内评论 4227846828,
fit_config.rs:171-191):elf_load_base()要求所有 file-backed PT_LOAD 共享同一p_paddr - p_offset,fail-closed 且不会写出错误基址,但带 gap 的真实内核 ELF 只能显式load,使format = "elf"+ 默认Auto的可用面偏窄。 - F-004(advisory,沿用行内评论 4227846833,
fit_config.rs:134-168):direct_entry()只校验 entry 所在 section 的LMA == VMA;format = "elf"+ 默认os = "linux"下其余段 VMA≠LMA 仍会生成成功(Linux 自身早期启动代码会建立映射/重定位,且本 head 已用注释记录该取舍,因此不作为阻塞项)。建议在接线 PR 的用户文档中固定该 flatten 契约。 - F-005(advisory,沿用行内评论 4278335719,
fit.rs:64-256、mod.rs:6-7):新增生成路径仍无调用方与端到端回归,CI 只覆盖合成ElfMetadata夹具(其executable_start = None,恰好跳过符号冲突分支)。建议接线前补“真实 ELF → 生成 FIT → 断言os/load/entry/payload”的用例,覆盖format=bin、format=elf、os=elf与 source/runtime 同路径与不同路径两个分支。
复核后未发现问题的地方
NamedTempFile + persist 的原子替换与权限保留(新输出 0666 受 umask 收窄、已有输出保留原权限)、输出与输入别名/硬链接保护、validate_elf_load_data() 的截断与溢出检查、bin_load_base()/section_lma() 的 p_paddr + file_delta LMA 规则、toml/json 往返测试、旧 U-Boot Linux 路径的等价性,以及新增生产代码中无 unwrap()/expect()/unsafe。
相近工作
本 PR 声明依赖 #193;仓库内相关既有工作为 FIT 边界重构 #122/#123、boot readiness #129、raw BIN 准备 #125、FIT 修复 #194/#201/#207。以 repo:drivercraft/ostool type:pr FIT ELF BIN 搜索未发现与本 PR 重复的开放 PR。
Powered by deepseek-flash
共享地址辅助函数只报告底层原因,由 load/entry 解析入口补充对应上下文,避免 ELF 自动入口失败被误报为 BIN 加载地址错误。保留完整错误链和原有地址判定逻辑。 复用现有测试夹具,覆盖同一段映射错误在 ELF entry 与 BIN load 中的诊断区别,不新增测试文件。 验证:ARM64 devbox 格式检查、12 个 FIT 聚焦测试、Clippy、构建及 ostool 测试通过。未本地复现 x86_64 CI matrix。 Co-authored-by: OpenAI Codex <codex@openai.com> Signed-off-by: Niu Zhihong <zhihong@nzhnb.com>
There was a problem hiding this comment.
审查结论
COMMENT(未发现阻塞问题)。 本 head cf308f4 相对上一轮已审的 57dab0c 只有一个提交(fix(ostool): 按地址解析阶段报告 FIT 错误),仅改 ostool/src/boot/fit_config.rs(+56/-38),内容是把 elf_load_base()/bin_load_base()/section_lma()/checked_end()/elf_container_base() 里硬编码的错误文案改为中性描述,并在调用点用 .context("cannot derive BIN FIT load address; set load explicitly") / .context("cannot derive ELF FIT load address") / .context("cannot derive FIT entry; set entry explicitly") 归属语义,另补一段断言两路径 root cause 一致的测试。地址推导逻辑、FitConfig 语义、fit.rs 与旧 U-Boot 路径均未改,因此上一轮结论继续成立:无阻塞问题;本轮新增 1 条 advisory(组合校验只挂在 resolve_load()),另有 4 条既有 advisory 仍未处理。
本 PR 做了什么、影响面
- 新增
ostool/src/boot/fit_config.rs:crate-privateFitConfig/FitFormat/FitOs/FitAddress/FitFdt,以及resolve_load()/resolve_entry()/direct_entry()/bin_load_base()/elf_load_base()/section_lma()地址推导。 ostool/src/artifact/elf_metadata.rs:新增LoadSection与load_sections(SHF_ALLOC、非SHT_NOBITS、file_range()存在且 size≠0),用于按 LMA 推导裸 BIN 落点。ostool/src/boot/fit.rs:新增内部入口generate_configured_fit()与validate_elf_load_data();写 FIT 拆为write_fit_image(..., os);旧generate_fit_image()语义不变(仍固定os = "linux"、仍对 LoongArch 调resolve_kernel_entry_addr(),ostool/src/run/uboot.rs:1327调用点未改)。ostool/src/boot/mod.rs:注册fit_config模块并保留#[allow(dead_code)]。- 影响面:
generate_configured_fit与fit_config在本 PR 内仍无调用方(mod.rs:6-7),.uboot.toml/.board.toml解析与用户可见行为均未改动,改动完全内部化;真正被固定下来的是“FITload/entry如何由 ELF 元数据推导”这一契约,供接线 PR 依赖。未发现对现有 U-Boot Linux 流程的行为回退。
验证
- CI:head
cf308f48ec1a2d8eb83a60901088fee94a873c36的check (stable, x86_64-unknown-linux-gnu)为 success(check run 116221906486,2026-10-15T03:02:36Z 完成),该工作流包含cargo fmt --all -- --check、cargo clippy --target x86_64-unknown-linux-gnu --all-features、cargo build、cargo test -- --nocapture。未发现与本 PR 相关的失败 CI。 - 本地:
git rev-parse HEAD=cf308f4…(与审查目标一致)、git rev-parse origin/main=787943d…、工作区干净,git diff --check origin/main...HEAD通过。本审查环境没有 Rust 工具链(which cargo/which rustc均未找到),cargo fmt --check、cargo clippy、cargo test未能本地复跑;这不是本 PR 导致的失败,也意味着地址推导目前只由 CI 中的合成单测覆盖。未做任何 U-Boot/硬件实机启动验证。
上一轮 review 的处理情况
57dab0c一轮的唯一 advisory(F-001,review comment 4278498269:section_lma()/checked_end()把诊断上下文硬编码成 BIN/load,ELF entry 推导失败时会建议错误方向):已修——helper 文案改为中性、上下文由调用点.context(...)归属,并新增单测断言 entry 错误文案不含 “BIN FIT load” 且两路径 root cause 相同。该条中“组合校验只挂在resolve_load()”的剩余部分未修,本轮记为 F-001 行内评论。- 更早的阻塞项与 ZR233 的 [P1]/[P2](
os = "elf"的 entry 语义、BINload按 section LMA 推导、BINentry与load同地址空间、format = "elf"的 Autoload不再信 VMA 符号)在8076e5d/e7b566e已修复,本 head 未回退。 - ZR233 在 review body 里要求的“真实 ELF → 生成 FIT → 断言属性/payload”回归仍缺失,见 F-002(按
AGENTS.md的人工验证条款不阻塞)。
遗留问题(均非阻塞)
- F-001(本轮新增,advisory,行内
ostool/src/boot/fit_config.rs:119):os = elf⇒format = elf的组合校验只在resolve_load()(78-81 行),resolve_entry()没有;详见行内评论。 - F-002(advisory,沿用既有行内评论 4278335719,
ostool/src/boot/fit.rs:81):新增生成路径与地址推导契约仍无端到端回归,CI 只覆盖合成ElfMetadata夹具(其executable_start = None恰好跳过符号冲突分支)与build_fit_config单测。建议接线前补“真实 ELF → 生成 FIT → 断言 kernel 的os/load/entry与 payload”用例,覆盖format=bin/format=elf/os=elf与 source/runtime 同路径与不同路径两个分支。 - F-003(advisory,沿用既有行内评论 4227846823,
ostool/src/boot/fit.rs:145-160):LoongArchMZ镜像头的 entry 换算仍内联在generate_configured_fit(),Auto entry 有两个解析点,并绕过direct_entry()的落点校验。建议把 payload 相关换算收敛进FitConfig。 - F-004(advisory,沿用既有行内评论 4227846828,
ostool/src/boot/fit_config.rs:169-190):elf_load_base()要求所有 file-backed PT_LOAD 共享同一p_paddr - p_offset,fail-closed 但偏严,带 gap 的内核 ELF 只能显式load。 - F-005(advisory,沿用既有行内评论 4227846833,
ostool/src/boot/fit_config.rs:136-166):direct_entry()只校验 entry 所在 section 的LMA == VMA;format = "elf"+ 默认os = "linux"下其余段 VMA≠LMA 仍会生成成功。建议在文档中固定format = "elf"的 flatten 契约。 - 复核后未发现问题的地方:
NamedTempFile+persist的原子替换与权限保留(新输出0666受 umask 收窄、已有输出保留原权限)、输出与输入别名保护(含 rename 不破坏硬链接)、validate_elf_load_data()的截断与溢出检查、bin_load_base()/section_lma()的p_paddr + file_deltaLMA 规则、toml/json往返测试、旧 U-Boot Linux 路径的等价性,以及新增生产代码中无unwrap()/expect()/unsafe。
相近工作
本 PR 声明依赖 #193;仓库内相关既有工作为 FIT 边界重构 #122/#123、boot readiness #129、raw BIN 准备 #125、FIT 修复 #194/#201/#207。以 repo:drivercraft/ostool is:pr is:open FIT 搜索未发现与本 PR 重复的开放 PR(该搜索只命中 PR #196 自身)。
Powered by deepseek-flash
ZR233
left a comment
There was a problem hiding this comment.
为什么需要改动
本次更新继续提供内部 FIT 生成能力,目标是让后续接线能够安全区分 ELF 容器、裸 BIN、FIT 的 load/ entry 和 U-Boot 的 os 语义。当前提交仍未修改 .build.toml、.uboot.toml、.board.toml、CLI 或既有 U-Boot runner,因此没有发现现有配置解析或默认启动流程的回归。
改动收益
相对上一轮审查,当前 head 已修复会导致生成镜像无法启动的地址问题:
os = "elf"现在要求format = "elf",并把 FITentry约束为 ELF 在内存中的容器地址(等于load),而不是 ELF 的e_entry。- BIN 的自动
load按实际 section LMA/物理加载布局推导,__executable_start不一致时拒绝静默采用。 - BIN 的自动
entry不再直接使用 VMA 的e_entry,会检查入口所在的文件段是否与加载地址空间一致。 - 配置化 LoongArch Linux BIN 在自动入口场景复用已有镜像头换算;旧路径仍使用原有 Linux 语义。
- 输出暂存后再持久化,保留既有输出权限并避免写入输入别名。
改动前逻辑(基准分支)
基准分支只有 generate_fit_image() 路径。U-Boot runner 在 ostool/src/run/uboot.rs 中调用它,读取 BIN/DTB/ramdisk,固定生成 os = "linux" 的 FIT;地址来自现有 runner 逻辑。仓库中没有这次新增的 FitConfig 地址解析层。
改动后逻辑(当前拉取请求)
当前提交把公共写 FIT 部分抽成 write_fit_image(..., FitOs),旧入口仍显式传入 FitOs::Linux,所以既有 U-Boot 流程保持原调用链和 Linux FIT 行为。新增的 generate_configured_fit() 与 fit_config 仍是 crate-private、由后续 boot-prepare PR 接入;它先解析并校验 source/runtime ELF 的布局,再解析地址、选择 ELF 或 BIN payload,最后写出 FIT。当前 PR 没有把这些字段暴露到用户配置,因此不会凭 FitConfig 默认值改变已有配置。
验证与覆盖
- 当前精确 head:
cf308f48ec1a2d8eb83a60901088fee94a873c36。 - GitHub Actions
Quality Checkrun38673550429、jobcheck (stable, x86_64-unknown-linux-gnu)116221906486均为 completed/success;日志包含 format、clippy、build、unit test(ostool二进制 333 tests passed)、Web UI unit/integration tests 和 publish dry run。 git diff --check refs/remotes/upstream/main...HEAD通过;所有现有 review threads 均已 resolved。- CI 当前执行了地址解析合成单测和旧生成路径测试,但没有执行“真实 ELF →
generate_configured_fit→ FIT 属性/payload → U-Boot 启动”的端到端路径,也没有实体板卡/U-Boot 实机证据。该边界不会掩盖现有配置兼容性结论,接线 PR 必须补齐。
后续接线边界
以下保留为非阻塞跟进项:接线时应使用可选父配置,缺省时继续调用旧 generate_fit_image();若字段放入 .uboot.toml,要同步 UbootConfigWire 和远程板卡映射;应补真实 ELF 覆盖 format=bin、format=elf、os=elf 以及 source/runtime 两种路径;并考虑把 LoongArch 入口特判和组合校验收敛到单一配置解析入口,明确带 gap ELF 的显式 load 限制和 format=elf, os=linux 的 flatten 契约。
结论
在当前提交和声明范围内未发现新的阻塞问题:旧配置与默认 U-Boot 流程保持兼容,上一轮地址语义阻塞项已修复,当前 CI 证据与精确 head 一致。因此本次审查通过;上述端到端覆盖和用户入口属于后续接线 PR 的验收条件。
|
hi @ZR233 ,bot 的 changes requested block 似乎没有更新 |
There was a problem hiding this comment.
审查结论
APPROVE(未发现阻塞问题)。 在 head 168b9501b690306301871fb135f067bf732044ca 上逐文件复核了全部 5 个改动文件(+1100/-64)。相对上一轮已审的 cf308f4,本 head 的 fix(ostool): close FIT review gaps 一并收口了此前遗留的全部 review 项(组合校验统一、Auto entry 单一解析点、真实 ELF 端到端回归),其余为已在本 head 用注释固定的设计取舍或属于后续接线 PR 的范围。因此给出通过结论。
本 PR 做了什么、影响面
- 新增
ostool/src/boot/fit_config.rs(crate-privateFitConfig/FitFormat/FitOs/FitAddress/FitFdt,以及validate()、resolve_load()、resolve_entry()、loongarch_image_entry()、bin_load_base()/elf_load_base()/section_lma())。 ostool/src/artifact/elf_metadata.rs:新增LoadSection/load_sections(SHF_ALLOC、非SHT_NOBITS、file_range()存在且 size≠0),用于按 LMA 推导裸 BIN 落点。ostool/src/boot/fit.rs:新增内部入口generate_configured_fit()与validate_elf_load_data();把写 FIT 拆为write_fit_image(..., os);旧generate_fit_image()仍固定os = "linux"。ostool/src/boot/mod.rs:注册fit_config模块并保留#[allow(dead_code)](用户入口由接线 PR 接入)。- 影响面:
generate_configured_fit与fit_config在本 PR 内没有生产调用方,.uboot.toml/.board.toml解析、ostool/src/run/uboot.rs的调用点以及用户可见 CLI/配置均未改动,属完全内部化改动;被固定下来的是“FITload/entry如何由 ELF 元数据推导”这一契约。旧路径经复核语义等价:resolve_kernel_entry_addr(arch, data, load, fallback)由等价的loongarch_image_entry(...)?.unwrap_or(kernel_entry_addr)取代;build_default_fit_config→build_fit_config(..., FitOs::Linux)仅增加参数;成功日志从写临时文件处移到两个入口persist之后。
验证
- CI:head
168b950的check (stable, x86_64-unknown-linux-gnu)(check run116811223443,Actions run 38850760828)completed/success(2026-10-16T04:40:31Z)。该工作流执行cargo fmt --all -- --check、cargo clippy --target x86_64-unknown-linux-gnu --all-features、cargo build、cargo test --target x86_64-unknown-linux-gnu(包含本 head 新增的真实 ELF 端到端测试,依赖工作流安装的llvm-tools)、webui 测试与cargo publish --workspace --dry-run --locked。未发现与本 PR 相关的失败 CI;该 check run 上的 2 条ENOENT .../target/tests/target注解属 e2e 工具链噪声,与本 PR(不涉及 webui)无关。 - 本地:
git rev-parse HEAD=168b950…(与审查目标一致)、git rev-parse origin/main=787943d…、工作区干净、git diff --check origin/main...HEAD通过。本审查环境没有 Rust 工具链(cargo/rustc/objcopy/llvm-objcopy均不存在),cargo fmt --check、cargo clippy、cargo test未能本地复跑;这不是本 PR 导致的失败。未做 U-Boot/硬件实机启动验证。
上一轮 review 的处理情况
- mai-team-app(
cf308f4的阻塞项):os = elf⇒format = elf的组合校验只挂在resolve_load()。已修:抽出FitConfig::validate()由resolve_load()/resolve_entry()共用,并新增rejects_incompatible_os_and_format_from_both_resolvers断言两个入口返回同一文案。 - mai-team-app(行内评论 4227846823,advisory):LoongArch
MZ头换算内联在生成入口,Auto entry 有两个解析点并绕过 BIN 落点校验。已修:loongarch_image_entry()移入fit_config.rs,resolve_entry(&metadata, load, &payload)成为唯一解析入口,旧路径 ALSO 复用同一函数。 - mai-team-app(行内评论 4278335719,advisory):缺少“真实 ELF → 生成 FIT → 断言属性/payload”的回归。已修:新增
generates_configured_fit_from_a_real_elf_for_elf_and_bin_payloads,用真实prepare_runtime_artifacts()与真实llvm-objcopy -O binary覆盖 format=bin / format=elf / os=elf 以及 source==runtime 与独立 runtime 两条分支,并断言 kernel 组件的os/load/entry/data。 - mai-team-app(行内评论 4227846828 / 4227846833,advisory):
elf_load_base()的单一容器基址限制、direct_entry()只校验 entry 所在段。已在本 head 用代码注释固定为明确契约(elf_load_base()说明“连续字节容器/单一基址”,resolve_entry()文档注释说明format=elf+os=linux的 flatten 契约与os=elf的适用场景),行为仍为 fail-closed。 - ZR233 的 [P1]/[P2](
bootelf需要内存中 ELF 头地址、__executable_start是 VMA):在8076e5d/e7b566e已修,本 head 未回退;其 review body 要求的真实 ELF 回归由上述新测试落地。 - ZR233 在
cf308f4上 APPROVED;作者在 2026-10-16T03:23 的 issue comment 提到“bot 的 changes requested block 似乎没有更新”。经复核,此前 CHANGES_REQUESTED 依据的问题在当前 head 均已修复或转为已文档化的非阻塞取舍,故本次为 APPROVE。
遗留风险与测试缺口(均非阻塞)
format = "elf"+FitAddress::Auto要求所有 file-backed PT_LOAD 共享同一p_paddr - p_offset,否则报错要求显式load;fail-closed 且诊断明确,但带 gap/非等距布局的内核只能显式指定,建议在接线 PR 的用户文档中说明。direct_entry()只校验 entry 所在 section 的LMA == VMA;format = "elf"+ 默认os = "linux"下其余段 VMA≠LMA 仍会生成成功(依赖内核自身早期映射/重定位)。该契约已写入resolve_entry()文档注释,建议在用户文档中重复并引导非恒等映射内核使用os = "elf"。- FIT
os = "elf"依赖目标 U-Boot 注册该 OS 字符串(CONFIG_CMD_ELF)并启用CONFIG_BOOTM_ELF;生成阶段无法校验远端配置,当前错误文案只提到CONFIG_BOOTM_ELF,建议接线文档一并说明。 - 本 PR 未提供用户入口,端到端只覆盖“生成 FIT + 断言属性/payload”,没有 U-Boot/硬件实机启动证据;这些属接线 PR 的验收条件。
- 复核后未发现问题的部分:
os = "elf"必须format = "elf"且 entry 等于 payload load(与do_bootm_elf()→bootelf(bmi->images->ep, …)语义一致);format = "elf"的 Autoload以p_paddr - p_offset为容器基址、符号仅在一致时被接受;BIN 的load/entry与 objcopy/BFD 的p_paddr + file_deltaLMA 规则一致;validate_elf_load_data()的文件范围与溢出检查;NamedTempFile+persist原子替换、新输出走 umask、已有输出保留原权限、输入别名/硬链接保护;toml/json往返测试;旧 U-Boot Linux 路径等价性;新增生产代码无unwrap()/expect()/unsafe。
相近工作
本 PR 声明依赖 #193。以 repo:drivercraft/ostool is:pr is:open FIT 搜索只命中本 PR 自身,未发现重复的开放 PR;相关既有工作为 FIT 边界重构 #122/#123、boot readiness #129、raw BIN 准备 #125、FIT 修复 #194/#201/#207。
Powered by deepseek-flash
支持生成包含 ELF 或 BIN 的 FIT 镜像;选择 BIN 时自动转换,无需手工处理。
本 PR 提供内部生成能力,暂未新增命令或用户配置入口;入口由 PR 3 接入。
依赖 #193,仅包含其上的 FIT 增量。