債:MinGWでのmsvcr80.dll使用。

MinGW/gcc 4.5.2 x86(TDM build)+MinGW RT3.18 を前提に、列挙。
TDM buildのx64も考慮する

1)gcc -dumpspecs >foobar でspcesを書き出す。

2)(1)のfoobar内の、-lmsvcrtを -lmsvcrNN、-lmoldnameを -lmoldnameNNに変更(NNは目的のmsvcrtVer)。
 Cの場合は -lmsvcrNNだけでも可。
 C++の場合は -lmoldnameNNも変えないと、スタートアップor stdlib++辺りがmsvcrt.dllをリンクする(DLLのチャンポンになる)。
 但し、64bit版ではmoldnameNNが無いので変更しない。
※x64は別記。

3)コンパイル時、-D__MSVCRT_VERSION__=0x0NNN(デフォルト0x0600)を明示的に定義する。
 msvcrt.dllでは600~701位、msvcr70なら700~、71は710~、80なら800~等。
 WinXPSP3ならmsvcrt.dllのVerが7.00を越えてるから、0x700を与える事で増加分の関数を使えるようになる。
 W2Kだと6.10程度が上限だと思うから、msvcrt.dllを使う限りは0x610程度にしておくのがよさげ。
 0x0NNNが小さい分には問題にならない。使える関数が増えないだけ。
 C++において0x800以上の時にstdio.hの定数を参照する記述がされているので、その場合はの前にincludeする(0x700迄は即値、800からは定数参照、値自体は同じ、というナニな状態は意味があるのだろうか。C++ヘッダをCヘッダに依存させる理由とか。)。

(4)リンカーのフロントエンドに -specs=で foobarを与える。
 MinGW/lib/gcc/mingw32/MinGW-Ver/にfoobarを specsという名で置いておくと勝手に参照される、かもしれない。
 gccがフロントエンドになる時(主にexe作成)はgcc -specs=Path/foobarかな。
 -Wl,-specs,~(or -Wl='-sepcs=~')の用にLDに渡す必要はないと思う。
 dllwrapの時はdllwrap -specs=~となる。

5)foobar.manifestをリソース化してリンク(http://fault0d.at.webry.info/201002/article_1.html)
 自身のディレクトリにDLLを置く、やくざなmanifest例。うまく行くかは不明。

 
  
  



※x64の場合のlibmoldnameXX.a。
 TDM BuildのMinGW x64にはmsvcrt用のlibmoldname.aしか添付されていない。
 先に書いた様に、それではC++の場合にlibmoldname.aからmsvcrtがリンクされてしまう。
 なので、自分でlibmoldnameXX.a相当を作る。
 1)TDMのWebページから mingw64-runtime-svn3913-src.zipを貰ってくる。
 2)moldname-msvcrt.defを解凍。 msvcrtXX.dllをsxsディレクトリから穿り出して同じディレクトリに置く。
 3)TDM x64版のdlltool.exeを使う。 Komisar版とは動作が違うので注意。SF.netの非公式x64も違うかも(未確認)。
 4) dlltool -D msvcrt80.dll -d moldname-msvcrt.def -l lib64_libmoldname80.a -U を実行。
  lib64_~としているのは内部的な名称に互換を持たせる為。  互換性が必要な要素なのかは不明なのでお呪い。
  -UはTDM buildでの互換の為に必須。 これによって、表面的な内部名には _ は付かず、より内部の名には付く状態になる(傍目には食い違っている状態)。

 write()を例にする。
 -U無しだと、write/writeになる。リンク動作は write()を探すのでリンクには成功するが、DLLは _write()なので実行時に無効なエントリエラーになる。
 -Uでは _が挿入され、write/_writeになる。リンクと実行が可能になる。
 Komisar buildのx86_64~dlltoolでは、-U無しでは _write/write、有りでは _write/_writeとなる為、TDM buildでは使えない。

 5)最後に libmoldname80.aにリネームして MinGW/x86_64~/lib/にコピーして完了。

ブログ気持玉

クリックして気持ちを伝えよう!

ログインしてクリックすれば、自分のブログへのリンクが付きます。

→ログインへ

なるほど(納得、参考になった、ヘー)
驚いた
面白い
ナイス
ガッツ(がんばれ!)
かわいい

気持玉数 : 0

この記事へのコメント

この記事へのトラックバック