提问人:a_pradhan 提问时间:5/1/2018 更新时间:5/1/2018 访问量:321
在 GCC 中截获函数调用时出现链接器错误
Linker error with intercepting function calls in GCC
问:
我正在使用标准,并使用 .这适用于大多数函数,如 、 等。但是,我无法包装这两个函数:__wrap_function
__real_function
-Wl,--wrap=function
malloc
fopen
int connect(int, const struct sockaddr*, socklen_t)
int stat(const char*, struct stat*)
使用这些函数时,链接器会抱怨未定义的对 和 的引用。__real_connect
__real_stat
这有什么特别的原因吗?(注意:例如,我还可以包装函数)socket
答:
1赞
jxh
#1
您可能忘记将 和 添加到您的链接行。-Wl,--wrap=connect
-Wl,--wrap=stat
这对我有用:
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/stat.h>
#include <unistd.h>
int __wrap_connect (int s, const struct sockaddr *addr, socklen_t len)
{
puts(__func__);
return __real_connect(s, addr, len);
}
int __wrap_stat (const char *path, struct stat *buf)
{
puts(__func__);
return __real_stat(path, buf);
}
int main(void) {
connect(0, NULL, 0);
stat("/", 0);
return 0;
}
在我的系统上编译时。
$ uname -s -r Linux 2.6.32-696.16.1.el6.x86_64 $ gcc --version | grep gcc gcc (GCC) 4.4.7 20120313 (Red Hat 4.4.7-18) $ gcc c.c -Wl,--wrap=connect -Wl,--wrap=stat $
但是,例如,当离开时,我得到:-Wl,--wrap=stat
$ gcc c.c -Wl,--wrap=connect /tmp/cchVzvsE.o: In function `__wrap_stat': c.c:(.text+0x65): undefined reference to `__real_stat' collect2: ld returned 1 exit status $
评论
0赞
a_pradhan
5/1/2018
这似乎与我的 cmake 文件有关。清除缓存并运行 cmake 。然后解决问题!但从本质上讲,是的,如果我错过了链接器行,它将是一个未定义的引用!谢谢你的帮助。
0赞
jxh
5/1/2018
@a_pradhan:由于我的回答实际上并没有解决您的问题,因此您应该继续使用问题的具体情况来更新您的问题。然后,编写一个答案,以解决更新的问题中提出的特定问题。这将增加您的问题和答案与未来读者的相关性。我将留下我的答案,只是为了提供更多信息(我已经把它作为社区维基的答案,因为我没有任何信心它会解决你的具体问题)。
0赞
a_pradhan
5/1/2018
#2
该错误似乎是由于cmake问题引起的。清除 cmake 缓存并运行 cmake 。然后使所有问题都解决了。
下一个:gcc - 没有意义的链接器错误
评论