-
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 ledl_main
fonction.Notez cependant que
ld.so
n'a pas de dépendances externes. Vous pouvez voir les symboles impliqués avecnm -D
; aucun d'entre eux n'est indéfini. -
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 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
n'est pasld-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
).