5

.c ファイルで GCC の弱い属性を持つ外部関数を宣言しました。

extern int weakFunction( ) __attribute__ ((weak));

コンパイルされたオブジェクト ファイルには、weak シンボルとして定義された weakFunction があります。nm の出力:

1791:         w weakFunction

次のように弱い定義関数を呼び出しています。

if (weakFunction != NULL)
{
    weakFunction();
}

オブジェクトファイルをパラメーターとして GCC ( gcc main.o weakf.o -o main.exe) に定義してプログラムをリンクすると、弱いシンボルが正常に動作します。weakf.o をリンクから除外すると、main.c の関数アドレスが NULL になり、関数は呼び出されません。

問題は、weakf.o が静的ライブラリ内にある場合、何らかの理由でリンカが関数を見つけられず、関数アドレスが常に NULL になることです。静的ライブラリは ar で作成されます:ar rcs weaklibrary weakf.o

誰かが同様の問題を抱えていましたか?

4

1 に答える 1

4

弱いシンボルの正確な仕組みはわかりませんが、あなたが求めているものを手に入れているようです。他の誰もweakFunction()の存在を強制していなければ、main()も存在しません。私にはこれは理にかなっています: ファシリティ X が存在する場合と存在しない場合で動作するコードを記述しようとしている場合、コードで X を強制的にビルドに含める必要はありません。「弱い」とは、何かが存在することを要求するのではなく、何かが存在するかどうかを尋ねることを意味しているようです。あなたの場合、リンカーオプションとして「-uweakFunction」を使用して弱いシンボルを強制的に含めることができます。

于 2010-04-13T09:21:22.257 に答える