2017-11-22 11 views
0

2.6.39カーネルを実行する組み込みデバイスソリューションでtimerfdを使用したいが、クロスコンパイラは古すぎるglibc(2.5)を使用する。 Timerfdは2.6.25以来存在していますが、glibc以降のみです。012古いglibcでlinux syscallを使用する

新しいglibcのヘッダファイルを使用しようとすると、コンパイラはextern timerfd_create(undefined reference to 'timerfd_create')を見つけられなかったと訴えていますが、 glibcのどこにいても。

私の質問は今、古いglibcのバージョンに関係なく、timerfdをどのように使用できますか?手動でシステムコールを起動する必要がありますか?はいの場合はどうすればよいですか?

+0

あなたは私のdownvoteを与えた場合は、その理由 – hellow

答えて

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 
+0

感謝を説明してください。そんなやり方で解決しました:) – hellow

関連する問題