В Linux, зачем нужны заглушки для стандартных библиотек?В Linux заглушки используются для стандартных библиотек. Почему нужны заглушки?
ответ
заглушки необходимы для обеспечения правильной компоновки исполняемого файла в различных версиях 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