大家好!
我正在研究获取应用程序中所有全局和静态变量列表的可能性、以及它们的名称、大小和地址。
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工具似乎满足了我的要求。 但是、如果您对可以实现相同功能的其他工具有任何建议、请告诉我。
谢谢、此致、
阿尔詹