[devel] Re: ELFs in /usr/share
Alexey Tourbin
=?iso-8859-1?q?at_=CE=C1_altlinux=2Eru?=
Вс Сен 18 12:46:18 MSD 2005
On Sun, Sep 18, 2005 at 03:23:46AM +0400, Dmitry V. Levin wrote:
> > А нужны более тонкие проверки, с reverse lookup'ом. Надо попробовать
> > нарисовать все эти ER-диаграммы. Но для этого нужно поставить пиратскую
> > винду, водрузить на неё пиратскую Rational Rose и т.п.
>
> Зачем? Если в сборочной среде правильно запущенный "ldd -r" выявляет
> undefined references, то этого зачастую достаточно.
Ну в идеале нужно промоделировать работу ldd -r на основе базы данных
пакетов, ELF'ов, символов и soname'ов. Что полученный дамп отчасти
позволяет сделать. Нужно ещё несколько таблиц и join'ов по составным
ключам.
> Тот факт, что какой-то ELF содержит символ, похожий на тот, который
> показывает "ldd -r" как undefined reference, ещё мало что даёт.
Да. Возмём некий ELF. У него есть, с одной стороны, список soname'ов,
которые он требует.
$ readelf -d /usr/bin/perl |grep NEEDED
0x00000001 (NEEDED) Shared library: [libperl.so.5.8]
0x00000001 (NEEDED) Shared library: [libdl.so.2]
0x00000001 (NEEDED) Shared library: [libm.so.6]
0x00000001 (NEEDED) Shared library: [libpthread.so.0]
0x00000001 (NEEDED) Shared library: [libc.so.6]
0x00000001 (NEEDED) Shared library: [libcrypt.so.1]
$
С другой стороны, у него есть список undefined symbols, которые по
смыслу должны разрешиться в эти soname'ы.
$ nm -D /usr/bin/perl |awk NF==2 |head
U PL_do_undump
U PL_op_mutex
U PL_sigfpe_saved
U PL_use_safe_putenv
U Perl_atfork_lock
U Perl_atfork_unlock
U Perl_croak_nocontext
U Perl_newXS
w _Jv_RegisterClasses
w __gmon_start__
$
Каждый символ может разрешиться в одном (в любом) из soname'ов.
Это называется декартовым произведением символов на soname'ы.
Такая таблица получается со стороны "requires".
Со стороны "provides" предоставляется более очевидная таблица,
тоже символов и sonme'ов, в которой просто перечислены все динамически
символы "с адресом" из soname'ов.
Далее делается inner join этих двух таблиц, по составному ключу
символ+soname. Требование к полученному результату: каждый символ
должен разрешиться в одном и только одном из soname'ов. Ну ясно
наверное, о чем речь идет. Это и есть строгая проверка, более строгая,
чем `ldd -r'. Сюда даже не обязательно реляционную модель приплетать,
просто она помогает понять entity-relationship.
> А там как раз такой дизайн:
> $ ldd -r /lib/libthread_db.so.1 >/dev/null
Это я отдельно посмотрю. Получется, что символы могут предоставляться
не только soname'ами, но и бинарями. Тогда нужно усложнять модель по
части "кто кого загружает".
> > Да нет, я просто пока понял, что если символов вообще нигде нет, то их
> > точно вообще нигде нет. :) Я написал, что это слабая проверка, она
> > ничего не гарантирует, только обнаруживает вопиющие случаи...
> Скорее клинические. :)
Ну вот если сделать давилку для публичных библиотек, то что она скажет
по поводу
tomboy /usr/lib/tomboy/libtomboy.so U GTK_IS_SOURCE_VIEW
?
Пропустит, потому что это не публичная библиотека. Тем не менее,
символа GTK_IS_SOURCE_VIEW нигде нет. Такое нужно давить в первую
очередь.
----------- следующая часть -----------
Было удалено вложение не в текстовом формате...
Имя : =?iso-8859-1?q?=CF=D4=D3=D5=D4=D3=D4=D7=D5=C5=D4?=
Тип : application/pgp-signature
Размер : 189 байтов
Описание: =?iso-8859-1?q?=CF=D4=D3=D5=D4=D3=D4=D7=D5=C5=D4?=
Url : <http://lists.altlinux.org/pipermail/devel/attachments/20050918/e4bff0df/attachment-0001.bin>
Подробная информация о списке рассылки Devel