7

私はオライリーの本21st Century Cを読んでいます。この著者は、静的ライブラリにリンクするときに次のように述べています。

コンパイラは、ライブラリの関連コンテンツを最終的な実行可能ファイルに[効果的に]コピーしています。

このモジュールで構成される独自の静的ライブラリを作成して、これをテストしようとしました。

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;
}

single_func()テストのために、1 つは を呼び出し、もう1 つはfunc0()andを呼び出す 2 つの C ファイルを作成しましfunc1()た。

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

これは上記のステートメントと矛盾しませんか、それともリンクに関する詳細が欠けていますか?

関連する質問として、スタティック ライブラリは 1600B ですが、このサイズの増加はどこから来るのでしょうか?


追加:

どちらのメイン ファイルも、次のように、関数を呼び出して結果を出力するだけで構成されています。

メイン0:

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

メイン1:

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

ファイルは次のようにコンパイルされました。

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

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

4

1 に答える 1

4

静的ライブラリでは、コピーの単位はライブラリ内のオブジェクト ファイルです。両方のプログラムがオブジェクトファイルから関数を呼び出すため、両方のプログラムは実行可能ファイル内のすべてのオブジェクトファイルになり、結果として同じサイズになります (呼び出しmain()プログラムのサイズを取得または取得します)。

実行可能ファイルの追加情報は、複数の場所から取得される可能性があります。その一部は、制御およびデバッグ情報です。それも静的にリンクした場合、その一部はCライブラリからのものである可能性があります。おそらく、メイン プログラムとリンク行を確認し、インフレの他の理由を突き止めるためにプラットフォームを知る必要があります。

于 2012-10-09T14:04:25.083 に答える