2012-10-09 10 views
5

私はO'Reillyの本21st Century Cを読んでいます。著者は、静的ライブラリ「コンパイラは、ライブラリの関連するコンテンツを最終的な実行可能ファイルにコピーしている」と述べています。 (1が(single_funcを呼び出しているCファイル)や他の呼のfunc0に作成されたテストのために静的ライブラリとのリンク時にオブジェクトコードを実行可能ファイルにコピーする方法は?

static char szStr[64]; 

char* single_func() { 
    strcpy(szStr, "Hello string!\r\n"); 
    return szStr; 
} 

void func0() { 
    strcpy(szStr, "Hello"); 
} 

char* func1() { 
    strcat(szStr, " string!\r\n"); 
    return szStr; 
} 

)と:

私はこのモジュールからなる自分の静的ライブラリを作成することによってこれをテストしようとしていますfunc1()。

結果の実行可能ファイルはどちらの場合も751290Bです。モジュールからstrcpyとstrcatを直接呼び出すと、両方の実行可能ファイルが7215Bになります。

これは上記の声明と矛盾しないのですか、リンクについての詳細がありませんか?

関連する質問は、静的ライブラリは1600Bなので、このサイズの増加はどこから来るのですか?


追加:

両方メインのファイルはこのように、関数を呼び出し、結果を印刷するよりも何で構成さ

main0:

#include <stdio.h> 
#include "sharedlib.h" 
int main() { 
    char* szStr = single_func(); 
    printf("%s", szStr); 
    return 0; 
} 

MAIN1:

のファイルは、次のようにコンパイルされた:

gcc -static main0.c -L. -lsharedlib -o main0 

プラットフォームは、Linuxで、コンパイラがGCC v4.6.3です。

答えて

3

静的ライブラリの場合、コピーの単位はライブラリ内のオブジェクトファイルです。どちらのプログラムもオブジェクトファイルから関数を呼び出すので、両方のプログラムは実行可能ファイル内のすべてのオブジェクトファイルで終わるので、同じサイズの結果(呼び出すmain()プログラムのサイズを指定または取得する)。

実行ファイル内の余分な情報は、いくつかの場所から来る可能性があります。その中には制御とデバッグの情報があります。それを静的にリンクすると、Cライブラリからのものかもしれません。私たちはおそらく、メインプログラムとリンクラインを見て、プラットフォームがインフレの他の理由を思い付くことを知る必要があるでしょう。

+1

私が質問した追加情報で私の質問が更新されましたが、どこに行くのか分かり始めました。 1:ライブラリのオブジェクトファイルから単一の関数を使用する場合、オブジェクトファイル全体が実行可能ファイルにロールインされます。 2:-staticオプションを使用することによって、_all_ライブラリは最終実行ファイルにロールインされ、より大きなファイルサイズが生成されます。私はこれで正しいですか? – Kenneth

+1

はい。あなたは両方の事柄に合っています。 Plaugerの本「The Standard C Library」(C89標準)を見ると、ほとんどのソースファイルには外部から見える関数が1つしかないので、使用しないものを実行可能ファイルにドラッグしないことがわかります。 '-lsharedlib'の後に' -shared'をコマンドラインに追加することによって、実行可能ファイルのサイズを大幅に減らすことができます。 –

+0

Cライブラリが静的にリンクされているように見えるのは少し驚きです。ある時点(おそらく10年前)、私はCライブラリが静的ライブラリとして提供されていないと考えました(したがって、共有する必要がありました)。私は誤解しているかもしれないし、LinuxよりもむしろUnixの変種であったかもしれない。あなたは 'ldd main0'で共有ライブラリとして読み込まれているものを確認することができます。使用された共有オブジェクトがリストされます。 –

関連する問題