构成输入文件的符号通常以这些符号的顺序出现在输出文件中。但暂定符号例外,因为完成这些符号的解析后才会完全定义这些符号。输出文件中暂定符号的顺序可能不遵循其原始顺序。
如果需要控制一组符号的顺序,应将所有暂定定义重新定义为初始化为零的数据项。例如,与源文件 foo.c 中说明的原始顺序相比,以下暂定定义将导致对输出文件中的数据项重新排序。
$ cat foo.c char One_array[0x10]; char Two_array[0x20]; char Three_array[0x30]; $ cc -o libfoo.so -G -Kpic foo.c $ elfdump -sN.dynsym libfoo.so | grep array | sort -k 2,2 [11] 0x10614 0x20 OBJT GLOB D 0 .bss Two_array [3] 0x10634 0x30 OBJT GLOB D 0 .bss Three_array [4] 0x10664 0x10 OBJT GLOB D 0 .bss One_array
根据符号地址对符号排序将导致符号的输出顺序与其在源文件中定义的顺序不同。相反,通过将这些符号定义为已初始化的数据项,可确保这些符号在输入文件中的相对顺序传递到输出文件。
$ cat foo.c char A_array[0x10] = { 0 }; char B_array[0x20] = { 0 }; char C_array[0x30] = { 0 }; $ cc -o libfoo.so -G -Kpic foo.c $ elfdump -sN.dynsym libfoo.so | grep array | sort -k 2,2 [4] 0x10614 0x10 OBJT GLOB D 0 .data One_array [11] 0x10624 0x20 OBJT GLOB D 0 .data Two_array [3] 0x10644 0x30 OBJT GLOB D 0 .data Three_array