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 :

Edition des liens : comment les symboles (fonctions) sont convertis en addresse ?


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Par défaut Edition des liens : comment les symboles (fonctions) sont convertis en addresse ?
    Bonsoir,

    mon titre n'est pas très clair. Je vais essayer de développer de manière plus claire.

    J'ai deux fichiers très simples :

    fichier1.c :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    #include <stdio.h>
     
    void fonction_bidon()
    {
    	printf("hello !");
    }
    main.c :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    extern void fonction_bidon();
     
    int main()
    {
    	fonction_bidon();
    	return 0;
    }
    Je compile les deux fichiers séparément. J'obtiens donc deux fichiers : main.o et fichier1.o

    J'en arrive à ma question. Mon fichier 'main.c' sait qu'il existe une 'fonction_bidon()' mais ne sait rien de plus à son sujet. Voici le code assembleur de 'main.o' que j'obtiens :
    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
     
    int main()
    {
       0:	55                     	push   ebp
       1:	89 e5                	mov    ebp,esp
       3:	83 e4 f0             	and    esp,0xfffffff0
       6:	e8 00 00 00 00       	call   b <main+0xb>
    			7: DISP32	__main
    	fonction_bidon();
       b:	e8 00 00 00 00       	call   10 <main+0x10>
    			c: DISP32	fonction_bidon()
    	return 0;
      10:	b8 00 00 00 00       	mov    eax,0x0
    }
      15:	c9                   	leave  
      16:	c3                   	ret    
      17:	90                   	nop
    Les deux CALL ont pour adresse relative 0 (E8 00 00 00 00), ce qui semble-t-il est la valeur donnée par défaut lorsque le compilateur ne connait pas l'adresse définitive. Je suppose que chaque fichier objet généré contient un tableau contenant toutes les adresses (par exemple, ici, les adresses 0x0007 et 0x000C) où la valeur devra être remplacée par la valeur définitive lors de la génération de l'exécutable.
    Comment et où sont stockées ces données dans ce fichier ? J'ai beau chercher dans les options de l'outil 'objdump', mais je ne trouve rien à ce sujet. L'ouverture du fichier dans un éditeur hexadécimal semble ne rien donner non plus : je vois bien le nom des symboles mais rien qui pourrait correspondre à des adresses où des valeurs devraient être remplacées. Dans le code assembleur généré, on aperçoit que 'objdump' sait déjà qu'aux adresses 0x0006 et 0x000B, il y a une instruction CALL qui lancera respectivement les fonctions '__main' et 'fonction_bidon()'.

    Merci.

  2. #2
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Par défaut
    Je comprend mal ta question. Les adresses seront résolues au linkage.
    S'il y a un appel de fonction mais pas de définition, l'édition des liens entre les objets sortira en erreur.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  3. #3
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Par défaut
    En réalité, ma question est très simple (si, si ! ), mais je peine à l'expliquer par écrit.

    J'ai bien compris que l'éditeur de liens résout les adresses, mais comment peut-il justement "deviner" à quelles positions (dans le code objet) ces adresses doivent être modifiées afin qu'elles correspondent aux fonctions désirées ? Car le code machine n'est qu'une succession d'instructions CPU et l'éditeur de liens n'est pas censé savoir ce qui doit être modifié dedans lors du linkage vu que ce n'est pas lui qui a compilé les codes sources.

    Je suppose donc qu'il existe une table dans le fichier objet qui lui fournit ces renseignements ? Une table du style :
    #1 : A la position 0x0007 -> remplacer les 4 octets afin que la valeur du CALL (instruction E8, déplacement relatif) corresponde à l'adresse de '__main'
    #2 : A la position 0x000C -> remplacer les 4 octets afin que la valeur du CALL (instruction E8, déplacement relatif) corresponde à l'adresse de 'fonction_bidon()'

    Je cherche simplement à savoir si ma supposition était bonne.

  4. #4
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    18 256
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 18 256
    Par défaut
    C'est géré par la table de relocation.

    Pour linux :
    Pour aller plus loin : rechercher le fonctionnement des sections .got et .plt du format ELF
    C'est très technique :
    https://www.segmentationfault.fr/lin...plt-got-ld-so/

    Pour Windows :
    Sous Windows, le concept est le même, mais s'appuie sur le format de fichier exécutable PE.
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur le P2V, mon article sur le cloud
    Consultez nos FAQ : Windows, Linux, Virtualisation

  5. #5
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Par défaut
    Merci beaucoup ! Je vais continuer mes recherches de ce côté.

  6. #6
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 119
    Billets dans le blog
    148
    Par défaut
    Bonjour,

    Le question est intéressante. Je n'ai pas de réponse, mais récemment, j'ai croisé des éléments pouvant y répondre. D'abord ici, mais surtout la documentation ici.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 0
    Dernier message: 05/10/2017, 18h51
  2. [Python 3.X] Import dans des modules? Comment faire et quelles sont les bonnes pratiques?
    Par Davjack dans le forum Général Python
    Réponses: 2
    Dernier message: 03/07/2014, 12h13
  3. Réponses: 8
    Dernier message: 21/12/2009, 15h16
  4. Problème d'édition des liens
    Par keyra dans le forum C
    Réponses: 9
    Dernier message: 30/04/2006, 12h48
  5. Edition des liens croisée
    Par Matthieu Brucher dans le forum Windows
    Réponses: 3
    Dernier message: 22/03/2006, 00h08

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