Oracle® Solaris 11.2 链接程序和库指南

退出打印视图

更新时间: 2014 年 7 月
 
 

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

构成输入文件的符号通常以这些符号的顺序出现在输出文件中。但暂定符号例外,因为完成这些符号的解析后才会完全定义这些符号。输出文件中暂定符号的顺序可能不遵循其原始顺序。

如果需要控制一组符号的顺序,应将所有暂定定义重新定义为初始化为零的数据项。例如,与源文件 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