.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
誰かが同様の問題を抱えていましたか?