This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] [tms470_414]如何从 obj 文件或.out 文件计算函数的校验和

Guru**** 2589300 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/979847/tms470_414-how-to-calculate-the-checksum-of-a-function-from-obj-file-or-out-file

你好,香榭丽舍

我们有一个使用 TMS470_414工具链的非常旧的代码。 此代码通过第三部分 JTAG 下载到内部 SRAM。 因此、代码确实验证了密钥 功能、以确保下载后该功能正常。

我的问题是:我如何知道 KEY 函数的值、因为我们可能需要修改 KEY 函数以用于其他用途。  我知道函数的数据值 是位于 obj 或最终.out 文件中的值。 但 如何检索、以便 我 可以手动计算校验和。

下面是伪代码

静态空 program_data_flash (空)

 代码部分

#pragma FUNC_EXT_CALLED (program_data_flash_end);
静态空 program_data_flash_end (void){}

#pragma 任务(main)

void main (void)

//检查 program_data_flash()是否有效,如果有效则运行
   校验和= 0;
   SRC_ptr =(uint8*)&program_data_flash;

   while (src_ptr <(uint8*) program_data_flash_end)
   {
       校验和+=* src_ptr++;
   }

   if (校验和= program_data_flash)

  {
       program_data_flash();
   }
   其他
   {
       //*((UINT32*) 0x19808)=校验和;
       failed();
   }

此致

