3

静的ライブラリと動的ライブラリを試していました。2つの.cファイル(たとえば、file1.c、file2.c)と2つの.hファイルを作成しました。これらのファイルには、それぞれ定義および宣言されたいくつかの関数が含まれています。

また、上記の2つの.cファイルの関数を呼び出す新しい.cを作成しました。

共有ライブラリ/静的ライブラリを使用した場合に取得する実行可能ファイルのサイズを確認したかったので、ファイルfile1の.osから静的ライブラリ(libstat.a)と共有ライブラリ(libshar.so)を作成しました。 cおよびfile2.c。

これらのライブラリをメインの.cにリンクすると、動的ライブラリの場合、実行可能ファイルのサイズが大きくなることがわかります。それは予想外ですよね?共有ライブラリを使用する場合、ライブラリは実行時に読み込まれるのに、なぜサイズが大きくなるのですか?

次のコマンドを使用しています。

静的ライブラリの場合

gcc -c file1.c file2.c

ar -cvq libstat.a file1.o file2.o

gcc -o ex1 mainprg.c -L . -lstat

動的/共有ライブラリの場合

gcc -c -fpic file1.c file2.c

gcc -shared file1.o file2.o -o libshar.so

gcc -o ex2 mainprg.c -L . -lshar

libshar.soのサイズはlibstat.oよりも大きく、ex2のサイズはex1よりも大きいことがわかりました。この結果は逆になると思いました。誰かが私に理由を説明できますか?

4

1 に答える 1

1

どのくらい多い/少ないですか?ライブラリ内のものが些細なものである場合、静的よりも動的バイナリにもう少し多くのスペースが使用されるのを見るのはそれほど驚くことではありません。動的バイナリには、実行時のリンクを容易にするために、追加のシンボル情報とその他のメタデータが含まれている必要があります。静的リンクの場合、そのメタデータの多くは省略できるため、ライブラリ内の関数やデータがかなり小さい場合は、それが表示されている可能性があります。ただし、より多くのコードとデータを含むより実質的なライブラリの場合、または多くの異なるライブラリとリンクしている場合は、バイナリをかなり小さくする必要があります...

于 2012-08-24T14:27:59.840 に答える