[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

dynamic linking error on ld-2.11.2



斉藤@densanと言います。

1.5.2の問題ではありませんが、1.5.2で起きた症状です。
binutils 2.11.2のldを使った場合の問題です。

理由は分かってませんが、ld-2.11.2 がrela.plt sectionに出力する
リロケーション情報が、エントリ数が 8192以上になると、
ダイナミックリンク時の1エントリあたりのスペース 8バイトから、
倍の16バイトに変わります。

_rtld_reloc_powerpc_plt()で、

 li   r11,index 
 b    pltresolve

のコードを埋め込む辺りの話です。

対策として、src/libexec/ld.elf_so/arch/powerpc/ppc_reloc.c で、
エントリ数が 8192以上かどうかを考慮する必要があります。

次のように直してみました。
diff ppc_reloc.c ppc_reloc.c.orig の実行結果です。

<               int N2 = obj->pltrelalim - obj->pltrela;
---
>               int N = obj->pltrelalim - obj->pltrela;
148,149c148
<               N2 = (N2 < 8192) ? (N2 * 2) : ((N2 - 8192) * 4 + 8192 * 2);
<               jmptab = pltcall + 18 + N2;
---
>               jmptab = pltcall + 18 + N * 2;
176c175
<       int N2 = obj->pltrelalim - obj->pltrela;
---
>       int N = obj->pltrelalim - obj->pltrela;
182,183c181
<       N2 = (N2 < 8192) ? (N2 * 2) : ((N2 - 8192) * 4 + 8192 * 2);
<       jmptab = pltcall + 18 + N2;
---
>       jmptab = pltcall + 18 + N * 2;
195c193
<       __syncicache(pltcall, 72 + N2 * 4);
---
>       __syncicache(pltcall, 72 + N * 8);

なぜ、8192なんでしょうか?
その理由が分かれば、NetBSDのldと互換をとるために、ld-2.11.2の方を直したいです。
なにか情報ありましたら、教えて下さい。