仕事で興味深い状況が発生し、適切な解決策を見つけようとしています。マルチコア MIPS ベア メタル (カーネルなし) で実行されるコードがあります。アップグレード可能にする必要があるサードパーティのコードと統合する必要があります。サード パーティのコードを PIC としてコンパイルし、このコードをダウンロードするときにコード/データ シンボルの GOT を変更することを考えていました (コードが存在する場所を制御できます)。また、サード パーティ コードへのインターフェイスは変更されないため、新しい PLT/GOT エントリはないと仮定します。これは機能しますか?他にどのようなことを考慮する必要がありますか?
2 に答える
正解は「動的リンカー/ローダーを埋め込む」より長いですか? あなたの問題は、ld.soなどによって解決されたものと同じようです。動的リンカー/ローダーが考慮しなければならないすべてのことを説明することは、John Levine によるLinkers and Loadersなどの本のトピックです。
Linux/Unix の binutilsobjcopy
が探しているものでしょうか。実際に実行時にランダムな順序で動的にロードするのではなく、すべてのバイナリを一度に構築していると仮定すると[そして、それらをそのメモリ全体に分散させるのに十分なメモリがない]、それでうまくいくと思います。
もちろん、GOT のみを修正する必要がある場合は、それができない理由がわかりません。それを行うものを作成するのはそれほど難しい作業ではありません。しかし、objcopy は既に作成されており、かなりの量のバイナリ/実行可能ファイルの「いじり」を行うことができます (私はそれを使用して、PC の BIOS ROM などを含むさまざまなシステムのブート ROM を作成しました) [思いついたわけではありません。そのアイデアでは、たまたまその中にobjcopyが含まれている誰かのmakefileを取得したようなものです-ある時点で何かがうまくいかなかったときに、それがどのようにROMを作成したかを理解するためにそれが何をしたかを調べました]