2

MIPS32 arch 用のランタイム リンカーを作成していますが、GPREL16 再配置タイプに問題があります。たとえば、コンパイラ/アセンブラは、次のような命令でリロケータブル オブジェクトを出力します。

ff838018        sd      v1,-32744(gp)

ここに含まれるシンボルは .sbss セクションに属し、ランタイム アドレス 0x12b119e8 に設定されます。_gp が 0x12b12220 で、.sbss セクションが 0x12b11868 から始まるとします。(値はターゲット ELF オブジェクトから読み取られます。)

ld によって再配置された後、命令は次のようになります。

ff83f7c8        sd      v1,-2104(gp)

私の質問は次のとおりです: ld はオフセット 0xf7c8 をどのように計算しますか? 私の推測では、0xf7c8 は _gp、.sbss アドレス、および元のオフセット 0x8018 によって計算されます。関連するコードは、binutils/src/bfd/elf32-mips.c のルーチン _bfd_mips_elf_gprel16_reloc にあると思います。

しかし、これがどのように計算されているかを理解することはできません。誰か手を貸してくれませんか?

よろしくお願いします -Qinglai

4

0 に答える 0