Ich verstehe, dass der strace
Befehl verwendet ptrace(PTRACE_PEEKUSER, child, __builtin_offsetof(struct user, regs.orig_eax))
, um den Index eines Systemaufrufs zu finden, bei dem das Trace-Kind gefangen ist. Um den Index dann in den Namen der syscall-Funktion zu übersetzen, wurden Tabellen erstellt, die aus dem Greifen der in der Installation vorhandenen Linux-Quellcode-Header bestehen.
Diese Methode muss undokumentiert und fehleranfällig sein, da Speicherort und Syntax von Quellcodedeklarationen nicht dokumentiert sind, durch Greifen ermittelt werden müssen und sich auf unbekannte Weise ändern können. Habe ich Recht, das zu sagen?
Wenn dem so ist, warum sollte strace
ich dann nicht die folgende Methode anwenden, die meiner Meinung nach einfacher ist, sich nur auf die Dokumentation stützt und somit narrensicher ist.
strace
Sendet zu Beginn des ersten Laufs nach dem Neustart einen Test-Syscall, einen für jede Syscall-Funktion, fängt diesen ab und beobachtet, welchen Syscall-Index das untergeordnete System verwendet. Das ergibt eine vollständige und korrekte benutzerdefinierte Tabelle, die in einer Datei gespeichert werden kann, die weiteren Aufrufen von bekannt ist strace
.
Ich bin sicher, dass diese Methode in Betracht gezogen worden sein muss, da es nichts besonders Geniales ist. Es muss also etwas falsch daran sein. Was ist falsch??
open(foobar.txt, O_RDONLY)
Keine undokumentierten Sachen erforderlichstrace
glaube ich ). Ich muss also sicherstellen, dass die Tabellestrace
beim Neustart gelöscht wird , wenn sie gespeichert wird, da sie nicht bei jedem Aufruf neu berechnet werden soll. Sicherlich muss es in Linux eine Möglichkeit geben, festzustellen, ob ich nach dem Neustart zum ersten Mal angerufen werde. Sicherlich muss es eine Datei geben, die beim Neustart berührt / erstellt wird, damit ich meinen Zeitstempel damit vergleichen kann?open(foobar.txt, O_RDONLY)
dass genau ein Systemaufruf erfolgt und das istSYS_open
? Es könnte verwendenSYS_openat
. Dies kann dazu führen, dass andere Systemaufrufe als Teil der verzögerten Bindung im dynamischen Linker stattfinden, wenn dies der erste Aufruf von istopen
. Oder es handelt sich um andere Systemaufrufe, die intern für einen anderen Zweck verwendet werden. Es gibt keine triviale Eins-zu-Eins-Zuordnung, die Sie zwischen Bibliotheksaufrufen und Systemaufrufen annehmen können.Antworten:
Weil es auf dieser niedrigen Ebene kein Konzept für einen Syscall-Namen gibt. Es gibt keine Möglichkeit zu
strace
sagen "Hey, lass uns einenfcntl()
Anruf tätigen und sehen, wie die Nummer ist!". Sie kann nur Anrufe tätigen, die auf den Systemrufnummern selbst basieren. Dies liegt daran, dass ein Syscall ausgeführt wird, wenn die Syscall-Nummer imeax
oder -Register gespeichertrax
wird und der Prozessint 0x80
oder aufruftsyscall
.quelle