IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Chargement dynamique de code


Sujet :

C

  1. #1
    Membre confirmé
    Inscrit en
    Mai 2005
    Messages
    149
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 149
    Par défaut Chargement dynamique de code
    Bonjour,
    Voila j'ai un projet de C à faire qui consiste en une gestion de la mémoire.

    Celui ci touche à sa fin, mais une derniere partie consiste à "charger dynamiquement le code pour l'appliquer à des programmes déja compilés".

    Quelqu'un pourrait me dire comment faire cela?

    Merci

  2. #2
    Expert confirmé
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Par défaut
    Quel systeme?

    Tu veux une genre de dll en gros c'est ca?

  3. #3
    Membre confirmé
    Inscrit en
    Mai 2005
    Messages
    149
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 149
    Par défaut
    Sur Linux...

    Bah je ne sais pas trop en fait.
    C'est l'énoncé du projet et j'ai juste ça comme infos...

    Il me semble que je dois trouver un moyen pour qu'un programme comme celui ci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    #include <stdlib.h>
    int main() {
    int *p;
    p = (int*) malloc(4);
    return 0;
    }
    SI le programme a déjà été compilé, celui ci doit tout de meme faire un appel à la fonction malloc de ma bibliotheque et non à la fonction malloc de stdlib...

    Tu vois?

  4. #4
    Membre Expert
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Par défaut
    Sous linux c'est pas des dll mais des .so
    Par contre chais pas comment ça marche

  5. #5
    Membre confirmé
    Inscrit en
    Mai 2005
    Messages
    149
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 149
    Par défaut
    Moi non plus hélas lol

    Mais j'aimerai bien savoir.

    Merci pour l'info .so je vais continuer à chercher....

    Si quelqu'un sait, ou a un lien, je suis preneur

  6. #6
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Ylias
    Voila j'ai un projet de C à faire qui consiste en une gestion de la mémoire.

    Celui ci touche à sa fin, mais une derniere partie consiste à "charger dynamiquement le code pour l'appliquer à des programmes déja compilés".

    Quelqu'un pourrait me dire comment faire cela?
    On ne peut pas faire ça en C standard. Il faut invoquer le 'loader' qui est une fonction de ton système.

    Détails sur le forum consacré à ton système. Rien à voir avec le langage C.

  7. #7
    Membre chevronné Avatar de Jack_serious
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    350
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 350
    Par défaut
    Citation Envoyé par Ylias
    Moi non plus hélas lol

    Mais j'aimerai bien savoir.

    Merci pour l'info .so je vais continuer à chercher....

    Si quelqu'un sait, ou a un lien, je suis preneur
    Sous Linux avec bash pour utiliser un malloc de ta sauce a la place du malloc standard, tu peux faire comme ca.

    Supposons que tu ai un fichier malloc.c, un free.c, un realloc.c, et un calloc.c.
    (il vaut mieux toutes les refaires des fois qu'un programme en appelle une ou l'autre.).

    1_ Tu compiles ta librairie dynamique.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    gcc -o mymalloc.so -shared *.c
    Sans oublier les options de compilation (-W -Wall -pedantic -ansi) mais la c'est pour l'exemple.

    2_ Tu precise au systeme ou aller chercher les fonctions.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    export LD_PRELOAD /home/toi/prog/c/mymalloc.so
    Attention.

    Ce type de manipulation est completement dependante du systeme sur lequel tu travailles.
    Et la commande a utiliser depend de ton shell.
    Donc il faut que tu cherches comment preloader une librairie dynamique sur ton systeme.

    Tu es sur un linux, avec un shell de ton choix, donc la manipulation ne sera pas la meme.

    Voici un exemple sur linux avec bash, qui illustre le principe :

    Deux fichiers :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    $ cat fork.c
    unsigned int    fork()
    {
      return(0);
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    $ cat test.c
    #include <stdio.h>
    #include <stdlib.h>
     
    int             main(int argc, char **argv)
    {
      unsigned int result;
     
      result = fork();
      printf("fork a renvoye %d\n", result);
      return (EXIT_SUCCESS);
    }
    Normalement le programme fait ca:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     ~/c/dvp$ gcc -o test test.c
     ~/c/dvp$ ./test
    fork a renvoye 25646
    fork a renvoye 0
    Je remplace fork par le mien, parce que je trouve plus sexy:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     ~/c/dvp$ gcc -shared -o fork.so fork.c
     ~/c/dvp$ export LD_PRELOAD='/home/jack/prog/c/dvp/fork.so
     ~/c/dvp$ ./test
    fork a renvoye 0
    Voila pour l'exemple.

    Apres il faut te documenter sur ton systeme. Pour savoir quelle variable d'envirronement il faut changer, et comment.
    Tu defini une variable avec export sous bash, avec setenv sous csh et affillies, etc...

    les variables peuvent changer de nom: LD_PRELOAD est le plus repandu mais il en existe d'autres. (_RLD_LIST, ...)

    Bonne chance.

  8. #8
    Membre confirmé
    Inscrit en
    Mai 2005
    Messages
    149
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 149
    Par défaut
    Merci à toi je vais chercher.
    Mais le C ça va pr moi mais Linux bof bof lol

    Pour la commande export
    Il me faut pas ajouter le fichier à la liste déja existante?
    Comme pr le path quoi...
    ça donnerait pas plutot
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    export LD_PRELOAD=$LD_PRELOAD:/home/jack/prog/c/dvp/fork.so
    ?

    Merci

  9. #9
    Membre chevronné Avatar de Jack_serious
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    350
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 350
    Par défaut
    Citation Envoyé par Ylias
    Merci à toi je vais chercher.
    Mais le C ça va pr moi mais Linux bof bof lol
    Why ?
    Citation Envoyé par Ylias
    Pour la commande export
    Il me faut pas ajouter le fichier à la liste déja existante?
    Comme pr le path quoi...
    ça donnerait pas plutot
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    export LD_PRELOAD=$LD_PRELOAD:/home/jack/prog/c/dvp/fork.so
    ?

    Merci
    Non.

    Normalement ton LD_PRELOAD est vide de base.
    Il n'est pas cense contenir quoi que ce soit. Donc pas besoin.

    Tente ca tu verras:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $ printenv LD_PRELOAD
    Tu verras c'est le desert.

  10. #10
    Membre confirmé
    Inscrit en
    Mai 2005
    Messages
    149
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 149
    Par défaut
    Oui en effet merci.

    j'ai testé avec un code bidon et ça marche.

    Seulement, je dois intégrer ça à un Makefile donc je suppose que je dois gérer le cas d'un shell bash et csh...

    Tu as une idée des grandes ligne du Makefile pour gérer ça

    Mon makefile actuelle donne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
     
    CC = gcc
    TARGET = test
    CFLAGS = -Wall -ansi -pedantic
     
     
    $(TARGET) : test.o libmonalloc.a
        $(CC) $(CFLAGS) -g -o $(TARGET) test.o -L. -lmonalloc -DMONALLOC
     
    test.o : test.c monalloc.h
        $(CC) $(CFLAGS) -g -c test.c -DMONALLOC
     
    monalloc.o : monalloc.c monalloc.h 
        $(CC) $(CFLAGS) -g -c monalloc.c
     
    gestionlog.o : gestionlog.c gestionlog.h
        $(CC) $(CFLAGS) -g -c gestionlog.c
     
    maillon.o : maillon.c maillon.h
        $(CC) $(CFLAGS) -g -c maillon.c
     
    libmonalloc.a : monalloc.o gestionlog.o maillon.o
        ar crs libmonalloc.a monalloc.o gestionlog.o maillon.o
     
     
    clean :
        rm -f *.o *.a test *~ *.log *.tgz
     
    archive :
        make clean
        tar zcf ProjetC.tgz *
    Je voudrais en fait soit avoir la possiblité de faire make static et me compiler la biblio comme ici ou alors faire make dyn par exemple et dans ce cas il compilera en dynamique la biblio et intégrera la var d'envionnement...

    Tu peux m'aider rapidement pr la gestino de deux cas car mes compétences se limitent au Makefile que j'ai fait au dessu...

    Merci par avance pr ton aide

  11. #11
    Membre Expert
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    CC = gcc
    TARGET = test
    CFLAGS = -Wall -ansi -pedantic
     
     
    $(TARGET) : test.o libmonalloc.a
        $(CC) $(CFLAGS) -g -o $(TARGET) test.o -L. -lmonalloc -DMONALLOC
     
    dyn : test.o dynlib.so
        $(CC) -o $(TARGET) test.o -DMONALLOC
     
     
    test.o : test.c monalloc.h
        $(CC) $(CFLAGS) -g -c test.c -DMONALLOC
     
    monalloc.o : monalloc.c monalloc.h 
        $(CC) $(CFLAGS) -g -c monalloc.c
     
    gestionlog.o : gestionlog.c gestionlog.h
        $(CC) $(CFLAGS) -g -c gestionlog.c
     
    maillon.o : maillon.c maillon.h
        $(CC) $(CFLAGS) -g -c maillon.c
     
    libmonalloc.a : monalloc.o gestionlog.o maillon.o
        ar crs libmonalloc.a monalloc.o gestionlog.o maillon.o
     
    #si toutefois j'ai bien compris comment ça marche
    dynlib.so : monalloc.o gestionlog.o maillon.o
        $(CC) -shared monalloc.o gestionlog.o maillon.o -o dynlib.so
     
     
    clean :
        rm -f *.o *.a test *~ *.log *.tgz
     
    archive :
        make clean
        tar zcf ProjetC.tgz *

  12. #12
    Membre chevronné Avatar de Jack_serious
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    350
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 350
    Par défaut
    That's it.

    Mais je suis pas fan de devoir taper une regle par .o.

    En ce qui me concerne j'aurais plus fait comme ca:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
     
    CC      = gcc
     
    TARGET  = test
     
    CFLAGS  = -Wall -W -ansi -pedantic -g3 -O2
     
    SRCS    = monalloc.c gestionlog.c maillon.c
     
    OBJS    = $(SRCS:.c=.o)
     
    $(TARGET) : test.o libmonalloc.a
        $(CC) $(CFLAGS) -g -o $(TARGET) test.o -L. -lmonalloc -DMONALLOC
     
    dyn : test.o dynlib.so
        $(CC) -o $(TARGET) test.o -DMONALLOC
     
     
    test.o : test.c monalloc.h
        $(CC) $(CFLAGS) -c test.c -DMONALLOC
     
    libmonalloc.a : $(OBJS)
        ar crs libmonalloc.a $(OBJS)
     
    dynlib.so : $(OBJS)
        $(CC) -shared $(OBJS) -o dynlib.so
     
    env     :
            export LD_PRELOAD='/home/truc/chemin/dynlib.so'
     
    clean :
        rm -f *.o *.a test *~ *.log *.tgz
     
    archive :
        make clean
        tar zcf ProjetC.tgz *

  13. #13
    Membre confirmé
    Inscrit en
    Mai 2005
    Messages
    149
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 149
    Par défaut
    Ok merci bien ça marche nickel...ou preque lol

    En fait sa compile bien, ça se lance bien seulement, mon malloc afifche théoriquement des messages d'erreurs à l'aide de printf en cas d'erreur par exemple.

    Cela fonctionnait en statique alors qu'en dynamique, le code fonctionne nickel mais les affichages ne se font pas...

    Merci pour votre aide.

  14. #14
    Membre confirmé
    Inscrit en
    Mai 2005
    Messages
    149
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 149
    Par défaut
    En fait ça ne marche pas...
    Sa me compile la biblio mais déja après avoir fait le make env
    Rien n'apparait pr set | grep LD_PRELOAD ...

    Je l'ajoute a la main mais toujours rien, le fichier test utilise le code de stdlib

  15. #15
    Membre chevronné Avatar de Jack_serious
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    350
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 350
    Par défaut
    Hehehehehe....

    Ca c'est un truc que tu peux chercher longtemps.

    Bon alors tu es en train de tester ton malloc...
    Donc tu remplace le malloc du systeme par le tien.
    Et ensuite tu lances de petits executables pour faire des tests, et comme tout bon codeur, tu met des messages de trace pendant les tests pour voir ce qui se passe.

    Et quand on met des commentaires, on utilise printf(). Normal... Tellement bien cette fonction.

    Helas, printf() utilise malloc(). Pas de bol. Donc si ton malloc() est foireux, tes printf() ne marchent pas.

    C'est con hein ?

    Solution: utilise des fonctions le plus basses possible, pour etre sur de ce qu'elle font. Et eviter les risques.

    Fais tes messages de trace avec fwrite(). Et encore... write() ca pourrait etre moins risque dans ce cas.

    En tout cas write() a ma connaissance n'utilise pas malloc(). fwrite() je n'en suis pas sur.

    Donc si tu veux afficher des adresses memoires, ou des entiers, tu va devoir tout recoder a la main.

  16. #16
    Membre confirmé
    Inscrit en
    Mai 2005
    Messages
    149
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 149
    Par défaut
    Je vais essayer!
    Est ce normal que après avoir fait le make env, la ligne n'apparaisse pas en tapant set?
    merci

  17. #17
    Membre chevronné Avatar de Jack_serious
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    350
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 350
    Par défaut
    set n'affiche pas les variables d'envirronement.

    Essaie de taper
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $ printenv LD_PRELOAD

  18. #18
    Membre confirmé
    Inscrit en
    Mai 2005
    Messages
    149
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 149
    Par défaut
    Sa ne donne rien ...

    JJ'ai fait le export à la main après avoir fait la compilation dynamique...

    Mais en fait, ça ne marche pas, il utilise tjs la fonction malloc de stdlib...

  19. #19
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Ylias
    Sa ne donne rien ...

    JJ'ai fait le export à la main après avoir fait la compilation dynamique...

    Mais en fait, ça ne marche pas, il utilise tjs la fonction malloc de stdlib...
    Une autre stratégie...

    http://emmanuel-delahaye.developpez.com/clib.htm
    Module SYSALLOC

  20. #20
    Membre confirmé
    Inscrit en
    Mai 2005
    Messages
    149
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 149
    Par défaut
    Je comprends le rapport?

Discussions similaires

  1. Chargement dynamique de code
    Par pouic06 dans le forum jQuery
    Réponses: 1
    Dernier message: 11/12/2013, 11h37
  2. [jar]chargement dynamique.
    Par Teddy-htk dans le forum API standards et tierces
    Réponses: 10
    Dernier message: 27/04/2006, 15h19
  3. Problème mémoire avec une dll par chargement dynamique
    Par widze19 dans le forum C++Builder
    Réponses: 6
    Dernier message: 15/12/2003, 13h20
  4. Dll a chargement dynamique
    Par delire8 dans le forum C++Builder
    Réponses: 7
    Dernier message: 05/06/2003, 22h47
  5. Chargement dynamique de DLL sous Unix
    Par Willou dans le forum Autres éditeurs
    Réponses: 7
    Dernier message: 18/12/2002, 18h25

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo