0

GCC 4.4.6-3 を使用して RHEL 6.2 を実行しています。いくつかのレガシー コードの単体テストを行っており、関数を with でラップしようとしてい-Wlます--wrap=functionclosefunction は、 またはのようなシステム コールである可能性がありますmallocが、ほとんどの場合、リンクされたオブジェクト ファイルで定義された他の関数になります。

私のテスト check_GetRequestID.c は次のようになります。

#include<stdlib.h>

int __wrap_getpid()
{
   return 10; 
}
int main(void)
{
    int x = API_GetRequestID();
    return 0;

}

API_GetRequestID()を呼び出すので、単体テストgetpid()用に慎重に定義したものにラップします。

コンパイル コマンドは次のとおりです。

gcc -m64 -pthread -DLITTLEEND -fPIC -I. -Iother/include/folders -Wall -Wformat -DFIU_ENABLE=1 -D_GNU_SOURCE -D_THREAD_SAFE -DLINUX -Wpointer-arith -pthread -c check_GetRequestID.c

gcc -m64 -pthread -DLITTLEEND -fPIC -I. -Iother/include/folders -Wall -Wformat -DFIU_ENABLE=1 -D_GNU_SOURCE -D_THREAD_SAFE -DLINUX -Wpointer-arith -pthread -L. -Lother/lib/paths -lcrypt -lutil -Wl,--wrap=getpid -Wl,--wrap=otherfunctions object.o object2.o ... -o check_GetRequestID

リンク コマンドで、ラップされた関数を呼び出す関数ごとにエラーが発生します。関数 inobject2.oが呼び出された場合、 in のgetpid()未定義の参照がスローさ__wrap_getpidobject2.oます。これには、単体テストAPI_GetRequestIDしようとしている機能である が含まれます。

ソースまたは make ファイルの変更に関する提案はあり__wrap_getpidますgetpid()か?

ありがとう。

4

1 に答える 1

0

getpid() 自体とまったく同じプロトタイプで関数を定義することもできます。そうすれば、動的リンカーは最初に定義を見つけ、リンクされたライブラリでの検索を停止します。

ただし、getpid() を使用するコードが動的ライブラリに存在する場合、この戦略は機能しない可能性があります。

于 2012-07-24T22:49:07.170 に答える