JavaScript is required to for searching.
ナビゲーションリンクをスキップ
印刷ビューの終了
Oracle Solaris 11.1 リンカーとライブラリガイド     Oracle Solaris 11.1 Information Library (日本語)
このドキュメントの評価
search filter icon
search icon

ドキュメントの情報

はじめに

パート I リンカーおよび実行時リンカーの使用

1.  Oracle Solaris リンカーの紹介

2.  リンカー

リンカーの起動

直接起動

コンパイラドライバを使用する

クロスリンク編集

リンカーオプションの指定

入力ファイルの処理

アーカイブ処理

共有オブジェクトの処理

追加ライブラリとのリンク

ライブラリの命名規約

共有オブジェクトとアーカイブとの混合体へのリンク

コマンド行上のアーカイブの位置

リンカーが検索するディレクトリ

実行時リンカーが検索するディレクトリ

初期設定および終了セクション

シンボルの処理

シンボルの可視性

シンボル解決

単純な解決

複雑な解決

重大な解決

未定義シンボル

実行可能ファイルの作成

共有オブジェクト出力ファイルの生成

ウィークシンボル

出力ファイル内の一時的シンボル順序

追加シンボルの定義

-u オプションを使用した追加シンボルの定義

シンボル参照の定義

絶対シンボルの定義

一時的シンボルの定義

シンボル定義の増強

シンボル範囲の縮小

シンボル削除

外部結合

文字列テーブルの圧縮

出力ファイルの生成

機能要件の特定

プラットフォーム機能の特定

マシン機能の指定

ハードウェア機能の特定

ソフトウェア機能の特定

シンボル機能関数ファミリの作成

シンボル機能データ項目のファミリの作成

オブジェクト機能のシンボル機能への変換

機能ファミリの実行

再配置処理

ディスプレイスメント再配置

スタブオブジェクト

補助オブジェクト

デバッガによる補助オブジェクトのアクセスと使用

親オブジェクト

デバッグ支援

3.  実行時リンカー

4.  共有オブジェクト

パート II クイックリファレンス

5.  リンカーのクイックリファレンス

パート III 詳細情報

6.  直接結合

7.  システムのパフォーマンスを最適化するオブジェクトの構築

8.  mapfile

9.  インタフェースおよびバージョン管理

10.  動的ストリングトークンによる依存関係の確立

11.  拡張性メカニズム

パート IV ELF アプリケーションバイナリインタフェース

12.  オブジェクトファイル形式

13.  プログラムの読み込みと動的リンク

14.  スレッド固有ストレージ (TLS)

パート V 付録

A.  リンカーとライブラリのアップデートおよび新機能

B.  System V Release 4 (バージョン 1) Mapfile

索引

ドキュメントの品質向上のためのご意見をください
簡潔すぎた
読みづらかった、または難し過ぎた
重要な情報が欠けていた
内容が間違っていた
翻訳版が必要
その他
Your rating has been updated
貴重なご意見を有り難うございました!

あなたの貴重なご意見はより良いドキュメント作成の手助けとなります 内容の品質向上と追加コメントのためのアンケートに参加されますか?

親オブジェクト

拡張可能な機能を提供するプログラムは、多くの場合、実行時に dlopen() 関数を使用して読み込まれた共有オブジェクトを利用します。これらの共有オブジェクトは、多くの場合プラグインと呼ばれ、コアシステムの機能を拡張するための柔軟な手段を提供します。プラグインを読み込むオブジェクトは、と呼ばれます。

親オブジェクトは、プラグインを読み込み、プラグイン内の関数やデータにアクセスします。また、一般に親オブジェクトはプラグインが使用する関数とデータを提供します。この例を、次の親およびプラグインのソースファイルで示します。ここで、親はプラグインのためにparent_callback() という名前の関数を提供しています。プラグインは、親が呼び出すための plugin_func() という名前の関数を提供しています。

$ cat main.c
#include <stdio.h>
#include <dlfcn.h>
#include <link.h>

void
parent_callback(void)
{
        (void) printf("plugin_func() has called parent_callback()\n");
}

int
main(int argc, char **argv)
{
        typedef void plugin_func_t(void);

        void            *hdl;
        plugin_func_t   *plugin_func;

        if (argc != 2) {
                (void) fprintf(stderr, "usage: main plugin\n");
                return (1);
        }

        if ((hdl = dlopen(argv[1], RTLD_LAZY)) == NULL) {
                (void) fprintf(stderr, "unable to load plugin: %s\n", dlerror());
                return (1);
        }

        plugin_func = (plugin_func_t *) dlsym(hdl, "plugin_func");
        if (plugin_func == NULL) {
                (void) fprintf(stderr, "unable to find plugin_func: %s\n",
                    dlerror());
                return (1);
        }

        (*plugin_func)();

        return (0);
}

$ cat plugin.c
#include <stdio.h>
extern    void    parent_callback(void);
void
plugin_func(void)
{
    (void) printf("parent has called plugin_func() from plugin.so\n");
    parent_callback();
}

$ cc -o main main.c -lc
$ cc -Kpic -G -o plugin.so plugin.c -lc
$ ./main ./plugin.so
parent has called plugin_func() from plugin.so
plugin_func() has called parent_callback()

共有オブジェクトを作成するときは、オブジェクトがそのすべての依存関係を確実に指定できるように、-z defs オプションの使用をお勧めします。ただし、-z defs を使用すると、親オブジェクトからは満たされないシンボルがあるため、プラグインオブジェクトをリンクできなくなります。

$ cc -zdefs -Kpic -G -o plugin.so plugin.c -lc
Undefined                       first referenced
 symbol                             in file
parent_callback                     plugin.o
ld: fatal: symbol referencing errors. No output written to plugin.so

parent_callback() シンボルが親オブジェクトによって提供されることをリンク編集に指定するには、mapfile を使用できます。

$ cat plugin.mapfile
$mapfile_version 2

SYMBOL_SCOPE {
    global:
        parent_callback         { FLAGS = PARENT };
};
$ cc -zdefs -Mplugin.mapfile -Kpic -G -o plugin.so plugin.c -lc

プラグインを作成するときの対処方法としては、-z parent オプションを使用して、プラグインが親のシンボルに直接アクセスできるようにすることをお勧めします。mapfile の代わりに -z parent を使用すると、親オブジェクトの名前がプラグインの動的セクションに記録され、file ユーティリティーで表示されるという利点も得られます。

$ cc -zdefs -zparent=main -Kpic -G -o plugin.so plugin.c -lc
$ elfdump -d plugin.so | grep PARENT
       [0]  SUNW_PARENT       0xcc                main
$ file plugin.so 
plugin.so: ELF 32-bit LSB dynamic lib 80386 Version 1,
           parent main, dynamically linked, not stripped