Libraries statiques et dynamiques
Résolu/Fermé
A voir également:
- Librairie statique vs dynamique
- Tableau croisé dynamique - Guide
- Le nom du champ de tableau croisé dynamique n'est pas valide ✓ - Forum Excel
- Udp vs tcp - Guide
- Liste déroulante dynamique excel - Guide
- Honor magic 5 pro vs s23 ultra - Guide
5 réponses
kmf31
Messages postés
1564
Date d'inscription
mercredi 30 mars 2005
Statut
Contributeur
Dernière intervention
22 juin 2007
501
25 mai 2005 à 22:02
25 mai 2005 à 22:02
Imagine toi:
programe = A
bibliotheque statique = B
bibliotheque dynamique = C
Il y a deux facons de compiler le programe:
1) en dynamique: => l'executable ne contient que A mais il faut que C soit toujours installe sinon on ne peut pas utiliser le programme:
Alors programe = A mais ca depend du C qui doit etre installe dans le systeme. Si on copie A sur un autre systeme linux ou il n'y a pas C ca ne marche plus!
2) en statique: => l'executable contient A+B (plus precisement: A+(copie de B))=> grand fichier et ca va toujours marcher meme sur un autre systeme linux ou il n'y a ni B ni C. Apres compilation on peut meme effacer la copie initiale de la bibliotheque B et l'exectutable fonctionnera toujours (mais on ne pourras plus compiler de nouveaux programes).
Exemple:
Tu mets ca (par copier-coller) dans un fichier appele "hello.c". Apres tu compiles ca de deux facons:
1) en dynamique:
2) en statique:
Maintenant tu peux observer les choses suivantes:
------------------------------------------------------------------
1) Pour utiliser il n'y a pas de difference:
=> ca affiche: Hello
=> ca affiche aussi: Hello
2) Mais le fichier statique est beaucoup plus grand, verifie avec:
car ca contient la bibliotheque libc en dur (a l'interieur du fichier).
3) Maintenant tu verifies la dependence dynamique des bibliotheques:
=> affichage de:
libc.so.6 => /lib/libc.so.6 (0x40028000)
/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
ou similaire.
=> affichage de:
not a dynamic executable
(ou en francais). Ca veut dire "pas de l'executable dynamique" => ici ce n'est pas possible de verifier les dependences ce qui est logique car "hello_statique" n'est pas dynamique.
La raison pourquoi "hello_statique" est plus grand est que ca contient (l'equivalent de) /lib/libc.so.6 et /lib/ld-linux.so.2 dans son propre fichier. Par contre "hello_dynamique" est petit et il cherchera toujours les copies dynamiques dans le systeme.
4) Pour finir tu peux afficher le type des fichiers par:
=> affichage de:
hello_dynamique: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), for GNU/Linux 2.0.0, dynamically linked (uses shared libs), not stripped
hello_statique: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), for GNU/Linux 2.0.0, statically linked, not stripped
ou similaire. Peut-etre chez toi ca sera en francais. Ca signifie que "hello_dynamique" est un programe "dynamique utilisant de bibliotheques partagees" et "hello_statique" est un programe "statique".
En fait en statique c'est indivisible apres la compilation mais tu pourras toujours compiler un autre programe en utilisant la copie initiale de la bibliotheque statique (elle ne disparrait pas, elle est seulement copiee dans le programe statique).
J'espere qu'avec ca, ce sera claire!
programe = A
bibliotheque statique = B
bibliotheque dynamique = C
Il y a deux facons de compiler le programe:
1) en dynamique: => l'executable ne contient que A mais il faut que C soit toujours installe sinon on ne peut pas utiliser le programme:
Alors programe = A mais ca depend du C qui doit etre installe dans le systeme. Si on copie A sur un autre systeme linux ou il n'y a pas C ca ne marche plus!
2) en statique: => l'executable contient A+B (plus precisement: A+(copie de B))=> grand fichier et ca va toujours marcher meme sur un autre systeme linux ou il n'y a ni B ni C. Apres compilation on peut meme effacer la copie initiale de la bibliotheque B et l'exectutable fonctionnera toujours (mais on ne pourras plus compiler de nouveaux programes).
Exemple:
#include <stdio.h> int main(){ printf("Hello\n"); }
Tu mets ca (par copier-coller) dans un fichier appele "hello.c". Apres tu compiles ca de deux facons:
1) en dynamique:
gcc hello.c -o hello_dynamique
2) en statique:
gcc hello.c -static -o hello_statique
Maintenant tu peux observer les choses suivantes:
------------------------------------------------------------------
1) Pour utiliser il n'y a pas de difference:
./hello_dynamique
=> ca affiche: Hello
./hello_statique
=> ca affiche aussi: Hello
2) Mais le fichier statique est beaucoup plus grand, verifie avec:
ls -l hello_*
car ca contient la bibliotheque libc en dur (a l'interieur du fichier).
3) Maintenant tu verifies la dependence dynamique des bibliotheques:
ldd hello_dynamique
=> affichage de:
libc.so.6 => /lib/libc.so.6 (0x40028000)
/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
ou similaire.
ldd hello_statique
=> affichage de:
not a dynamic executable
(ou en francais). Ca veut dire "pas de l'executable dynamique" => ici ce n'est pas possible de verifier les dependences ce qui est logique car "hello_statique" n'est pas dynamique.
La raison pourquoi "hello_statique" est plus grand est que ca contient (l'equivalent de) /lib/libc.so.6 et /lib/ld-linux.so.2 dans son propre fichier. Par contre "hello_dynamique" est petit et il cherchera toujours les copies dynamiques dans le systeme.
4) Pour finir tu peux afficher le type des fichiers par:
file hello_*
=> affichage de:
hello_dynamique: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), for GNU/Linux 2.0.0, dynamically linked (uses shared libs), not stripped
hello_statique: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), for GNU/Linux 2.0.0, statically linked, not stripped
ou similaire. Peut-etre chez toi ca sera en francais. Ca signifie que "hello_dynamique" est un programe "dynamique utilisant de bibliotheques partagees" et "hello_statique" est un programe "statique".
En fait en statique c'est indivisible apres la compilation mais tu pourras toujours compiler un autre programe en utilisant la copie initiale de la bibliotheque statique (elle ne disparrait pas, elle est seulement copiee dans le programe statique).
J'espere qu'avec ca, ce sera claire!