OVH Cloud OVH Cloud

Code binaire de la bibliotheque standard

19 réponses
Avatar
candide
Bonjour,

Comment, en général, le code binaire de la bibliothèque standard apparait-il
dans le système de fichier ? sous la forme d'un seul (et assez gros ?) fichier
ou en plusieurs fichiers, chacun gérant les fonctions de chaque en-tête
(<stdlib.h>, <stdio.h>, etc), en supposant qu'il s'agisse de fichiers (je sais
que ce n'est pas nécessaire).

D'autre part, toujours en général, la bibliothèque standard est-elle statique ou
dynamique ? Sous Windows avec Mingw, il me semble que c'est un fichier
d'extension .a . Sous Linux et gcc, qu'en est-il ? De quel(s) fichier(s) (nom,
extension et répertoire) s'agit-il ?

Merci

9 réponses

1 2
Avatar
candide
batyann811 a écrit :
candide wrote:


donc je ne sais pas si je dois déduire que le fichier à déplacer est
GLIBC_2.0.so .




Chez moi c'est /lib/libc-2.3.5.so. Mais ne t'aventures pas à effacer ou



Oui, je crois en effet que c'est plus prudent, je serais bien en peine après
pour tout remettre en état ;)

Oui c'est possible. http://www.trustonme.net/didactels/154.html



oui mais ça c'est toto1.o + toto2.o = toto.a .
Avatar
batyann811
candide wrote:


oui mais ça c'est toto1.o + toto2.o = toto.a .



Effectivement. J'avais mal lu la question.
Avatar
espie
Meme sous Linux, c'est plus tres vrai, tout ca.
Les binutils recents introduisent des "linker scripts" qui permettent
de faire des trucs assez tordus cote gestion des bibliotheques.

Ces jours-ci, la libc sous linux, c'est un blob que l'editeur de liens
connait, et auquel il se refere quand il veut faire une edition de liens.

Par exemple, sur un Linux auquel j'ai acces, voici /usr/lib/libc.so:

/* GNU ld script
Use the shared library, but some functions are only in
the static library, so try that secondarily. */
OUTPUT_FORMAT(elf32-i386)
GROUP ( /lib/libc.so.6 /usr/lib/libc_nonshared.a AS_NEEDED ( /lib/ld-linux.so.2 ) )

et les raisons pour lesquelles certains bouts sont dans
libc.so.6, d'autres dans libc_nonshared.a, et enfin quelques morceaux
qui necessitent ld-linux.so.2, eh bien, si vous ne faites pas du systeme,
en general vous ne voulez pas savoir...
Avatar
espie
In article <4986f0b4$0$10259$,
candide wrote:
comment fait-on sous Linux pour fondre deux fichiers objets en un seul :
toto1.o +toto2.o = toto.o ? C'est possible ? (Naturellement, j'ai parcouru
longuement le manuel de gcc.)



Oui, et non. Ca va dependre de ce que tu veux.
- bibliotheque au sens classique: on ne melange rien, on fait juste une
archive (mettons libtruc.a) qui contiendra toto1.o et toto2.o. Si tu fais
ton edition de liens avec -ltruc, l'editeur de liens prendre toto1.o et ou
toto2.o dans le resultat.
- bibliotheque au sens bibliotheque dynamique. Pas beaucoup d'autre rapport
que le nom. Ces bibliotheques sont en fait des "objects chargeables
dynamiquement". Ca s'obtient en:
* fabriquant des fichiers objets susceptibles de faire partie d'un tel objet.
(souvent -fpic ou -fPIC, dependant du processeur).
* faisant une edition de liens finale pour fabriquer l'objet en question,
avec les bonnes incantations (ici, gcc -shared sait faire). Ca va produire
autre chose qu'une bete executable (un objet chargeable dynamiquement), et
ca permet a l'editions de liens d'etre "partielle" (pas besoin de main, et
generalement on peut laisser des symboles pour plus tard).
C'est ensuite le boulot de l'editeur de liens dynamique de recoller les
morceaux, soit au demarrage du programme si tu as code en dur des objets
dynamiques dedans (c'est les "bibliotheques dynamiques" traditionnelles),
soit plus tard si tu charges explicitement ces objets un peu apres (a coup
de dlopen/dlsym, c'est les "plugin" habituels).

Le point important, c'est qu'il y a effectivement "melange" des divers objets
pour une bibliotheque dynamique (tu gardes juste les symboles et pas l'identite
des objets) et "simple archivage" pour une bibliotheque statique (tu peux aller
rechercher exactement les fichiers que tu veux dans ta bibliotheque).


C'est le modele actuel "classique" sur systeme linux ou Unix (quasiment tous
les unix aujourd'hui utilisent du ELF, avec ce modele d'objets dynamiquement
chargeables). Pas mal de gens bidouillent avec des extensions:
- granularite de la bibliotheque au niveau de la fonction
- inter-optimisation entre fichiers objets
- systemes de cache plus ou moins sophistiques pour eviter de tout charger/de
refaire l'edition de liens dynamique a chaque fois pour des bibliotheques
dynamiques.
Avatar
Marc
batyann811 wrote:

Chez moi c'est /lib/libc-2.3.5.so. Mais ne t'aventures pas à effacer ou
déplacer ce fichier car tu risques d'avoir de gros problèmes. Du genre
ne plus pouvoir lancer aucun programme qui serait lié avec cette
bibliothèque.



Le fichier qui peut etre supprimé, c'est /usr/lib/libc.so (qui a des
chances de venir d'un paquet libc-dev, par exemple), qui est un lien
symbolique vers le vrai fichier utilisé a l'exécution.

comment fait-on sous Linux pour fondre deux fichiers objets en un seul :
toto1.o +toto2.o = toto.o ? C'est possible ? (Naturellement, j'ai parcouru
longuement le manuel de gcc.)