Yihe

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我猜您的客户设计非常陈旧、他们想要进行代码更新。 看起来他们有一个自定义工具(不是来自 TI)、该工具计算了代码的校验和并将其嵌入到下载的目标文件中。 我建议他们再次查看是否可以找到他们使用的原始自定义工具。

    如果失败、则需要重新创建该工具。 他们需要确定用于下载的目标代码的形式。 (旧的可能是 COFF、但它可能是 ELF。) 我建议他们使用 hex470将代码转换为可读格式(Intel hex、Tektronics hex 或 Motorola S)。 然后编写一个程序来计算校验和。 最后、查看用于创建目标代码的链接命令文件。 它应建议将计算出的校验和值放在何处、然后重新编译.out 文件。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好

    感谢你的答复。 我可能无法清楚地描述它、我们已经将.out 文件转换为 Intel hex 文件。 但问题是如何获取 program_data_flash()和 program_data_flash_end()的起始地址,以便我们可以从十六进制文件计算函数的校验和。

    .map 文件没有这些函数的地址、因为它们是静态的。 我假设它们位于.bss 段下。  

    此致

    Yihe

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尝试在.out 文件上运行 ofd470.exe、然后在输出中搜索这些符号。  

    TMS470目标文件显示版本4.4.10.126
    工具版权所有(c) 1996-2016德州仪器(TI)公司

    用法:ofd470 [-options]文件名

    使用'ofd470 -h '以了解有关特定选项的更多信息。 使用
    'ofd470 -h '搜索有关的信息选项 。

    由[]包围的选项参数声明它们是可选的。 选项参数
    用逗号分隔指定必须从中选择选项的参数
    列出了这些参数。

    常规选项:
    --dwarf_display=attribute
    显示设置;有关详细信息、请使用--DWARF_DISPLAY=帮助
    --DYNAMIC_INFO 输出动态链接信息
    -g 将 DWARF 信息附加到文件信息。
    -h 显示帮助
    -o=文件将目标文件信息输出到 。
    --obj_display=attribute
    显示设置;有关详细信息、请使用--obj_display=help
    v 打印详细文本输出。
    -x 以 XML 格式输出信息。
    --xml_indent=#嵌套 XML 标记的缩进空间数

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您是否检查了引导加载程序代码的映射或正在加载的应用程序的映射? 这些符号将位于引导加载程序中。 在闪存中编程之前、正在修改的关键功能是否完全适合 RAM? 如果确实如此、您可能不需要 RAM 缓冲器起始地址和结束地址。 当用零填充数据时、简单校验和不会改变。 只需计算要加载的代码的校验和即可。 只要要加载的代码大小等于或小于 RAM 缓冲区的大小、并且剩余的 RAM 位置为零、校验和就会相同。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你(们)好

    谢谢你。 I obj 转储.out 文件。 以下是与关键功能相关的详细信息。

    program_data_flash 的起始地址为0x1983C

    program_data_flash_end 的起始地址为0x198B4。

    因此、0x1983C 和0x198b3之间的数据是 program_data_flash 的代码。  

    我是对的吗?

    <25>"$program_data_flash":

    未定义的外部符号、类型= 0x4、类= C_label
    0个辅助条目、其值为0x0。

    <26>"_program_data_flash":
    在".text"部分中定义、类型= 0x4、类= C_label
    0个辅助条目、其值为0x1983c。

    <27>"DW$L$_program_data_flash$2$B":
    在".text"部分中定义、类型= 0x4、类= C_label
    0个辅助条目、其值为0x19850。

    <28>"L3":
    在".text"部分中定义、类型= 0x4、类= C_label
    0个辅助条目、其值为0x19850。

    <29>"DW$L$_program_data_flash$2$E":
    在".text"部分中定义、类型= 0x4、类= C_label
    0个辅助条目、其值为0x19860。

    <30>"DW$L$_program_data_flash$4$B":
    在".text"部分中定义、类型= 0x4、类= C_label
    0个辅助条目、其值为0x19878。

    <31>“L4”:
    在".text"部分中定义、类型= 0x4、类= C_label
    0个辅助条目、其值为0x19878。

    32>"DW$L$_program_data_flash$5$B":
    在".text"部分中定义、类型= 0x4、类= C_label
    0个辅助条目、其值为0x19884。

    33>"DW$L$_program_data_flash$4$E":
    在".text"部分中定义、类型= 0x4、类= C_label
    0个辅助条目、其值为0x19884。

    34>"DW$L$_program_data_flash$6$B":
    在".text"部分中定义、类型= 0x4、类= C_label
    0个辅助条目、其值为0x19888。

    <35>"L5":
    在".text"部分中定义、类型= 0x4、类= C_label
    0个辅助条目、其值为0x19888。

    <36>"DW$L$_program_data_flash$5$E":
    在".text"部分中定义、类型= 0x4、类= C_label
    0个辅助条目、其值为0x19888。

    37>"DW$L$_program_data_flash$7$B":
    在".text"部分中定义、类型= 0x4、类= C_label
    0个辅助条目、其值为0x19894。

    38>"DW$L$_program_data_flash$6$E":
    在".text"部分中定义、类型= 0x4、类= C_label
    0个辅助条目、其值为0x19894。

    39>“DW$L$_program_data_flash$8$B”:
    在".text"部分中定义、类型= 0x4、类= C_label
    0个辅助条目、其值为0x198a0。

    <40>"DW$L$_program_data_flash$7$E":
    在".text"部分中定义、类型= 0x4、类= C_label
    0个辅助条目、其值为0x198a0。

    41>"DW$L$_program_data_flash$9$B":
    在".text"部分中定义、类型= 0x4、类= C_label
    0个辅助条目、其值为0x198a4。

    <42>“L6”:
    在".text"部分中定义、类型= 0x4、类= C_label
    0个辅助条目、其值为0x198a4。

    43>“DW$L$_program_data_flash$8$E”:
    在".text"部分中定义、类型= 0x4、类= C_label
    0个辅助条目、其值为0x198a4。

    44>"DW$L$_program_data_flash$9$E":
    在".text"部分中定义、类型= 0x4、类= C_label
    0个辅助条目、其值为0x198b0。

    <45>"$program_data_flash_end":
    未定义的外部符号、类型= 0x4、类= C_label
    0个辅助条目、其值为0x0。

    <46>“_program_data_flash_end”:
    在".text"部分中定义、类型= 0x4、类= C_label
    0个辅助条目、其值为0x198b4。

    此致

    Yihe

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    是的、我认为您是正确的。 即120字节。