web-dev-qa-db-fra.com

Que sont ld-linux.so.2 et linux-gate.so.1?

Quand je lance ldd program J'obtiens une sortie du formulaire

    linux-gate.so.1 =>  (0xb77ae000)
    libstdc++.so.6 => /lib/libstdc++.so.6 (0xb76bc000)
    libm.so.6 => /lib/libm.so.6 (0xb7691000)
    libgcc_s.so.1 => /lib/libgcc_s.so.1 (0xb7674000)
    libc.so.6 => /lib/libc.so.6 (0xb74c2000)
    /lib/ld-linux.so.2 (0xb77af000)

Pouvez-vous expliquer la sortie et la raison linux-gate.so.1 et ld-linux.so.2 afficher différemment des autres entrées? Quels sont leurs rôles?

29
e271p314

J'espère que vous ne posez pas de questions sur les entrées principales, qui indiquent que pour la bibliothèque demandée libm.so.6 il a été trouvé dans le fichier /lib/libm.so.6, par exemple, mais posent des questions sur les deux valeurs aberrantes.

Pourquoi sont-ils affichés différemment? pour linux-gate.so.1 c'est parce que ce n'est pas réellement un fichier sur le disque - il est exposé par le noyau comme mécanisme pour faire des appels système. Pour /lib/ld-linux.so.2 c'est parce que c'est l'interpréteur du programme qui est réellement utilisé pour exécuter l'application.

Il y a un assez bon entrée de blog décrivant le linux-gate.so, et il l'explique assez bien.

Pour /lib/ld-linux.so.2, vous devez comprendre un peu ce qui se passe lorsque vous lancez un binaire ELF. La réponse courte est que le gestionnaire du noyau pour ces types de binaires utilise ce fichier pour lancer l'application.

Le but principal de ce programme est de mapper le binaire en mémoire, de charger toutes les bibliothèques référencées dans le programme (par exemple le libm.so.6 mentionné précédemment), puis de transférer le contrôle à l'adresse de départ du binaire en cours d'exécution.

Ce programme est défini comme faisant partie de la structure du fichier ELF, dans la section INTERP de l'en-tête du programme. Pour les binaires linux 32 bits, il s'agit du nom typique de l'interpréteur 32 bits. Pour les binaires 64 bits, vous constaterez qu'il est généralement appelé ld-linux-x86_64.so.2 (pour les plates-formes 64 bits x86).

Vous pouvez déterminer vous-même ces informations à l'aide de readelf -l, et la section INTERP:

INTERP         0x0000000000000238 0x0000000000400238 0x0000000000400238
               0x000000000000001c 0x000000000000001c  R      1
    [Requesting program interpreter: /lib64/ld-linux-x86-64.so.2]
45
Petesh