特定の手順によって,既存資産などの位置独立ではないプログラムを,位置独立プログラムから参照することができます。この場合の位置独立ではない側のプログラムを,共有部と呼びます。
共有部の実行形式の作成時に,最適化リンカの-fsymbolオプションを使用して,位置独立プログラムから参照したい関数や変数のアドレスを,.fsyファイルに出力しておきます。
すでに作成済みの共有部の実行形式を位置独立プログラムから参照したい場合は,共有部のリンク・マップ・ファイルなどで参照したい関数や変数のアドレスを確認し,.fsyファイルに記述します。
FILE=memcmp 00002000 00002023 24 _memcmp 00002000 0 none ,g * FILE=memcpy 00002024 0000203b 18 _memcpy 00002024 0 none ,g * FILE=strcpy 0000203c 0000204f 14 _strcpy 0000203c 0 none ,g * |
.public _memcmp _memcmp .equ 0x2000 .public _memcpy _memcpy .equ 0x2024 .public _strcpy _strcpy .equ 0x203c |
このとき,宣言の所属するセクションを,共有部側の関数,変数定義のセクションと合わせておきます。参照する側のPIC関数は,PIC用のセクションに定義してください。
-pid,-pirod,-pidオプション指定時でも,#pragma section指令に,text,const,r0_disp16等の位置独立でないセクション再配置属性を指定することは可能です。この場合,関数や変数の宣言のみを記述できます。関数や変数の定義を記述するとエラーになります。 |
共有部の関数,変数を参照するコードを記述し,位置独立プログラムをビルドします。このとき,共有部から作成した.fsyファイを一緒にビルドすることで,共有部側にある関数や変数への参照を絶対アドレスで解決します。
位置独立プログラム同士,また位置独立プログラムと共有部との間の,参照可能な関係と参照方法を次の表に示します。
非PIC関数のリンク時には,リンカがPIC関数,PIROD変数の実行時のアドレスを特定できないため,あらゆる直接参照ができません。実行時にポインタを受け取って,ポインタ経由で参照することは可能です。 |