4

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”值的内容,但不明白如何使用它。任何帮助都是可观的。

4

0 回答 0