Главная страница


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)
 
 

Вернуться к списку тем, сортированных по: возрастание даты  уменьшение даты  тема  автор 

 Тема:    Автор:    Дата:  
 Hеобязательный линкинг   Alexandr Leykin   06 Nov 2005 22:44:29 
 Hеобязательный линкинг   Mike Novikoff   07 Nov 2005 11:40:00 
Архивное /ru.linux/3917436f17f0.html, оценка 3 из 5, голосов 10
Яндекс.Метрика
Valid HTML 4.01 Transitional