2011-08-06 6 views
4

Mon code est en test.c:Les bibliothèques qui sont liés par défaut

int main(){ 
return 0; 
} 

Les bibliothèques partagées de façon dynamique l'exécutable compilé à partir dont il dépend sont:

$ gcc -o test test.c 
$ ldd test 
    linux-gate.so.1 => (0x00783000) 
    libc.so.6 => /lib/libc.so.6 (0x00935000) 
    /lib/ld-linux.so.2 (0x00ea5000) 
  1. Je me demandais ce que les rôles joués par les trois bibliothèques?
  2. À quelle bibliothèque appartient la fonction main? /lib/libc.so.6?
  3. À quelle bibliothèque appartient return? /lib/libc.so.6?
  4. Les trois bibliothèques sont-elles toutes dynamiquement liées par défaut par gcc?
  5. Comment puis-je savoir statiques bibliothèques avec lesquelles gcc se connecte par défaut?

Merci!

Répondre

2
  1. linux-gate.so est pas vraiment un lib partagé, mais une partie du noyau qui agit comme un système rapide et rend possible les appels. ld-linux.so est un morceau de code qui permet de charger d'autres bibliothèques partagées. libc.so est la bibliothèque C, contenant des fonctions standard telles que printf et strcpy.
  2. main n'appartient à aucune bibliothèque. Il appartient à votre programme, en ce sens que sa version assemblée est entièrement stockée dans le fichier binaire test.
  3. return n'est pas une fonction mais une construction de langage C.
  4. Non, il lie également libgcc, qui n'est apparemment pas une bibliothèque partagée sur votre système (ou il apparaîtrait) et du code de démarrage. g++ serait en outre lier dans libstdc++.so (la bibliothèque standard C++) et libm.so (la partie mathématique de la bibliothèque standard C).
+0

Merci! Les trois bibliothèques sont-elles toutes liées par défaut par gcc? – Tim

+0

@Tim: ajouté cela à la réponse. –

+0

(1) Les trois bibliothèques sont-elles toutes ** dynamiquement ** reliées par défaut par gcc? (2) Comment puis-je connaître les bibliothèques statiques auxquelles gcc se connecte par défaut? – Tim

1

linux-gate est une bibliothèque virtuelle qui fournit un accès aux fonctions du système. Son nom complet est l'objet partagé dynamique virtuel Linux. Il est utilisé par libc.

libc est l'heure d'exécution C. C'est ce qui appelle en fait main() pour vous. (Il est possible de le contourner si vous n'utilisez aucune fonction C.)

ld-linux est l'éditeur de liens dynamique qui sait comment charger et appeler le temps d'exécution C pour vous.

main vit dans test.o, pas dans une bibliothèque.

return est un mot-clé, pas une fonction. Il ordonne au compilateur d'émettre du code pour que la fonction renvoie le contrôle à son appelant.

2
  1. linux-gate est un objet partagé virtuel qui agit comme une connexion au système appelle dans le noyau. libc est la glibc, qui fournit des fonctions telles que printf() et ainsi de suite. ld-linux est le chargeur de la glibc, qui permet le chargement d'autres objets partagés.

  2. main() appartient à votre code. Il est appelé par crt1.o qui est lié dans l'exécutable par gcc (bien, ld spécifiquement).

  3. returnreturnreturn n'est pas une fonction mais plutôt une construction de langage, donc gcc le transforme directement en code contenu dans le fichier objet (et éventuellement exécutable). En passant, la valeur renvoyée par main() est capturée par crt1.o et transformée en un code de résultat de programme.

+0

Merci! Les trois bibliothèques sont-elles toutes liées par défaut par gcc? – Tim

+0

Est-ce que crt1.o est une bibliothèque? Si oui, une bibliothèque partagée dynamiquement ou une bibliothèque statique? – Tim

+0

En mode C, ce sont les bibliothèques qui sont liées dynamiquement. D'autres langues peuvent ajouter d'autres bibliothèques (par exemple 'libstdC++'). –

1

ld-linux.so fournit la magie qui aide ldd de travail. libc.so fait partie de la bibliothèque d'exécution C. Entre autres choses, la bibliothèque d'exécution contient le point d'entrée réel qui appelle main. est fourni par votre code. return n'est pas une fonction, c'est un mot-clé dans le langage C.

Questions connexes