GNU/Linux >> Tutoriels Linux >  >> Linux

Comment l'éditeur de liens/chargeur dynamique lui-même peut-il être lié dynamiquement, comme indiqué par `file` ?

  1. Oui, il se lie quand il s'initialise. Techniquement, l'éditeur de liens dynamique n'a pas besoin de résolution d'objet et de relocalisation pour lui-même, car il est entièrement résolu tel quel, mais il définit des symboles et il doit en prendre soin lors de la résolution du binaire qu'il "interprète", et ces symboles sont mis à jour pour pointer vers leurs implémentations dans les bibliothèques chargées. En particulier, cela affecte malloc - l'éditeur de liens a une version minimale intégrée, avec le symbole correspondant, mais qui est remplacée par la version de la bibliothèque C une fois chargée et déplacée (ou même par une version interposée s'il y en a une), en prenant soin de s'assurer que cela ne cela n'arrive pas à un point où cela pourrait casser l'éditeur de liens.

    Les détails sanglants sont en rtld.c , dans le dl_main fonction.

    Notez cependant que ld.so n'a pas de dépendances externes. Vous pouvez voir les symboles impliqués avec nm -D; aucun d'entre eux n'est indéfini.

  2. La page de manuel ne fait référence qu'aux entrées directement sous /lib , c'est-à-dire /lib/ld.so (l'éditeur de liens dynamique libc 5, qui prend en charge a.out ) et /lib*/ld-linux*.so* (l'éditeur de liens dynamique libc 6, qui prend en charge ELF). La page de manuel est très spécifique, et ld.so n'est pas ld-2.28.so .

    L'éditeur de liens dynamique trouvé sur la grande majorité des systèmes actuels n'inclut pas a.out soutien.

file et ldd rapportent des choses différentes pour l'éditeur de liens dynamique car ils ont des définitions différentes de ce qui constitue un binaire lié statiquement. Pour ldd , un binaire est lié statiquement s'il n'a pas de DT_NEEDED symboles, c'est-à-dire pas de symboles indéfinis. Pour file , un binaire ELF est lié statiquement s'il n'a pas de PT_DYNAMIC section (cela changera dans la version file suivant 5.37 ; il utilise maintenant la présence d'un PT_INTERP section comme indicateur d'un binaire lié dynamiquement, qui correspond au commentaire dans le code).

L'éditeur de liens dynamique de la bibliothèque GNU C n'a pas de DT_NEEDED symboles, mais il a un PT_DYNAMIC section (car il s'agit techniquement d'une bibliothèque partagée). En conséquence, ldd (qui est l'éditeur de liens dynamique) indique qu'il est lié statiquement, mais file indique qu'il est lié dynamiquement. Il n'a pas de PT_INTERP section, donc la prochaine version de file indiquera également qu'il est lié de manière statique.

$ ldd /lib64/ld-linux-x86-64.so.2
        statically linked

$ file $(readlink /lib64/ld-linux-x86-64.so.2)
/lib/x86_64-linux-gnu/ld-2.28.so: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=f25dfd7b95be4ba386fd71080accae8c0732b711, stripped

(avec file 5.35)

$ file $(readlink /lib64/ld-linux-x86-64.so.2)
/lib/x86_64-linux-gnu/ld-2.28.so: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), statically linked, BuildID[sha1]=f25dfd7b95be4ba386fd71080accae8c0732b711, stripped

(avec la version actuellement en développement de file ).


Linux
  1. Comment pouvez-vous déterminer les versions installées des bibliothèques glibc ?

  2. Comment puis-je rappeler l'argument de la commande bash précédente ?

  3. Comment puis-je voir la taille des fichiers et des répertoires sous Linux ?

  4. Comment puis-je masquer la barre d'outils dans Emacs de manière persistante ?

  5. Comment pixelliser tout le texte d'un PDF ?

À quoi se réfère l'interpréteur signalé par `file` ?

Comment installer le chargeur IonCube sur Ubuntu Linux

Comment puis-je connaître le chemin absolu d'un processus en cours d'exécution ?

Comment puis-je modifier le $PATH sous Linux ?

Comment puis-je trouver le fichier le plus ancien dans une arborescence de répertoires

Comment puis-je surveiller la longueur de la file d'attente d'acceptation ?