2014/12/29(月) [n年前の日記]
#1 [dxruby][ruby] dllからMinGW用のライブラリファイルを作成
コメント欄で、dlltool、pexports というツールの存在を教えてもらったので試してみたり。Visual C++ で作った .dll しかない状態で、MinGW で使えるimport(?)ライブラリを取り出すことができるツール、らしい。…自分、importライブラリって何だろう、てな知識状態ではあるのですけど。
以下を参考に作業。
_MinGW 環境で Windows のダイナミックリンクライブラリ *.DLL からインポートライブラリ *.a ファイルを作成する - あらきけいすけの雑記帳
_dllからインポートライブラリを作成する方法
_Mingw32でDirectX!: 思いつき
以下を参考に作業。
_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 みたいな感じ。
dlltool は、既に MinGW の中に入ってた。
しかし、tar.xxx を解凍して MinGW の bin に突っ込んだ後、mingw-get も使ってインストールしたら、mingw-get upgrade が必ず不正終了するようになってしまった…。MinGW/MSYSを再インストール。
mingw-get を使ってインストールするだけなら、mingw-get upgrade が不正終了する状態にはならない模様。
そもそも、今の 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 を起動したその上で、以下を打ってみたり。
で。これをどうすればいいの?(爆)
何もわからないまま、libayame.dll.a を、ayame.so のソースファイル群と同じ場所にコピー。extconf.rb 内のリンカオプション指定部分を修正。
ruby extconf.rb、make clean、make を実行。ayame.so ができたので、オリジナルの ayame.so と差し替えて、ruby sample1.rb を実行。
音は鳴らない。
ていうか、できた ayame.so は、前に作った ayame.so と4byteしか違わない…。たぶんまた、自分は頓珍漢なことをしてる予感。
$ 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.a300KB の 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 の状態を確認。
自分で MinGW64 を使ってビルドした ayame.so の状態を確認。
オリジナル版は、WINMM.dll が表示されてるけれど、自ビルド版は WINMM.dll が無い。もしかしてそのせいで音が鳴らないのだろうか。timeGetTime() を使ってるはずなのに、どうしてリンクされないのだろう。動かしてみて不正終了しないのも謎。
また、dlltool で作った libayame.dll.a についても objdump で情報を確認してみたら、そのほとんどが 00000000 で表示されて。もしかすると、Ayame.dll から何も取り出せてないのでは…? それとも 00000000 だらけになるのが正しい?
Ayame.dll の情報を objdump で確認したら、それっぽいアレコレがズラズラと表示された。うーん。やっぱり、libayame.dll.a は、ちゃんと作れてないのかな…。
オリジナル版の 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 は、ちゃんと作れてないのかな…。
[ ツッコむ ]
以上です。