2010-12-08 4 views

Répondre

13

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 
Questions connexes