[devel] I: rpm 4.0.4-alt98.49, latter rain

Dmitry V. Levin ldv на altlinux.org
Вт Окт 5 21:39:06 UTC 2010


On Tue, Oct 05, 2010 at 02:17:17PM +0400, Alexey Tourbin wrote:
> On Tue, Oct 05, 2010 at 02:01:03PM +0400, Dmitry V. Levin wrote:
> > overlinked libraries означает, что ELF cлинкован с тем, с чем не должен.
> > underlinked libraries означает, что ELF не cлинкован с тем, с чем должен.
> > 
> > С первым мы уже давно боремся с помощью -Wl,--as-needed, поэтому наличие
> > overlinked libraries, скорее всего, является следствием использования
> > -Wl,--no-as-needed.
> > 
> > Cо вторым мы тоже давно боремся с помощью "%set_verify_elf_method strict".
> 
> C недолинковкой вопрос несколько сложнее: verify-elf/ldd не ругается
> на непрямые транзитивные зависимости (по символам), если они разрешаются
> при загрузке.  В этом вся соль.  И в этом одна из претензий к тулчейну!
> 
> Я сейчас не могу придумать тривиальный пример, вот менее тривиальный
> пример:
> 
> lib.req: WARNING: /usr/lib64/libwx_gtk2u_adv-2.8.so.0.7.0: underlinked libraries: /usr/lib64/libX11.so.6
> lib.req: WARNING: /usr/lib64/libwx_gtk2u_core-2.8.so.0.7.0: underlinked libraries: /usr/lib64/libX11.so.6
> 
> Как так можно было слинковать?
> Проблемы в консерватории имеются.

Вот тривиальный пример:
$ cat test.c
#include <gtk/gtk.h>
#include <X11/Xlib.h>
int foo(void){return !gtk_major_version || !XOpenDisplay(0);}
$ gcc -fpic -shared test.c -o test.so $(pkg-config --cflags gtk+-2.0) -lgtk-x11-2.0
$ /usr/lib/rpm/lib.req test.so
rtld(GNU_HASH)
libc.so.6(GLIBC_2.2.5)(64bit)
lib.req: WARNING: /usr/src/tmp/test.so: underlinked libraries: /usr/lib64/libX11.so.6
lib.req: WARNING: libgtk-x11-2.0.so.0()(64bit) is not yet set-versioned
libgtk-x11-2.0.so.0()(64bit)
$ readelf -d test.so |fgrep NEEDED
 0x0000000000000001 (NEEDED)             Shared library: [libgtk-x11-2.0.so.0]
 0x0000000000000001 (NEEDED)             Shared library: [libc.so.6]

И ещё пример:
$ cat test.c
#include <X11/Xlib.h>
int foo(void){return !XOpenDisplay(0);}
$ gcc -fpic -shared test.c -o test.so $(pkg-config --cflags gtk+-2.0) -Wl,--no-as-needed -lgtk-x11-2.0
$ /usr/lib/rpm/lib.req test.so
rtld(GNU_HASH)
libc.so.6(GLIBC_2.2.5)(64bit)
lib.req: WARNING: /usr/src/tmp/test.so: overlinked libraries: /usr/lib64/libgtk-x11-2.0.so.0
lib.req: WARNING: /usr/src/tmp/test.so: underlinked libraries: /usr/lib64/libX11.so.6
libgtk-x11-2.0.so.0()(64bit)
$ readelf -d test.so |fgrep NEEDED
 0x0000000000000001 (NEEDED)             Shared library: [libgtk-x11-2.0.so.0]
 0x0000000000000001 (NEEDED)             Shared library: [libc.so.6]

Только откуда следует, что это поведение ld(1) неправильное?


-- 
ldv
----------- следующая часть -----------
Было удалено вложение не в текстовом формате...
Имя     : отсутствует
Тип     : application/pgp-signature
Размер  : 198 байтов
Описание: отсутствует
Url     : <http://lists.altlinux.org/pipermail/devel/attachments/20101006/edf6358b/attachment.bin>


Подробная информация о списке рассылки Devel