不久前,我更新了ARM编译器 (Sourcery CodeBench Lite 2013)稍微更新版本(Sourcery CodeBench Lite 2015)。
这导致我们的输出出现一些奇怪的差异。我使用.elf文件主要用于调试目的(与GDB结合使用)和一些自动测试脚本,可以在短时间内检查很多变量。 现在问题是:
Size of the .elf of the old compiler: 35MB
Size of the .elf with the new compiler: 2.2MB
这一点只是一个巨大的差异,并且在编译器更新旁边没有任何改变,而且小尺寸的.elf文件阅读速度慢很多,而这正成为一个问题。
Sourcery Codebench更改日志并没有太多帮助,但我知道旧版本基于GCC版本4.7.3,而新版本基于> GCC 4.8.3。 我现在一直在寻找,但我无法在编译器中找到导致这种不同输出的变化。
该软件使用arm-none-eabi和 为了调试,启用了以下选项:
-g3
-gdwarf-2
makefile到目前为止我可以分享它,让我指出这个文件已经存在很长时间了:
EXT_LIBS := \
-lm
cppflags := \
$(CONFIGFLAGS) \
-UUSE_FULL_ASSERT \
-DADC_IN_HAL_IO \
cflags := \
$(cpu_flags) \
$(cppflags) \
$(cc_board_flags) \
$(INCLUDES) \
-O0 \
-Wall \
-Wno-comment \
-Wno-unused-but-set-variable \
-c \
-fmessage-length=0 \
-mthumb \
-g3 \
-gdwarf-2
asflags := \
$(cpu_flags) \
$(cppflags) \
$(as_board_flags) \
$(INCLUDES) \
-Wall \
-c \
-fmessage-length=0 \
-mthumb \
-g3 \
-gdwarf-2
lnkflags := \
$(lnk_board_flags) \
$(INCLUDES) \
-T$(SRC_LD) \
-Wl,-Map,$(PROJECT).map \
$(cpu_flags) \
-mthumb \
-g3 \
-gdwarf-2
od_flags := \
--dwarf
编辑评论:
使用file
时,这两个文件都会给我以下内容:
ELF 32-bit LSB Executable, ARM, version 1 (SYSV), statically linked, not stripped
要求的地图文件:
https://dl.dropboxusercontent.com/u/58946673/Old_compiler.map
https://dl.dropboxusercontent.com/u/58946673/New_Compiler.map
是否有人知道如何将.elf文件再次增加为旧(大)格式?
答案 0 :(得分:0)
当你考虑到后者的这一部分时,较小的ELF似乎与较大的地图文件直接相关:
...
Discarded input sections
.group 0x00000000 0x8 can.o
...
新的链接器已经认为可以抛弃它认为不需要的一大堆东西。有可能默认情况下--gc-sections
生效,并且这些部分(或至少看起来是)未引用。由于其余的符号和部分布局在两个版本之间看起来大致相同,所以看起来就是这种情况 - 如果保持兆字节显然不必要的ELF部分确实对您有隐藏的好处,请尝试传递--no-gc-sections
在链接选项中。
可能可能存在其他原因,例如未被显式链接描述文件规则捕获的部分名称,以及具有不同默认行为的两个链接器怎么处理这些问题,但我肯定会首先调查最明显的罪魁祸首。