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

Administration système Discussion :

Chargement des .so


Sujet :

Administration système

  1. #1
    xwz
    xwz est déconnecté
    Membre du Club
    Profil pro
    Analyste programmeur
    Inscrit en
    Décembre 2005
    Messages
    48
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Analyste programmeur

    Informations forums :
    Inscription : Décembre 2005
    Messages : 48
    Points : 63
    Points
    63
    Par défaut Chargement des .so
    Bonsoir à tous,

    Je ne savais pas trop où poster la question, alors je le met dans adminsys. Si vous estimez que la question doit être déplacée, n'hésitez pas, et désolé d'avoir posté au mauvais endroit.

    Je voudrais comprendre le fonctionnement des bibliothèques partagées sous Linux. En gros, si j'ai tout bien compris, quand on utilise les fonctions dlload/dlsym/... on doit faire le boulot du linker (et de ld.so), à savoir référencer les fonctions à utiliser. Ma question étant, comment sont chargées les bibliothèques avec ld.so pour que l'OS arrive à faire la résolution des symboles à la "volée". Avec strace j'ai compris qu'il lisait le reader du .so et que mprotect et mmap étaient utilisés pour réinterpréter le binaire, mais quelles sont les données qui sont transmisent à ces deux fonctions ? quels blocs sont utilisés ? Avez vous un lien/livre qui décrirait toutes la procédure et/ou le fonctionnement détaillé ? J'ai cherché mais rien trouvé de bien concluant.

    Merci d'avance,

    X.

  2. #2
    Modérateur
    Avatar de jlliagre
    Homme Profil pro
    Ingénieur support avancé & développement
    Inscrit en
    Juin 2007
    Messages
    2 695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur support avancé & développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 695
    Points : 7 882
    Points
    7 882
    Par défaut
    La liste des bibliothèques partagées à charger se trouve dans la section dynamique des en-têtes privés des fichiers exécutables qui sont au format ELF sous Unix et Linux et beaucoup d'autres systèmes d'exploitation.

    Tu peux les afficher avec la commande

    La commande ldd permet d'afficher plus de dépendances car elle analyse récursivement les bibliothèques trouvées.
    ɹǝsn *sıɹɐlos*

  3. #3
    xwz
    xwz est déconnecté
    Membre du Club
    Profil pro
    Analyste programmeur
    Inscrit en
    Décembre 2005
    Messages
    48
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Analyste programmeur

    Informations forums :
    Inscription : Décembre 2005
    Messages : 48
    Points : 63
    Points
    63
    Par défaut
    Bonjour,

    Oui, je connais la commande objdump, readelf, nm, ... mais ma question était plus coté fonctionnement bas niveau du chargement. Si par exemple moi je voulais faire cette étape à la main, il me faudrait faire des read, des mmap et mprotect, mais quelles sont les données à fournir à ces deux dernières fonctions ?

    Par exemple, avec strace sur une petite app qui charge une bibliothèque HelloWorld, j'obtiens :

    open("../lib-build/libHelloWorld.so", O_RDONLY|O_CLOEXEC) = 3
    read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\200\10\0\0\0\0\0\0"..., 832) = 832
    fstat(3, {st_mode=S_IFREG|0755, st_size=8072, ...}) = 0
    getcwd("/home/xwz/dev/tests/protect/app", 128) = 32
    mmap(NULL, 2101336, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fbb5aefa000
    mprotect(0x7fbb5aefb000, 2093056, PROT_NONE) = 0
    mmap(0x7fbb5b0fa000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0) = 0x7fbb5b0fa000
    close(3) = 0
    là on peut voir qu'un nouvel mmap est exécuté avec NULL et une taille de 2101336 et qu'elle renvoie : 0x7fbb5aefa000. Déjà, pourquoi une taille de 2101336 ?
    ensuite, l'adresse du mprtect sort d'où ? Visiblement, c'est l'adresse retournée par mmap + 4096 (le pagesize), mais pourquoi un offset de 4096 là dessus ?

    Et je suppose que dans le strace il manque des étapes, par exemple la copy du binaire du .so dans la zone mémoire du mmap ?

    Merci.

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


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

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 858
    Points : 218 577
    Points
    218 577
    Billets dans le blog
    120
    Par défaut
    Sachant qu'il y a un fstat avant le mmap, je dirais : la taille du SO, afin de pouvoir charger la SO à travers le segment mémoire créé avec mmap. Mais en effet, il y a pas mal de chose intéressante, surtout qu'il ne faut pas oublier qu'il y a des mécanismes de protection (non-déterminisme d'où sera chargée la bibliothèque, fermeture en écriture du segment...).
    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.

  5. #5
    xwz
    xwz est déconnecté
    Membre du Club
    Profil pro
    Analyste programmeur
    Inscrit en
    Décembre 2005
    Messages
    48
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Analyste programmeur

    Informations forums :
    Inscription : Décembre 2005
    Messages : 48
    Points : 63
    Points
    63
    Par défaut
    Le .so fait 8072o, ce qui pourrait expliquer le 8192 (première puissance de 2 au dessus de 8072, je ne sais meme pas si c'est lié), mais pas les autres chiffres. C'est pourquoi j'aimerais trouver autre chose que les codes sources, parce que pour avoir regardé, c'est pas le code le plus simple à comprendre vu le nombre d'étapes et de vérifications.

  6. #6
    Modérateur
    Avatar de jlliagre
    Homme Profil pro
    Ingénieur support avancé & développement
    Inscrit en
    Juin 2007
    Messages
    2 695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur support avancé & développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 695
    Points : 7 882
    Points
    7 882
    Par défaut
    Citation Envoyé par xwz Voir le message
    Oui, je connais la commande objdump, readelf, nm, ... mais ma question était plus coté fonctionnement bas niveau du chargement. Si par exemple moi je voulais faire cette étape à la main, il me faudrait faire des read, des mmap et mprotect, mais quelles sont les données à fournir à ces deux dernières fonctions ?
    J'ai bien compris la question et la réponse est toujours celle que j'ai déjà fourni:

    La liste des bibliothèques partagées à charger se trouve dans la section dynamique des en-têtes privés des fichiers exécutables

    L'approche consistant à vouloir faire du reverse-engineering en observant via strace ce que fait un exécutable est vaine. La mécanique est complexe mais tout est documenté et open-source.

    Je te conseille plutôt d'analyser le format ELF et de regarder ce que font ldd et ld-linux.so à partir de leur code source.

    Si tu n'arrive pas à trouver ton compte avec le code source, ce sera encore moins facile sans ...
    ɹǝsn *sıɹɐlos*

  7. #7
    xwz
    xwz est déconnecté
    Membre du Club
    Profil pro
    Analyste programmeur
    Inscrit en
    Décembre 2005
    Messages
    48
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Analyste programmeur

    Informations forums :
    Inscription : Décembre 2005
    Messages : 48
    Points : 63
    Points
    63
    Par défaut
    Citation Envoyé par jlliagre Voir le message
    La mécanique est complexe mais tout est documenté et open-source.
    .
    Je sais que tout est open-source et complexe. Pour le coté documenté, c'est justement ce que je cherche, mais je n'ai pas encore trouvé de documents (sites/livres) qui repondent à mes interrogations, donc si tu as ça dans un coin, je suis preneur.

  8. #8
    Modérateur
    Avatar de jlliagre
    Homme Profil pro
    Ingénieur support avancé & développement
    Inscrit en
    Juin 2007
    Messages
    2 695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur support avancé & développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 695
    Points : 7 882
    Points
    7 882
    Par défaut
    Avec quel objectif souhaites-tu comprendre comment fonctionne le chargeur de bibliothèques partagées ?
    ɹǝsn *sıɹɐlos*

  9. #9
    xwz
    xwz est déconnecté
    Membre du Club
    Profil pro
    Analyste programmeur
    Inscrit en
    Décembre 2005
    Messages
    48
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Analyste programmeur

    Informations forums :
    Inscription : Décembre 2005
    Messages : 48
    Points : 63
    Points
    63
    Par défaut
    Dans l'absolue, faire un mini ld-linux.so à ma sauce comme exercice afin de comprendre en détail le fonctionnement et voir s'il est possible par exemple de charger un .so depuis une ressource c++ (tout le binaire du .so dans un header généré par xxd) sans faire de compilation statique. Oui, ça peut sembler étrange voire être un non-sens comme idée, mais j'aimerais le faire quand même.

  10. #10
    Modérateur
    Avatar de jlliagre
    Homme Profil pro
    Ingénieur support avancé & développement
    Inscrit en
    Juin 2007
    Messages
    2 695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur support avancé & développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 695
    Points : 7 882
    Points
    7 882
    Par défaut
    Ok, lit ce pdf, en particulier le chapitre 2 qui traite du chargement dynamique (PROGRAM LOADING AND DYNAMIC LINKING), mais il te faudra sûrement regarder aussi comment fait le vrai loader, peut-être en le traçant avec un débogueur.
    ɹǝsn *sıɹɐlos*

  11. #11
    xwz
    xwz est déconnecté
    Membre du Club
    Profil pro
    Analyste programmeur
    Inscrit en
    Décembre 2005
    Messages
    48
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Analyste programmeur

    Informations forums :
    Inscription : Décembre 2005
    Messages : 48
    Points : 63
    Points
    63
    Par défaut
    Ok, merci beaucoup, je vais regarder ça. Je pense qu'une fois que j'aurais la théorie, la lecture du code de ld-linux.so sera plus simple.

  12. #12
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    17 434
    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 : 17 434
    Points : 43 065
    Points
    43 065
    Par défaut
    Tu as tout ce qui faut dans la doc fournie par Jiliagre

    Le plus gros morceau concerne la relocation, regarder GOT/PLT. C'est complexe mais pas infaisable.

    J'avais bossé là-dessus, je vais voir si je retrouve des notes là-dessus.
    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

  13. #13
    xwz
    xwz est déconnecté
    Membre du Club
    Profil pro
    Analyste programmeur
    Inscrit en
    Décembre 2005
    Messages
    48
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Analyste programmeur

    Informations forums :
    Inscription : Décembre 2005
    Messages : 48
    Points : 63
    Points
    63
    Par défaut
    Oui, j'imagine que ce n'est pas si simple à faire, mais c'est un sujet que je trouve intéressant. Et d'ailleurs, merci de ne pas avoir porté de jugement sur le projet, quand j'ai posé sur différents salon IRC, j'ai eu les réponses "inutile", "nul", "aucun sens", etc. sans jamais avoir de réponse à mes questions !

    Je pense que je vais avoir pas mal de lecture avant de vraiment débuter, mais je pense que je vais beaucoup en apprendre !

    Bonne soirée.

    X.

Discussions similaires

  1. Nbr de chargement des fichiers des <link>
    Par durand2504 dans le forum Général Conception Web
    Réponses: 2
    Dernier message: 14/03/2006, 10h43
  2. Détecter la fin du chargement des images
    Par GregPeck dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 12/02/2006, 21h18
  3. [FLASH 8] Chargement des images d'un repertoire
    Par PrinceMaster77 dans le forum Flash
    Réponses: 1
    Dernier message: 18/01/2006, 20h30
  4. Chargement des drivers access via ODBC sous Qt 3
    Par Higestromm dans le forum Bases de données
    Réponses: 10
    Dernier message: 09/01/2006, 14h30
  5. Temps de chargement des applications .NET
    Par kamal101 dans le forum Visual Studio
    Réponses: 3
    Dernier message: 17/11/2005, 09h11

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