isymexport を使用してライブラリ内のシンボルを隠す

テクニカル・ノート 28924

アーキテクチャ:

ARM

コンポーネント:

linker

更新日:

2018/08/08 8:28

はじめに

本テクニカルノートでは、isymexportとステアリングファイルを使用して、ライブラリのシンボルを隠す方法について説明します。

問題

アプリケーションが、ユーザが作成したライブラリに含まれるweakでないグローバル変数/関数と同じ名前を持つグローバル変数/関数を定義しようとしている。

推奨方法

これを解決するには、ステアリングファイルとともにisymexportを使用して、ライブラリに含まれるどのシンボルをアプリケーションから見えるようにするか、どれを隠すかを選択します。

通常、ライブラリファイルはリンカ(Linker) > ライブラリ(Library) > 追加ライブラリ(Additional libraries)のオプションで指定しますが、isymexportで生成されたファイルで指定することもできます。

ただし、isymexportへの入力は、実行可能なELFファイル(リンクで生成された出力)でなければなりません。そのため、ライブラリを入力ファイルとして使うことはできません。

この制約を回避するには、このライブラリをリンクするためだけに新たなプロジェクトを作成し、isymexportへの入力として使用する出力ファイル(リンクされたイメージ)を生成します。

以下の例(Example project.zip)には、3つのプロジェクトが含まれています。

  1. Library
  2. Common
  3. Application

Library

int型のグローバル配列と、この配列に基づきint型の値を返す5つの関数が格納されたライブラリファイル(library.a)をビルドします。

Common

ライブラリファイル(library.a)をインクルードし、リンクされたイメージを生成します。ステアリングファイルとともにisymexportを呼び出し、エクスポートするシンボルと隠すシンボルを選択します。配列の名前と1つの関数の名前を隠します。

ビルド後に、コマンドラインからpost-build.batが呼び出されます。これにより、isymexportが呼び出されてcommon.symbolsが生成され、さらに、ielfdumparmが呼び出されてcommon.symbols(エクスポートされたシンボル)のシンボルテーブルがダンプされます。

専らエントリシンボルとして使用される、ダミー関数が定義されています。これは、リンクされたイメージに起動コードを含めないようにするためです(ライブラリだけを含めなければなりません)。

ライブラリ内にあるものがすべてリンカに渡されるようにするには、
--no_removeオプションとともに--whole_archiveオプションを使用します。これにより、参照されないセクションがリンカによって維持され、リンクされたイメージから削除されないようにすることができます。

Application

ライブラリに含まれる配列と5つの関数の1つと同じ名前で、int型配列と関数を定義します。

アプリケーションプロジェクトでは、5つの関数が順番に呼び出され、リターン値がstdoutに出力されます。

ライブラリによってエクスポートされたシンボルは、共通プロジェクトを介してインポートされます。このとき、isymexportによって生成されたcommon.symbolsファイルがインクルードされます。

C-SPYデバッガでは、アプリケーションプロジェクトと共通プロジェクトをシミュレータで実行できます。ターミナルI/O(Terminal I/O)ウィンドウには、呼び出し先の関数によって返されたint型の値が表示されます。そのうち1つはアプリケーションの配列から返され、他の4つはライブラリの配列から返されます。

 

全ての製品名は、それぞれの所有者の商標または登録商標です。

申し訳ございませんが、弊社サイトではInternet Explorerをサポートしていません。サイトをより快適にご利用いただくために、Chrome、Edge、Firefoxなどの最新ブラウザをお使いいただきますようお願いいたします。