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.

[参考译文] TMS320F28388D:从.out 文件中获取所有变量的名称、大小和地址

Guru**** 2581345 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1252803/tms320f28388d-get-name-size-and-address-of-all-variables-from-out-file

器件型号:TMS320F28388D

大家好!

我正在研究获取应用程序中所有全局和静态变量列表的可能性、以及它们的名称、大小和地址。

map 文件提供一些信息、但不针对静态变量。 我看了一些像 readelf、objdump、dwarfdump 这样的工具、但据我所知、它们无法生成我需要的列表。

然后我发现了 TI nm2000 工具、它似乎提供了我需要的信息。 当我使用以下代码进行测试时:

typedef struct
{
    uint32_t ui32;
    uint16_t ui16;
    uint8_t  ui8;
} T_TEST_STRUCT;

uint8_t Test_ui8_glob;
uint8_t Test_ui8_glob_init = 0;
static uint8_t Test_ui8_stat;
static uint8_t Test_ui8_stat_init = 0;

uint16_t Test_ui16_glob;
uint16_t Test_ui16_glob_init = 0;
static uint16_t Test_ui16_stat;
static uint16_t Test_ui16_stat_init = 0;

uint32_t Test_ui32_glob;
uint32_t Test_ui32_glob_init = 0;
static uint32_t Test_ui32_stat;
static uint32_t Test_ui32_stat_init = 0;

T_TEST_STRUCT Test_struct_glob;
T_TEST_STRUCT Test_struct_glob_init = { 0, 0, 0 };
static T_TEST_STRUCT Test_struct_stat;
static T_TEST_STRUCT Test_struct_stat_init = { 0, 0, 0 };

然后运行"nm2000 -l mytest.out"、得到以下结果:

[index]  value      size  bind  type  vis   shndx  symbol name 
...
...
[25332] |0x200100ac|8|GLOB |COMN |HIDN |14    |Test_struct_glob
[25334] |0x20010830|8|GLOB |OBJT |HIDN |13    |Test_struct_glob_init
[83]    |0x2001008c|8|LOCL |OBJT |HIDN |14    |Test_struct_stat
[84]    |0x20010838|8|LOCL |OBJT |HIDN |13    |Test_struct_stat_init
[25330] |0x2001011e|2|GLOB |COMN |HIDN |14    |Test_ui16_glob
[25341] |0x20010746|2|GLOB |OBJT |HIDN |13    |Test_ui16_glob_init
[79]    |0x2000feda|0|LOCL |OBJT |HIDN |14    |Test_ui16_stat
[80]    |0x20010748|2|LOCL |OBJT |HIDN |13    |Test_ui16_stat_init
[25331] |0x200100cc|4|GLOB |COMN |HIDN |14    |Test_ui32_glob
[25342] |0x2001074c|4|GLOB |OBJT |HIDN |13    |Test_ui32_glob_init
[81]    |0x2000fedc|0|LOCL |OBJT |HIDN |14    |Test_ui32_stat
[82]    |0x20010750|4|LOCL |OBJT |HIDN |13    |Test_ui32_stat_init
[25329] |0x20010123|1|GLOB |COMN |HIDN |14    |Test_ui8_glob
[25339] |0x20010744|1|GLOB |OBJT |HIDN |13    |Test_ui8_glob_init
[77]    |0x2000fed8|0|LOCL |OBJT |HIDN |14    |Test_ui8_stat
[78]    |0x20010745|1|LOCL |OBJT |HIDN |13    |Test_ui8_stat_init
...
...

除非变量被定义为静态且不被初始化、否则大多数情况都是可以的。 则大小显示为0。 在所有其他情况下、会显示正确的大小、即使对于未初始化的静态结构也是如此。

这种行为的原因是什么?

另外、nm2000输出字段"index"、"vis"和"hndx"的含义是什么? 我找不到关于它的任何文档。

除了与未初始化静态变量相关的问题之外、nm2000工具似乎满足了我的要求。 但是、如果您对可以实现相同功能的其他工具有任何建议、请告诉我。

