Considérez les dépendances des objets partagés de /bin/bash
, qui incluent /lib64/ld-linux-x86-64.so.2
(éditeur de liens dynamique / chargeur):
ldd /bin/bash
linux-vdso.so.1 (0x00007fffd0887000)
libtinfo.so.6 => /lib/x86_64-linux-gnu/libtinfo.so.6 (0x00007f57a04e3000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f57a04de000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f57a031d000)
/lib64/ld-linux-x86-64.so.2 (0x00007f57a0652000)
L'inspection /lib64/ld-linux-x86-64.so.2
montre qu'il s'agit d'un lien symbolique vers /lib/x86_64-linux-gnu/ld-2.28.so
:
ls -la /lib64/ld-linux-x86-64.so.2
lrwxrwxrwx 1 root root 32 May 1 19:24 /lib64/ld-linux-x86-64.so.2 -> /lib/x86_64-linux-gnu/ld-2.28.so
De plus, les file
rapports /lib/x86_64-linux-gnu/ld-2.28.so
à eux-mêmes sont liés dynamiquement:
file -L /lib64/ld-linux-x86-64.so.2
/lib64/ld-linux-x86-64.so.2: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=f25dfd7b95be4ba386fd71080accae8c0732b711, stripped
J'aimerais savoir:
- Comment le linker / loader (
/lib64/ld-linux-x86-64.so.2
) dynamiquement peut-il être lui-même lié dynamiquement? Se lie-t-il au moment de l'exécution? /lib/x86_64-linux-gnu/ld-2.28.so
est documenté pour gérer a.out binaries (man ld.so
), mais/bin/bash
est un exécutable ELF?
Le programme ld.so gère les binaires a.out, un format utilisé il y a longtemps; ld-linux.so * (/lib/ld-linux.so.1 pour libc5, /lib/ld-linux.so.2 pour glibc2) gère ELF, que tout le monde utilise depuis des années.
/lib/x86_64-linux-gnu/ld-2.28.so
, debian 10 buster)file
le commentaire erroné de comment il définit les binaires statiques et la réalité deld-2.28.so
... Le différenciateur estPT_DYNAMIC
.Réponses:
Oui, il se lie lorsqu'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, il est "interprété", 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 qu'elle est chargée et déplacée (ou même par une version interposée s'il y en a une), avec quelque soin prises pour s'assurer que cela ne se produit pas à un point où il pourrait briser l'éditeur de liens.Les détails sanglants sont dans
rtld.c
, dans ladl_main
fonction.Notez cependant qu'il
ld.so
n'a pas de dépendances externes. Vous pouvez voir les symboles impliqués dansnm -D
; aucun d'eux n'est indéfini.La page de manuel se réfère uniquement aux entrées directement sous
/lib
, c'est -à- dire/lib/ld.so
(l'éditeur de liens dynamique libc 5, qui prend en chargea.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 etld.so
ne l'est pasld-2.28.so
.L'éditeur de liens dynamique trouvé sur la grande majorité des systèmes actuels n'inclut pas de
a.out
support.file
etldd
signaler 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. Carldd
, un binaire est lié statiquement s'il n'a pas deDT_NEEDED
symboles, c'est-à - dire pas de symboles non définis. Pourfile
, un binaire ELF est lié statiquement s'il n'a pas dePT_DYNAMIC
section (cela changera dans la versionfile
5.37 suivante; il utilisePT_INTERP
maintenant la présence d'une section comme indicateur d'un binaire lié dynamiquement, qui correspond au commentaire dans le code).L'éditeur de liens dynamique de bibliothèque GNU C n'a pas de
DT_NEEDED
symboles, mais il a unePT_DYNAMIC
section (car il s'agit techniquement d'une bibliothèque partagée). Par conséquent,ldd
(qui est l'éditeur de liens dynamique) indique qu'il est lié statiquement, maisfile
indique qu'il est lié dynamiquement. Il n'a pas dePT_INTERP
section, donc la prochaine version defile
indiquera également qu'il est lié statiquement.(avec
file
5.35)(avec la version en cours de développement de
file
).la source
/lib*/ld-linux*.so*
ou d'un troisième éditeur de liens dynamiques?ldd
rapports de l'éditeur de liens dynamiques comme liés statiquement? Parce que sa liste de dépendances d'objets partagés est vide?/lib*/ld-linux*.so*
. J'ai spécifié l'origine de l'éditeur de liens dynamique car il existe d'autres implémentations disponibles pour Linux.Je soupçonne que le
file
programme a tort au sujet du lieur / chargeur dynamique étant lui-même lié dynamiquement. Leldd
programme n'est pas d'accord. Du moins pas sur mon système (Debian Stretch):man ld.so
lit également: "ld-linux.so * gère ELF" . Sur votre système (et le mien d'ailleurs), les deux sont des liens symboliques vers le même binaire que je déduis capable de gérer à la fois ELF et le (ancien obsolète) format a.out.la source