みけCATのにっき(仮)
つれづれなるまゝに、日くらし、PCにむかひて、心に移りゆくよしなし事を、そこはかとなく書きつくれば、あやしうこそものぐるほしけれ。
(本当か!?)
出典

MSVCRT.DLLに依存しない実行ファイルを作る ACT.2

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

MSVCRT.DLLに依存しない実行ファイルを作る ACT.2

投稿記事 by みけCAT » 12年前

前回の日記で、おまじないを唱えてMSVCRT.DLLに依存しないexeファイルを作る方法を見つけました。
しかし、これを実用化するには、標準ライブラリの実装やコマンドラインへの対応といった課題が残っていました。
そこで、私は考えました。

待てよ…前回の実験は主にC言語のライブラリを使うCUIアプリケーションの話だった。
一方、GUIのアプリケーションなら主にWindows APIを使い、C言語のライブラリの出番はほとんどなくなるはずだ。
さらに、CUIアプリケーションは主に競技プログラミングや実験、個人的な計算向けが多いが、
GUIアプリケーションは主にVectorなどで本格的に公開するものが多い。(個人の感想・状況です)
ということは、GUIアプリケーションから優先して脱MSVCRT.DLLしたほうがいいんじゃないか?

というわけで、早速実験。
実験用のコードには、C言語を始めよう! v.1.1.2.3に付属している「サンプル(Windows)」を使用しました。(著作権保護のためコード略)

まずは普通にコンパイルしてみる。

CODE:

>gcc -O2 -mwindows -o yes_msvcrt_test.exe no_msvcrt_test.c
dep_yes_msvcrt_test.png
yes_msvcrt_test.exeが依存するDLL
予想通り、思いっきりMSVCRT.DLLに依存しています。

次に、おまじないを唱える。
今回、なんとソースコードを一切変更することなく、コンパイルオプションだけでMSVCRT.DLLに依存させないことに成功しました!

CODE:

>gcc -O2 -mwindows -o no_msvcrt_test.exe no_msvcrt_test.c -nostdlib -lkernel32 -luser32
dep_no_msvcrt_test.png
no_msvcrt_test.exeが依存するDLL
dep_no_msvcrt_test.png (57.85 KiB) 閲覧数: 306 回
やったか!?

…でも、よく見ると
dep_no_msvcrt_test_2.png
no_msvcrt_test.exeが依存するDLLをよく見ると…
あっ!MSVCRT.DLLだ!
さらに、WS2_32.DLLなど、多くのDLLからMSVCRT.DLLへの依存が見つかりました。
しかし、アイコンをよく見てください。
ヘルプを参照すると、このアイコンは「そのDLLの関数が呼ばれた時にDLLがロードされる」ということらしいです。
といっても、USER32.DLLから関数が呼ばれる可能性が大いにあり、実質MSVCRT.DLL依存ということになります。
さらに、WS2_32.DLLが依存しているということは、winsockを使ったら即アウト、ということになりそうです。

でも、よく考えると、このUSER32.DLLはWindowsの基本的なDLLの一つのはずです。
これがMSVCRT.DLLに依存しているということは、MSVCRT.DLLもWindowsに標準搭載されているはず、と考えられるのでしょうか?
コメントお待ちしています。

YuO
記事: 947
登録日時: 14年前

Re: MSVCRT.DLLに依存しない実行ファイルを作る ACT.2

投稿記事 by YuO » 12年前

MSVCRT.DLLはシステムDLLです。
当然,Windows Resource Protectionの対象ファイルになります。
このため,VC++では,例えばMSVCR100.DLLなどがCRTのDLLとして提供されています。

MSVCRT.DLLに依存することの何が問題か,まったく理解できません。
Linuxでlibcに依存することに問題がある,と言っているのと同じことなので。