AnglaisFrançaisEspagnol

Ad


Icône de favori OnWorks

c2ph - En ligne dans le Cloud

Exécutez c2ph dans le fournisseur d'hébergement gratuit OnWorks sur Ubuntu Online, Fedora Online, l'émulateur en ligne Windows ou l'émulateur en ligne MAC OS

Il s'agit de la commande c2ph qui peut être exécutée dans le fournisseur d'hébergement gratuit OnWorks en utilisant l'un de nos multiples postes de travail en ligne gratuits tels que Ubuntu Online, Fedora Online, l'émulateur en ligne Windows ou l'émulateur en ligne MAC OS

PROGRAMME:

Nom


c2ph, pstruct - Dump des structures C générées à partir des stabs "cc -g -S"

SYNOPSIS


c2ph [-dpnP] [var=val] [fichiers ...]

OPTIONS
Options:

-w large ; abréviation de : type_width=45 member_width=35 offset_width=8
-x hexadécimal ; abréviation de : offset_fmt=x offset_width=08 size_fmt=x size_width=04

-n ne génère pas de code perl (par défaut lorsqu'il est invoqué en tant que pstruct)
-p générer du code perl (par défaut lorsqu'il est invoqué en tant que c2ph)
-v générer du code perl, avec les decls C comme commentaires

-je ne recalcule PAS les tailles pour les types de données intrinsèques
-un vidage d'informations sur les intrinsèques également

-t trace l'exécution
-d cracher des rames de sortie de débogage

-slist donne à une liste séparée par des virgules une structure à vider

DESCRIPTION


Ce qui suit est l'ancienne documentation c2ph.doc de Tom Christiansen[email protected]>
Date : 25 juillet 91 08:10:21 GMT

Il était une fois, j'ai écrit un programme appelé pstruct. C'était un programme perl qui essayait de
analyser les structures C et afficher leurs décalages de membres pour vous. C'était surtout
utile pour les personnes qui consultent des dumps binaires ou qui fouillent dans le noyau.

Pstruct n'était pas un joli programme. Il n'était pas non plus particulièrement robuste. Le problème, vous
voyez, était que le compilateur C était bien meilleur pour analyser le C que je ne pourrais jamais espérer l'être.

Alors je suis devenu intelligent : j'ai décidé d'être paresseux et de laisser le compilateur C analyser le C, ce qui cracherait
out débogueur poignarde pour moi de lire. Ceux-ci étaient beaucoup plus faciles à analyser. Ce n'est toujours pas un
joli programme, mais au moins c'est plus robuste.

Pstruct accepte tous les fichiers .c ou .h, ou de préférence .s, puisque c'est le format dont il s'agit
va les masser de toute façon, et crache des listes comme celle-ci :

structure tty {
int tty.t_locker 000 4
int tty.t_mutex_index 004 4
structure tty * tty.t_tp_virt 008 4
structure clist tty.t_rawq 00c 20
entier 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
structure tty * tty.t_rawq.c_tp_cpu 01c 4
structure tty * tty.t_rawq.c_tp_iop 020 4
caractère non signé * tty.t_rawq.c_buf_cpu 024 4
caractère non signé * tty.t_rawq.c_buf_iop 028 4
structure 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
structure tty * tty.t_canq.c_tp_cpu 03c 4
structure tty * tty.t_canq.c_tp_iop 040 4
caractère non signé * tty.t_canq.c_buf_cpu 044 4
caractère non signé * tty.t_canq.c_buf_iop 048 4
structure 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
structure tty * tty.t_outq.c_tp_cpu 05c 4
structure tty * tty.t_outq.c_tp_iop 060 4
caractère non signé * tty.t_outq.c_buf_cpu 064 4
caractère non signé * 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
fil de structure * tty.t_rsel 07c 4

et ainsi de suite

En fait, cela a été généré par un ensemble particulier d'options. Vous pouvez contrôler le
formatage de chaque colonne, que vous préfériez large ou gras, hexadécimal ou décimal, des zéros non significatifs
ou peu importe.

Tout ce dont vous avez besoin pour pouvoir l'utiliser est un compilateur C qui génère des stabs de style BSD/GCC.
Les -g sur les compilateurs BSD natifs et GCC devrait l'obtenir pour vous.

Pour en savoir plus, tapez simplement une fausse option, comme -\ ?, et un long message d'utilisation sera
à condition de. Il y a pas mal de possibilités.

Si vous n'êtes qu'un programmeur C, c'est la fin du message pour vous. Vous pouvez quitter
maintenant, et si vous le souhaitez, enregistrez la source et exécutez-la quand vous en avez envie. Ou
pas.

Mais si vous êtes un programmeur perl, alors pour vous j'ai quelque chose de bien plus merveilleux que
juste une imprimante offset de structure.

Vous voyez, si vous appelez pstruct par son autre incybernation, c2ph, vous avez un générateur de code
qui traduit le code C en code perl ! Eh bien, la structure et les déclarations syndicales au moins,
mais c'est un peu.

Avant ce point, toute personne programmant en perl qui voulait interagir avec des programmes C,
comme le noyau, a été forcé de deviner les dispositions des structures C, puis de câbler
ces derniers dans son programme. Bien sûr, lorsque vous avez présenté votre programme merveilleusement conçu à un
système où la structure sgtty a été présentée différemment, votre programme est tombé en panne. Qui est un
la honte.

Nous avons eu le traducteur h2ph de Larry, qui a aidé, mais cela ne fonctionne que sur les symboles cpp, pas
real C, qui était également très nécessaire. Ce que je vous propose est une manière symbolique d'aborder
toutes les structures C. Je les ai formulés en termes de packages et de fonctions. Prendre en compte
programme suivant :

#! / usr / local / bin / perl

requiert « syscall.ph » ;
nécessite 'sys/time.ph';
requiert « 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 "vous avez utilisé %8.3fs+%8.3fu secondes.\n", $utime, $stime ;

Comme vous le voyez, le nom du package est le nom de la structure. Les champs normaux sont juste
leurs propres noms. De plus, les fonctions d'accès suivantes sont fournies pour votre commodité :

struct Ceci ne prend aucun argument, et est simplement le nombre de
éléments de la structure. Vous utiliseriez ceci pour l'indexation
en tableaux de structures, peut-être comme ceci

$usec = $u[ &user'u_timer
+ (&ITIMER_VIRTUAL * &itimerval'struct)
+ &timerval'it_value
+ &timeval'tv_usec
];

sizeof Renvoie les octets de la structure, ou le membre si
vous lui passez un argument, comme

&rusage'sizeof(&rusage'ru_utime)

typedef C'est la définition du format perl pour passer à pack et
déballer. Si vous demandez le typedef d'un rien, vous obtenez
toute la structure, sinon vous obtenez celle du membre
vous demandez pour. Le rembourrage est pris en charge, tout comme la magie de
garantir qu'une union est décompressée dans tous ses alias.
Les champs de bits ne sont cependant pas encore tout à fait pris en charge.

offsetof Cette fonction est le décalage d'octet dans le tableau de cette
membre. Vous pouvez utiliser ceci pour l'indexation directement
dans la structure compressée avec vec() si vous êtes trop paresseux
pour le déballer.

typeof A ne pas confondre avec la fonction accesseur typedef, cette
on retourne le type C de ce champ. Cela permettrait
vous d'imprimer une jolie impression structurée de certains
structure sans rien en savoir au préalable.
Aucun argument pour celui-ci n'est un noop. Un jour, je posterai un tel
quelque chose pour vider votre structure u pour vous.

La façon dont je vois cela utilisé est essentiellement la suivante :

% h2ph /usr/lib/perl/tmp.ph
% c2ph some_include_file.h >> /usr/lib/perl/tmp.ph
% d'installation

C'est un peu plus compliqué avec c2ph car il faut bien comprendre les inclusions. je ne peux pas savoir
ceci pour votre système, mais ce n'est généralement pas trop difficile.

Le code n'est pas joli comme je l'ai mentionné - je n'ai jamais pensé que ce serait un programme de 1000 lignes
quand j'ai commencé, ou je n'aurais peut-être pas commencé. :-) Mais j'aurais été moins cavalier dans la façon dont
les parties du programme communiquaient entre elles, etc. Cela aurait peut-être aussi aidé si
Je n'ai pas eu à deviner la composition des coups à la volée, puis à prendre en compte le micro
différences entre mon compilateur et gcc.

Quoi qu'il en soit, c'est ici. Devrait fonctionner sur perl v4 ou supérieur. Peut-être moins.

--à M

Utiliser c2ph en ligne en utilisant les services onworks.net


Serveurs et postes de travail gratuits

Télécharger des applications Windows et Linux

Commandes Linux

Ad