CANN Runtime 错误码 EE1014 详解:算子二进制 ELF 文件解析失败(File_Operation_Error_Parse)
2026/9/19 22:25:17 网站建设 项目流程

CANN Runtime 错误码 EE1014 详解:算子二进制 ELF 文件解析失败(File_Operation_Error_Parse)

【免费下载链接】runtime本项目提供CANN运行时组件和维测功能组件。项目地址: https://gitcode.com/cann/runtime

导读

EE1014(File_Operation_Error_Parse)是 CANN Runtime 在加载算子二进制(operator binary)时,对 ELF 文件进行解析校验失败后上报的执行类错误码。该错误通常出现在算子文件损坏、编译产物不完整或构建参数不正确等场景,会直接导致算子无法加载执行。本文以 EE1014 错误码文档 为主体,结合仓库中 elf.cc、program.cc 等源码与 error_code.json 错误码定义,完整说明该错误码的报错格式、触发机制、常见原因与排查解决流程,帮助开发者快速定位并修复算子二进制文件问题。

错误信息说明

报错格式

EE1014 的错误消息模板固定为:

Failed to parse the binary file of the operator. Reason: %s.

其中占位符%s表示具体报错原因。该模板在仓库中有两处权威定义,二者保持完全一致:

  • 错误码元数据:error_code_meta.h 中通过宏X(EE1014, "EE1014", ("reason"), "Failed to parse the binary file of the operator. Reason: %s. ErrorCode=EE1014.\n", DLOG_ERROR)定义,属于DLOG_ERROR级别日志;
  • 错误码配置:error_code.json 中定义"errTitle": "File_Operation_Error_Parse""ErrCode": "EE1014""ErrMessage": "Failed to parse the binary file of the operator. Reason: %s.",并声明参数列表"Arglist": "reason"

从错误码前缀看,EE1014 属于 RTS Errors 大类(对应error_code.json中的"errClass": "RTS Errors"),即 Runtime 侧执行错误。

报错示例

文档给出的典型报错示例如下:

Failed to parse the binary file of the operator. Reason: The ELF section header address in the operator binary ELF file header cannot be empty.

这条示例对应 elf.cc 中的实际校验逻辑:当通过e_shoff(ELF 文件头中的节区头偏移)计算出的节区头地址shdrs为空指针时,通过RT_LOG_OUTER_MSG_IMPL(ErrorCode::EE1014, "The ELF section header address in the operator binary ELF file header cannot be empty")上报 EE1014。

可能原因

根据错误码文档与 error_code.json 中的suggestion定义,EE1014 的可能原因有两类:

  1. 算子的二进制文件损坏:文件在传输、拷贝、打包或落盘过程中被截断、篡改,导致 ELF 结构不合法;
  2. 编译参数不正确:算子编译工具链(如与当前 CANN Runtime 版本不匹配的编译器)产出的 ELF 文件头、节区表等字段取值不合法,或编译产物与目标运行环境不匹配。

触发机制与底层源码分析

EE1014 的根因在于 Runtime 加载算子二进制时对 ELF 文件执行的逐项合法性校验。从源码结构看,这些校验主要分布在 src/runtime/core/src/kernel/elf.cc 与 src/runtime/core/src/kernel/program.cc,覆盖文件头、节区表、符号表等多个层面。

文件头与节区表校验(elf.cc)

Get64bitSectionHeaders函数(elf.cc)负责解析 64 位 ELF 文件的节区头,是 EE1014 最主要的触发点,具体校验包括:

校验项判定条件报错内容(Reason 部分)
e_shentsizee_shnum组合e_shentsizee_shnum为 0,或两者乘积超过uint64_t最大值The value %s of e_shentsize or the value %s of e_shnum in the operator binary ELF file header is incorrect. The expected value complies with the following rule: both e_shentsize and e_shnum are not 0, and the product of the values of e_shnum and e_shentsize cannot be greater than the maximum value of uint64_t(elf.cc)
e_shentsize与节区头实际大小e_shentsize不等于sizeof(Elf64_External_Shdr)(64 字节)The value %s of e_shentsize in the operator binary ELF file header must be equal to the size %s of the ELF section header(elf.cc)
节区头地址e_shoff计算出的节区头指针为空The ELF section header address in the operator binary ELF file header cannot be empty(elf.cc)
节区偏移越界第 i 个节区的偏移超过 ELF 对象大小The offset %s of the section ranked %s exceeds the size %s of the ELF object(elf.cc)
sh_link取值sh_link大于节区总数The value %s of sh_link in the section ranked %s is invalid. The valid value range is [0, %s](elf.cc)

此外,符号表解析(Get64bitElfSymbols,elf.cc)同样会触发 EE1014:

  • section->sh_size为 0,应大于 0(elf.cc);
  • section->sh_entsize为 0 或大于sh_size,合法范围是(0, sh_size](elf.cc);
  • sh_size与符号条目数推算结果不一致(elf.cc);
  • 符号条目sh_ent偏移超出 ELF 对象大小(elf.cc)。

