Concernant la liaison de bibliothèques statiques et partagées en C

#include  int main() { printf("%s","Hello world"); return 0; } $gcc -o hello hello.c 

Question:

1 – Je crois que le fichier object de la fonction printf est lié statiquement. Est-ce exact?

2 – Comment dois-je configurer / écrire ce code pour que les fichiers de bibliothèque soient liés dynamicment ou que les bibliothèques partagées soient utilisées au moment de l’exécution?

Remarque: je suis débutant dans ce concept, alors n’hésitez pas à me corriger lorsque cela n’a pas de sens

L’éditeur de liens prend ce qu’il trouve. C’est généralement la bibliothèque partagée.

Sur un système Linux, vous pouvez utiliser

 file hello 

pour savoir si elle est liée statiquement ou dynamicment.

Par exemple

 file /bin/bash 

donne

/ bin / bash: ELF exécutable LSB 64 bits, x86-64, version 1 (SYSV), lié de manière dynamic (utilise des bibliothèques partagées), pour GNU / Linux 2.6.24, BuildID [sha1] = 0x6dafe33f9353cbb054b1b1b1f7b0b7b074545252575757, ssortingpped

tandis que

 file /bin/busybox 

donne

/ bin / busybox: Exécutable ELB 64 bits ELF, x86-64, version 1 (SYSV), lié statiquement , pour GNU / Linux 2.6.24, BuildID [sha1] = 0xac4943b7daf7c3c204a2866ea5398f2337ff93c9, supprimé

Vous pouvez forcer un lien statique en ajoutant l’option -static à gcc

 gcc -static -o hello hello.c file hello 

/ tmp / hello: Exécutable ELB 64 bits ELF, x86-64, version 1 (GNU / Linux), lié statiquement , pour GNU / Linux 2.6.24, BuildID [sha1] = 0x790ec9b287fd2a276162560e5e6669ba6b73e68f, non supprimé

Mettre à jour:

La liaison consiste à regrouper des fichiers d’object, des bibliothèques dynamics et statiques ainsi que certains objects standard pour former un fichier exécutable binary.

Vous pouvez utiliser les bibliothèques dynamics et statiques dans un seul exécutable. Les fichiers object nécessaires d’une bibliothèque statique sont copiés dans l’exécutable. D’un autre côté, les bibliothèques dynamics (en réalité, les objects dynamics) ne sont pas copiées, mais référencées par le binary résultant.

Mettre à jour:

Il existe deux types de bibliothèques, les bibliothèques statiques (ar archives, voir man ar )

 file /usr/lib/libnet.a /usr/lib/libnet.a: current ar archive 

et bibliothèques dynamics (objects dynamics)

 file /usr/lib/libnet.so.1.5.0 /usr/lib/libnet.so.1.5.0: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=0x0c596357947e79001025b3c57be933690085dffb, ssortingpped 

Vous pouvez avoir les deux types de bibliothèque installés en même temps, par exemple:

 ls -l /usr/lib/libnet.* -rw-r--r-- 1 root root 207780 Okt 28 2011 /usr/lib/libnet.a -rw-r--r-- 1 root root 802 Okt 28 2011 /usr/lib/libnet.la lrwxrwxrwx 1 root root 15 Okt 28 2011 /usr/lib/libnet.so -> libnet.so.1.5.0 lrwxrwxrwx 1 root root 15 Okt 28 2011 /usr/lib/libnet.so.1 -> libnet.so.1.5.0 -rw-r--r-- 1 root root 92712 Okt 28 2011 /usr/lib/libnet.so.1.5.0 

Une archive ar contient un ou plusieurs fichiers object, qui sont sélectionnés par l’éditeur de liens si nécessaire par le fichier exécutable. Un object partagé est un object avec des sous-routines, ce qui permet d’être appelé par d’autres objects partagés ou exécutables au moment de l’exécution.

Si ce sujet vous intéresse, vous pouvez également consulter cet article Wikipedia – Bibliothèque (informatique) .