1

組み込みLinuxを構築していますが、さまざまなセクションのLMAアドレスとVMAアドレスが等しくないためにエラーが発生します。

> /opt/tc/uclibc-crosstools-gcc-4.6/usr/bin/mips-linux-uclibc-objdump -h vmlinux
...
9  __modver      00000470  802b6b90  802b6b90  002aab90  2**0
                 ALLOC
10 .data         002f5e20  802b8000  802b7b90  002abb90  2**14
                 CONTENTS, ALLOC, LOAD, DATA
11 .init.text    0001c020  805ae000  805adb90  005a1b90  2**2
                 CONTENTS, ALLOC, LOAD, READONLY, CODE
...

私が抱えている問題は、自動生成されたリンカースクリプト(arch / mips / kernel / vmlinux.lds)に次の行があることです。

 .init.data : AT(ADDR(.init.data) - 0) { ...}

これは、.init.textVMAが.init.textLMAと等しくなければならないことを示しています。また、スクリプトにあるように、.dataのATを手動で追加しようとしました.data : AT(ADDR(.data))が、.dataが正しい場所に戻されません。興味深い点の1つは、LMAとVMAが0x470バイト異なることです。これは、まさに__modverセクションのサイズです。なぜ私がこの振る舞いをしているのか、誰かが何か光を当てることができますか?

(mipsアーキテクチャーにはbuildroot 2011.11、uClibc 0.9.32.1、gcc 4.6、およびlinux 3.2を使用しています。)

ありがとう

ジョン

4

1 に答える 1

1

したがって、他の誰かが同じ問題に遭遇した場合に備えて、私は自分の質問に答えています。時間を節約できる可能性があります。リンカーにバグがあることがわかりました。modverセクションは空でしたが、ALIGNディレクティブが含まれていました。これはリンカーを混乱させるように見え、後続のすべてのセクションのLMAを破棄します。これに対する解決策は、1バイトの変数を強制的にmodverに含めることでした(ただし、start_modverとend_modverの間ではありません。そうしないと、新しい問題が発生します...)。これで問題が解決します。リンカーは最終的に修正する必要があります。

ジョン

于 2012-04-17T19:32:20.603 に答える