2010-12-08 2 views

ответ

13

заглушки необходимы для обеспечения правильной компоновки исполняемого файла в различных версиях Linux без создания объектных файлов.

Например: Пусть а исполняемый файл мы строим:

gcc -o a test.o test1.o test2.o -lz 

В приведенном выше случае исполняемой а имеет зависимость от libz.so (-lz является связь с libz.so). Компоновщик разрешает libz.so использовать LD_LIBRARY_PATH.

Теперь давайте посмотрим проблему:

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 

В RHEL5, мы видим неопределенную символ в libz.so. Если мы не передадим libc в компоновщик после lz в приведенной выше команде, это не может быть разрешено.

Stub: Если мы создадим заглушку для libz.so, упакуем все символы libz.so в библиотеку заглушек и свяжемся с библиотекой-заглушкой вместо реальной библиотеки, мы не увидим никаких ошибок:

Модифицированная ссылка линия:

gcc -o a test.o test1.o test2.o -L/home/lib/stubs/ -lz 

В домашней директории Lib///штырей, у нас есть библиотека заглушки для libz.so по имени libzstub.so.

Компоновщик дает более высокий приоритет пути, указанному в команде связи, чем LD_LIBRARY_PATH.

Теперь, даже если мы ссылаемся на выпуск RHEL5, компоновщик разрешает символы для libz.so из каталога/home/lib/stubs.

Здесь детали конфигурации ящиков, которые я использовал.

Погрузчик заботится о загрузке соответствующей функции во время выполнения.

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