もきもき3D

アクセスカウンタ

zoom RSS 債:MinGWでのmsvcr80.dll使用。

<<   作成日時 : 2011/06/15 13:30   >>

ブログ気持玉 0 / トラックバック 0 / コメント 0

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++<string>において0x800以上の時にstdio.hの定数を参照する記述がされているので、その場合は<string>の前に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例。うまく行くかは不明。
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
 <noInheritable/>
  <assemblyIdentity type="win32" name="Microsoft.VC80.CRT"
    version="8.0.50727.4053" processorArchitecture="x86"
    publicKeyToken="1fc8b3b9a1e18e3b"/>
  <file name="msvcr80.dll" />
</assembly>


※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件)

タイトル (本文) ブログ名/日時

トラックバック用URL help


自分のブログにトラックバック記事作成(会員用) help

タイトル
本 文

コメント(0件)

内 容 ニックネーム/日時

コメントする help

ニックネーム
本 文
債:MinGWでのmsvcr80.dll使用。 もきもき3D/BIGLOBEウェブリブログ
文字サイズ:       閉じる