1

一番下のサンプルコードをコンパイルすると

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;
}
4

2 に答える 2

0

メーリング リストにフォローアップがあります: https://sourceware.org/bugzilla/show_bug.cgi?id=16163

于 2015-05-06T10:44:02.950 に答える
0

誰か教えてくれませんか、なぜですか

-fPICコンパイル時にフラグが欠落している可能性が最も高いです。

于 2013-07-25T05:05:35.263 に答える