0

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

我的测试 check_GetRequestID.c 类似于:

#include<stdlib.h>

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

}

API_GetRequestID()调用getpid()所以我将它包装成为unit-testing仔细定义的东西。

编译命令为:

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调用getpid(),那么它会为__wrap_getpidin抛出未定义的引用object2.o。这包括API_GetRequestID,这是我试图单元测试的功能。

关于更改源代码或制作文件的任何建议,这将允许我正在单元测试的函数在调用__wrap_getpid时调用getpid()

谢谢。

4

1 回答 1

0

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

如果使用 getpid() 的代码驻留在动态库中,该策略可能不起作用。

于 2012-07-24T22:49:07.170 回答