ld -r
Mais ce n'est pas une bonne idée, les archives (.a) sont plus adaptées.
Avatar
candide
Marc Espie a écrit :


soit plus tard si tu charges explicitement ces objets un peu apres (a coup
de dlopen/dlsym, c'est les "plugin" habituels).



Je savais même pas que c'était une possibilité offerte par les bibliothèques
dynamiques (même si ça paraît logique après coup). Ça doit être rigolo de faire
des trucs comme des plugins, ya un petit côté magique ...
Avatar
candide
Marc a écrit :


Le fichier qui peut etre supprimé, c'est /usr/lib/libc.so (qui a des
chances de venir d'un paquet libc-dev, par exemple), qui est un lien
symbolique vers le vrai fichier utilisé a l'exécution.



Merci mais j'ai pas osé et en plus je connais pas assez le maniement des
bibliothèques dynamiques pour savoir comment refaire marcher mon exécutable.

En plus,

$ ldd toto
linux-gate.so.1 => (0xb7f09000)
libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0xb7da6000)
/lib/ld-linux.so.2 (0xb7f0a000)

donc à mon avis ça va pas suffire.

Par contre, juste à côté de /usr/lib/libc.so j'ai vu qu'il y avait libc.a en en
faisant

$ nm libc.a

je crois que j'ai toute la bibliothèque standard (et d'autres choses en plus je
suppose) dans un gros fichier de 1,4 Mo

Si je compile en faisant gcc -static j'obtiens d'ailleurs un big exécutable qui
passe de 6.5 Kio à 544 Kio !!




ld -r



Ah oui ça marche, j'aurais jamais pensé que ld faisait ça, merci.

Mais ce n'est pas une bonne idée, les archives (.a) sont plus adaptées.



D'accord, je vous fais confiance ;)
Avatar
YBM
candide a écrit :
Marc a écrit :

Le fichier qui peut etre supprimé, c'est /usr/lib/libc.so (qui a des
chances de venir d'un paquet libc-dev, par exemple), qui est un lien
symbolique vers le vrai fichier utilisé a l'exécution.



Merci mais j'ai pas osé et en plus je connais pas assez le maniement des
bibliothèques dynamiques pour savoir comment refaire marcher mon exécutable.

En plus,

$ ldd toto
linux-gate.so.1 => (0xb7f09000)
libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0xb7da6000)
/lib/ld-linux.so.2 (0xb7f0a000)

donc à mon avis ça va pas suffire.



Un bon exercice en la matière est de se fabriquer un système de fichiers
minimal dans lequel on peut faire tourner quelques exécutables (un shell
par exemple) et de tester tout ça avec chroot :

mkdir -p miniroot/lib miniroot/bin

colle ton hello dans miniroot/bin

ajoute ensuite ce qu'il faut tant que "sudo chroot miniroot hello"
ne marche pas (indice : il faut coller ld-linux.so dans lib, celui
n'est pas évident à trouver tout de suite, cf. man ld.so)

Ensuite il n'y plus qu'à ajouter un /dev et quelques détails annexe
pour pouvoir coller tout ça dans une image disque et fabriquer un
système embarqué testable avec qemu.
Avatar
PIGUET Bruno
Le Mon, 02 Feb 2009 15:37:21 +0100, batyann811 a écrit :


Chez moi c'est /lib/libc-2.3.5.so. Mais ne t'aventures pas à effacer ou
déplacer ce fichier car tu risques d'avoir de gros problèmes. Du genre
ne plus pouvoir lancer aucun programme qui serait lié avec cette
bibliothèque.



Mais on peut s'en sortir :
http://weblog.elzevir.fr/2009/01/ma-vie-sans-libc/

Bruno.
1 2