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

时间:2015-08-26 17:34:39

标签: gcc linker arm ld compiler-optimization

当我在编译后检查内存映射时,我可以看到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-embeddedarm-none-eabi-gcc v4.8.3,而ld是v2.23.2。

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

1 个答案:

答案 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