Ini ialah pstruct arahan yang boleh dijalankan dalam penyedia pengehosan percuma OnWorks menggunakan salah satu daripada berbilang stesen kerja dalam talian percuma kami seperti Ubuntu Online, Fedora Online, emulator dalam talian Windows atau emulator dalam talian MAC OS.
JADUAL:
NAMA
c2ph, pstruct - Buang struktur C seperti yang dijana daripada tikaman "cc -g -S".
SINOPSIS
c2ph [-dpnP] [var=val] [fail ...]
PILIHAN
Pilihan:
-w lebar; pendek untuk: type_width=45 member_width=35 offset_width=8
-x hex; singkatan untuk: offset_fmt=x offset_width=08 size_fmt=x size_width=04
-n jangan menjana kod perl (lalai apabila dipanggil sebagai pstruct)
-p menjana kod perl (lalai apabila dipanggil sebagai c2ph)
-v menjana kod perl, dengan C decls sebagai ulasan
-saya TIDAK mengira semula saiz untuk jenis data intrinsik
-maklumat longgokan tentang intrinsik juga
-t pelaksanaan jejak
-d memuntahkan rim keluaran penyahpepijatan
-slist berikan senarai dipisahkan koma satu struktur untuk dibuang
DESCRIPTION
Berikut ialah dokumentasi c2ph.doc lama oleh Tom Christiansen[e-mel dilindungi]>
Tarikh: 25 Jul 91 08:10:21 GMT
Pada suatu masa dahulu, saya telah menulis satu program bernama pstruct. Ia adalah program perl yang cuba melakukannya
menghuraikan struktur C dan memaparkan offset ahli mereka untuk anda. Ini adalah terutamanya
berguna untuk orang yang melihat dump binari atau mencucuk sekitar kernel.
Pstruct bukanlah program yang cantik. Ia juga tidak begitu teguh. Masalahnya, awak
lihat, adakah pengkompil C jauh lebih baik dalam menghuraikan C daripada yang saya harapkan.
Jadi saya menjadi bijak: Saya memutuskan untuk menjadi malas dan membiarkan pengkompil C menghuraikan C, yang akan meludah
keluar tikaman debugger untuk saya baca. Ini adalah lebih mudah untuk dihuraikan. Ia masih bukan a
program yang cantik, tetapi sekurang-kurangnya ia lebih mantap.
Pstruct mengambil mana-mana fail .c atau .h, atau sebaik-baiknya fail .s, kerana itu formatnya
akan mengurutnya, dan mengeluarkan senarai seperti ini:
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
aksara yang tidak ditandatangani * tty.t_rawq.c_buf_cpu 024 4
aksara tidak ditandatangani * 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
aksara yang tidak ditandatangani * tty.t_canq.c_buf_cpu 044 4
aksara yang tidak ditandatangani * 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
aksara yang tidak ditandatangani * tty.t_outq.c_buf_cpu 064 4
aksara yang tidak ditandatangani * 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
benang struktur * tty.t_rsel 07c 4
dan lain-lain.
Sebenarnya, ini dijana oleh set pilihan tertentu. Anda boleh mengawal
pemformatan setiap lajur, sama ada anda lebih suka lebar atau gemuk, heks atau perpuluhan, mendahului sifar
atau apa sahaja.
Apa yang anda perlukan untuk dapat menggunakan ini ialah pengkompil C daripada menjana tikaman gaya BSD/GCC.
. -g pilihan pada penyusun BSD asli dan GCC harus mendapatkan ini untuk anda.
Untuk mengetahui lebih lanjut, hanya taip pilihan palsu, seperti -\?, dan mesej penggunaan yang panjang akan menjadi
disediakan. Terdapat sebilangan besar kemungkinan.
Jika anda hanya seorang pengaturcara C, maka ini adalah penghujung mesej untuk anda. Anda boleh berhenti
sekarang, dan jika anda peduli, simpan sumbernya dan jalankannya apabila anda mahukannya. Ataupun
tidak.
Tetapi jika anda seorang pengaturcara perl, maka untuk anda saya mempunyai sesuatu yang lebih menakjubkan daripada
hanya pencetak mengimbangi struktur.
Anda lihat, jika anda memanggil pstruct dengan incybernation yang lain, c2ph, anda mempunyai penjana kod
yang menterjemah kod C ke kod perl! Nah, struktur dan pengisytiharan kesatuan sekurang-kurangnya,
tetapi itu agak sedikit.
Sebelum ini, sesiapa pengaturcaraan dalam perl yang ingin berinteraksi dengan program C,
seperti kernel, terpaksa meneka susun atur struktur C, dan kemudian wayar keras
ini ke dalam programnya. Sudah tentu, apabila anda membawa program anda yang direka dengan hebat ke a
sistem di mana struktur sgtty dibentangkan secara berbeza, program anda rosak. Yang manakah a
malu.
Kami mempunyai penterjemah h2ph Larry, yang membantu, tetapi itu hanya berfungsi pada simbol cpp, bukan
C sebenar, yang juga sangat diperlukan. Apa yang saya tawarkan kepada anda adalah cara simbolik untuk mendapatkannya
semua struktur C. Saya telah menjelaskannya dari segi pakej dan fungsi. Pertimbangkan
program berikut:
#!/usr/local/bin/perl
memerlukan 'syscall.ph';
memerlukan 'sys/time.ph';
memerlukan 'sys/resource.ph';
$ru = "\0" x &rusage'sizeof();
syscall(&SYS_getrusage, &RUSAGE_SELF, $ru) && mati "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 "anda telah menggunakan %8.3fs+%8.3fu saat.\n", $utime, $stime;
Seperti yang anda lihat, nama pakej ialah nama struktur. Medan biasa adalah adil
nama mereka sendiri. Selain itu, fungsi aksesori berikut disediakan untuk kemudahan anda:
struct Ini tidak memerlukan hujah, dan hanyalah bilangan peringkat pertama
elemen dalam struktur. Anda akan menggunakan ini untuk pengindeksan
ke dalam tatasusunan struktur, mungkin seperti ini
$usec = $u[ &user'u_utimer
+ (&ITIMER_VIRTUAL * &imerval'struct)
+ &itimerval'it_value
+ &timeval'tv_usec
];
sizeof Mengembalikan bait dalam struktur, atau ahli jika
anda memberikannya hujah, seperti
&rusage'sizeof(&rusage'ru_utime)
typedef Ini ialah definisi format perl untuk menghantar ke pek dan
membongkar. Jika anda meminta typedef bagi apa-apa, anda mendapat
keseluruhan struktur, jika tidak, anda mendapat struktur ahli
awak minta. Padding dijaga, seperti keajaiban untuk
menjamin bahawa kesatuan dibongkar ke dalam semua aliasnya.
Bitfields masih belum disokong lagi.
offsetof Fungsi ini ialah offset bait ke dalam tatasusunan itu
ahli. Anda mungkin ingin menggunakan ini untuk pengindeksan secara langsung
ke dalam struktur yang dibungkus dengan vec() jika anda terlalu malas
untuk membongkarnya.
typeof Jangan dikelirukan dengan fungsi accessor typedef, ini
satu mengembalikan jenis C medan itu. Ini akan membolehkan
anda untuk mencetak cetakan cantik berstruktur yang bagus untuk beberapa
struktur tanpa mengetahui apa-apa tentangnya terlebih dahulu.
Tiada args untuk yang ini adalah noop. Suatu hari nanti saya akan menyiarkan seperti itu
satu perkara untuk membuang struktur u anda untuk anda.
Cara saya melihat ini digunakan adalah seperti ini pada dasarnya:
% h2ph /usr/lib/perl/tmp.ph
% c2ph some_include_file.h >> /usr/lib/perl/tmp.ph
% pemasangan
Ia adalah sedikit menipu dengan c2ph kerana anda perlu mendapatkan termasuk betul. Saya tidak boleh tahu
ini untuk sistem anda, tetapi ia biasanya tidak terlalu sukar.
Kod itu tidak cantik seperti yang saya nyatakan -- Saya tidak pernah menyangka ia akan menjadi program 1000 baris
apabila saya mula, atau saya mungkin tidak bermula. :-) Tetapi saya akan menjadi kurang angkuh dalam bagaimana
bahagian program berkomunikasi antara satu sama lain, dsb. Ia juga mungkin membantu jika
Saya tidak perlu mengetahui solekan tikaman dengan cepat, dan kemudian mengambil kira mikro
perbezaan antara pengkompil saya dan gcc.
Bagaimanapun, ini dia. Harus dijalankan pada perl v4 atau lebih tinggi. Mungkin kurang.
--tom
Gunakan pstruct dalam talian menggunakan perkhidmatan onworks.net