議論/DLLサポート


Top / 議論 / DLLサポート

DLLサポート機能

ひげぽんの考えをまとめるためのページです

2005/07/10

以前からご要望のありました、DLLのサポート機能を実装しました。 具体的なポイントは以下の通り。

なおこの実装は仕様がFixしているものではないことにご注意ください。 ご要望いただいている機能を満たすよう実装しましたが、 お使いいただいた後のフィードバックで仕様変更となる可能性があります。

2005/07/08

システムコールインターフェース公開検討

2005/07/05

2005/07/04

2005/07/03以前の考え [#c4ca94bf]

MonaのカーネルにDLLサポート機能を!。について自分の考えをまとまるためにずらずらとゆるい感じでメモ。 下記に示した参考資料を読みましたが、基本的に既存OSの仕様を全然知らず想像・妄想しているので鵜呑みにしないでくださいw

参考資料

WindowsでDLLを動的に呼ぶ。明示的リンク

	hDll = ::LoadLibraryEx("dlltest.dll",NULL,0);
	if( ! hDll ){
		cout << "open err";
		return;
	}

	OKiHo = (LONG(__stdcall*)(LONG,LONG))  ::GetProcAddress( hDll,"hogehoge");
	if( ! OKiHo ){
		::FreeLibrary( hDll );
		cout << "read err";
		return;
	}

Linuxで動的ライブラリ

     /* 動的ライブラリをロードする */
     module = dlopen("libhello.so", RTLD_LAZY);
     if (!module) {
         fprintf(stderr, "libhello.so をオープンできませんでした: %s\n", dlerror());
         exit(1);
     }

     /* シンボルを取得する */
     dlerror();
     demo_function = dlsym(module, "hello");

DLLの構造

セクション概要備考
.textコード共有可。リロケート時のみ書き込み
.dataデータ共有不可。読み書き。各プロセスに要コピー
.rdata定数共有可。リロケート時のみ書き込み
.bssワークエリア共有不可。読み書き。要ゼロクリア
.edataエクスポートテーブル共有可。リロケート時のみ書き込み
.idataインポートテーブル共有可。リンク時のみ書き込み
.reloc再配置情報リロケート後破棄可

実例

/* test.c */
static int a = 1; /* .data */
const static int b = 2; /* .rdata */
const char* c = "mona"; /* cは.data, "mona"は.rdata */
static int d[2000]; /* .bss */
int test() { return a + b; } /* .text */

PEサーバーの実装

EXEとDLLをひとまとめにして実行バイナリイメージを生成している。呼ばれない部分が外されないため、実行時のメモリ効率はスタティックリンクよりも悪い。

  1. EXEを読み取って、依存しているDLLをリストアップして、どんどん後ろに配置していく。
    • 0xa0000000: [EXE][DLL][DLL]...
    • 先日のブラッシュアップにより、DLLが依存しているDLLも再帰的にリストアップされるようになった。
      • DLLが依存しているDLLに必ずしもEXEが依存しているとは限らない。
      • たとえばGLUTだけでアプリを書く場合、GLUT.DLLからGUI.DLLが呼び出されるが、EXEからはGUI.DLLを呼ばないので、リンクする必要がない。
      • これは仮にBayGUIを使用するGLUTがあるとすれば、EXEは再コンパイルせずにそのままにして、GLUT.DLLを置き換えるだけでBayGUIで動かすことが出来ることを意味する。
  2. DLLを置かれたアドレスにリロケートする。
  3. エクスポートテーブルを基にインポートテーブルのコールアドレスを埋めていく。
    • 名前で解決する場合、リニアサーチしていて無駄が多い。ハッシュしておくべき。
    • 序数でリンクすると高速だが、バイナリ互換性の維持が困難なので、使用しない方が無難。

関連ログ

議論/DLL/今後: 機能について

議論/DLL/今後: メモリマップ

libc: コメント

コメント

コメントはありません。 コメント/議論/DLLサポート?

お名前:

MENU

now: 4

リンク


最新の20件
2018-05-03 2017-09-29 2017-04-25 2017-01-10 2016-12-11 2016-10-04 2016-08-14 2016-06-05 2016-05-29 2016-04-15 2015-12-28 2013-02-25 2013-02-21 2013-02-20 2013-02-12 2013-02-11 2013-02-10
最新の20件
2010-02-01 2010-01-31 2010-01-30 2010-01-29 2010-01-16

Counter: 6543, today: 2, yesterday: 0

リロード   新規 編集 凍結 差分 添付 複製 改名   トップ 一覧 検索 最終更新 バックアップ   ヘルプ   最終更新のRSS

Last-modified: 2008-03-28 (金) 15:48:02 (3740d);  Modified by mona
PukiWiki 1.4.6 Copyright © 2001-2005 PukiWiki Developers Team. License is GPL.
Based on "PukiWiki" 1.3 by yu-ji
Powered by PHP 5.2.17
HTML convert time to 0.075 sec.