包含函数的未定义引用-Wl, - wrap

时间:2012-07-24 22:41:50

标签: c unit-testing gcc linker wrapper

我正在使用GCC 4.4.6-3运行RHEL 6.2。我正在对一些遗留代码进行单元测试,并尝试使用-Wl--wrap=function来封装函数。函数可能是系统调用,如closemalloc,但主要是我链接的目标文件中定义的其他函数。

我的测试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

在链接命令中,每个调用包装函数的函数都会出错。如果object2.o中的某个函数调用getpid(),则会在__wrap_getpid中抛出object2.o的未定义引用。这包括API_GetRequestID,这是我尝试单元测试的功能。

有关更改来源或制作文件的任何建议,这些建议可让我单位测试的功能在__wrap_getpid拨打getpid()时致电{1}}吗?

感谢。

1 个答案:

答案 0 :(得分:0)

您也可以使用与getpid()本身完全相同的原型来定义函数。这样,动态链接器将首先找到您的定义并停止在链接库中搜索它。

如果使用getpid()的代码驻留在动态库中,那么该策略可能无效。