|
ru.linux- RU.LINUX --------------------------------------------------------------------- From : Mike Novikoff 2:5020/133.73 07 Nov 2005 11:40:00 To : Alexandr Leykin Subject : Hеобязательный линкинг -------------------------------------------------------------------------------- AL> Есть программа имеющая ряд ф-ций, зарание известно с какими библиотеками AL> нужно взаимодействовать (SDL, QT,...), как организовать такую линковку AL> чтобы те ф-ции которые зависят от либ не требовались для запуска проги AL> (хотя они присутствуют при линковке как возможно используемые). Возможно, поможет использование weak symbols. Известный мне пример - вендорские патчи (версии от RH и MDK) к пакету gpm. Который может использовать (и действительно использует) libncurses, но не привязан к ним (ldd ничего не покажет, соответственно и `rpm -q --requires`). * Mon Jun 16 2003 Jakub Jelinek <jakub@redhat.com> - don't link against -lncurses, instead make wgetch and stdscr weak undefined symbols to break library dependency cycle * Mon Jul 07 2003 Gwenole Beauchesne <gbeauchesne@mandrakesoft.com> 1.20.1-7mdk - Patch4: Don't link against -lncuses, make weak wgetch and stdscr (Jakub Jelinek) Сам патч (от MDK - с комментарием): >=== gpm-1.20.1-weak-wgetch.patch ===< When libncurses is configured with gpm support and gpm with ncurses support, libncurses.so depends on libgpm.so and libgpm.so depends on libncurses.so. Such loops should never happen. If Gpm_Wgetch is passed non-NULL win argument, it must have been created by ncurses anyway and so it should be already loaded. On the other side, if Gpm_Wgetch is never used or used just with NULL argument, libncurses is never needed. --- gpm-1.20.1/src/lib/libcurses.c.weak-wgetch 2002-12-24 23:57:16 +++ gpm-1.20.1/src/lib/libcurses.c 2003-07-07 16:44:33 @@ -41,7 +41,12 @@ #endif /* HAVE_NCURSES_CURSES_H */ #endif /* HAVE_NCURSES_H */ -#define GET(win) ((win) ? wgetch(win) : getch()) +/* If win != NULL, it must have been created by ncurses anyway. + Avoid circular library dependencies. */ +#pragma weak wgetch +#pragma weak stdscr + +#define GET(win) ((win && wgetch) ? wgetch(win) : getch()) int Gpm_Wgetch(WINDOW *win) { --- gpm-1.20.1/configure.in.weak-wgetch 2003-07-07 16:42:20.000000000 +0200 +++ gpm-1.20.1/configure.in 2003-07-07 16:44:33.000000000 +0200 @@ -108,7 +108,7 @@ No|no|N|n) SHARED_LIBS=-lc ;; AC_CHECK_LIB($i, wgetch,,,$TERMLIBS) else :; fi done - SHARED_LIBS="$LIBS $TERMLIBS -lc" + SHARED_LIBS="-lc" LIBS=$SAVELIBS ;; esac --- gpm-1.20.1/configure.weak-wgetch 2003-07-07 16:39:09.000000000 +0200 +++ gpm-1.20.1/configure 2003-07-07 16:44:33.000000000 +0200 @@ -1926,7 +1926,7 @@ fi else :; fi done - SHARED_LIBS="$LIBS $TERMLIBS -lc" + SHARED_LIBS="-lc" LIBS=$SAVELIBS ;; esac >=== gpm-1.20.1-weak-wgetch.patch ===< [mn@lo (tty2) mn]$ ldd $(which gpm) libc.so.6 => /lib/libc.so.6 (0x4001c000) /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000) [mn@lo (tty2) mn]$ ldd /usr/lib/libgpm.so libc.so.6 => /lib/libc.so.6 (0x40010000) /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x80000000) Mike --- * Origin: mn@lo.lan (2:5020/133.73) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.linux/3917436f17f0.html, оценка из 5, голосов 10
|