入力ファイルの追加は、通常、その追加の順に出力ファイルに表示されます。一時的シンボルはこの規則の例外であり、シンボルが完全に解決されるまで完全には定義されません。出力ファイル内の一時的シンボルの順番は、追加順にならない場合があります。
シンボルグループの順序を制御する必要がある場合には、一時的定義は、ゼロで初期化されたデータ項目に再定義する必要があります。たとえば、次のような一時的定義をすると、出力ファイル内のデータ項目が、ソースファイル 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