这些校验的逻辑本质是防止损坏的 ELF 文件导致越界读、空指针解引用等内存安全问题,Runtime 通过RT_LOG_OUTER_MSG_IMPL(ErrorCode::EE1014, ...)将具体原因填入Reason: %s.后上报。

文件位数校验

elf.cc 中还包含一处RT_LOG_OUTER_MSG_IMPL(ErrorCode::EE1014, "The ELF file must be a 64-bit file"),即算子二进制必须是 64 位 ELF 文件,若加载了 32 位或格式不正确的文件同样会触发 EE1014。

程序(Program)加载层面的校验(program.cc)

算子二进制解析成功后,内核信息会被组织到 Program 中,此时 program.cc 也会复用 EE1014 上报相关错误:

  • 二进制文件中包含重复的内核名时,上报The operator binary file contains duplicate kernel name %s,并返回RT_ERROR_KERNEL_DUPLICATE(program.cc);
  • 内核名称为空等非法场景也会引用 EE1014(program.cc)。

src/runtime/feature/xpu/program_plat.cc 中同样存在对 EE1014 的引用,用于平台相关加载路径下的错误上报,印证该错误码贯穿了通用 Runtime 与 XPU 特性两条加载链路。

错误码使用边界(参考开发者指南)

EE1014 的消息模板被硬编码为Failed to parse the binary file of the operator. Reason: %s.仅适用于算子 ELF 二进制解析失败场景。在仓库的 error-code-guide.md 中明确列出了该错误码的误用示例:例如读取二进制文件时路径无法访问,属于文件访问类错误,不应使用 EE1014——此时会输出误导性信息,且其建议(重新编译并加载算子二进制)对非解析场景毫无指导意义。排查问题时,请先确认错误确实发生在算子 ELF 解析环节,再对照本文的触发点分析。

解决方法

错误码文档给出的解决方法是:重新编译并加载算子的二进制文件。结合源码中的校验点,建议按以下步骤排查:

  1. 确认报错原因字段:完整查看日志中Reason: %s.的具体内容,对照上文的校验表定位是哪一项 ELF 字段或哪个解析环节不合法(如e_shentsizee_shnum、节区偏移、符号表条目等);
  2. 重新生成算子二进制:使用与当前 CANN Runtime 版本匹配的算子编译工具链重新编译算子,确认编译产物为 64 位 ELF 且未被任何后处理步骤改写;
  3. 检查传输与拷贝链路:确认.o等二进制文件在拷贝、打包(如上传到设备、跨进程传递)过程中未发生截断或损坏,必要时对比源文件校验和;
  4. 检查构建参数:若使用了自定义编译参数或链接选项,确认其产出的节区表(e_shentsizee_shnumsh_linksh_sizesh_entsize)符合标准 ELF 规范,且算子内内核名称唯一、非空;
  5. 重新加载:在修复二进制文件后,重新加载算子并复测,确认日志中不再出现 EE1014。

注意:EE1014 的解决建议以"重新编译并加载"为统一动作,因为损坏的二进制无法通过运行时参数修复;先定位Reason再重编,才能避免反复触发。

验证与回归测试

仓库的单元测试 rt_error_code_test.cc 对 EE1014 进行了覆盖验证:

  • 通过PrintErrMsgToLog(ErrorCode::EE1014, "file", 1000, "func", values1014)验证错误码消息打印与参数填充(rt_error_code_test.cc);
  • 使用"The ELF section header address in the operator binary ELF file header cannot be empty"构造并校验 EE1014 的 Reason 输出(rt_error_code_test.cc);
  • 通过GetParamNames(ErrorCode::EE1014)校验参数名列表,并验证 EE1014 的参数个数为 1(reason)(rt_error_code_test.cc、rt_error_code_test.cc)。

这说明 EE1014 的"1 个参数 + 固定消息模板 + Reason 填充"的格式约定有自动化测试保障,读者可参考该测试文件理解错误码的验证方式。

扩展阅读

  • RTS 错误码总览:查看 EE 系列错误码的完整清单与分类;
  • 错误码编写指南:了解 EE1014 等错误码的定义规范与使用边界;
  • 消息示例:更多错误消息格式参考;
  • ELF 解析实现:EE1014 的主要触发源码;
  • Program 加载实现:算子二进制加载与内核注册逻辑;
  • 错误码定义:错误码的官方配置与 suggestion 说明;
  • 错误码元数据:错误码宏定义与日志级别。

总结

EE1014(File_Operation_Error_Parse)是 CANN Runtime 针对算子二进制 ELF 文件解析失败的统一错误码,其消息模板Failed to parse the binary file of the operator. Reason: %s.中的原因字段由 Runtime 在elf.ccprogram.cc中逐项校验后动态填充,覆盖文件头字段非法、节区偏移越界、符号表异常、非 64 位文件、内核名重复等场景。排查时Reason内容为准绳,定位具体非法字段后,使用匹配版本的编译工具链重新编译并重新加载算子二进制即可解决。

【免费下载链接】runtime本项目提供CANN运行时组件和维测功能组件。项目地址: https://gitcode.com/cann/runtime

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询