Dies ist der Befehl c2ph, der beim kostenlosen Hosting-Anbieter OnWorks mit einer unserer zahlreichen kostenlosen Online-Workstations wie Ubuntu Online, Fedora Online, dem Windows-Online-Emulator oder dem MAC OS-Online-Emulator ausgeführt werden kann
PROGRAMM:
NAME/FUNKTION
c2ph, pstruct - Dump von C-Strukturen, wie sie aus "cc -g -S"-Stabs generiert wurden
ZUSAMMENFASSUNG
c2ph [-dpnP] [var=val] [Dateien ...]
OPTIONAL
Option:
-w breit; Abkürzung für: type_width=45 member_width=35 offset_width=8
-x hex; Abkürzung für: offset_fmt=x offset_width=08 size_fmt=x size_width=04
-n keinen Perl-Code generieren (Standard bei Aufruf als pstruct)
-p Perl-Code generieren (Standard bei Aufruf als c2ph)
-v generiert Perl-Code mit C-Decls als Kommentar
-Ich berechne die Größen für intrinsische Datentypen NICHT neu
-A Dump-Informationen zu intrinsischen auch
-t Trace-Ausführung
-d Unmengen von Debugging-Ausgaben spucken
-slist gibt einer durch Kommas getrennten Liste eine Struktur zum Ausgeben
BESCHREIBUNG
Das Folgende ist die alte c2ph.doc-Dokumentation von Tom Christiansentchrist@perl.com>
Datum: 25. Juli 91 08:10:21 GMT
Ich habe einmal ein Programm namens pstruct geschrieben. Es war ein Perl-Programm, das versucht hat
Analysieren Sie C-Strukturen und zeigen Sie ihre Member-Offsets für Sie an. Das war besonders
nützlich für Leute, die sich Binär-Dumps ansehen oder im Kernel herumstöbern.
Pstruct war kein schönes Programm. Es war auch nicht besonders robust. Das Problem, du
sehen, war, dass der C-Compiler beim Parsen von C viel besser war, als ich es mir jemals erhoffen konnte.
Also wurde ich schlau: Ich beschloss, faul zu sein und ließ den C-Compiler das C analysieren, was spucken würde
Debugger-Stichs aus, damit ich sie lesen kann. Diese waren viel einfacher zu analysieren. Es ist immer noch nicht
hübsches Programm, aber zumindest ist es robuster.
Pstruct nimmt alle .c- oder .h-Dateien, oder vorzugsweise .s-Dateien, da dies das Format ist
werde sie sowieso einmassieren und Auflistungen wie diese ausspucken:
strukturiere tty {
int tty.t_locker 000 4
int tty.t_mutex_index 004 4
strukt tty * tty.t_tp_virt 008 4
Strukturliste tty.t_rawq 00c 20
int tty.t_rawq.c_cc 00c 4
int tty.t_rawq.c_cmax 010 4
int tty.t_rawq.c_cfx 014 4
int tty.t_rawq.c_clx 018 4
strukt tty * tty.t_rawq.c_tp_cpu 01c 4
strukt tty * tty.t_rawq.c_tp_iop 020 4
unsigned char * tty.t_rawq.c_buf_cpu 024 4
unsigned char * tty.t_rawq.c_buf_iop 028 4
Strukturliste tty.t_canq 02c 20
int tty.t_canq.c_cc 02c 4
int tty.t_canq.c_cmax 030 4
int tty.t_canq.c_cfx 034 4
int tty.t_canq.c_clx 038 4
struct tty * tty.t_canq.c_tp_cpu 03c 4
struct tty * tty.t_canq.c_tp_iop 040 4
unsigned char * tty.t_canq.c_buf_cpu 044 4
unsigned char * tty.t_canq.c_buf_iop 048 4
Strukturliste tty.t_outq 04c 20
int tty.t_outq.c_cc 04c 4
int tty.t_outq.c_cmax 050 4
int tty.t_outq.c_cfx 054 4
int tty.t_outq.c_clx 058 4
struct tty * tty.t_outq.c_tp_cpu 05c 4
strukt tty * tty.t_outq.c_tp_iop 060 4
unsigned char * tty.t_outq.c_buf_cpu 064 4
unsigned char * tty.t_outq.c_buf_iop 068 4
(*int)() tty.t_oproc_cpu 06c 4
(*int)() tty.t_oproc_iop 070 4
(*int)() tty.t_stopproc_cpu 074 4
(*int)() tty.t_stopproc_iop 078 4
Struktur-Thread * tty.t_rsel 07c 4
usw.
Tatsächlich wurde dies durch einen bestimmten Satz von Optionen erzeugt. Sie können die
Formatierung jeder Spalte, egal ob breit oder dick, hex oder dezimal, führende Nullen
oder Wasauchimmer.
Alles, was Sie dafür brauchen, ist ein C-Compiler, der Stabs im BSD/GCC-Stil erzeugt.
Die -g Option auf nativen BSD-Compilern und GCC sollte dies für Sie besorgen.
Um mehr zu erfahren, geben Sie einfach eine falsche Option ein, z. B. -\?, und eine lange Nutzungsnachricht wird sein
bereitgestellt. Es gibt eine ganze Reihe von Möglichkeiten.
Wenn Sie nur ein C-Programmierer sind, ist dies das Ende der Nachricht für Sie. Du kannst aufhören
jetzt, und wenn Sie möchten, speichern Sie die Quelle und führen Sie sie aus, wenn Sie Lust dazu haben. Oder
nicht.
Aber wenn Sie ein Perl-Programmierer sind, dann habe ich für Sie etwas viel Wunderbareres als
nur ein Strukturoffsetdrucker.
Sie sehen, wenn Sie pstruct durch seine andere Inkybernation, c2ph, aufrufen, haben Sie einen Codegenerator
das übersetzt C-Code in Perl-Code! Zumindest Struktur- und Gewerkschaftserklärungen,
aber das ist schon einiges.
Jeder, der in Perl programmierte und mit C-Programmen interagieren wollte,
wie der Kernel, war gezwungen, die Layouts der C-Strukturen zu erraten und dann fest zu verdrahten
diese in sein Programm. Natürlich, wenn Sie Ihr wunderbar gestaltetes Programm zu einem
System, bei dem die Sgtty-Struktur anders angelegt war, ist Ihr Programm kaputt gegangen. Die ein
Schande.
Wir hatten Larrys h2ph-Übersetzer, der geholfen hat, aber das funktioniert nur bei cpp-Symbolen, nicht
echtes C, das auch sehr gebraucht wurde. Was ich Ihnen anbiete, ist ein symbolischer Weg, um zu gelangen
alle C-Strukturen. Ich habe sie in Bezug auf Pakete und Funktionen formuliert. Bedenke die
folgendes Programm:
#!/usr/local/bin/perl
erfordern 'syscall.ph';
erfordern 'sys/time.ph';
erfordern 'sys/resource.ph';
$ru = "\0" x &rusage'sizeof();
syscall(&SYS_getrusage, &RUSAGE_SELF, $ru) && die "getrusage: $!";
@ru = entpacken($t = &rusage'typedef(), $ru);
$utime = $ru[ &rusage'ru_utime + &timeval'tv_sec ]
+ ($ru[ &rusage'ru_utime + &timeval'tv_usec ]) / 1e6;
$stime = $ru[ &rusage'ru_stime + &timeval'tv_sec ]
+ ($ru[ &rusage'ru_stime + &timeval'tv_usec ]) / 1e6;
printf "Sie haben %8.3fs+%8.3fu Sekunden verwendet.\n", $utime, $stime;
Wie Sie sehen, ist der Name des Pakets der Name der Struktur. Reguläre Felder sind nur
ihre eigenen Namen. Außerdem stehen Ihnen die folgenden Accessor-Funktionen zur Verfügung:
struct Dies erfordert keine Argumente und ist lediglich die Nummer der ersten Ebene
Elemente in der Struktur. Sie würden dies für die Indizierung verwenden
in Arrays von Strukturen, vielleicht so
$usec = $u[ &user'u_utimer
+ (&ITIMER_VIRTUAL * &timerval'struct)
+ &timerval'it_value
+ &timeval'tv_usec
];
sizeof Gibt die Bytes in der Struktur oder den Member zurück, wenn
Sie übergeben ihm ein Argument, wie zum Beispiel
&rusage'sizeof(&rusage'ru_utime)
typedef Dies ist die Perl-Formatdefinition für die Übergabe an pack und
auspacken. Wenn Sie nach der Typdefinition eines Nichts fragen, erhalten Sie
die ganze Struktur, sonst bekommt man die des Mitglieds
Du fragst für. Für die Polsterung ist gesorgt, ebenso wie für die Magie zu
garantieren, dass eine Union in alle ihre Aliase entpackt wird.
Bitfelder werden jedoch noch nicht ganz unterstützt.
offsetof Diese Funktion ist der Byte-Offset im Array davon
Mitglied. Vielleicht möchten Sie dies direkt für die Indizierung verwenden
in die gepackte Struktur mit vec() wenn du zu faul bist
um es auszupacken.
typeof Nicht zu verwechseln mit der typedef-Accessor-Funktion, this
one gibt den C-Typ dieses Felds zurück. Dies würde es ermöglichen
Sie einen schönen strukturierten hübschen Druck von einigen ausdrucken
strukturieren, ohne vorher etwas darüber zu wissen.
Keine Argumente für dieses ist ein Noop. Irgendwann poste ich solche
eine Sache, um Ihre u-Struktur für Sie zu entleeren.
Die Art und Weise, wie dies verwendet wird, ist im Grunde so:
% h2ph /usr/lib/perl/tmp.ph
% c2ph some_include_file.h >> /usr/lib/perl/tmp.ph
% Installieren
Es ist ein kleiner Trick mit c2ph, weil Sie die Includes richtig machen müssen. ich kann es nicht wissen
dies für Ihr System, aber es ist normalerweise nicht allzu schwierig.
Der Code ist nicht schön, wie ich schon sagte – ich hätte nie gedacht, dass es ein 1000-Zeilen-Programm sein würde
als ich angefangen habe, oder ich habe vielleicht nicht angefangen. :-) Aber ich wäre weniger unbekümmert gewesen
die Teile des Programms miteinander kommunizierten usw. Es hätte auch helfen können, wenn
Ich musste das Make-up der Stiche nicht im Handumdrehen erraten und dann Mikro berücksichtigen
Unterschiede zwischen meinem Compiler und gcc.
Hier ist es jedenfalls. Sollte auf Perl v4 oder höher laufen. Vielleicht weniger.
- Tom
Nutzen Sie c2ph online über die Dienste von onworks.net