当我在编译后检查内存映射时,我可以看到DATA或BSS部分中的符号没有以优化的方式排序,而是它们的大小和CPU的aligmnent访问限制。
例如,我最终得到的结果是:
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是来自https://launchpad.net/gcc-arm-embedded的arm-none-eabi-gcc
v4.8.3,而ld
是v2.23.2。
ld
没有进行此优化的相关原因是什么?如何重新排序符号以提高内存使用率?
答案 0 :(得分:0)
这可以通过链接描述文件中的SORT_BY_ALIGNMENT来完成,例如:
*(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