Sous Linux, pourquoi les stubs sont-ils requis pour les bibliothèques standard?Dans les stubs Linux sont utilisés pour les bibliothèques standard. Pourquoi les talons sont-ils requis?
Répondre
Les talons sont nécessaires pour assurer la liaison correcte d'un exécutable entre différentes versions de Linux sans créer les fichiers objets.
Par exemple: Soit a l'exécutable que nous construisons:
gcc -o a test.o test1.o test2.o -lz
Dans l'un exécutable de cas ci-dessus a une dépendance à l'égard libz.so (-lz
est de créer un lien avec libz.so). L'éditeur de liens résout libz.so en utilisant LD_LIBRARY_PATH.
Voyons maintenant le problème:
In RHEL4(Linux Zseries):
objdump -T /usr/lib64/libz.so.1 | grep stack_chk
In RHEL5(Linux ZSeries);
objdump -T /usr/lib64/libz.so.1 | grep stack_chk
0000000000000000 DF UND 0000000000000031 GLIBC_2.4 __stack_chk_fail
En RHEL5, nous voyons un symbole non défini dans le libz.so. Sauf si nous passons libc à l'éditeur de liens après lz dans la commande ci-dessus, cela ne peut pas être résolu. Stubs: Si nous générons le stub pour libz.so, en empaquetant tous les symboles de libz.so dans une bibliothèque de bout et un lien avec la bibliothèque de stub au lieu de la bibliothèque réelle, nous ne voyons aucune erreur:
ligne de liaison modifié:
gcc -o a test.o test1.o test2.o -L/home/lib/stubs/ -lz
Dans le répertoire/home/lib/talons, nous avons une bibliothèque stub pour libz.so par nom libzstub.so. Le lieur attribue une priorité plus élevée au chemin indiqué dans la commande link que LD_LIBRARY_PATH.
Maintenant, même si nous lions dans la version RHEL5, l'éditeur de liens résout les symboles pour libz.so à partir du répertoire/home/lib/stubs.
Ici, j'ai utilisé les détails de configuration des boîtes. Le chargeur prend en charge le chargement de la fonction correspondante lors de l'exécution.
RHEL5:
libcmpiutil-0.4-2.el5
glibc-utils-2.5-42
libc-client-2004g-2.2.1
libcap-1.10-26
libcap-1.10-26
libchewing-devel-0.3.0-8.el5
libchewing-0.3.0-8.el5
libcxgb3-1.2.3-1.el5
libcap-devel-1.10-26
glibc-common-2.5-42
libcxgb3-static-1.2.3-1.el5
libcroco-devel-0.6.1-2.1
compat-glibc-headers-2.3.4-2.26
libcroco-0.6.1-2.1
compat-libcom_err-1.0-7
libcmpiutil-devel-0.4-2.el5
compat-glibc-2.3.4-2.26
glibc-headers-2.5-42
glibc-devel-2.5-42
libcap-devel-1.10-26
libc-client-2004g-2.2.1
libcmpiutil-0.4-2.el5
libcroco-0.6.1-2.1
libc-client-devel-2004g-2.2.1
glibc-2.5-42
libchewing-devel-0.3.0-8.el5
libcroco-devel-0.6.1-2.1
compat-libcom_err-1.0-7
libc-client-devel-2004g-2.2.1
libchewing-0.3.0-8.el5
libcxgb3-1.2.3-1.el5
libcmpiutil-devel-0.4-2.el5
glibc-2.5-42
glibc-devel-2.5-42
compat-glibc-2.3.4-2.26
RHEL4:
rpm -qa | grep libc
glibc-2.3.4-2.41
libcxgb3-1.1.4-1.el4
libc-client-2002e-14
libcroco-0.6.0-4
libcap-devel-1.10-20
glibc-kernheaders-2.4-9.1.103.EL
compat-libcom_err-1.0-5
glibc-devel-2.3.4-2.41
compat-glibc-2.3.2-95.30
compat-libcom_err-1.0-5
glibc-common-2.3.4-2.41
libcroco-devel-0.6.0-4
libcxgb3-1.1.4-1.el4
libc-client-2002e-14
glibc-utils-2.3.4-2.41
libcap-1.10-20
glibc-headers-2.3.4-2.41
glibc-profile-2.3.4-2.41
libcxgb3-static-1.1.4-1.el4
glibc-devel-2.3.4-2.41
compat-glibc-2.3.2-95.30