[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の方を直したいです。
なにか情報ありましたら、教えて下さい。