Undefined reference to `clock_gettime` although `-lrt` is given

前端 未结 1 1028
星月不相逢
星月不相逢 2021-02-03 11:34

I\'ve give -lrt as the last linker flag to the compiler. But still getting this error.

arif@khost:~/sak/sak.exosip$ gcc eXo_init.c -I/opt/osip2/incl         


        
1条回答
  •  挽巷
    挽巷 (楼主)
    2021-02-03 11:45

    Well the problem is solved If i pass this linker flag

    -Wl,--no-as-needed
    

    Before the library list in command line.

    Why this works because in my platform, linker is always passed with -Wl,--as-needed.

    From ld manual :

    --as-needed
           --no-as-needed
               This option affects ELF DT_NEEDED tags for dynamic libraries
               mentioned on the command line after the --as-needed option.
               Normally the linker will add a DT_NEEDED tag for each dynamic
               library mentioned on the command line, regardless of whether the
               library is actually needed or not.  --as-needed causes a DT_NEEDED
               tag to only be emitted for a library that satisfies an undefined
               symbol reference from a regular object file or, if the library is
               not found in the DT_NEEDED lists of other libraries linked up to
               that point, an undefined symbol reference from another dynamic
               library.  --no-as-needed restores the default behaviour.
    

    So when --as-needed is given before a library , liker only links with the libraries which are given in NEEDED section of the library.

    For example,

    -Wl,--as-needed -llibA -llibB -llibC
    

    Here --as-needed is given before libA. So during linking, linker will examine the NEEDED section of libA. If in NEEDED section of libA lists only libC, then the libB will not be linked.

    This specific problem occurred because

    arif@khost:~/sak/sak.exosip$ objdump -p /opt/osip2/lib/libosip2.so.10 | grep NEEDED
      NEEDED               libosipparser2.so.10
      NEEDED               libc.so.6
    

    libosip2 does not lists librt as NEEDED.

    If i pass --no-as-needed, then all the libraries will be linked regardless of what is given in ELF's NEEDED section.

    Although this should not be the case because,

    arif@khost:~/sak/sak.exosip$ nm --demangle /opt/osip2/lib/libosip2.so.10 | grep clock_gettime
                     U clock_gettime
    

    It has undefined symbol clock_gettime which is provided by librt.so.

    Well its actually a fault of the libosip2 devs that their autotools is not working with --as-needed.

    The link command used by osip:

    libtool: link: gcc -shared  -fPIC -DPIC  .libs/ict_fsm.o .libs/ist_fsm.o .libs/nict_fsm.o .libs/nist_fsm.o .libs/ict.o .libs/ist.o .libs/nict.o .libs/nist.o .libs/fsm_misc.o .libs/osip.o .libs/osip_transaction.o .libs/osip_event.o .libs/port_fifo.o .libs/osip_dialog.o .libs/osip_time.o .libs/port_sema.o .libs/port_thread.o .libs/port_condv.o   -Wl,-rpath -Wl,/home/arif/sak/osip/src/osipparser2/.libs -Wl,-rpath -Wl,/opt/osip2-test/lib -lnsl ../osipparser2/.libs/libosipparser2.so    -Wl,-soname -Wl,libosip2.so.10 -o .libs/libosip2.so.10.0.0
    

    So its not linking with librt and thats why its not listing librt in its NEEDED list

    If configured with :

     LDFLAGS="${LDFLAGS} -lrt" ./configure --prefix=/opt/osip2-test/ 
    

    Then the link command becomes :

    libtool: link: gcc -shared  -fPIC -DPIC  .libs/ict_fsm.o .libs/ist_fsm.o .libs/nict_fsm.o .libs/nist_fsm.o .libs/ict.o .libs/ist.o .libs/nict.o .libs/nist.o .libs/fsm_misc.o .libs/osip.o .libs/osip_transaction.o .libs/osip_event.o .libs/port_fifo.o .libs/osip_dialog.o .libs/osip_time.o .libs/port_sema.o .libs/port_thread.o .libs/port_condv.o   -Wl,-rpath -Wl,/home/arif/sak/osip/src/osipparser2/.libs -Wl,-rpath -Wl,/opt/osip2-test/lib -lnsl ../osipparser2/.libs/libosipparser2.so -lrt    -Wl,-soname -Wl,libosip2.so.10 -o .libs/libosip2.so.10.0.0
    

    So its linking with librt. Its also reflected in its ELF:

    arif@khost:~/sak/osip/src/osip2/.libs$ objdump -p libosip2.so.10 | grep NEEDED
      NEEDED               libosipparser2.so.10
      NEEDED               librt.so.1
      NEEDED               libc.so.6
    

    This patch fixes this :

    diff --git a/src/osip2/Makefile.am b/src/osip2/Makefile.am
    index bb0d8f3..b72c22a 100644
    --- a/src/osip2/Makefile.am
    +++ b/src/osip2/Makefile.am
    @@ -14,7 +14,7 @@ libosip2_la_SOURCES+=port_sema.c port_thread.c port_condv.c
     endif
    
     libosip2_la_LDFLAGS = -version-info $(LIBOSIP_SO_VERSION) \
    - $(FSM_LIB) $(EXTRA_LIB) ../osipparser2/libosipparser2.la -no-undefined
    + $(FSM_LIB) $(EXTRA_LIB) ../osipparser2/libosipparser2.la -no-undefined -lrt
    
    
     INCLUDES = -I$(top_srcdir)/includ
    

    Relevant usenet discussion thread : https://groups.google.com/forum/#!topic/comp.unix.programmer/VKbARy6W4AY

    UPDATE:

    osip developer responded to my mail. He fixed it with a different patch (More general solution then mine) http://git.savannah.gnu.org/cgit/osip.git/commit/?id=bd5b1ad58381e4bfce08bad9b66ad00cd28f9b65

    0 讨论(0)
提交回复
热议问题