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.

[参考译文] 编译器:如何查看符号的大小

Guru**** 2595800 points


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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/620184/compiler-how-to-see-the-size-of-a-symbol

部件号:TMS570LS3137

工具/软件:TI C/C++编译器

有关软件内存使用情况的详细分析,我想查看每个内存部分及其使用情况的细分。
(使用TI编译器5.1。6)

当前在地图文件中,我可以看到:

  • 使用了哪些部分和区域,它们需要/获得了多少空间
  • 我有什么对象,它们放置符号的区域以及符号内存空间的起始位置(但不是大小!)

我希望看到更详细的信息:我想知道符号需要多少空间,编译器/链接器应该可以获得和知道这些信息。

例如,我在TMS570的内部RAM中有一个".normal_task_ram"部分(假设从0x8000开始),在这一部分中,obj "normal_Task1"放置了2个大小为20和40字节的变量,我希望出现这样的情况:

=============================================================================================================

normal_task.obj

运行/加载
值 大小 装订名称(部分)
------- ----------------- ----------------- --------
0.008万00 000000140万00014</s>0.0014万 本地 normal_task_var1 (.normal_task_ram:normal_task_var1)
0.008万50 000000285万00028</s>0.0028万 全局normal_task_var2 (.normal_task_ram:normal_task_var1) 

链接程序是否可以以某种方式输出详细信息?

我目前的最佳方法是分析映射文件,并尝试通过减去给定部分中符号的地址来确定哪个变量消耗RAM, 这远不准确,因为可能会有孔,或者最后一个符号可能只是放置在结束区域,除了空心ram区域之外,没有其他符号。

我找到并检查了TI cG_xml工具,也检查了"xml_output",但似乎没有一个工具能够访问我在这里尝试访问的内容:只是链接器输出中的信息似乎丢失了。

是否有办法实现我的目标?  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我假设您正在使用EABI。 编译器会填充变量的ELF符号大小字段,因此,如果使用armofd之类的工具查看ELF符号,就可以看到对象的大小。 自2016年以来(ARM编译器16.12 ELF. 0.STS或更高版本),只要存在dwarf调试的默认级别(无需任何选项),汇编器也将填充函数的ELF大小。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    所以如果我理解对了,答案是否定的,就没有办法从map/elf文件中获得这个信息(内存中的符号大小)。 5.1 6或更高版本的编译器都不能。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是的,您可以从ELF符号中看到变量的大小,只是不能在地图文件中看到。 您需要使用"armofd -v a.out "并查找"Symbol Table"
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我是这样做的。

    "armofd.exe --output=out.txt --obj_display=all --dwarf --dwarf_display=all app.out"

    在生成的out.txt中,没有符号表,变量存在,但只有它们的起始地址,即放置它们的位置。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您仍缺少详细(-v)选项。 使用:

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

    谢谢你,我所遗漏的钥匙是详尽的。

    以为只打印到控制台。