Dit is de opdracht c2ph die kan worden uitgevoerd in de gratis hostingprovider van OnWorks met behulp van een van onze meerdere gratis online werkstations zoals Ubuntu Online, Fedora Online, Windows online emulator of MAC OS online emulator
PROGRAMMA:
NAAM
c2ph, pstruct - Dump C-structuren zoals gegenereerd uit "cc -g -S" -steken
KORTE INHOUD
c2ph [-dpnP] [var=val] [bestanden ...]
OPTIES
Opties:
-w breed; afkorting voor: type_width=45 member_width=35 offset_width=8
-x zeskant; afkorting voor: offset_fmt=x offset_width=08 size_fmt=x size_width=04
-n genereer geen perl-code (standaard wanneer aangeroepen als pstruct)
-p perl-code genereren (standaard wanneer aangeroepen als c2ph)
-v genereer perl-code, met C decls als commentaar
-ik bereken de grootte voor intrinsieke datatypes NIET opnieuw
-ook een dumpinformatie over intrinsieke waarden
-t trace-uitvoering
-d breidt debug-uitvoer uit
-slist geeft een door komma's gescheiden lijst een structuur die moet worden gedumpt
PRODUCTBESCHRIJVING
Het volgende is de oude c2ph.doc-documentatie van Tom Christiansen[e-mail beveiligd]>
Datum: 25 juli 91 08:10:21 GMT
Er was eens een programma met de naam pstruct. Het was een perl-programma dat dat probeerde
ontleed C-structuren en geef hun ledenoffsets voor u weer. Dit was vooral
handig voor mensen die naar binaire dumps kijken of in de kernel snuffelen.
Pstruct was geen mooi programma. Het was ook niet bijzonder robuust. Het probleem, jij
Kijk, was dat de C-compiler veel beter was in het parseren van C dan ik ooit zou kunnen hopen.
Dus ik werd slim: ik besloot lui te zijn en de C-compiler de C te laten parseren, die zou spugen
debugger steekt voor mij uit om te lezen. Deze waren veel gemakkelijker te analyseren. Het is nog steeds geen A
mooi programma, maar het is in ieder geval robuuster.
Pstruct accepteert alle .c- of .h-bestanden, of bij voorkeur .s-bestanden, omdat dat het formaat is
Ik ga ze er toch in masseren, en spuugt lijsten als deze uit:
structuur tty {
int tty.t_locker 000 4
int tty.t_mutex_index 004 4
struct tty * tty.t_tp_virt 008 4
struct 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
struct tty * tty.t_rawq.c_tp_cpu 01c 4
struct tty * tty.t_rawq.c_tp_iop 020 4
niet-ondertekende char * tty.t_rawq.c_buf_cpu 024 4
niet-ondertekende char * tty.t_rawq.c_buf_iop 028 4
struct 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
struct tty * tty.t_canq.c_tp_cpu 03c 4
struct tty * tty.t_canq.c_tp_iop 040 4
niet-ondertekende char * tty.t_canq.c_buf_cpu 044 4
niet-ondertekende char * tty.t_canq.c_buf_iop 048 4
struct 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
struct tty * tty.t_outq.c_tp_cpu 05c 4
struct tty * tty.t_outq.c_tp_iop 060 4
niet-ondertekende char * tty.t_outq.c_buf_cpu 064 4
niet-ondertekende 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
struct draad * tty.t_rsel 07c 4
enz.
Eigenlijk werd dit gegenereerd door een bepaalde reeks opties. Je kunt de controle uitoefenen
opmaak van elke kolom, of u nu de voorkeur geeft aan breed of dik, hexadecimaal of decimaal, met voorloopnullen
of wat dan ook.
Het enige dat u nodig hebt om dit te kunnen gebruiken, is een C-compiler die steken in BSD/GCC-stijl genereert.
De -g optie op native BSD-compilers en GCC zou dit voor u moeten krijgen.
Voor meer informatie typt u gewoon een valse optie, zoals -\?, en er zal een lang gebruiksbericht verschijnen
mits. Er zijn behoorlijk wat mogelijkheden.
Als je alleen maar een C-programmeur bent, dan is dit het einde van het bericht voor jou. Je kunt stoppen
nu meteen, en als je dat wilt, sla dan de bron op en voer hem uit wanneer je daar zin in hebt. Of
niet.
Maar als je een perl-programmeur bent, dan heb ik iets veel wonderlijkers voor je dan
gewoon een structuuroffsetprinter.
Zie je, als je pstruct aanroept via zijn andere incybernatie, c2ph, heb je een codegenerator
dat vertaalt C-code naar perl-code! Nou ja, tenminste structuur- en vakbondsverklaringen,
maar dat is nogal wat.
Vóór dit punt kon iedereen die in Perl programmeerde en met C-programma's wilde communiceren,
net als de kernel, werd hij gedwongen de lay-outs van de C-structuren te raden, en vervolgens te bekabelen
deze in zijn programma. Natuurlijk, toen je je prachtig vormgegeven programma meenam naar een
systeem waar de sgtty-structuur anders was ingedeeld, is uw programma kapot gegaan. Wat een is
schaamte.
We hebben de h2ph-vertaler van Larry gehad, die hielp, maar die werkt alleen op cpp-symbolen, niet
echte C, wat ook heel hard nodig was. Wat ik je aanbied is een symbolische manier om dat te bereiken
alle C-structuren. Ik heb ze ingedeeld in termen van pakketten en functies. Houd rekening met de
volgend programma:
#!/usr/local/bin/perl
vereist 'syscall.ph';
vereist 'sys/time.ph';
vereist 'sys/resource.ph';
$ru = "\0" x &rusage'sizeof();
syscall(&SYS_getrusage, &RUSAGE_SELF, $ru) && die "getrusage: $!";
@ru = uitpakken($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 "je hebt %8.3fs+%8.3fu seconden gebruikt.\n", $utime, $stime;
Zoals u ziet, is de naam van het pakket de naam van de structuur. Reguliere velden zijn gewoon
hun eigen namen. Bovendien zijn voor uw gemak de volgende toegangsfuncties beschikbaar:
struct Er zijn geen argumenten nodig en het is slechts het nummer van het eerste niveau
elementen in de structuur. U zou dit gebruiken voor indexering
in reeksen structuren, misschien zoals deze
$usec = $u[ &user'u_utimer
+ (&ITIMER_VIRTUAL * &itimerval'struct)
+ &itimerval'it_waarde
+ &timeval'tv_usec
];
sizeof Geeft de bytes in de structuur terug, of het lid if
je geeft er een argument aan, zoals
&gebruik'groottevan(&gebruik'ru_utime)
typedef Dit is de definitie van het perl-formaat voor het doorgeven aan pack en
uitpakken. Als je om de typedef van een niets vraagt, krijg je
de hele structuur, anders krijg je die van het lid
jij vraagt naar. Er wordt voor de vulling gezorgd, net als voor de magie
garanderen dat een vakbond wordt uitgepakt in al zijn aliassen.
Bitvelden worden echter nog niet helemaal ondersteund.
offsetof Deze functie is de byte-offset in de array daarvan
lid. Mogelijk wilt u dit gebruiken voor directe indexering
in de ingepakte structuur met vec() als je te lui bent
om het uit te pakken.
typeof Niet te verwarren met de typedef accessorfunctie, dit
men retourneert het C-type van dat veld. Dit zou het mogelijk maken
je kunt er een mooie, gestructureerde, mooie afdruk van maken
structuur zonder dat u er vooraf iets over weet.
Geen argumenten hiervoor zijn een noop. Ooit zal ik zoiets posten
iets om je u-structuur voor je weg te gooien.
De manier waarop ik zie dat dit wordt gebruikt, is in principe als volgt:
% h2ph /usr/lib/perl/tmp.ph
% c2ph een_include_file.h >> /usr/lib/perl/tmp.ph
% installeren
Het is een beetje lastiger met c2ph, omdat je de inclusies goed moet krijgen. Ik kan het niet weten
dit voor uw systeem, maar het is meestal niet zo erg moeilijk.
De code is niet mooi zoals ik al zei; ik had nooit gedacht dat het een programma van 1000 regels zou zijn
toen ik begon, anders was ik misschien niet begonnen. :-) Maar ik zou minder arrogant zijn geweest in de manier waarop
de delen van het programma communiceerden met elkaar, etc. Het had ook geholpen kunnen zijn als
Ik hoefde de samenstelling van de steken niet meteen te raden, en dan rekening te houden met micro
verschillen tussen mijn compiler en gcc.
Hoe dan ook, hier is het. Moet draaien op perl v4 of hoger. Misschien minder.
--Tom
Gebruik c2ph online met behulp van onworks.net-services