В Linux заглушки используются для стандартных библиотек. Зачем нужны заглушки? - PullRequest
10 голосов
/ 08 декабря 2010

В Linux зачем нужны заглушки для стандартных библиотек?

1 Ответ

13 голосов
/ 03 февраля 2011

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

Например: Пусть a будет исполняемым файлом, который мы создаем:

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

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

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

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

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

В каталоге / home / lib / stubs мыесть библиотека заглушек для libz.so по имени libzstub.so.

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

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

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

Загрузчик заботится о загрузкеcoresponding функция во время выполнения.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...