ARM的GCC链接器未优化符号放置

ARM的GCC链接器未优化符号放置,gcc,linker,arm,ld,compiler-optimization,Gcc,Linker,Arm,Ld,Compiler Optimization,当我在编译后检查内存映射时,我可以看到数据或BSS部分中的符号没有以优化的方式排序,它们的大小和CPU ALIGMNT访问限制都有问题 例如,我的结局是: address size name 0x1000 1 var_a 0x1004 4 var_b 0x1008 1 var_c 0x100a 2 var_d 0x100c 4 var_e 0x1010 1 var_f 0x1014 4 var

当我在编译后检查内存映射时,我可以看到数据或BSS部分中的符号没有以优化的方式排序,它们的大小和CPU ALIGMNT访问限制都有问题

例如,我的结局是:

address  size   name
0x1000      1   var_a
0x1004      4   var_b
0x1008      1   var_c
0x100a      2   var_d
0x100c      4   var_e
0x1010      1   var_f
0x1014      4   var_g
0x1018      0   end
而不是得到:

0x1000      4   var_b
0x1004      4   var_e
0x1008      4   var_g
0x100c      2   var_d
0x100e      1   var_a
0x100f      1   var_c
0x1010      1   var_f
0x1011      0   end
但是,我可以看到,所有符号都是混淆的,与它们在源代码中或编译过程中的顺序无关

我正在使用选项
-Os
-flto
-flto
-fuse-linker-plugin
-flto-report
-flto-compression level=9
。ARM的GCC为
ARM none eabi GCC
v4.8.3 from和
ld
为v2.23.2


ld
没有进行此优化是否有相关原因?如何对符号重新排序以提高内存使用率?

这可以通过链接器脚本中的“逐个排序”对齐来完成,例如:

*(SORT_BY_ALIGNMENT(SORT_BY_NAME(.data*)))
还有以下选项,尽管我没有尝试:

--sort-common [=ascending|descending]
    Sort common symbols by alignment [in specified order]
 --sort-section name|alignment
    Sort sections by name or maximum alignment