一番下のサンプルコードをコンパイルすると
arm-elf-gcc init.c -o lib.so -Wl,-shared -nostdlib
いくつかの再配置を含む共有ライブラリを取得します (readelf lib.so -r):
0000032c 00000d02 R_ARM_ABS32 000004b8 plpv1
00000330 00001302 R_ARM_ABS32 00000000 lpv2
000004b8 00000b02 R_ARM_ABS32 00000000 lpv1
今まで私は、リンカーがすべての静的再配置を解決し、必要に応じて動的再配置 (ローダーによって処理される) を生成すると信じていました。リンカー出力に静的再配置が残っているのはなぜですか? このドキュメントでは、R_ARM_ABS32 は静的再配置であり、次のようにも述べています。
静的再配置は静的リンカによって処理されます。それらは通常、完全に解決されるか、リンク後のステップまたは動的ローダーによって処理される動的再配置を生成するために使用されます。適切に形成されたイメージには、静的リンクが完了した後の静的再配置がないため、通常、ポストリンカまたは動的ローダーは動的再配置のみを処理する必要があります。
ところで、これは i386-elf-gcc を使用して再現することもできます。そこで使用される静的再配置は R_386_32 です。
ローダーで実際に処理する必要がある再配置を教えてください。前もって感謝します!
コード例:
extern unsigned char lpv1;
extern unsigned char lpv2;
unsigned char* plpv1 = &lpv1;
void func(void)
{
lpv2 = *plpv1;
}