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