2017-11-22 3 views
0

Ich möchte die timerfd in einer Embedded-Gerät-Lösung verwenden, die einen Kernel 2.6.39 ausführt, aber der Cross-Compiler verwendet eine zu alte glibc (2.5). Timerfd existiert seit 2.6.25, aber erst seit glibc 2.8Verwenden von Linux syscall mit älteren glibc

Wenn ich versuche, die Header-Datei von einem neueren glibc zu verwenden, beschwert sich der Compiler über das externe timerfd_create nicht zu finden (undefined reference to 'timerfd_create'), aber ich kann die Implementierung nicht finden überall im glibc.

Meine Frage ist jetzt, wie kann ich die timerfd verwenden, unabhängig von der alten glibc-Version? Muss ich den Syscall manuell aufrufen? Wenn ja, wie mache ich das?

+0

Wenn Sie mir eine downvote geben, erklären Sie bitte, warum – hellow

Antwort

1

Ich kann die Implementierung nirgends in der glibc finden.

Hier Trick, es zu finden: mit libc6-dbg installiert:

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. 

Dies zeigt Ihnen, dass die Implementierung einfach ist Argument an den Kernel über Systemaufruf direkt zu übergeben.

Ihre Implementierung kann dann sein:

#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

Dank. So gelaufen, funktioniert jetzt :) – hellow

Verwandte Themen