OVH Cloud OVH Cloud

Petites questions sur g++

6 réponses
Avatar
Frouin Jean-Michel
Bonjour, j'aimerai bien que quelque m'aide pour une recherche.
Je ne sais pas où commencer.

Je suis en train d'implémenter un système d'injection de code en
assembleur dans un fichier c++ compilé par g++ (a l'aide de la commande
: g++ -S -o monfichier.s monfichier.cpp)

La dessus mon programme insert du code source assembleur dans le fichier
: monfichier.s

Mais voila pour trouver où l'injecter j'ai fais une rapide analyse et
conclus que je devais injecter un bout de code avant le leave d'une
fonction qui contient _ZN et Ev.

J'ai calculer a peut pres mon prologue et y insère aussi du code de
facon a ajouter du code en entrée et en sortie de toutes les méthodes de
mes classes a surveiller (le code injecté me permet d'insérer du code
pour un programme d'analyse des performances : nombre de fois que la
fonction est appelée, son temps d'exécution ...)

Donc voila ma question :
Ou puis je trouver de la doc sur la convention qui traduit une méthode :
CDummy::dummy(int, ...) en _ZN ... Ev ?
Et si c'est possible de la doc pour comprendre comment le prologue est
réellement écris (moi j'ai 3 lignes de prologue grosso modo sur mes
classes de test, avec entre autre le positionnement de la pile pour les
paramètres de la méthode, mais c des méthodes toutes simples).

Bon voila pour le moment j'arrive a injecter du code dans une classe bob
qui affiche : "bob", d'une classe dummy qui affiche "dummy" et donc au
lieu du :
bob
de la classe bob de base, j'ai un joli :
bob
dummy
:) mais voila je sais que sur un exemple plus complet cela ne marche pas
:) (j'ai essayé) donc un petit coup de main si qqun sais :)

Merci


__________________________________
Frouin Jean-Michel

http://www.oceaneds.com/snoogie/
http://www.sdatabase.org

6 réponses

Avatar
Fabien LE LEZ
On Thu, 01 Feb 2007 22:35:32 +0100, Frouin Jean-Michel
:

(le code injecté me permet d'insérer du code
pour un programme d'analyse des performances : nombre de fois que la
fonction est appelée, son temps d'exécution ...)


Tu n'aimes pas gprof ?

Avatar
Frouin Jean-Michel
On Thu, 01 Feb 2007 22:35:32 +0100, Frouin Jean-Michel
:

(le code injecté me permet d'insérer du code
pour un programme d'analyse des performances : nombre de fois que la
fonction est appelée, son temps d'exécution ...)


Tu n'aimes pas gprof ?

Sisi :) mais j'essaie d'apprendre a implémenter une injection de code :)

Je ne veux pas refaire la roue :) juste comprendre comment cela marche
et pour tester sur un cas complet j'ai utiliser un test d'analyse de
performance :) c juste un exemple :)
Merci

--
__________________________________
Frouin Jean-Michel

http://www.oceaneds.com/snoogie/
http://www.sdatabase.org


Avatar
Franck Branjonneau
Frouin Jean-Michel écrivait:

Je ne sais pas où commencer.

Je suis en train d'implémenter un système d'injection de code en
assembleur dans un fichier c++ compilé par g++ (a l'aide de la commande
: g++ -S -o monfichier.s monfichier.cpp)

La dessus mon programme insert du code source assembleur dans le fichier
: monfichier.s


Quelle idée !!!

Donc voila ma question :
Ou puis je trouver de la doc sur la convention qui traduit une méthode :
CDummy::dummy(int, ...) en _ZN ... Ev ?


Le site de GCC ? <http:://gcc.gnu.org/>
En particulier ce qui concerne l'ABI, le « mangling » ?
codesourcery.com et l'ABI de l'Itanium ?
c++filt ?
Le source de c++filt (et de GCC) ?

Et si c'est possible de la doc pour comprendre comment le prologue est
réellement écris


Là, définitivement, il faut utiliser le source de GCC. Travailler sur
l'assembleur généré est un mauvaise idée...

--
Franck Branjonneau

Avatar
Frouin Jean-Michel
Frouin Jean-Michel écrivait:

Je ne sais pas où commencer.

Je suis en train d'implémenter un système d'injection de code en
assembleur dans un fichier c++ compilé par g++ (a l'aide de la commande
: g++ -S -o monfichier.s monfichier.cpp)

