[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