HOWTO    - Program Library HOWTO

David A. Wheeler

    1.20, 11  2003

       HOWTO  ,   
                
   Linux.              
   (static),      (shared)       (
   dynamically loaded ) .
     _________________________________________________________

    
   1. 
   2.  (static) 
   3.  (shared) 

        3.1. 

              3.1.1.   
              3.1.2.    

        3.2.    
        3.3.  

              3.3.1. LD_LIBRARY_PATH
              3.3.2. LD_DEBUG
              3.3.3.   

        3.4.    
        3.5.     
        3.6.    

   4.  (Dynamically Loaded - DL) 

        4.1. dlopen()
        4.2. dlerror()
        4.3. dlsym()
        4.4. dlclose()
        4.5.   

   5. 

        5.1.   nm
        5.2.   (constructor) 
                 (destructor) 

              5.2.1.   _init  _fini
                      (/)

        5.3.      
                  (scripts )

        5.4.   (Symbol versioning)  
                  (Version scripts)

        5.5. GNU libtool
        5.6.     
        5.7.   
        5.8. C++  C
        5.9.      C++
        5.10. Linux Standard Base (LSB -    Linux)
        5.11.    
                 (shared) 

   6.  

        6.1.  libhello.c
        6.2.  libhello.h
        6.3.  demo_use.c
        6.4.  script_static
        6.5.  script_shared
        6.6.  demo_dynamic.c
        6.7.  script_dynamic

   7.   
   8.    

