ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

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

CANN Runtime 错误码 EE1014 详解:算子二进制 ELF 文件解析失败(File_Operation_Error_Parse) CANN Runtime 错误码 EE1014 详解算子二进制 ELF 文件解析失败File_Operation_Error_Parse【免费下载链接】runtime本项目提供CANN运行时组件和维测功能组件。项目地址: https://gitcode.com/cann/runtime导读EE1014File_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. ErrorCodeEE1014.\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_shoffELF 文件头中的节区头偏移计算出的节区头地址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 的可能原因有两类算子的二进制文件损坏文件在传输、拷贝、打包或落盘过程中被截断、篡改导致 ELF 结构不合法编译参数不正确算子编译工具链如与当前 CANN Runtime 版本不匹配的编译器产出的 ELF 文件头、节区表等字段取值不合法或编译产物与目标运行环境不匹配。触发机制与底层源码分析EE1014 的根因在于 Runtime 加载算子二进制时对 ELF 文件执行的逐项合法性校验。从源码结构看这些校验主要分布在 src/runtime/core/src/kernel/elf.cc 与 src/runtime/core/src/kernel/program.cc覆盖文件头、节区表、符号表等多个层面。文件头与节区表校验elf.ccGet64bitSectionHeaders函数elf.cc负责解析 64 位 ELF 文件的节区头是 EE1014 最主要的触发点具体校验包括校验项判定条件报错内容Reason 部分e_shentsize与e_shnum组合e_shentsize或e_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_telf.cce_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 headerelf.cc节区头地址由e_shoff计算出的节区头指针为空The ELF section header address in the operator binary ELF file header cannot be emptyelf.cc节区偏移越界第 i 个节区的偏移超过 ELF 对象大小The offset %s of the section ranked %s exceeds the size %s of the ELF objectelf.ccsh_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此外符号表解析Get64bitElfSymbolself.cc同样会触发 EE1014section-sh_size为 0应大于 0elf.ccsection-sh_entsize为 0 或大于sh_size合法范围是(0, sh_size]elf.ccsh_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_DUPLICATEprogram.cc内核名称为空等非法场景也会引用 EE1014program.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 解析环节再对照本文的触发点分析。解决方法错误码文档给出的解决方法是重新编译并加载算子的二进制文件。结合源码中的校验点建议按以下步骤排查确认报错原因字段完整查看日志中Reason: %s.的具体内容对照上文的校验表定位是哪一项 ELF 字段或哪个解析环节不合法如e_shentsize、e_shnum、节区偏移、符号表条目等重新生成算子二进制使用与当前 CANN Runtime 版本匹配的算子编译工具链重新编译算子确认编译产物为 64 位 ELF 且未被任何后处理步骤改写检查传输与拷贝链路确认.o等二进制文件在拷贝、打包如上传到设备、跨进程传递过程中未发生截断或损坏必要时对比源文件校验和检查构建参数若使用了自定义编译参数或链接选项确认其产出的节区表e_shentsize、e_shnum、sh_link、sh_size、sh_entsize符合标准 ELF 规范且算子内内核名称唯一、非空重新加载在修复二进制文件后重新加载算子并复测确认日志中不再出现 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 的参数个数为 1reasonrt_error_code_test.cc、rt_error_code_test.cc。这说明 EE1014 的1 个参数 固定消息模板 Reason 填充的格式约定有自动化测试保障读者可参考该测试文件理解错误码的验证方式。扩展阅读RTS 错误码总览查看 EE 系列错误码的完整清单与分类错误码编写指南了解 EE1014 等错误码的定义规范与使用边界消息示例更多错误消息格式参考ELF 解析实现EE1014 的主要触发源码Program 加载实现算子二进制加载与内核注册逻辑错误码定义错误码的官方配置与 suggestion 说明错误码元数据错误码宏定义与日志级别。总结EE1014File_Operation_Error_Parse是 CANN Runtime 针对算子二进制 ELF 文件解析失败的统一错误码其消息模板Failed to parse the binary file of the operator. Reason: %s.中的原因字段由 Runtime 在elf.cc与program.cc中逐项校验后动态填充覆盖文件头字段非法、节区偏移越界、符号表异常、非 64 位文件、内核名重复等场景。排查时以Reason内容为准绳定位具体非法字段后使用匹配版本的编译工具链重新编译并重新加载算子二进制即可解决。【免费下载链接】runtime本项目提供CANN运行时组件和维测功能组件。项目地址: https://gitcode.com/cann/runtime创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表