2012-11-15 79 views
8

我只使用过AVR和MSP430,但这两者都是如此。在编译和静态链接之后,我的最终ELF二进制大约为208kB,而Intel Hex二进制大约为41kB。 AVRDUDE告诉我它正在上传约18kB。这里究竟发生了什么?为什么上传的二进制大小比实际大小要小得多?

+0

尝试创建一个.bin文件...它也可能是也可能不是正确的大小,但可能是一个更好的指标。 .elf格式比只有加载的字节有更多的东西。 .hex文件有一些额外的东西,并在ascii中,所以你有两倍多的字节在门外,然后添加额外的。这些文件格式全部记录在维基百科和其他地方 –

+0

这不是说二进制文件比文件大于二进制文件。 –

回答

10

我最后的ELF二进制是208KB

各地

是的,因为ELF是不是原始的机器代码。它是一种通用的可执行格式,它具有重定位信息,动态加载信息,只读数据的不同级别,可写数据和代码等。这些大多数与微控制器无关,因为它没有操作系统,没有动态加载设施,所以大多数额外的信息都可以被剥离。

Intel Hex二进制码约为41kB。 AVRDUDE告诉我它正在上传约18kB。

有两个原因。其中一个英特尔十六进制文件包含每行结尾的校验和。如果使用合理的平均线长度来剪切这些文件,您可以预期文件会缩小几个百分点,例如达到36kB。然后,有一个原因英特尔十六进制文件被命名为'十六进制'文件。它们不包含原始二进制数据,而是包含十六进制格式的原始二进制数据 - 我。即一个真正的字节使用两个字节进行编码。所以当AVRdude上传代码时,它会将其转换为原始二进制文件(这是AVR处理器可以运行的内容),然后数据大小再次减少50%。

+2

ELF二进制文件也可能包含符号。 –

+0

@MichaelBurr是的,没错。 – 2012-11-15 09:55:25

+0

太棒了。听起来不错,谢谢! – Andrew

0

目标代码包含附加的元数据,包括符号表和调试器信息。如果您使用的是GNU工具链,则大多数数据通常可能会被编译器和/或链接器选项或实用程序剥离。

一个十六进制文件使用2个十六进制数字字符来表示单个字节,再加上记录开销,因此总是比二进制文件长度的两倍多一点。