1. 

     HOWTO     
             
       Linux,   
     GNU.   " ''   
         (compiled)  (
     ),         
   .              
          ,  
      (recompilation),  
             (update).   
           : 
     (static),     (shared),
       (dynamically loaded - DL).

           , 
            (executable) 
            .      
      ,          
                   
   .  ,        , 
          
        .    
           (format)
      (            
             ) '
   ,          
       .  
   HOWTO         
          .

                    
   (developers)         ,     
     ,   
                 (update)  
                      
   .       , 
             
              
       .  '      ,  ,
         (upgrading)     
   ,             
     . ,      , 
           
     .     C++
       ,     
    "C++ mini- howto".

              
             (dynamically   linked
   libraries  -  DLLs)         
   (shared) ,    DLL   
                
     (DL),        
   DLL                 
   .               
   ,   HOWTO   DLLs  Linux.

      HOWTO      
                 
   / GNU/Linux :   ELF (Executable and
   Linking  Format).        GCC  GNU (GNU GCC
   toolset)        
             ELF  -  , 
      Linux     
       a.out  (     
   2.6  ). ,     
   .

             
         ,              
         GNU  libtool          
     ,     
     Linux    \  .  GNU Libtool   
   script  (  )   ,  
              
   (..,      )    
     ,  , .  Linux, 
   GNU  Libtool          
            HOWTO.    
   (portable  interface)    ,  
      portability wrappers (
   ).      GNU   Libtool      ,
      "libltdl".   ,        
      glib  (    
   glibc)        dynamic module loading
   (    ).     
      glib 
   http://developer.gnome.org/doc/API/glib/glib-dynamic-loading-o
   f-modules.html.         ,      Linux     
        
        HOWTO.    
          Linux,        
           HOWTO         
   .

       ( "" )   HOWTO 
     http://www.dwheeler.com/program-library,  and it has been
              Linux
   (http://www.tldp.org).         (C)  2000
       David A. Wheeler     
   GPL (Gerneral Public License) -    
         .
     _________________________________________________________

2.  (static) 

                    
     object  files ( ) - , 
            ".a".  
                 ar
   (archiver).        
            ,          
        (    ).
   ,      , 
    ,     .

                 
         (link to programs),  
           recompilation     
   ,                    
   .               
           ,
           ,  
             . 
           developers
          
               ,  
                 (    
             , 
           
         ). ,   
       ELF        
          ( 1-5%)    
            
   ,         
    ,  .

          ,   
               object  files      ,
        :
ar rcs my_library.a file1.o file2.o

             object files:
   file1.o    file2.        my_library.a,
      my_library.a,    .
             
   ,   ar(1).

           ,    ,
   ,   .    
                   
        (compilation and linking process)
                 .  
      gcc(1)      ,
       ()  -l 
          .    
         info (info:gcc).

                       
        GCC -    -l 
         linker (   
           ..      
   ),     '      
      .    
                .  
          -l    
   ,            linkning,    
         .

            linker ld(1) ,
       -l  -L, , 
            
   GCC (1)      LD (1)   
   .
     _________________________________________________________

3.  (shared) 

                  
              .    
          ,    
         ,    
       .    
           ,   
       Linux  :

     *      (update)  ,    
               
        ,       
        -- 
     *             
              ,    
          .
     *               
          
     _________________________________________________________

3.1. 

           
       ,    
             .   
             ,
            "soname" ,  
        (real name),   .
               
    .
     _________________________________________________________

3.1.1.   

               , 
     "soname".    soname        "lib",
          ,   ".so"  
         (    - ".")   
                   interface  
        (    ,    
       C      "lib").
               (   (fully-qualified)  soname
                
             -      
   ,     -  soname      
         (symbolic   link)       
   " "   .

             "
   ",               
       .    
     soname   ,    (minor
   number),     ,     (release
   number).             
     .  minor   release  
               (configuration  control  ),
               
     .     
                         
                 
   ,        .

   ,         
           ,  (    "linker
   name"),          soname   
   .

           
                .  
   ,               
            ,    
             soname. ,
            ,    
                   (
       ).      
      ,      
             
   ldconfig(8).    ldconfig        
       sonames     
   ,          cache
   /etc/ld.so.cache (    ).

     ldconfig        linker  names (   
     ) -       
     ,      linker name 
        symbolic link  " " soname   
      .      linker name
         soname,   
             
        (linking).  
   H.  J.  Lu    ldconfig     linker
   names.                
             
   ,    '       
                   (
   )  . ,   ldconfig  
             
     ,           
          linker   
      .

     ,   /usr/lib/libreadline.so.3   
     soname,        ldconfig      
          (realname) 
     /usr/lib/libreadline.so.3.0.      
         linker,  /usr/lib/libreadline.so    
              o
   /usr/lib/libreadline.so.3.
     _________________________________________________________

3.1.2.    

            
      (filesystem).    
   (open  source software)       GNU
   -        
   info:standards#Directory_Variables.            GNU
   ,      ,   
       /usr/local/lib   
       (           
   /usr/local/bin).       
           
     .

          (Filesystem Ierarchy
   Standards  -  FHS)            
     (. http://www.pathname.com/fhs).    FHS,
          
   /usr/lib,         
           /lib   
            
   /usr/local/lib.

             
     -      GNU   
                
   ,       FHS          (
             
    ,      
    ).      :  
     (      -  bugs)    
       "",     "local"
   ()     (/usr/local),   ""
       ,          
   (package   managers)             
            
          .     
                  
   ,       
     /usr/local/libexec (     
   /usr/libexec).           Red-Hat-""
             /usr/local/lib "'
   "        -  
          /etc/ld.so.conf .  
   (standard)           
   /usr/X11R6/lib      -Windows,  ....    
   /lib/security       PAM modules,  
         ( 
    ).
     _________________________________________________________

3.2.    

        GNU                    glibc,
           Linux,  
     ELF        program loader
   (   )           .  
        Linux,                  
   /lib/ld-linux.so.X  (         ).
       ,    ,    
         
    .

                      
        /etc/ld.so.conf.   
       ""    RedHat  ,   , 
           /usr/local/lib    
   /etc/ld.so.conf.         bug (),  
       /usr/local/lib    /etc/ld.so.conf   
     ""          
       RedHat-derived .    
            ,  
        ,   
            
       /etc/ld.so.conf  -      
              (standard
   set),           (preloading).  
     ,  ,    ""
   (patches)     -     
         .

                  
   ,       , 
               (.o
   )      /etc/ld.so.preload;         
   "-"             
     .        
          patches -     
          .

               
             ,    
              caching.  
      ldconfig   (8)    ,      
   /etc/ld.conf,  (sets up)   
                 
    (dynamic link directoriew),    
        (standard conventions),   
      ""  /etc/ld.so.cache, 
             .
           .  
                ""  :  
            ldconfig 
         DLL  , ,    
      DLL  -    ldconfig 
             
           . , 
   ,    dynamic  loader     
   /etc/ld.so.cache            
   .

   ,    FreeBSD    
          cache.  FreeBSD,  ELF cache
         /var/ld-  elf.so.hints   a.out cache 
   /var/run/ld.so.hints.      ldconfig
   (8),             
     .
     _________________________________________________________

3.3.  

           
            ,   
         .
     _________________________________________________________

3.3.1. LD_LIBRARY_PATH

          
   ,       .  Linux,  
      LD_LIBRARY_PATH            
     ,           
   ,        , 
         (default)   .
             (debugging) 
         ""  
     .        LD_PRELOAD
              
   ""     ,   
     /etc/ld.so.preload.      
   /lib/ld-linux.so  loader.        ,  
   LD_LIBRARY_PATH             Unix,  
         -   ,   
      HP- UX     
       SHLIB_PATH,   ,   
           LIBPATH ( 
      ,      
        ).

     LD_LIBRARY_PATH        
   ,                 
          
      -      
              "Why   LD_LIBRARY_PATH   is   bad",   
   http://www.visi.com/~barr/ldpath.html   
            ,     
                   
   .         
   LD_LIBRARY_PATH,    Linux      
        (program  loader)        
     .    ,     
               
       LD_LIBRARY_PATH, 
       :
  /lib/ld-linux.so.2 --library-path PATH EXECUTABLE

         ld-linux.so    ,   
           ,   ,  
             -   
        .
     _________________________________________________________

3.3.2. LD_DEBUG

             GNU C loader
       LD_DEBUG.  ""   dl  
           . 
     :
  export LD_DEBUG=files
  command_to_run

             
        ,        
   (dependencies) ,  SOs    
   .        LD_DEBUG     "bindings",  
           
   (symbol  binding),   "libs"    
       (library search paths), 
       "versions",      
   (version dependencies).

            LD_DEBUG   "help" 
        ,     
      .   ,    LD_DEBUG
           ,      
      debugging  testing.
     _________________________________________________________

3.3.3.   

                  
       ,      
    (loading process) -       LD
   _    RTLD  _.           
       debugging      (loader
   process)            . 
     '          - 
                 '  , 
                 
     loader (  GCC).

                    
         (DLLs)   
       setuid/setgid  (    
    permissions set),     .
   ,    GNU  loader  (       
          ),    
   setuid    setgid,       (  
   )              
      .  loader     
   setuid        setgid                credentials
   ("")      -     uid  euid
   ,    gid  egid ,    
        setuid/setgid (    
     )        
          (linking).   
      GNU glibc ,    
   -                        /elf/rtld.c    
   sysdeps/generic/dl-sysdep.c.      
     uid      gid      euid  egid, 
         ,     
      .  Unix-  
           : 
   setuid/setgid      
         .
     _________________________________________________________

3.4.    

             
   .  ' ,   object files   
           GCC  
     (flags) -fPIC  -fpic.   
   -fPIC  -fpic    " 
   "  (position  independent  code),      
            -  
     .   soname     
     -Wl    gcc.     -Wl   
          linker (   
      -soname    ) -    
     -Wl    ,   ,  
         (white spaces)  .
          
      :
gcc -shared -Wl,-soname,your_soname \
    -o library_name file_list library_list

     ,    object files
   (a.o  b.o)        
     .          
     debugging (-g -     -ggdb  
     debugging     
   gdb)              (warnings  -
       - Wall),   , ,
           .  
   (compilation)      object  files  ( 
     -c),       
   fPIC:
gcc -fPIC -g -c -Wall a.c
gcc -fPIC -g -c -Wall b.c
gcc -shared -Wl,-soname,libmystuff.so.1 \
    -o libmystuff.so.1.0.1 a.o b.o -lc

       :

     *   ""  (strip)   ,  
             -fomit-frame-pointer  
       compiler,    ,   . 
             ,     
                   debuggers   (
       )  .
     *       -fPIC    -fpic    
           .      -fPIC  - fpic  
                 .  
       -fPIC  ,      
            -fpic (    
                  
          ,   PIC   -fPIC
              , '  
              -fpic).   
       -fpic         ,
               
               (platform-dependent),  
                   (globally
       visible symbols),     .  linker  
             "  "  (        
       )               
       .      ,    -fPIC -
        .
     *   ,     gcc 
             (object file)  
             "- Wl,
       -export-dynamic".  ,     
       (dynamic  symbol  table)          
               .   
        (      ELF) 
                 ((. ld(1)
           ).   
                        
       "  ",  ,     DL 
       -        
               (... 
               
       ""  -         
            symbol,  ,  
       ..     4.5,  cos  symbol
         math  ).      "
       ",          
                .       
                "-   rdynamic"      "-   Wl,
       -export-dynamic",        Linux,
             ELF (ELF documentation), 
         "-  rdynamic"      gcc 
       -linux .

             ,    
         
         -     
                  
         ,       
            
     .          
   (linking  option)           
   "rpath"    ld,          
   runtime  (  )    
      .   gcc, 
       rpath     :
 -Wl,-rpath,$(DEFAULT_LIB_INSTALL_PATH)

            
      client ,     
        LD_LIBRARY_PATH  (  
   )           
             ,      
        .
     _________________________________________________________

3.5.     

       ,  
        .            
            
    (.. /usr/lib)     ldconfig(8).

   '  ,             
      .   ,            
       ,    link
       soname      realname  (    
   versionless  soname,    soname    
     ".so",         
   ).      :
 ldconfig -n directory_with_shared_libraries

   ,        ,   
       linker        
           .        
     -l  -L    .

             
       standard    (..          
         /usr/lib),    
       .        ,    
       ,     
             
     ...        .
          (flag) -L  gcc 
       .    
    " rpath" (  ),  
             
                   
   standard.         
               .  ,
          LD_LIBRARY_PATH,    
                 
           
        .  
   bash,          my_program   
    :
LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH  my_program

                     
   /,       
     ""  object  file      
   LD_PRELOAD  -        
                
   (    ).

           (update)  
         -       
   (API),        
      soname.        
         ,       
      . ,    
           
     soname,        
             
    ,     (.,  
           ".orig"),  
           wrapper script  
           
   ()  .      
           ,  "" , 
   ,           
                 ,    
                
     .    wrapper  script    
    :
  #!/bin/sh
  export LD_LIBRARY_PATH=/usr/local/my_lib:$LD_LIBRARY_PATH
  exec /usr/bin/my_program.orig $*

                   
   ""              -
            
       --- (backwards-compatible) 
           soname   
                 . 
         "    "    
     "  ".

          
          ldd
   (1).  ,   ,     
        ls :
  ldd /bin/ls

   ,       sonames    
       (  ls   ),   
         .   
                   dependencies
   ():

     * /lib/ld-linux.so.  (  N     
       1,      2).      
           .
     * libc.so.  (  N      6). 
            C.     
               C  (   
                  ),    
                
        .

   :            ldd        
   .       ldd (1),
     ldd  (  )     
         (   ELF, 
   LD_TRACE_LOADED_OBJECTS)       .
                  
             ldd        
      (    
     ldd).  ,   ,   ldd
         .
     _________________________________________________________

3.6.    

             binary incompatible
   ("-  ")         , 
   soname      .  C,   
                        
   binary-incompatible   :

    1.       ()  
                
       ,
    2.       ""  (exported  data  items)
         (:     
               , '   
            ).
    3.    (exported function) .
    4.  interface    .

            ,  
       binary-compatible   .
           ,   
   o  Application  Binary  Interface  (ABI,      "
     ")  ,    .
     ,         
   /          .
           , 
              
         ""     ,  
                     ,
           (   ) 
         ,         
     (      ), 
     .  :       
           (arrays).

         C++  (        
   compiled-in  templates  / compiled dispatched ), 
          .        
   ,         .          
         ""   
   ,            
            C++.  
   ,   " ",  
               C++    
          
             .       (
   )         C++
                 binary-compatibilty    ("
   "),       Troll Tech's Technical
   FAQ:

    1.         
       (       binaries  
          ),    ""
       (evaluates)   SuperClass::virtualFunction() 
         (compile-time,  link-time).
    2.          virtual  member  functions
       (    ),      
          layout  vtbl  .
    3.           data members (
       )        ,      
         inline member functions.
    4.       class ierarchy ( ), 
             .
    5.    '  private data members (
        ),       
        layout  .
    6.    public  protected member functions  
        inline.
    7.       public  protected member function 
       inline.
    8.        inline ,  
            .
    9.              (  public,
       protected    private)   member function   
       (portable)   ,        
                   
       .

         ,   
             C++  ,    
            updates        
            
   .     ,          Unix-     
   (    Linux)     
        ,   
         ()   , 
           "" , 
      .
     _________________________________________________________

4.  (Dynamically Loaded - DL) 

     (, " ")  (DL) 
            ()
         .    
     plugins    modules,    
       plugin   . 
   ,      Pluggable  Authentication  Modules (PAM),
        DL          
          "" (configure) 
          .  
            (interpreters) 
          
                        
         ,   
          . 
   ,         
    just-in-time compiler   multi-user dungeon (MUD).

    Linux,  DL     ""
        (format)  - 
       object files    ,
       .          
          link-time  
          - ' ,   API
   (Application   Programming   Interface   -     
     )       ,
       "" ,  ,  
   .        C      
    <dlfcn.h>      .

          Linux   
         Solaris    
      "dlopen()"   API.  ,        
        -  HP- UX 
            shl_load  (),      Windows
      DLLs,           
   interface.             
                 
     ,      
       wrapping  library      
         .      
     glib        
   modules  (DLM,  Dynamic Loading of Modules) -  
                  
            
   .        glib 
   http://developer.gnome.org/doc/API/glib/glib-dynamic-loading-o
   f-modules.html.       glib    
     (documentation),     '  .
           libltdl, 
        GNU libtool.    
                   
   ,               CORBA
   Object  Request  Broker  (ORB).      
       API     Linux   Solaris,
       .

     developers   C++   
   (DL),                "C++  dlopen
   mini-HOWTO".
     _________________________________________________________

4.1. dlopen()

         dlopen(3)           
         .   C     
   :
  void * dlopen(const char *filename, int flag);

            "/" (   
   ),  dlopen()      
   (       ). ,   
         :

    1.              (
                    )    
        LD_LIBRARY_PATH  .
    2.                   
                 /etc/ld.so.cache  (
          ld.so.conf).
    3.     /usr/lib.    
             :       
                 a.out loader.  
       loader,       ,  
           /usr/lib,     /lib (. man page
       ld.so(8)).          '     ,
                 
             (   ),
                
            .

    dlopen(),     flag    
   RTLD_LAZY,    "     
   (unresolved   symbols)              
       ",        RTLD_NOW,      "
       dlopen()  ,   
    ,      ".  
   RTLD_GLOBAL  ,       
     OR      flag,   
       (external  symbols)     
           
     .      debugging,       
     RTLD_NOW -    RTLD_LAZY  
                
        (unresolved references).  
    RTLD_NOW        
   (        )  -   
     ,          RTLD_LAZY
   .

                (..  
         ),       
          (   ,  
   ,   X).

        dlopen()   "handle"   
           DL   
     "  "  (opaque  value).    dlopen()  
     NULL        ,
             .    
               
   dlopen(),    file handle.

         ,         
   (""  -  exports)         _init, 
         dlopen().  
              
     . ,   
       ""      _init  _fini.
             ,      
            .   '  ,  
           
         __attribute__((constructor))  
   __attribute__((destructor)) (   
   gcc).             5.2    
   .
     _________________________________________________________

4.2. dlerror()

             dlerror
   (),             
            dlopen(), dlsym
   (),      dlclose   ().          
       (   )  dlerror()
     NULL,      .
     _________________________________________________________

4.3. dlsym()

             
             .
               DL 
     dlsym (3),        
     () .     
   :
 void * dlsym(void *handle, char *symbol);

      handle       dlopen(),  
   symbol     ( NIL-terminated -  
   NIL).      ,    
        dlsym()   void *,  
          casting     
   (          
       ).

     dlsym()    NULL     . 
                 
   NULL     ,            ,  
           :  
   ,         , 
          ;       
   dlerror()  (      
     ),          dlsym()  
       ,          dlerror()   
        .    
      :
 dlerror(); /* clear error code */
 s = (actual_type) dlsym(handle, symbol_being_searched_for);
 if ((err = dlerror()) != NULL) {
  /* handle error, the symbol wasn't found */
 } else {
  /* symbol found, its value is in s */
 }
     _________________________________________________________

4.4. dlclose()

   T    dlopen()   dlclose(),   
      .     
             file  handles,   
     (deallocated)     dlclose()
             dlopen()   
   .    ,         
          . 
     ,     _fini
   (  )      ,   
                  
       .  '  ,     
        (export  routines)    
                  (function       attributes)
   __attribute__((constructor))   __attribute__((destructor)).
          5.2   .
   :    dlclose()   0   ,
               ,
          man pages  Linux.
     _________________________________________________________

4.5.   

                 man  page  
   dlopen(3).        math,
           2.0,      
       (    ):
    #include <stdlib.h>
    #include <stdio.h>
    #include <dlfcn.h>

    int main(int argc, char **argv) {
        void *handle;
        double (*cosine)(double);
        char *error;

        handle = dlopen ("/lib/libm.so.6", RTLD_LAZY);
        if (!handle) {
            fputs (dlerror(), stderr);
            exit(1);
        }

        cosine = dlsym(handle, "cos");
        if ((error = dlerror()) != NULL)  {
            fputs(error, stderr);
            exit(1);
        }

        printf ("%f\n", (*cosine)(2.0));
        dlclose(handle);
    }

             "foo.c",
     build    :
    gcc -o foo foo.c -ldl
     _________________________________________________________

5. 

5.1.   nm

       nm(1)         
     .       
            .      
     nm(1)        
          ,    , 
       .         
          ( 
             ),      
                  (.  -
     -l).

         nm       (symbol
   type)             .      
        :     
         (local),       
           (    -    global,external).   
         T ( 
                 ), 
   D(         ),   (
            ), 
   U( -      
       ),   W(" -weak- ":
                ,
       ).

             ,    
              ,    
           "-"  nm (
         )    grep 
             .   Bourne shell,
           /lib,
   /usr/lib,      (direct)  
   /usr/lib,   /usr/local/lib   "cos"  :
nm -o /lib/* /usr/lib/* /usr/lib/*/* \
      /usr/local/lib/* 2> /dev/null | grep 'cos$'

           nm   
                 
   info:binutils#nm.
     _________________________________________________________

5.2.   (constructor)  
(destructor) 

           
   (initialization)    ""  (cleanup) 
    gcc__attribute__((constructor)) 
   gcc__attribute__((destructor)).     info pages  gcc
         .        constructors
           dlopen()  (   
   main(),           load time). 
     destructors     dlclose
   (        exit()      main(),  
         load time).    C
   (C prototypes)     :
  void __attribute__ ((constructor)) my_init(void);
  void __attribute__ ((destructor)) my_fini(void);

                
         gcc   "-  nostartfiles"    "-nostdlib".  
                 ,        
   /          (  
     ).
     _________________________________________________________

5.2.1.   _init  _fini (/)

           ,  _init 
   _fini,            
            .   ,  
   ,                  
     .       
     -         
            (function   attributes
   constructor/destructor)    ' .

                 
          _init    _fini,    
               .    
          
    module:  _init  _fini.    ``_init ''
     (is  exported)   ,   
         (    dlopen()    
     ).        C,  
            (defined)       
       _init.            
     _fini,      
          (    dlclose()
            -. dlclose(),
          ).    C
       :
  void _init(void);
  void _fini(void);

         ,      
     ".o"      gcc,     
      gcc "- nostartfiles".  
        C   (linking)  
          . ,  
          "multiple-definition"   ("-").
             
            modules         
       .     
   Jim  Mischel      Tim  Gentry        
             _init 
   _fini,             
   .
     _________________________________________________________

5.3.        
(scripts )

             GNU  loader   
              (script  files)  
         scripting  ,  
       .      
           .   ,
      /usr/lib/libc.so      :
/* GNU ld script
   Use the shared library, but some functions are only in
   the static library, so try that secondarily.  */
GROUP ( /lib/libc.so.6 /usr/lib/libc_nonshared.a )

         ,    
   texinfo    scripts    ld  linker (ld  ). 
               info:ld#Options  
   info:ld#Commands,          
   info:ld#Option Commands.
     _________________________________________________________

5.4.   (Symbol versioning)   
 (Version scripts)

   ,               (external
   functions)        ""  (bound)  
     ,    .  
          (out of date),
            interface-   
            ,       
     .

              symbol versioning
   ( )    version scripts ( 
   ).    symbol versioning,     
                   
             
     .         
         ld (man)   vesrion scripts
    http://www.gnu.org/manual/ld-2.9.1/html_node/ld_25.html.
     _________________________________________________________

5.5. GNU libtool

             
             ,    
       GNU libtool      
     .    GNU  libtool       
          (generic  library  support
   script).        libtool            
            
   ,  .    interfaces 
       object  files,      
       (link  libraries),  
   (link    executables),          (debug
   executables),             
   .      libltdl,  
     (portability wrapper)    
      (dynamic   loading   programs).     
   ,                          
   http://www.gnu.org/software/libtool/manual.html
     _________________________________________________________

5.6.     

             
           debugging,      .  
    ,    .

            object files
   ,     debugging     (
               
      ).   ,          
   ,     strip(1)    
   .      strip(1)          
        -    
    .

            
     "-s"    "-s"  GNU ld -  "-S"  
           debugger  (    
   )     ,   "-s"   
              .    
             gcc 
   "-Wl,-S"    "-Wl,-s".      
        ,    
   ,            ""
   .
     _________________________________________________________

5.7.   

         paper  Whirlwind Tutorial on Creating Really
   Teensy  ELF Executables for Linux  .  
                    
     .    ,    
                 
      ,           
         ELF.
     _________________________________________________________

5.8. C++  C

             C++, 
          C,  C++ 
              C  "extern C".
   ,    linker          
     C. ,  compilers  C++ ""
   ("mangle")           C++ (.., 
     ),         
           C (
       ).

               
       C  C ++,     
   "extern  C"      ,   
           .   
      # ifndef (     
         -   ),
        ,   foobar.h,  
          C   C++,    
   :
/* Explain here what foobar does */

#ifndef FOOBAR_H
#define FOOBAR_H

#ifdef __cplusplus
extern "C" {
#endif

 ... header code for foobar goes here ...

#ifdef  __cplusplus
}
#endif
#endif
     _________________________________________________________

5.9.      C++

     developers    KDE          
     GUI    C++     
     ,          
     (relocations).       
       .    Making C++ ready for the desktop
   (by Waldo Bastian)   .
     _________________________________________________________

5.10. Linux Standard Base (LSB -    Linux)

       LSB project      
       (standards)     
           Linux      
          
       Linux.            
   http://www.linuxbase.org.

                   
   LSB-       2002, 
   Developing   LSB-certified   applications:   Five   steps   to
   binary-compatible  Linux  applications '  George Kraft IV
   (Senior  software  engineer,  IBM's  Linux Technology Center).
   ,            
         (standardized compatibility
   layer)         . , 
   LSB          
   C   C++         
   LSB-  compliant  -          
       linker      
     .  ,       
            -   
         LSB  . , 
            "lsbcc"       C/C++
     ( lsbcc    
      -  linking  environment-        
     LSB  ):
 $ CC=lsbcc make myapplication
  (or)
 $ CC=lsbcc ./configure; make myapplication

          lsbappchk 
                    
        LSB:
 $ lsbappchk myapplication

                
       LSB (..  RPM v3.  
     LSB,    add-on software   /opt by
   default).              website    LSB  
    .
     _________________________________________________________

5.11.     
(shared) 

            
            ;  
       ,                  ld
   "--whole-archive"       ,         
           .a files
     .so .

                        
   --whole-archive:
 gcc -shared -Wl,-soname,libmylib.$(VER) -o libmylib.so $(OBJECTS) \
 -Wl,--whole-archive $(LIBS_TO_LINK) -Wl,--no-whole-archive \
 $(REGULAR_LIBS)

            ld, 
          --no-whole-archive, 
        ,      gcc      
        standard .  
       Kendall  Bennett         
      "".
     _________________________________________________________

6.  

                
         (static,   shared,   dynamically
   loaded).   libhello.c    ,
       libhello.h     .  demo_use.c
         caller   .  
           scripts      (script_static   
   script_dynamic),         
            . ,
         demo_dynamic.c      script_dynamic,   
          
   .
     _________________________________________________________

6.1.  libhello.c

/* libhello.c - demonstrate library use. */

#include <stdio.h>

void hello(void) {
  printf("Hello, library world.\n");
}
     _________________________________________________________

6.2.  libhello.h

/* libhello.h - demonstrate library use. */


void hello(void);
     _________________________________________________________

6.3.  demo_use.c

/* demo_use.c -- demonstrate direct use of the "hello" routine */

#include "libhello.h"

int main(void) {
 hello();
 return 0;
}
     _________________________________________________________

6.4.  script_static

#!/bin/sh
# Static library demo

# Create static library's object file, libhello-static.o.
# I'm using the name libhello-static to clearly
# differentiate the static library from the
# dynamic library examples, but you don't need to use
# "-static" in the names of your
# object files or static libraries.

gcc -Wall -g -c -o libhello-static.o libhello.c

# Create static library.

ar rcs libhello-static.a libhello-static.o

# At this point we could just copy libhello-static.a
# somewhere else to use it.
# For demo purposes, we'll just keep the library
# in the current directory.

# Compile demo_use program file.

gcc -Wall -g -c demo_use.c -o demo_use.o

# Create demo_use program; -L. causes "." to be searched during
# creation of the program.  Note that this command causes
# the relevant object file in libhello-static.a to be
# incorporated into file demo_use_static.

gcc -g -o demo_use_static demo_use.o -L. -lhello-static

# Execute the program.

./demo_use_static
     _________________________________________________________

6.5.  script_shared

#!/bin/sh
# Shared library demo

# Create shared library's object file, libhello.o.

gcc -fPIC -Wall -g -c libhello.c

# Create shared library.
# Use -lc to link it against C library, since libhello
# depends on the C library.

gcc -g -shared -Wl,-soname,libhello.so.0 \
    -o libhello.so.0.0 libhello.o -lc

# At this point we could just copy libhello.so.0.0 into
# some directory, say /usr/local/lib.

# Now we need to call ldconfig to fix up the symbolic links.

# Set up the soname.  We could just execute:
# ln -sf libhello.so.0.0 libhello.so.0
# but let's let ldconfig figure it out.

/sbin/ldconfig -n .

# Set up the linker name.
# In a more sophisticated setting, we'd need to make
# sure that if there was an existing linker name,
# and if so, check if it should stay or not.

ln -sf libhello.so.0 libhello.so

# Compile demo_use program file.

gcc -Wall -g -c demo_use.c -o demo_use.o

# Create program demo_use.
# The -L. causes "." to be searched during creation
# of the program; note that this does NOT mean that "."
# will be searched when the program is executed.

gcc -g -o demo_use demo_use.o -L. -lhello

# Execute the program.  Note that we need to tell the program
# where the shared library is, using LD_LIBRARY_PATH.

LD_LIBRARY_PATH="." ./demo_use
     _________________________________________________________

6.6.  demo_dynamic.c

/* demo_dynamic.c -- demonstrate dynamic loading and
   use of the "hello" routine */


/* Need dlfcn.h for the routines to
   dynamically load libraries */
#include <dlfcn.h>

#include <stdlib.h>
#include <stdio.h>

/* Note that we don't have to include "libhello.h".
   However, we do need to specify something related;
   we need to specify a type that will hold the value
   we're going to get from dlsym(). */

/* The type "simple_demo_function" describes a function that
   takes no arguments, and returns no value: */

typedef void (*simple_demo_function)(void);


int main(void) {
 const char *error;
 void *module;
 simple_demo_function demo_function;

 /* Load dynamically loaded library */
 module = dlopen("libhello.so", RTLD_LAZY);
 if (!module) {
   fprintf(stderr, "Couldn't open libhello.so: %s\n",
           dlerror());
   exit(1);
 }

 /* Get symbol */
 dlerror();
 demo_function = dlsym(module, "hello");
 if ((error = dlerror())) {
   fprintf(stderr, "Couldn't find hello: %s\n", error);
   exit(1);
 }

 /* Now call the function in the DL library */
 (*demo_function)();

 /* All done, close things cleanly */
 dlclose(module);
 return 0;
}
     _________________________________________________________

6.7.  script_dynamic

#!/bin/sh
# Dynamically loaded library demo

# Presume that libhello.so and friends have
# been created (see dynamic example).

# Compile demo_dynamic program file into an object file.

gcc -Wall -g -c demo_dynamic.c

# Create program demo_use.
# Note that we don't have to tell it where to search for DL libraries,
# since the only special library this program uses won't be
# loaded until after the program starts up.
# However, we DO need the option -ldl to include the library
# that loads the DL libraries.

gcc -g -o demo_dynamic demo_dynamic.o -ldl

# Execute the program.  Note that we need to tell the
# program where get the dynamically loaded library,
# using LD_LIBRARY_PATH.

LD_LIBRARY_PATH="." ./demo_dynamic
     _________________________________________________________

7.   

          
    :

     * "The GCC HOWTO"   Daniel Barlow. ,  
       HOWTO                  
                    
       queries  .     
         ,    .      HOWTO 
              Linux 
       http://www.tldp.org.
     * "Executable  and  Linkable  Format",     TIS
       (Tool Interface Standards) (    
            "Portable Formats Specification"  
         ).      ELF (
             Linux  GNU gcc),   
        .  
       ftp://tsx-11.mit.edu/pub/linux/packages/GCC/ELF.doc.tar.gz
                    MIT,      
              -    
       "hps"  -        
              "ps",    
           Postscript        
       .
     * "ELF:      ",   Hongjui
       Lu.         ELF 
         Linux      GNU  gcc,        
       ftp://tsx-11.mit.edu/pub/linux/packages/GCC/elf.ps.gz.
     *       ld  "Using  LD,  the  GNU  Linker",
         ld    . 
         http://www.gnu.org/manual/ld-2.9.1.
     *             
            "info",    ld
        gcc.
     _________________________________________________________

8.    

           Copyright  (C)  2000    David .
   Wheeler.     GNU General Public License (GPL).
              .  
     "",     
       ,    :

              -  
       /      
      General Public License  GNU    
     Free Software Foundation -    2  , 
     (       )      
     .

                  
     ,         -   
                     
          .   GNU GPL
       .

              GNU GPL  
           -    ,    Free Software
     Foundation,  Inc.,  59  Temple Place, Suite 330, Boston, MA
     02111-1307 USA

            mirroring   sites, 
   :

     *       mirrors        
         o master site,
     *          o    url        master    site,
       http://www.dwheeler.com/program-library,    hypertext
       link  , 
     *   (David A. Wheeler)  .

                        
       bugs  .     
   bugs            ,   
     mirroring.  o link  master site,  
                   mirror  
   .        
   sites        
        links   -  
         ,  
            
            updates          ,
    .

      ,     , 
         ,    
   ()         
          .      
               - 
       "  "  (public  domain work)  
         .    
     ,      
   : "You must cause the modified files to carry prominent
   notices stating that you changed the files and the date of any
   change".           ,
                 .    
   ,          
     (   David A. Wheeler),  
       ,     , 
   .
