【问题标题】:Using linux syscall with older glibc将 linux 系统调用与较旧的 glibc 一起使用
【发布时间】:2017-11-22 07:58:50
【问题描述】:

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

当我尝试使用来自较新 glibc 的头文件时,编译器抱怨找不到 extern timerfd_create (undefined reference to 'timerfd_create'),但我在 glibc 中的任何地方都找不到实现。

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

【问题讨论】:

  • 如果你不赞成我,请解释原因

标签: glibc


【解决方案1】:

我在 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

【讨论】:

    猜你喜欢
    • 2016-06-27
    • 1970-01-01
    • 2016-12-01
    • 2018-11-25
    • 2021-07-06
    • 2011-06-29
    • 2018-12-14
    • 2016-01-18
    • 2016-01-16
    相关资源
    最近更新 更多