Este es el comando pstruct que se puede ejecutar en el proveedor de alojamiento gratuito de OnWorks utilizando una de nuestras múltiples estaciones de trabajo en línea gratuitas, como Ubuntu Online, Fedora Online, emulador en línea de Windows o emulador en línea de MAC OS.
PROGRAMA:
NOMBRE
c2ph, pstruct - Estructuras de volcado de C generadas a partir de las puñaladas "cc -g -S"
SINOPSIS
c2ph [-dpnP] [var = val] [archivos ...]
OPCIONES
Opciones:
-w de ancho; abreviatura de: type_width = 45 member_width = 35 offset_width = 8
-x hex; abreviatura de: offset_fmt = x offset_width = 08 size_fmt = x size_width = 04
-n no genera código perl (predeterminado cuando se invoca como pstruct)
-p genera código perl (predeterminado cuando se invoca como c2ph)
-v genera código perl, con C decl como comentarios
-no recalculo tamaños para tipos de datos intrínsecos
-un volcado de información sobre intrínsecos también
-t rastrea la ejecución
-d arroja montones de resultados de depuración
-slist da a la lista separada por comas una estructura para volcar
DESCRIPCIÓN
La siguiente es la antigua documentación c2ph.doc de Tom Christiansen[email protected]>
Fecha: 25 de julio de 91 08:10:21 GMT
Érase una vez, escribí un programa llamado pstruct. Era un programa de Perl que intentaba
analizar las estructuras de C y mostrar sus compensaciones de miembros. Esto fue especialmente
útil para personas que buscan volcados binarios o hurgan en el kernel.
Pstruct no fue un programa bonito. Tampoco fue particularmente robusto. El problema tu
ver, fue que el compilador de C era mucho mejor analizando C de lo que yo podría esperar ser.
Así que me volví inteligente: decidí ser perezoso y dejar que el compilador de C analizara el C, que escupiría
el depurador apuñala para que lo lea. Estos fueron mucho más fáciles de analizar. Todavía no es un
bonito programa, pero al menos es más robusto.
Pstruct toma cualquier archivo .co .h, o preferiblemente .s, ya que ese es el formato que tiene.
va a masajearlos de todos modos, y escupe listados como este:
estructura tty {
int tty.t_locker 000 4
int tty.t_mutex_index 004 4
estructura tty * tty.t_tp_virt 008 4
estructura clist tty.t_rawq 00c 20
inttty.t_rawq.c_cc 00c 4
int tty.t_rawq.c_cmax 010 4
inttty.t_rawq.c_cfx 014 4
inttty.t_rawq.c_clx 018 4
estructura tty * tty.t_rawq.c_tp_cpu 01c 4
estructura tty * tty.t_rawq.c_tp_iop 020 4
carácter sin firmar * tty.t_rawq.c_buf_cpu 024 4
carácter sin firmar * tty.t_rawq.c_buf_iop 028 4
estructura clist tty.t_canq 02c 20
int tty.t_canq.c_cc 02c 4
int tty.t_canq.c_cmax 030 4
inttty.t_canq.c_cfx 034 4
int tty.t_canq.c_clx 038 4
estructura tty * tty.t_canq.c_tp_cpu 03c 4
estructura tty * tty.t_canq.c_tp_iop 040 4
carácter sin firmar * tty.t_canq.c_buf_cpu 044 4
carácter sin firmar * tty.t_canq.c_buf_iop 048 4
estructura 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
estructura tty * tty.t_outq.c_tp_cpu 05c 4
estructura tty * tty.t_outq.c_tp_iop 060 4
carácter sin firmar * tty.t_outq.c_buf_cpu 064 4
carácter sin firmar * 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
estructura hilo * tty.t_rsel 07c 4
etc.
En realidad, esto fue generado por un conjunto particular de opciones. Puedes controlar el
formato de cada columna, ya sea que prefiera ancho o grueso, hexadecimal o decimal, ceros iniciales
o lo que sea.
Todo lo que necesita para poder usar esto es un compilador de C que genera puñaladas al estilo BSD / GCC.
Los -g en los compiladores BSD nativos y GCC debería obtener esto para usted.
Para obtener más información, escriba una opción falsa, como - \?, y aparecerá un mensaje de uso prolongado.
previsto. Hay muchas posibilidades.
Si solo es un programador en C, este es el final del mensaje para usted. Puedes salir
ahora mismo, y si lo desea, guarde la fuente y ejecútela cuando lo desee. O
no.
Pero si eres un programador de Perl, entonces tengo algo mucho más maravilloso que
sólo una impresora offset de estructura.
Verá, si llama a pstruct por su otra incibernación, c2ph, tiene un generador de código
que traduce el código C en código Perl. Bueno, estructura y declaraciones sindicales al menos,
pero eso es bastante.
Antes de este punto, cualquiera que programara en perl y quisiera interactuar con programas en C,
como el kernel, se vio obligado a adivinar los diseños de las estructuras C, y luego cablear
estos en su programa. Por supuesto, cuando llevó su programa maravillosamente elaborado a un
sistema donde la estructura sgtty estaba dispuesta de manera diferente, su programa se rompió. El cual es un
vergüenza.
Hemos tenido el traductor h2ph de Larry, que ayudó, pero que solo funciona con símbolos cpp, no
real C, que también era muy necesaria. Lo que te ofrezco es una forma simbólica de llegar a
todas las estructuras C. Los he expresado en términos de paquetes y funciones. Considera el
siguiente programa:
#! / usr / local / bin / perl
require 'syscall.ph';
require 'sys / time.ph';
require 'sys / resource.ph';
$ ru = "\ 0" x & rusage'sizeof ();
syscall (& SYS_getrusage, & RUSAGE_SELF, $ ru) && die "getrusage: $!";
@ru = desempaquetar ($ 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 "ha utilizado% 8.3fs +% 8.3fu segundos. \ n", $ utime, $ stime;
Como ve, el nombre del paquete es el nombre de la estructura. Los campos regulares son solo
sus propios nombres. Además, se proporcionan las siguientes funciones de acceso para su conveniencia:
estructura Esto no toma argumentos, y es simplemente el número de primer nivel
elementos de la estructura. Usarías esto para indexar
en matrices de estructuras, tal vez así
$ usec = $ u [& user'u_utimer
+ (& ITIMER_VIRTUAL * & itimerval'struct)
+ & itimerval'it_value
+ & timeval'tv_usec
];
sizeof Devuelve los bytes en la estructura, o el miembro si
le pasa un argumento, como
& rusage'sizeof (& rusage'ru_utime)
typedef Esta es la definición de formato perl para pasar a empaquetar y
deshacer. Si pides el typedef de una nada, obtienes
toda la estructura, de lo contrario obtienes la del miembro
usted pide. El acolchado está cuidado, al igual que la magia de
Garantizar que un sindicato se descomprime en todos sus alias.
Sin embargo, los campos de bits aún no son compatibles.
offsetof Esta función es el byte offset en la matriz de ese
miembro. Es posible que desee utilizar esto para indexar directamente
en la estructura empaquetada con vec () si eres demasiado vago
para desembalarlo.
typeof No debe confundirse con la función de acceso typedef, este
uno devuelve el tipo C de ese campo. Esto permitiría
que imprima una bonita impresión estructurada de algunos
estructura sin anudar nada al respecto de antemano.
No hay argumentos para este es un error. Algún día publicaré tal
algo para deshacerse de su estructura U por usted.
La forma en que veo que se usa esto es básicamente esto:
% h2ph /usr/lib/perl/tmp.ph
% c2ph some_include_file.h >> /usr/lib/perl/tmp.ph
% Instalar en pc
Es un poco engañoso con c2ph porque tienes que conseguir las inclusiones correctas. No puedo saber
esto para su sistema, pero no suele ser demasiado difícil.
El código no es bonito como mencioné; nunca pensé que sería un programa de 1000 líneas
cuando comencé, o puede que no haya comenzado. :-) Pero hubiera sido menos arrogante en cómo
las partes del programa se comunicaron entre sí, etc. También podría haber ayudado si
No tuve que adivinar la composición de las puñaladas sobre la marcha y luego tener en cuenta el micro
diferencias entre mi compilador y gcc.
De todos modos, aquí está. Debe ejecutarse en perl v4 o superior. Tal vez menos.
--Tomás
Use pstruct en línea usando los servicios de onworks.net