La dessus mon programme insert du code source assembleur dans le fichier
: monfichier.s


Quelle idée !!!

Donc voila ma question :
Ou puis je trouver de la doc sur la convention qui traduit une méthode :
CDummy::dummy(int, ...) en _ZN ... Ev ?


Le site de GCC ? <http:://gcc.gnu.org/>
En particulier ce qui concerne l'ABI, le « mangling » ?
codesourcery.com et l'ABI de l'Itanium ?
c++filt ?
Le source de c++filt (et de GCC) ?
Merci je vais googler un peu de ce coté.


Et si c'est possible de la doc pour comprendre comment le prologue est
réellement écris


Là, définitivement, il faut utiliser le source de GCC. Travailler sur
l'assembleur généré est un mauvaise idée...

Pourquoi est ce une si mauvaise idée de travailler sur le code assembleur ?


Merci encore,

--
__________________________________
Frouin Jean-Michel

http://www.oceaneds.com/snoogie/
http://www.sdatabase.org


Avatar
Franck Branjonneau
Frouin Jean-Michel écrivait:


Travailler sur l'assembleur généré est un mauvaise idée...

Pourquoi est ce une si mauvaise idée de travailler sur le code

assembleur ?


C'est un travail éphémère : tu travailles pour une version de ton
compilateur sur une plate-forme.

C'est un travail difficile : comment instrumentes-tu

inline int inc(int const x) { return x+1; }

int main() { return inc(0); }

?

Enfin, et surtout, quel problème tentes-tu de résoudre qui *nécessite*
de travailler sur de l'assembleur ?

--
Franck Branjonneau


Avatar
Franck Branjonneau
Frouin Jean-Michel écrivait:


Enfin, et surtout, quel problème tentes-tu de résoudre qui *nécessite*
de travailler sur de l'assembleur ?



Tout d'abord merci pour tes réponses.
Mais maintenant supposons que je doive implémenter un système qui
puisse analyser les performances de n'importe lequel de mes codes
sources d'applications.

Je veux que ce code puisse compter et garder en mémoire le temps que
prendra chaque fonction à s'éxécuter.
Pour le moment deux fonctions :StartTiming(...) et EndTiming(...) font
cela que je place au début et à la fin de mes méthodes dans mes
classes.
De plus pour le moment ces deux fonctions sont en fait des méthodes
d'une classe nommée PerformanceAnalysis.

D'ailleurs au passage, est ce une bonne idée d'utiliser une classe ou
alors des fonctions standard du C sont préférées ?


Les deux sont des bonnes idées.

Je présume qu'un appel a une fonction standard du C est plus facile à
insérer en code assembleur (même si j'ai bien compris que cela n'est
pas la bonne méthode ;) qu'un appel à une instance d'une classe.


C'est de la cuisine interne au compilateur donc... je ne sais pas ;-)
Mais un appel de fonction membre (non virtuelle) peut-être vu comme un
un appel de fonction non-membre avec un paramètre caché (this)
supplémentaire...

Pour un exemple d'infrastructure de test :
<URL:http://www.research.att.com/~bs/wrap_code.cpp>.

Ensuite, si je veux automatiser cela, soit j'injecte les appels
directement dans l'assembleur (ok j'ai compris c pas bien), soit
j'écris un petit logiciel qui l'insèrera pour moi dans le code source
C++ et le sauvegardera sous un autre nom avant d'être compilé.

Si on oublie tous les problèmes liés au fait de savoir où et quand
bien placer les appels de Start et EndTiming, est ce la bonne méthode
?


Utiliser un profiler (tel que gprof) n'est-il pas plus simple ?
(Sinon oui ;-) )

Voila en fait j'aimerai apprendre à faire une telle chose par moi même
et surtout à comprendre comment cela fonctionne.


Les profilers coopèrent avec les compilateurs.

Si tu t'intéresses au comportement d'un application, tu utilises un
profiler. Si tu veux comparer deux codes réalisant la même fonction tu
écris du code ad hoc (éventuellement avec une infrastructure telle que
celle donnée en lien). Mais avec les architectures récentes :
« Ca montre une fois de plus que c'est quasi impossible de predire
l'efficacite d'un code local... », Laurent Deniau in
<news:eq7gaq$kg9$.

--
Franck Branjonneau