共有オブジェクトの説明
共有オブジェクトの概説
ILINKリンカは、実行可能ファイル(独自の実行環境を構築するファイル、または実行中のシステムにロードされるファイル)の作成に加えて、共有オブジェクト(共有ライブラリ)を生成することもできます。
共有オブジェクトは、dlopen関数の呼び出しにより、既に実行されている別のプロセスの実行環境にロードされます。共有オブジェクトは常にRAMにロードされます。ロードプロセスは共有オブジェクトにアクセスし、そのシンボルを使用できるようになります。
ロードプロセスは複数の共有オブジェクトを開くことができ、共有オブジェクトは相互にエクスポートされたコンテンツを参照できます。共有オブジェクトがその目的を果たしたら、そのオブジェクトをアンロードし、ロード先のメモリは別の共有オブジェクトなど他の目的に再利用できます。
注記
共有オブジェクトは、32ビットArmアーキテクチャでのみサポートされます。.
共有オブジェクトを生成する理由
共有オブジェクトは、オペレーティングシステムで複数のアプリケーションや別の共有オブジェクトがランタイム時に使用できるように設計されています。アプリケーションが共有オブジェクトを使用する場合、オペレーティングシステムは動的リンカまたは動的リンカのように動作するものを使用して、ロード時にオブジェクトをファイルからメモリにロードします。
共有オブジェクトの生成および使用要件
ILINKで共有オブジェクトを生成する、またアプリケーションでそれを使用するには、次の要件が適用されます。
位置独立コードおよびデータ
共有オブジェクト内のコードとデータは、メモリ上の任意に位置における必要があります。つまり位置独立でなければいけません。このため、共有オブジェクトの出力を指定するコマンドラインオプション‑‑sharedも、コンパイラオプション‑‑ropiや‑‑rwpi=gotを指定するのと同じ効果があります。これらのオプションを個別に設定する必要はありません。共有オブジェク トには、絶対アドレスのコードやデータを含めることはできません。
共有オブジェクトで使用したアセンブラコードも位置独立で、グローバルデータにアクセスするすべてのコードは、オプション --rwpi=got を使用してコンパイラが生成したコードのように、グローバルオフセットテーブル(GOT) を使用する必要があります。
注記
オプション --rwpi および --rwpi=sb は、共有オブジェクトとともに使用できません。
動的リンク
共有オブジェクトの使用には、動的リンカまたは動的リンカのように機能するものの使用が必要になります。動的リンカは、利用可能なメモリに共有オブジェクトをロードして、参照元や参照先を解決できます。動的リンカは、通常オペレーティングシステムに含まれていて、IARでは提供していません。
ILINK によって生成された共有オブジェクトは、ELF for the Arm® Architecture 2022Q3, AAELF32 の 7.3 章で定義されている SVr4 DSO-like PLT Linkage シーケンスに準拠しています。そのような共有オブジェクトを扱う動的リンカであれば、ILINKが生成した共有オブジェクトを扱えます。
Cソースコード
C++ は共有オブジェクトを完全にはサポートしていません。特に、vtable(仮想関数)、動的初期化、例外などの C++ の主要な機能は使用できません。ただし、他のほとんどのC++コンストラクトは機能するため、一部のC++を使用すれば、動作する共有オブジェクトを生成できます。