在 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
个函数)
您可能忘记将 -Wl,--wrap=connect
和 -Wl,--wrap=stat
添加到 link 行。
这对我有用:
#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
$
看来错误是由于cmake问题引起的。清除 cmake 缓存和 运行 cmake 。其次是make all resolved it.
我正在使用标准 __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
个函数)
您可能忘记将 -Wl,--wrap=connect
和 -Wl,--wrap=stat
添加到 link 行。
这对我有用:
#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 $
看来错误是由于cmake问题引起的。清除 cmake 缓存和 运行 cmake 。其次是make all resolved it.