2

私はLinuxgccの初心者です。Linuxgccのweak属性を学習するための簡単なコードを書いています。

私のサンプルコードを参照してください:

weakref.c、メインファイル。fooメソッドが定義されているかどうかに関係なくファイルが機能するようにしたい。

#include <stdio.h>
extern void foo(void) __attribute__((weak));

int main() {
  if (foo){
    foo();
    printf ("foo is defined\n");
  } else {
    printf("foo is not defined\n");
  }
}

したがって、次のコマンドを実行してコンパイルして実行します。

gcc weakref.c -o main_static
./main_static

そして、出力は「fooが定義されていません」です。これは私が期待したことです。

次に、新しいファイルlibfoo.cを作成しました。以下を参照してください。

#include <stdio.h>

void  foo() {
  printf("Print in foo.\n");
}

私はメインファイルをlibfoo.cで動作させるために3つの方法を試みました:

  1. libfoo.cとweakref.cをコンパイルし、オブジェクトファイルをリンクします。
  2. libfoo.cを静的ライブラリとしてコンパイルし、weakref.cのオブジェクトファイルにリンクします。
  3. libfoo.cを共有ライブラリとしてコンパイルし、weakref.cのオブジェクトファイルにリンクします。

3番目の方法のみが機能し、次の出力が得られます。

Print in foo.
foo is defined

弱い参照が共有ライブラリでのみ機能するかどうか、およびその理由を教えてください。どうもありがとう!

4

1 に答える 1

3

弱い参照が共有ライブラリでのみ機能するかどうかを教えてください

全くない。

1.と3.の両方が「fooisdefined」を生成することが期待されます。

アーカイブライブラリからオブジェクトをプルする目的で、からの未解決の弱参照は未解決のシンボルとしてカウントされないため、2。はからプルすること期待されていません。ただし、次のように強制的にリンクにプルすることができます。そうすると、再び「fooisdefined」を取得する必要があります。libfoo.olibfoo.aweakref.o libfoo.ogcc weakref.o -lfoo -ufoo

何が起こるべきかを述べたので、練習が同意するかどうか見てみましょう。Linux / x86_64システムからのトランスクリプト、gcc (Ubuntu 4.4.3-4ubuntu5.1) 4.4.3およびを使用GNU ld (GNU Binutils for Ubuntu) 2.20.1-system.20100303

$ gcc -c weakref.c libfoo.c
$ ar ruv libfoo.a libfoo.o
ar: creating libfoo.a
a - libfoo.o
$ gcc weakref.o && ./a.out
foo is not defined

これはあなたの#1です:

$ gcc weakref.o libfoo.o && ./a.out
Print in foo.
foo is defined

ご覧のとおり、#1は、あなたが主張したとおりではなく、私が期待したとおりに「機能」します。あなたはどこかで間違いを犯したに違いありません。

これはあなたの#2です:

$ gcc weakref.o -L. -lfoo && ./a.out
foo is not defined

再びあなたの#2ですが、libfoo.oをリンクに強制的に引き込みます:

$ gcc weakref.o -L. -lfoo -ufoo && ./a.out
Print in foo.
foo is defined
于 2012-07-06T20:51:27.017 に答える