链接器错误与GCC中的拦截函数调用

时间:2018-04-30 19:38:24

标签: c gcc linker-errors ld undefined-reference

我使用标准__wrap_function__real_function拦截-Wl,--wrap=function的函数调用。这适用于大多数函数,如mallocfopen等。但是,我无法包装这两个函数:

  1. int connect(int, const struct sockaddr*, socklen_t)
  2. int stat(const char*, struct stat*)
  3. 使用这些函数,链接器会抱怨__real_connect__real_stat的未定义引用。

    这有什么特别的原因吗? (注意:我也可以包装socket函数)

2 个答案:

答案 0 :(得分:1)

您可能忘记将 private void HighlightExpired (DataGridView dtg) { foreach (DataGridViewRow row in dtg.Rows) { if (row.IsNewRow) continue; if (row.Cells["colStatus"].Value.ToString() == "Expired") { row.DefaultCellStyle.BackColor = Color.Red; } } } -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

答案 1 :(得分:0)

似乎错误是由于cmake问题引起的。清除cmake缓存并运行cmake。然后让所有人解决它。