Ito ang command na c2ph na maaaring patakbuhin sa OnWorks na libreng hosting provider gamit ang isa sa aming maramihang libreng online na workstation gaya ng Ubuntu Online, Fedora Online, Windows online emulator o MAC OS online emulator
PROGRAMA:
NAME
c2ph, pstruct - Dump C structures na nabuo mula sa "cc -g -S" stabs
SINOPSIS
c2ph [-dpnP] [var=val] [mga file ...]
Opsyon
Pagpipilian:
-w malawak; maikli para sa: type_width=45 member_width=35 offset_width=8
-x hex; maikli para sa: offset_fmt=x offset_width=08 size_fmt=x size_width=04
-n huwag bumuo ng perl code (default kapag tinawag bilang pstruct)
-p bumuo ng perl code (default kapag tinawag bilang c2ph)
-v bumuo ng perl code, na may mga C decls bilang mga komento
-HINDI ko nirerecompute ang mga laki para sa mga intrinsic na datatypes
-isang pagtatapon ng impormasyon sa intrinsics din
-t trace execution
-d spew reams ng debugging output
-slist magbigay ng comma-separated list ng mga istrukturang itatambak
DESCRIPTION
Ang sumusunod ay ang lumang dokumentasyon ng c2ph.doc ni Tom Christiansen[protektado ng email]>
Petsa: 25 Hul 91 08:10:21 GMT
Noong unang panahon, sumulat ako ng isang programa na tinatawag na pstruct. Ito ay isang perl program na sinubukan
i-parse ang mga istrukturang C at ipakita ang kanilang mga offset ng miyembro para sa iyo. Ito ay lalo na
kapaki-pakinabang para sa mga taong tumitingin sa binary dumps o poking sa paligid ng kernel.
Ang Pstruct ay hindi isang magandang programa. Ni ito ay partikular na matatag. Ang problema, ikaw
tingnan mo, ay ang C compiler ay mas mahusay sa pag-parse ng C kaysa sa inaasahan kong maging.
Kaya naging matalino ako: nagpasya akong maging tamad at hayaan ang C compiler na i-parse ang C, na dumura
out debugger stabs para mabasa ko. Ang mga ito ay mas madaling i-parse. Hindi pa rin ito a
magandang programa, ngunit hindi bababa sa ito ay mas matatag.
Kinukuha ng Pstruct ang anumang .c o .h file, o mas mabuti ang mga .s, dahil iyon ang format nito
imamasahe pa rin ang mga ito, at ilalabas ang mga listahang tulad nito:
struct 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
unsigned char * tty.t_rawq.c_buf_cpu 024 4
unsigned 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
unsigned char * tty.t_canq.c_buf_cpu 044 4
unsigned 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
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
struct thread * tty.t_rsel 07c 4
at iba pa
Sa totoo lang, ito ay nabuo ng isang partikular na hanay ng mga opsyon. Maaari mong kontrolin ang
pag-format ng bawat column, mas gusto mo man ang malapad o mataba, hex o decimal, ang mga nangungunang zero
o kung ano man.
Ang kailangan mo lang para magamit ito ay isang C compiler kaysa sa pagbuo ng BSD/GCC-style stabs.
Ang -g opsyon sa mga katutubong BSD compiler at GCC ay dapat makakuha nito para sa iyo.
Para matuto pa, mag-type lang ng bogus na opsyon, gaya ng -\?, at magkakaroon ng mahabang mensahe sa paggamit
ibinigay. Mayroong isang patas na bilang ng mga posibilidad.
Kung ikaw ay isang C programmer lamang, ito na ang katapusan ng mensahe para sa iyo. Pwede ka nang umalis
sa ngayon, at kung nagmamalasakit ka, i-save ang pinagmulan at patakbuhin ito kapag gusto mo ito. O kaya
hindi.
Ngunit kung ikaw ay isang perl programmer, kung gayon para sa iyo mayroon akong isang bagay na mas nakakamangha kaysa
isang structure offset printer lang.
Tingnan mo, kung tatawagin mo ang pstruct sa pamamagitan ng iba pang incybernation nito, c2ph, mayroon kang generator ng code
na nagsasalin ng C code sa perl code! Well, istruktura at mga deklarasyon ng unyon man lang,
pero medyo lang.
Bago ang puntong ito, sinumang nagprograma sa perl na gustong makipag-ugnayan sa mga programang C,
tulad ng kernel, ay pinilit na hulaan ang mga layout ng mga istrukturang C, at pagkatapos ay hardwire
ang mga ito sa kanyang programa. Siyempre, kapag kinuha mo ang iyong kamangha-manghang ginawang programa sa isang
system kung saan iba ang inilatag ng sgtty structure, nasira ang program mo. Alin ang a
nakakahiya
Mayroon kaming tagasalin ng h2ph ni Larry, na nakatulong, ngunit gumagana lamang iyon sa mga simbolo ng cpp, hindi
tunay na C, na kailangan din. Ang inaalok ko sa iyo ay isang simbolikong paraan ng pagkuha
lahat ng mga istrukturang C. Inilagay ko ang mga ito sa mga tuntunin ng mga pakete at pag-andar. Isaalang-alang ang
sumusunod na programa:
#!/usr/local/bin/perl
nangangailangan ng 'syscall.ph';
nangangailangan ng 'sys/time.ph';
nangangailangan ng 'sys/resource.ph';
$ru = "\0" x &rusage'sizeof();
syscall(&SYS_getrusage, &RUSAGE_SELF, $ru) && mamatay "gettrusage: $!";
@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 "ginamit mo ang %8.3fs+%8.3fu segundo.\n", $utime, $stime;
Tulad ng nakikita mo, ang pangalan ng pakete ay ang pangalan ng istraktura. Ang mga regular na patlang ay makatarungan
kanilang sariling mga pangalan. At ang mga sumusunod na accessor function ay ibinibigay para sa iyong kaginhawahan:
struct Hindi ito tumatagal ng mga argumento, at ito ay bilang lamang ng unang antas
elemento sa istruktura. Gagamitin mo ito para sa pag-index
sa mga hanay ng mga istruktura, marahil ay ganito
$usec = $u[ &user'u_utimer
+ (&ITIMER_VIRTUAL * &imerval'struct)
+ &imerval'it_value
+ &timeval'tv_usec
];
sizeof Ibinabalik ang mga byte sa istraktura, o ang miyembro kung
ipasa mo ito sa isang argumento, tulad ng
&rusage'sizeof(&rusage'ru_utime)
typedef Ito ang kahulugan ng perl format para sa pagpasa sa pack at
alisan ng laman. Kung hihilingin mo ang typedef ng isang wala, makukuha mo
ang buong istraktura, kung hindi man ay makukuha mo ang sa miyembro
hinihiling mo. Ang padding ay pinangangalagaan, pati na ang magic sa
ginagarantiyahan na ang isang unyon ay na-unpack sa lahat ng mga alias nito.
Ang mga bitfield ay hindi pa suportado gayunpaman.
offsetof Ang function na ito ay ang byte offset sa hanay ng iyon
miyembro. Maaaring naisin mong gamitin ito para sa direktang pag-index
sa naka-pack na istraktura na may vec() kung ikaw ay masyadong tamad
para i-unpack ito.
typeof Huwag malito sa typedef accessor function, ito
ibinabalik ng isa ang uri ng C ng field na iyon. Ito ay magpapahintulot
mong i-print ang isang magandang structured pretty print ng ilan
istraktura nang hindi alam ang anumang bagay tungkol dito nang maaga.
Walang args sa isang ito ay isang noop. Balang araw magpopost ako ng ganyan
isang bagay na itatapon ang iyong istraktura para sa iyo.
Ang paraang nakikita kong ginagamit ito ay karaniwang ganito:
% h2ph /usr/lib/perl/tmp.ph
% c2ph some_include_file.h >> /usr/lib/perl/tmp.ph
% pag-install
Ito ay isang maliit na manlilinlang sa c2ph dahil kailangan mong makuha ang mga kasama nang tama. hindi ko alam
ito para sa iyong system, ngunit ito ay karaniwang hindi masyadong mahirap.
Ang code ay hindi maganda tulad ng aking nabanggit -- Hindi ko akalain na ito ay isang 1000-linya na programa
kapag nagsimula ako, o maaaring hindi ko nasimulan. :-) Ngunit ako ay hindi gaanong cavalier sa kung paano
ang mga bahagi ng programa ay nakipag-ugnayan sa isa't isa, atbp. Maaaring nakatulong din ito kung
Hindi ko na kailangang idivine ang makeup ng mga stabs on the fly, at pagkatapos ay account para sa micro
mga pagkakaiba sa pagitan ng aking compiler at gcc.
Anyway, eto na. Dapat tumakbo sa perl v4 o mas mataas. Baka onti.
--tom
Gamitin ang c2ph online gamit ang mga serbisyo ng onworks.net