【问题标题】:Undefined reference to wrapped function with -Wl,--wrap使用 -Wl,--wrap 对包装函数的未定义引用
【发布时间】:2012-07-23 07:56:33
【问题描述】:

我正在使用 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(),那么它会抛出object2.o__wrap_getpid 的未定义引用。这包括API_GetRequestID,这是我正在尝试单元测试的函数。

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

谢谢。

【问题讨论】:

    标签: c unit-testing gcc linker wrapper


    【解决方案1】:

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

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

    【讨论】:

    • 我认为getpid() 在动态库中,它在 unistd.h 中定义。
    • @user1437652:是的,但我说如果代码使用 getpid()(即在您的情况下为API_GetRequestID)驻留在动态库中,则此技术可能不起作用.
    猜你喜欢
    • 2019-09-05
    • 2011-09-19
    • 2017-10-17
    • 1970-01-01
    • 2019-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多