Embedded 为什么上传的二进制大小比实际大小小得多?

Embedded 为什么上传的二进制大小比实际大小小得多?,embedded,avr,msp430,Embedded,Avr,Msp430,我只使用过AVR和MSP430,但这对他们两个都是正确的。编译和静态链接后,我的最终ELF二进制文件约为208kB,Intel十六进制二进制文件约为41kB。AVRDUDE告诉我它正在上传大约18kB。这里到底发生了什么 我的最后一个ELF二进制文件大约是208kB 是的,因为ELF不是原始的机器代码。它是一种通用的可执行格式,具有重新定位信息、动态加载信息、只读数据、可写数据和代码的不同安全性等。由于微控制器没有操作系统,没有动态加载设施,因此大多数额外信息可以剥离 英特尔十六进制二进制文件约

我只使用过AVR和MSP430,但这对他们两个都是正确的。编译和静态链接后,我的最终ELF二进制文件约为208kB,Intel十六进制二进制文件约为41kB。AVRDUDE告诉我它正在上传大约18kB。这里到底发生了什么

我的最后一个ELF二进制文件大约是208kB

是的,因为ELF不是原始的机器代码。它是一种通用的可执行格式,具有重新定位信息、动态加载信息、只读数据、可写数据和代码的不同安全性等。由于微控制器没有操作系统,没有动态加载设施,因此大多数额外信息可以剥离

英特尔十六进制二进制文件约为41kB。AVRDUDE告诉我它正在上传大约18kB


有两个原因。首先,一个英特尔十六进制文件在每行末尾都包含校验和。如果使用合理的平均行长度剪切这些行,则可以预期文件将缩小几个百分点,例如,缩小到36kB。然后,英特尔十六进制文件被命名为“十六进制”文件是有原因的。它们不包含原始二进制数据,但包含十六进制形式的原始二进制数据-i。E一个实字节使用两个字节进行编码。因此,当AVRdude上传代码时,它会将其转换为原始二进制文件(这是AVRs处理器可以运行的),然后数据大小再次减少50%。

目标代码包含额外的metatdata,包括符号表和调试器信息。如果您使用的是GNU工具链,那么大多数数据通常可以通过编译器和/或链接器选项剥离,或者通过剥离实用程序剥离


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

如上所述,十六进制文件格式是ascii可打印的,这使得通过通信链路(如7位调制解调器/终端)进行传输更加容易,非常类似于Motorola。s19:


ELF二进制文件中可能也有符号。请尝试创建一个.bin文件…该文件的大小可能正确,也可能不正确,但可能是一个更好的指示器。.elf格式的内容比加载的字节多得多。.hex文件有一些额外的内容,并且是ascii格式的,所以您有两倍的字节,然后添加额外的内容。这些文件格式都记录在维基百科和其他地方,不是二进制文件比文件小,而是文件比二进制文件大。