Ошибка компоновщика при перехвате вызовов функций в GCC - PullRequest
0 голосов
/ 30 апреля 2018

Я использую стандартные __wrap_function и __real_function для перехвата вызовов функций с помощью -Wl,--wrap=function. Это работает успешно для большинства функций, таких как malloc, fopen и т. Д. Однако я не могу обернуть эти две функции:

  1. int connect(int, const struct sockaddr*, socklen_t)
  2. int stat(const char*, struct stat*)

С этими функциями компоновщик жалуется с неопределенной ссылкой на __real_connect и __real_stat.

Есть ли какая-то особая причина для этого? (Примечание: я также могу обернуть socket функций, например)

Ответы [ 2 ]

0 голосов
/ 01 мая 2018

Кажется, что ошибка была вызвана из-за проблем cmake. Очистка кеша cmake и запуск cmake. а затем сделать все решено.

0 голосов
/ 30 апреля 2018

Вероятно, вы забыли добавить -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
$
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...