auto-import関連


Top / auto-import関連

このページは何か?

PEのDLLの auto-import 関連のメモです。
長くなったら分割していきます。

関連ページ

monalibc/相談/auto-import
gcj/質問箱

背景

プロセス終了時に stdout に "^eop" を発行することで Scheme の call-process-out-string を実装しようと試みる。
monapi_impl.cpp の user_start_c_impl に

outStream->write((uint8_t*)eop, 5);

と書いたがうまくいかなかった。

問題点1

TEST.EX5 が NULL 参照で落ちるようになってしまった。
outStream が 0 であることが確認された。

問題点1への対応

monapi_impl.cpp の user_start_c_impl の outStream->write の直前に

::MonAPI::System::getStdoutStream()->write((uint8_t*)eop, 5);

と書いた。
これでは解決せず問題点2が発生し泥沼に陥る。

問題点2

monapi_implをリンクしている SCHEME.EX5 / TEST.EX5 の挙動がおかしくなった。
具体的には

問題点2への対応

GC や interactive であるかどうかなど疑ったが見当外れだった。

::MonAPI::System::getStdoutStream()

を monapi_impl.cpp で呼ぶとおかしくなり、呼ばないと正常化することが分かった。

ツリーをいろいろ検索すると monalibc/stream.cpp で

// これだとおかしくなる by higepon
// extern "C" void stream_opener()
// {
//  stdin->_stream = MonAPI::System::getStdinStream();
//  stdout->_stream = MonAPI::System::getStdoutStream();
//  stderr->_stream = MonAPI::System::getStdoutStream();
// }

というコメントを見つける。
状況が似ているので、MonAPI::System::getStdoutStream();を呼ばずに、outStream を直接参照する方法が正しそうだ(問題点1への対応はあっていたのかも?)。

仕切り直し

問題点1への対応をさらに調べると SCHEME.EX5 では user_start_c_impl の該当個所でもきちんと outStream に正しい値が入っていることが分かった。
なので outStream へ正しい値が入るように monapi/monapi_impl.cpp の dllmain で MonAPI::System::getStdoutStream() を呼ぶようにしたところうまくいった。
この時点で目に見える不具合は全て解決された。

結局一体何だったのか?

結局一体どういう問題だったのだろうか?。結論から言うと分からないのだけど、未来の自分とここをみるであろう人のために分かったことをまとめておきます。
SCHEME.EX5 を例に現在の DLL 周りを図にすると以下のようになります。

http://f.hatena.ne.jp/images/fotolife/h/higepon/20070428/20070428105828.jpg

コード/ライブラリの分類としては

一般的に知られている auto-import の問題

man /home/taro/man/man1/i586-mingw32-ld.1 の --auto-import には以下のような問題と対応方法が書かれています。

--foo.h (DLLの中)
extern int arr[];
--foo.c
#include "foo.h"
void main(int argc, char **argv){
  printf("%d\n",arr[1]);
}

このコードは

"variable '<var>' can't be auto-imported. Please read the documentation for ld's "--enable-auto-import" for details."

というリンクエラーになります。

対応法方はいくつかあり、詳しくは man に譲るとして

ただ今回の件が、この問題と関係あるかは、まだ理解が浅く良く分かりませんでした。

コメント

コメントはありません。 コメント/auto-import関連?

お名前:

MENU

now: 4

リンク


最新の20件
2018-10-07 2018-09-20 2018-09-03 2018-05-09 2017-09-29 2017-01-10 2016-12-11 2016-10-04 2016-08-14 2016-05-29 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: 2115, today: 2, yesterday: 0

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

Last-modified: 2008-03-28 (金) 15:48:00 (3855d);  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.047 sec.