mieki256's diary



2014/12/29(月) [n年前の日記]

#1 [dxruby][ruby] dllからMinGW用のライブラリファイルを作成

コメント欄で、dlltool、pexports というツールの存在を教えてもらったので試してみたり。Visual C++ で作った .dll しかない状態で、MinGW で使えるimport(?)ライブラリを取り出すことができるツール、らしい。…自分、importライブラリって何だろう、てな知識状態ではあるのですけど。

以下を参考に作業。

_MinGW 環境で Windows のダイナミックリンクライブラリ *.DLL からインポートライブラリ *.a ファイルを作成する - あらきけいすけの雑記帳
_dllからインポートライブラリを作成する方法
_Mingw32でDirectX!: 思いつき

pexportsのインストール。 :

pexports は、 _mingw-utils に入ってる。と、巷の解説ページには書いてあったのだけど、情報としては少し古いようで。 _MinGW - Minimalist GNU for Windows | SourceForge.net から辿っていったら、 _pexports単体 が存在していた。おそらく、mingw-utils-0.3 までは pexports が含まれていたけど、mingw-utils-0.4-1 以降は pexports が含まれず、単体で配布するようになったのだろうと。

そもそも、今の MinGW なら、msys.bat で起動した後に mingw-get instal xxxx で簡単にインストールができる。Ubuntu Linux の apt-get みたいな感じ。
mingw-get install mingw-utils
mingw-get install pexports
アンインストールは、mingw-get remove xxxx と打てばいいのかな? 完全に消してくれるわけではなさそうだけど。

dlltool は、既に MinGW の中に入ってた。

しかし、tar.xxx を解凍して MinGW の bin に突っ込んだ後、mingw-get も使ってインストールしたら、mingw-get upgrade が必ず不正終了するようになってしまった…。MinGW/MSYSを再インストール。

mingw-get を使ってインストールするだけなら、mingw-get upgrade が不正終了する状態にはならない模様。

libxxxx.a を作成。 :

Ayame.dll を作業しやすい場所にコピーしてから、msys.bat を起動したその上で、以下を打ってみたり。
$ pexports.exe Ayame.dll > ayame.dll.def
$ dlltool --dllname Ayame.dll --input-def ayame.dll.def --output-lib libayame.dll.a
または
$ dlltool -D Ayame.dll -d ayame.dll.def -l libayame.dll.a
300KB の Ayame.dll から、7.4KB の libayame.dll.a が作れた。ファイルサイズが随分小さくなったけど、ええのやろか…?

で。これをどうすればいいの?(爆)

何もわからないまま、libayame.dll.a を、ayame.so のソースファイル群と同じ場所にコピー。extconf.rb 内のリンカオプション指定部分を修正。
$LDFLAGS << ' -static-libgcc -static-libstdc++ -layame.dll -lwinmm '
-layame.dll を追加することで、「libayame.dll.a てのが居るはずだからソイツを使え」と指定する形になってたらいいなーと希望。

ruby extconf.rb、make clean、make を実行。ayame.so ができたので、オリジナルの ayame.so と差し替えて、ruby sample1.rb を実行。

音は鳴らない。

ていうか、できた ayame.so は、前に作った ayame.so と4byteしか違わない…。たぶんまた、自分は頓珍漢なことをしてる予感。

objdumpでdllやsoの情報を確認。 :

MinGW/MSYS の中に入ってる、objdump というツールを使うと、dll や so が依存してるDLLの情報を確認できると知った。

オリジナル版の ayame.so の状態を確認。
> objdump -p ayame.so.org | grep dll
        DLL Name: msvcrt-ruby200.dll
        DLL Name: ole32.dll
        DLL Name: USER32.dll
        DLL Name: WINMM.dll
        DLL Name: KERNEL32.dll

自分で MinGW64 を使ってビルドした ayame.so の状態を確認。
> objdump -p ayame.so | grep dll
        DLL Name: msvcrt-ruby200.dll
        DLL Name: KERNEL32.dll
        DLL Name: msvcrt.dll
        DLL Name: msvcrt.dll
        1d7e8      56  __dllonexit
        DLL Name: ole32.dll
        DLL Name: USER32.dll

オリジナル版は、WINMM.dll が表示されてるけれど、自ビルド版は WINMM.dll が無い。もしかしてそのせいで音が鳴らないのだろうか。timeGetTime() を使ってるはずなのに、どうしてリンクされないのだろう。動かしてみて不正終了しないのも謎。

また、dlltool で作った libayame.dll.a についても objdump で情報を確認してみたら、そのほとんどが 00000000 で表示されて。もしかすると、Ayame.dll から何も取り出せてないのでは…? それとも 00000000 だらけになるのが正しい?

Ayame.dll の情報を objdump で確認したら、それっぽいアレコレがズラズラと表示された。うーん。やっぱり、libayame.dll.a は、ちゃんと作れてないのかな…。

以上です。

過去ログ表示

Prev - 2014/12 - Next
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31

カテゴリで表示

検索機能は Namazu for hns で提供されています。(詳細指定/ヘルプ


注意: 現在使用の日記自動生成システムは Version 2.19.6 です。
公開されている日記自動生成システムは Version 2.19.5 です。

Powered by hns-2.19.6, HyperNikkiSystem Project