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 #include 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 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