谢谢、此致、
阿尔詹

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

    类型名称 uint8_t C2000编译器不支持该选项。  您是使用 C2000编译器构建此代码的吗?  还是另一个编译器?

    谢谢。此致、

    -乔治

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

    George、您好!

    在本例中、我使用的是 F28388D 的 CM 内核、因此这里是 ARM 编译器:TI-CGT-ARM_20.2.7.LTS。 并且uint8_t是_stdint.h 中的 typedef。 但这对于这个问题并不重要、因为它是关于从 ELF/DWARF 输出文件获取变量信息的问题。

    我确实注意到、使用 readelf 工具读取符号表时可以获得类似的结果:

       Num:    Value  Size Type    Bind   Vis      Ndx Name
    ...
        77: 2000fed8     0 OBJECT  LOCAL  HIDDEN    14 Test_ui8_stat
        78: 20010745     1 OBJECT  LOCAL  HIDDEN    13 Test_ui8_stat_init
        79: 2000feda     0 OBJECT  LOCAL  HIDDEN    14 Test_ui16_stat
        80: 20010748     2 OBJECT  LOCAL  HIDDEN    13 Test_ui16_stat_init
        81: 2000fedc     0 OBJECT  LOCAL  HIDDEN    14 Test_ui32_stat
        82: 20010750     4 OBJECT  LOCAL  HIDDEN    13 Test_ui32_stat_init
        83: 2001008c     8 OBJECT  LOCAL  HIDDEN    14 Test_struct_stat
        84: 20010838     8 OBJECT  LOCAL  HIDDEN    13 Test_struct_stat_init
    ...
     25329: 20010123     1 COMMON  GLOBAL HIDDEN    14 Test_ui8_glob
     25330: 2001011e     2 COMMON  GLOBAL HIDDEN    14 Test_ui16_glob
     25331: 200100cc     4 COMMON  GLOBAL HIDDEN    14 Test_ui32_glob
     25332: 200100ac     8 COMMON  GLOBAL HIDDEN    14 Test_struct_glob

    出于某种原因、未初始化的静态(局部)变量始终显示大小为0。

    此致、
    阿尔詹

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

    我可以重现相同的结果。  我不知道未初始化的静态变量的 SIZE 字段为什么为0。  因此、我提交了 EXT_EP-11390 来对此进行调查。  我们欢迎您通过这个链接来了解这一点。

    请考虑此问题。  鉴于此错误、Code Composer Studio 如何仍然知道这些变量的正确大小?  因为它不依赖于符号表条目的 size 字段。  相反、它从目标文件的 Dwarf 调试部分获取有关变量类型的信息。  该类型信息包含变量的大小。  在这种情况下、您必须考虑符号表条目的大小字段不符合预期的其他情况的可能性。

    这里是收集符号信息的另一种方式。

    armofd -x --obj_display=none,symbols -o file.xml file.obj

    以下是 file.xml 中的几行。

                      <elf32_sym>
                         <index>0x1d</index>
                         <st_name>0xe8</st_name>
                         <st_name_string>global_variable</st_name_string>
                         <st_value>0x4</st_value>
                         <st_size>0x4</st_size>
                         <st_bind>STB_GLOBAL</st_bind>
                         <st_type>STT_COMMON</st_type>
                         <st_visibility>STV_HIDDEN</st_visibility>
                         <st_shndx>SHN_COMMON</st_shndx>
                      </elf32_sym>

    自动处理 XML 通常更容易。

    该命令 阿莫夫德  是目标文件显示实用程序。  这在 TI ARM 汇编工具手册中有记录

    谢谢。此致、

    -乔治

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

    感谢您提交问题、我将密切关注它。

    我曾尝试过armofd实用程序(以及ofd2000)、但大小相同的结果仍然0x0适用于未初始化的静态变量:

                      <elf32_sym>
                         <index>0x4d</index>
                         <st_name>0x45b</st_name>
                         <st_name_string>Test_ui8_stat</st_name_string>
                         <st_value>0x2000fed8</st_value>
                         <st_size>0x0</st_size>
                         <st_bind>STB_LOCAL</st_bind>
                         <st_type>STT_OBJECT</st_type>
                         <st_visibility>STV_HIDDEN</st_visibility>
                         <st_shndx>0xe</st_shndx>
                         <st_shndx_string>.bss</st_shndx_string>
                      </elf32_sym>

    我尚未尝试使用 C28x 编译器、我们还需要来自 F28388D CPU1和 CPU2内核的相同变量信息、以及我们想要创建的运行时监控工具。

    目前、我可以通过简单地初始化我们可能要在运行时监控的所有变量来使用一种权变措施。 至少这比写我自己的 DWARF 解析器更容易。

    谢谢、此致、
    阿尔詹

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

    仅供参考、C28x 编译器的结果相同:

        33: 0000a801     0 OBJECT  LOCAL  HIDDEN     6 Test_ui8_stat
        34: 0000a821     2 OBJECT  LOCAL  HIDDEN    10 Test_ui8_stat_init
        35: 0000a803     0 OBJECT  LOCAL  HIDDEN     6 Test_ui16_stat
        36: 0000a823     2 OBJECT  LOCAL  HIDDEN    10 Test_ui16_stat_init
        37: 0000a806     0 OBJECT  LOCAL  HIDDEN     6 Test_ui32_stat
        38: 0000a826     4 OBJECT  LOCAL  HIDDEN    10 Test_ui32_stat_init
        40: 0000a80c     0 OBJECT  LOCAL  HIDDEN     6 Test_struct_stat
        41: 0000a82c     8 OBJECT  LOCAL  HIDDEN    10 Test_struct_stat_init
       774: 0000a828     8 OBJECT  GLOBAL HIDDEN    10 Test_struct_glob_init
       775: 0000a804     4 OBJECT  GLOBAL HIDDEN     6 Test_ui32_glob
       776: 0000a800     2 OBJECT  GLOBAL HIDDEN     6 Test_ui8_glob
       778: 0000a820     2 OBJECT  GLOBAL HIDDEN    10 Test_ui8_glob_init
       779: 0000a822     2 OBJECT  GLOBAL HIDDEN    10 Test_ui16_glob_init
       780: 0000a802     2 OBJECT  GLOBAL HIDDEN     6 Test_ui16_glob
       781: 0000a808     8 OBJECT  GLOBAL HIDDEN     6 Test_struct_glob
       782: 0000a824     4 OBJECT  GLOBAL HIDDEN    10 Test_ui32_glob_init

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

    我更新了记录、注意这也是在 C2000编译器中出现的。

    谢谢。此致、

    -乔治