[devel] A: Меры по синхронизации версии libdb в libaprutil1, apache2 и его внешних модулях
Aleksey Avdeev
=?iso-8859-1?q?solo_=CE=C1_solin=2Espb=2Eru?=
Чт Окт 30 04:43:14 MSK 2008
Dmitry V. Levin пишет:
> On Wed, Oct 29, 2008 at 11:45:54PM +0300, Aleksey Avdeev wrote:
> [...]
>> В общем нам надо применять противограбливые меры. Предлагаю следующие:
>>
>> 1. Версию используемой libdb фиксировать в спеке aprutil1 явным образом.
>
> Настоятельно прошу сперва прочесть и понять dsohowto.pdf, а потом уже
> задавать вопросы, делать выводы и принимать меры.
На данный момент ситуация такова:
1. Имея 4.0/branch в качестве источника ставим apache2 (2.2.6-alt4) и
subversion-server-dav (1.4.4-alt1). При этом по зависимостям к нам
приплывают libaprutil1 (1.2.8-alt2). Всё это хозяйство благополучно
использует libdb-4.4.so:
$ ldd /usr/sbin/httpd2.prefork
...
libaprutil-1.so.0 => /usr/lib64/libaprutil-1.so.0
(0x00002aad8cbe6000)
...
libdb-4.4.so => /lib64/libdb-4.4.so (0x00002aad8d9f2000)
$ readelf -d /usr/sbin/httpd2.prefork
...
0x0000000000000001 (NEEDED) Shared library:
[libaprutil-1.so.0]
...
$ ldd /usr/lib64/libsvn_fs_base-1.so.0
...
libaprutil-1.so.0 => /usr/lib64/libaprutil-1.so.0
(0x00002b6338266000)
libdb-4.4.so => /lib64/libdb-4.4.so (0x00002b6338488000)
...
$ readelf -d /usr/lib64/libsvn_fs_base-1.so.0
...
0x0000000000000001 (NEEDED) Shared library:
[libaprutil-1.so.0]
0x0000000000000001 (NEEDED) Shared library: [libdb-4.4.so]
...
libsvn_fs_base-1.so.0 слинкован одновременно с libaprutil-1 и libdb-4.4.
$ ldd /usr/lib64/libaprutil-1.so.0
...
libdb-4.4.so => /lib64/libdb-4.4.so (0x00002b5c3f9ee000)
...
$ readelf -d /usr/lib64/libaprutil-1.so.0
Dynamic section at offset 0x19398 contains 28 entries:
...
0x0000000000000001 (NEEDED) Shared library: [libdb-4.4.so]
...
Вобщем -- всё пока замечательно.
Смотрим куда указывает libaprutil-1.so.0:
$ ls -lA /usr/lib64/libaprutil-1.so.0
lrwxrwxrwx 1 root root 21 Окт 30 03:26 /usr/lib64/libaprutil-1.so.0 ->
libaprutil-1.so.0.2.8
2. Переключаемся на Sisyphus и обновляем apache2* (только его пакеты) до
2.2.9-alt12. По прежнему используется libdb-4.4.so:
$ ldd /usr/sbin/httpd2.prefork
...
libaprutil-1.so.0 => /usr/lib64/libaprutil-1.so.0
(0x00002ad6c11b4000)
...
libdb-4.4.so => /lib64/libdb-4.4.so (0x00002ad6c1fc0000)
...
$ readelf -d /usr/sbin/httpd2.prefork
...
0x0000000000000001 (NEEDED) Shared library:
[libaprutil-1.so.0]
...
Существенных изменений пока нет. И httpd2.prefork напрямую libdb по
прежнему не требует.
2. Обновляем libaprutil1 до 1.3.4-alt3 и смотрим что и как использует libdb:
$ ldd /usr/sbin/httpd2.prefork
...
libaprutil-1.so.0 => /usr/lib64/libaprutil-1.so.0
(0x00002b5a95117000)
...
libdb-4.7.so => /lib64/libdb-4.7.so (0x00002b5a95cf2000)
...
Видим что используется уже libdb-4.7.so. Происходит это потому, что
бинарник httpd2.prefork напрямую с libdb не слинкован, и данную
библиотеку грузит бинарник libaprutil-1.so.0, который мы только что
заменили:
$ ls -lA /usr/lib64/libaprutil-1.so.0
lrwxrwxrwx 1 root root 21 Окт 30 04:00 /usr/lib64/libaprutil-1.so.0 ->
libaprutil-1.so.0.3.4
$ ldd /usr/lib64/libaprutil-1.so.0
...
libdb-4.7.so => /lib64/libdb-4.7.so (0x00002b93b57cf000)
...
$ readelf -d /usr/lib64/libaprutil-1.so.0
...
0x0000000000000001 (NEEDED) Shared library: [libdb-4.7.so]
...
Смотрим как это повлияло на libsvn_fs_base (напомню, что он слинкован
одновременно с libaprutil-1 и libdb-4.4):
$ ldd /usr/lib64/libsvn_fs_base-1.so.0
...
libaprutil-1.so.0 => /usr/lib64/libaprutil-1.so.0
(0x00002b141c053000)
libdb-4.4.so => /lib64/libdb-4.4.so (0x00002b141c27d000)
^^^^^^^^^^^^
...
libdb-4.7.so => /lib64/libdb-4.7.so (0x00002b141d137000)
^^^^^^^^^^^^
...
Как видим, при использовании данной либы в памяти окажутся сразу 2
версии libdb. Не думаю, что это допустимо (особенно то, что rpm/apt
допустили данную ситуацию).
Вариантов решить ситуацию (на уровне rpm/apt) вижу 2:
1. Более правильный -- менять сонейм libaprutil при смене сонейма
прилинкованной libdb. При этом следует учесть что:
а) Сонейм заданный апстримом от сонейма libdb не зависит.
б) Ситуация когда в системе одновременно присутствуют
subversion-server-dav и apache2 собраные с libaprutil имеющими разные
сонеймы требует дальнейшего анализа. (Я на эту тему ещё не думал.)
2. Быстрый -- предлагаемые мной костыли с зависимостями специального
вида. В данном случаи они не сработали из-за рассинхранизации между
версиями apache2-libdb и libdb с которой собрана libaprutil1.
--
С уважением. Алексей.
----------- следующая часть -----------
Было удалено вложение не в текстовом формате...
Имя : signature.asc
Тип : application/pgp-signature
Размер : 552 байтов
Описание: OpenPGP digital signature
Url : <http://lists.altlinux.org/pipermail/devel/attachments/20081030/ecf446de/attachment.bin>
Подробная информация о списке рассылки Devel