gnu 链接器“ld”提供选项“-sort-common”,它按大小对未初始化的全局参数(称为 COMMON 节符号)进行排序。当链接器将符号对齐到偶数地址时,此选项有助于最大限度地减少节中的孔。例如,如果我们定义:
--main.c
字符一个;
短 b;
字符 c;
int main() { 返回 0; }
并在没有“sort-common”的情况下将其编译为 main.o,我们将在“a”的地址和“b”的地址之间得到一个字节的“洞”。如果我们使用“sort-common”,链接器会将参数重新排序为“a, c, b”,并且由于 a 的大小为 1 字节,c 的大小为 1 字节,因此它们的地址之间不会有“空洞”。我的问题是我的代码看起来像:
--main.c
字符 a = 0;
短 b = 0;
字符 c = 0;
...
在这种情况下,a、b 和 c 在 BSS 部分中,这意味着“sort-common”不会影响它们。
除了“常见”部分之外,我如何对其他部分的符号进行排序?
我还在 LD 脚本中搜索了许多选项,但均未成功。
更新:我在 segment_flags 中读到了一些关于“Order”值的内容,但不明白如何使用它。任何帮助都是可观的。