ARM .ELF大小调试选项

时间:2016-07-04 06:25:53

标签: c debugging gcc arm embedded

不久前,我更新了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文件再次增加为旧(大)格式?

1 个答案:

答案 0 :(得分:0)

当你考虑到后者的这一部分时,较小的ELF似乎与较大的地图文件直接相关:

...

Discarded input sections

 .group         0x00000000        0x8 can.o
...

新的链接器已经认为可以抛弃它认为不需要的一大堆东西。有可能默认情况下--gc-sections生效,并且这些部分(或至少看起来是)未引用。由于其余的符号和部分布局在两个版本之间看起来大致相同,所以看起来就是这种情况 - 如果保持兆字节显然不必要的ELF部分确实对您有隐藏的好处,请尝试传递--no-gc-sections在链接选项中。

可能可能存在其他原因,例如未被显式链接描述文件规则捕获的部分名称,以及具有不同默认行为的两个链接器怎么处理这些问题,但我肯定会首先调查最明显的罪魁祸首。