C 如何对“除”之外的其他部分的符号进行排序;普通的;部门?

C 如何对“除”之外的其他部分的符号进行排序;普通的;部门?,c,gcc,build,linker,static-linking,C,Gcc,Build,Linker,Static Linking,gnu链接器“ld”提供选项“-sort common”,该选项按大小对未初始化的全局参数(称为公共部分符号)进行排序。当链接器将符号与偶数地址对齐时,此选项有助于最小化节中的孔。 例如,如果我们定义: --main.c 字符a 短b 字符c int main(){return 0;} 如果不使用“sort common”,我们将在地址“a”和地址“b”之间得到一个1字节的“洞”。如果我们使用“sort common”,链接器会将参数重新排序为“a,c,b”,并且由于a的大小为1字节,c的大小为

gnu链接器“ld”提供选项“-sort common”,该选项按大小对未初始化的全局参数(称为公共部分符号)进行排序。当链接器将符号与偶数地址对齐时,此选项有助于最小化节中的孔。 例如,如果我们定义:

--main.c

字符a

短b

字符c

int main(){return 0;}

如果不使用“sort common”,我们将在地址“a”和地址“b”之间得到一个1字节的“洞”。如果我们使用“sort common”,链接器会将参数重新排序为“a,c,b”,并且由于a的大小为1字节,c的大小为1字节,因此它们的地址之间不会有“洞”。 我的问题是我的代码看起来像:

--main.c

字符a=0

短b=0

字符c=0

在这种情况下,a、b和c位于BSS部分,这意味着“排序公用”不会影响它们

如何对“常用”部分之外的其他部分的符号进行排序?

我还在LD脚本中搜索了许多选项,但都没有成功


更新:我读了一些关于段_标志中的“顺序”值的内容,不知道如何使用它。任何帮助都是值得的。

afaik即使是未初始化的变量也会出现在BSS部分;来自ld手册:“此选项告诉ld在将公共符号放置在适当的输出部分时,按对齐方式[…]对其进行排序”;在C中,具有静态存储持续时间的数据总是初始化的。默认情况下,这些数据将在BSS中结束,除非您在ld脚本中设置了不同的部分(使用“*(COMMON)”)。但是我想对非公共BSS部分和数据部分进行排序。我可以用地图文件吗?我在段_标志中读到一些关于“顺序”值的内容,不知道如何使用它。