Ошибка компоновщика при перехвате вызовов функций в 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
функции, например)
2 ответа:
Вероятно, вы забыли добавить
-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 $