Questo è il comando c2ph che può essere eseguito nel provider di hosting gratuito OnWorks utilizzando una delle nostre molteplici workstation online gratuite come Ubuntu Online, Fedora Online, emulatore online Windows o emulatore online MAC OS
PROGRAMMA:
NOME
c2ph, pstruct - Scarica le strutture C generate da "cc -g -S" stabs
SINOSSI
c2ph [-dpnP] [var=val] [file...]
VERSIONI
Opzioni:
-w largo; abbreviazione di: type_width=45 member_width=35 offset_width=8
-x esadecimale; abbreviazione di: offset_fmt=x offset_width=08 size_fmt=x size_width=04
-n non genera codice perl (predefinito quando invocato come pstruct)
-p genera codice perl (predefinito quando invocato come c2ph)
-v genera codice perl, con C decls come commenti
-NON ricalcolo le dimensioni per i tipi di dati intrinseci
-un'informazione di dump anche sugli intrinseci
-t traccia l'esecuzione
-d vomita risme di output di debug
-slist fornisce all'elenco separato da virgole una struttura da scaricare
DESCRIZIONE
Quella che segue è la vecchia documentazione c2ph.doc di Tom Christiansen[email protected]>
Data: 25 luglio 91 08:10:21 GMT
C'era una volta, ho scritto un programma chiamato pstruct. Era un programma perl che cercava di
analizza le strutture C e mostra i loro offset dei membri per te. Questo è stato particolarmente
utile per le persone che guardano i dump binari o rovistano nel kernel.
Pstruct non era un bel programma. Né era particolarmente robusto. Il problema, tu
vedi, era che il compilatore C era molto più bravo ad analizzare il C di quanto potessi mai sperare di essere.
Quindi sono diventato intelligente: ho deciso di essere pigro e lasciare che il compilatore C analizzasse il C, il che sarebbe sputato
out debugger pugnala per me da leggere. Questi erano molto più facili da analizzare. Non è ancora un
bel programma, ma almeno è più robusto.
Pstruct accetta qualsiasi file .co .h, o preferibilmente .s, poiché questo è il formato che è
andando a massaggiarli comunque, e sputando fuori elenchi come questo:
struttura tty {
int tty.t_locker 000 4
int tty.t_mutex_index 004 4
struttura tty * tty.t_tp_virt 008 4
struttura clist 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
struttura tty * tty.t_rawq.c_tp_cpu 01c 4
struttura tty * tty.t_rawq.c_tp_iop 020 4
carattere non firmato * tty.t_rawq.c_buf_cpu 024 4
carattere non firmato * tty.t_rawq.c_buf_iop 028 4
struttura clist 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
struttura tty * tty.t_canq.c_tp_cpu 03c 4
struttura tty * tty.t_canq.c_tp_iop 040 4
carattere non firmato * tty.t_canq.c_buf_cpu 044 4
carattere non firmato * tty.t_canq.c_buf_iop 048 4
struttura clist 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
struttura tty * tty.t_outq.c_tp_cpu 05c 4
struttura tty * tty.t_outq.c_tp_iop 060 4
carattere non firmato * tty.t_outq.c_buf_cpu 064 4
carattere non firmato * tty.t_outq.c_buf_iop 068 4
(*int)() tty.t_opoc_cpu 06c 4
(*int)() tty.t_opoc_iop 070 4
(*int)() tty.t_stopproc_cpu 074 4
(*int)() tty.t_stopproc_iop 078 4
struttura del thread * tty.t_rsel 07c 4
ecc.
In realtà, questo è stato generato da un particolare insieme di opzioni. Puoi controllare il
formattazione di ogni colonna, che si preferisca ampia o grassa, esadecimale o decimale, zeri iniziali
o qualsiasi altra cosa
Tutto ciò di cui hai bisogno per essere in grado di usarlo è un compilatore C che genera stab in stile BSD/GCC.
. -g opzione sui compilatori nativi BSD e GCC dovrebbe ottenere questo per te.
Per saperne di più, digita un'opzione fasulla, come -\?, e verrà visualizzato un messaggio di utilizzo prolungato
fornito. Ci sono un discreto numero di possibilità.
Se sei solo un programmatore C, questa è la fine del messaggio per te. puoi smettere
in questo momento, e se ti interessa, salva il sorgente ed eseguilo quando ne hai voglia. o
non.
Ma se sei un programmatore perl, allora per te ho qualcosa di molto più meraviglioso di
solo una stampante offset struttura.
Vedi, se chiami pstruct con l'altro suo incybernation, c2ph, hai un generatore di codice
che traduce il codice C in codice perl! Beh, almeno la struttura e le dichiarazioni sindacali,
ma è un bel po'.
Prima di questo punto, chiunque programmasse in perl e volesse interagire con programmi C,
come il kernel, è stato costretto a indovinare i layout delle strutture C, e quindi hardwire
questi nel suo programma. Naturalmente, quando hai portato il tuo programma meravigliosamente realizzato a
sistema in cui la struttura sgtty era strutturata in modo diverso, il tuo programma si è rotto. Il quale è un
vergogna.
Abbiamo avuto il traduttore h2ph di Larry, che ha aiutato, ma funziona solo sui simboli cpp, non
vera C, che era anche molto necessaria. Quello che ti offro è un modo simbolico di arrivare a
tutte le strutture C. Li ho espressi in termini di pacchetti e funzioni. Considera il
seguente programma:
#! / usr / local / bin / perl
richiedono 'syscall.ph';
richiedono 'sys/time.ph';
richiedono 'sys/resource.ph';
$ru = "\0" x &rusage'sizeof();
syscall(&SYS_getrusage, &RUSAGE_SELF, $ru) && die "getrusage: $!";
@ru = unpack($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 "hai usato %8.3fs+%8.3fu secondi.\n", $utime, $stime;
Come vedi, il nome del pacchetto è il nome della struttura. I campi regolari sono solo
i propri nomi. Inoltre, per comodità dell'utente, vengono fornite le seguenti funzioni di accesso:
struct Questo non accetta argomenti ed è semplicemente il numero di primo livello
elementi nella struttura. Lo useresti per l'indicizzazione
in array di strutture, forse in questo modo
$usec = $u[ &user'u_utimer
+ (&ITIMER_VIRTUAL * &struttura'valore_time)
+ &timemerval'it_value
+ &timeval'tv_usec
];
sizeof Restituisce i byte nella struttura o il membro se
gli passi un argomento, come
&rusage'sizeof(&rusage'ru_utime)
typedef Questa è la definizione del formato perl da passare a pack e
disimballare. Se chiedi il typedef di un niente, ottieni
tutta la struttura, altrimenti ottieni quella del membro
chiedi. L'imbottitura è curata, così come la magia di
garantire che un'unione venga decompressa in tutti i suoi alias.
Tuttavia, i campi di bit non sono ancora del tutto supportati.
offsetof Questa funzione è l'offset di byte nell'array di quello
membro. Potresti voler usarlo per l'indicizzazione direttamente
nella struttura compatta con vec() se sei troppo pigro
per disimballarlo.
typeof Da non confondere con la funzione di accesso typedef, questo
uno restituisce il tipo C di quel campo. Questo permetterebbe
di stampare una bella stampa strutturata di alcuni
struttura senza conoscerne nulla in anticipo.
Nessun argomento per questo è un noop. Un giorno posterò tale
una cosa per scaricare la tua struttura per te.
Il modo in cui lo vedo utilizzato è sostanzialmente questo:
% h2ph /usr/lib/perl/tmp.ph
% c2ph some_include_file.h >> /usr/lib/perl/tmp.ph
% installazione
È un po' più complicato con c2ph perché devi ottenere le giuste inclusioni. non posso saperlo
questo per il tuo sistema, ma di solito non è troppo difficile.
Il codice non è carino come ho detto -- non avrei mai pensato che sarebbe stato un programma da 1000 righe
quando ho iniziato, o forse non avrei iniziato. :-) Ma sarei stato meno sprezzante nel modo
le parti del programma comunicate tra loro, ecc. Avrebbe anche potuto essere d'aiuto se
Non ho dovuto indovinare il trucco delle pugnalate al volo, e poi spiegare il micro
differenze tra il mio compilatore e gcc.
Comunque, eccolo qui. Dovrebbe essere eseguito su perl v4 o successivo. Forse meno.
--tom
Usa c2ph online utilizzando i servizi onworks.net