代码之家  ›  专栏  ›  技术社区  ›  hellow Adolfo Casari

在较旧的glibc中使用linux系统调用

  •  0
  • hellow Adolfo Casari  · 技术社区  · 7 年前

    我想在运行2.6.39内核的嵌入式设备解决方案中使用timerfd,但交叉编译器使用了太旧的glibc(2.5)。Timerfd自2.6.25起存在,但仅自glibc 2.8起存在

    当我试图使用较新的glibc的头文件时,编译器抱怨没有找到外部timerfd\u create( undefined reference to 'timerfd_create' ),但我在glibc的任何地方都找不到实现。

    我现在的问题是,无论旧的glibc版本如何,我如何使用timerfd?我必须手动调用系统调用吗?如果是,我该怎么做?

    1 回复  |  直到 7 年前
        1
  •  1
  •   Employed Russian    7 年前

    我在glibc的任何地方都找不到实现。

    下面是找到它的技巧:安装libc6 dbg后:

    gdb -q  /lib/x86_64-linux-gnu/libc.so.6
    (gdb) list timerfd_create
    61  ../sysdeps/unix/syscall-template.S: No such file or directory.
    

    这告诉您,实现只是通过系统调用将参数直接传递给内核。

    然后,您的实现可以是:

    #include <unistd.h>
    #include <syscall.h>
    
    #ifndef __NR_timerfd_create
    #define __NR_timerfd_create 283
    int timerfd_create(int clockid, int flags)
    {
      return syscall(__NR_timerfd_create, clockid, flags);
    }
    #endif