Cod*_*wer 9 c++ embedded optimization g++
我已经创建了一个小程序作为系统的概念验证,这些系统将在嵌入式平台上实现.该程序是用C++ 11编写的,使用std编译并在笔记本电脑上运行.应该在以后实施的最终程序是嵌入式系统.我们无权访问嵌入式平台的编译器.
我想知道是否有一种方法可以在将应用程序移植到嵌入式平台时以合理且可比较的方式确定程序静态内存(已编译二进制文件的大小).要求是二进制文件的大小小于10kb.编译时,我们的二进制文件大小为700Kb,并使用以下标志进行剥离:
g++ options: -Os -s -ffunction-sections -fdata-sections
linker options: -s -Wl,--gc-sections
strip libmodel.a -s -R .comment -R .gnu.version --strip-unneeded -R .note
Run Code Online (Sandbox Code Playgroud)
在使用条带和优化选项之前,它占用了4MB.
我仍然离开,这不是一个很大的计划.如何以任何方式与嵌入式平台上的等效程序进行比较是合理的.
请注意,二进制文件的大小可能有点具有欺骗性,因为未初始化的变量(.bss 部分)不一定会占用二进制文件中的物理空间,因为这些变量通常只是被标记为存在,而实际上没有为它们提供任何空间...这通常是由操作系统加载程序在运行您的程序时发生的。
objdump( http://www.gnu.org/software/binutils/ ) 或者elfdumpelf 工具链 ( http://sourceforge.net/apps/trac/elftoolchain/ ) 将帮助您确定各个部分的大小,数据和文本,以及各个函数和全局变量的大小等。所有这些程序都会“查看”编译的二进制文件并提取大量信息,例如 .text、.data 部分的大小,列出各种符号,它们的位置和大小,甚至可以分解 .text 部分......
在 ELF 映像 test.elf 上使用 elfdump 的示例可能是elfdump -z test.elf > output.txt。这将转储所有内容,包括文本部分反汇编。例如,从elfdump我的系统上我看到
Section #6: .text, type=NOBITS, addr=0x500, off=0x5f168
size=149404(0x2479c), link=0, info=0, align=16, entsize=1
flags=<WRITE,ALLOC,EXECINSTR>
Section #7: .text, type=NOBITS, addr=0x24c9c, off=0x5f168
size=362822(0x58946), link=0, info=0, align=4, entsize=1
flags=<WRITE,ALLOC,EXECINSTR,INCLUDE>
....
Section #9: .rodata, type=NOBITS, addr=0x7d5e4, off=0x5f168
size=7670(0x1df6), link=0, info=0, align=4, entsize=1
flags=<WRITE,ALLOC>
Run Code Online (Sandbox Code Playgroud)
这样我就可以看到我的代码占用了多少空间(.text 部分)和我的只读数据。后来在文件中我看到......
Symbol table ".symtab"
Value Size Bind Type Section Name
----- ---- ---- ---- ------- ----
218 0x7c090 130 LOC FUNC .text IRemovedThisName
Run Code Online (Sandbox Code Playgroud)
所以我可以看到我的函数IRemovedThisName占用了 130 个字节。快速脚本将允许您列出按大小排序的函数和按大小排序的变量。这可以为您指明需要优化的地方......
有关objdump尝试http://www.thegeekstuff.com/2012/09/objdump-examples/的一个很好的示例,特别是第 3 节,它向您展示了如何使用该选项获取节标题的内容-h。
至于程序如何在两个不同的平台上进行比较,我认为您只需在两个平台上进行编译并比较obj/elfdump在每个系统上获得的结果 - 结果将取决于系统指令集、每个编译器的优化程度、一般硬件架构差异等。
如果您无法访问嵌入式系统,您可以尝试在笔记本电脑上使用针对最终目标配置的交叉编译器。这将为您提供适合嵌入式平台的二进制文件和分析文件的工具(即 的跨平台版本objdump)。这将为您提供一些关于程序在最终嵌入式系统上的外观的大概数据。
希望这可以帮助。
编辑:这也将有助于如何从 C 程序内部或使用内联汇编获取 C 函数的大小?