链接程序和库指南

输出文件中暂定符号的顺序

构成输入文件的符号通常以这些符号的顺序出现在输出文件中。处理暂定符号及其关联的存储空间时,情况却有所不同。完成这些符号的解析后才会完全定义这些符号。如果解析可重定位目标文件中的已定义符号,则此符号出现在定义后面。

如果需要控制一组符号的顺序,则应将所有暂定定义重新定义为初始化为零的数据项。例如,与源文件 foo.c 中说明的原始顺序相比,以下暂定定义将导致在输出文件中重新排序数据项:


$ cat foo.c

char A_array[0x10];

char B_array[0x20];

char C_array[0x30];



$ cc -o prog main.c foo.c

$ nm -vx prog | grep array

[32]    |0x00020754|0x00000010|OBJT |GLOB |0x0  |15  |A_array

[34]    |0x00020764|0x00000030|OBJT |GLOB |0x0  |15  |C_array

[42]    |0x00020794|0x00000020|OBJT |GLOB |0x0  |15  |B_array

通过将这些符号定义为已初始化的数据项,这些符号在输入文件中的相对顺序将被传递到输出文件:


$ cat foo.c

char A_array[0x10] = { 0 };

char B_array[0x20] = { 0 };

char C_array[0x30] = { 0 };



$ cc -o prog main.c foo.c

$ nm -vx prog | grep array

[32]    |0x000206bc|0x00000010|OBJT |GLOB |0x0  |12  |A_array

[42]    |0x000206cc|0x00000020|OBJT |GLOB |0x0  |12  |B_array

[34]    |0x000206ec|0x00000030|OBJT |GLOB |0x0  |12  |C_array