Menu

#317 missing -lm when building shared lib on OSF/1

open-fixed
5
2006-03-29
2004-01-10
No

For Tcl 8.4.5, when building the shared lib (configure
--enable-shared) on Digital OSF/1 V4.0, user
executables that link against libtcl8.4.so (-ltcl) and
that don't need the math library libm.so themselves,
suddenly need a -lm on the link command line, otherwise
there will be runtime errors due to unresolved symbols
from libm.so. Previously (with Tcl 8.3.4), it was not
necessary to have the -lm flag, so the Tcl upgrade
breaks existing user Makefiles.

I found that building libtcl8.4.so with -lm on the link
command line solves the problem. This seems to put
enough information into libtcl8.4.so for the runtime
linker to be able to resolve all symbols. So instead of

ld -shared -expect_unresolved "*" -o libtcl8.4.so
${OBJS} -rpath
/work/cvim1/src/tcl/tcl8.4.5/install/osf1-alpha/lib

I do

ld -shared -expect_unresolved "*" -o libtcl8.4.so
${OBJS} -lm -rpath
/work/cvim1/src/tcl/tcl8.4.5/install/osf1-alpha/lib

This is easily accomplished by doing

$ gmake SHLIB_LD_LIBS=-lm

So, a way to fix this problem would be to change line
1345 in unix/tcl.m4 from

SHLIB_LD_LIBS=""

to

SHLIB_LD_LIBS="-lm"

Discussion

  • Jeffrey Hobbs

    Jeffrey Hobbs - 2006-03-28
    • status: open --> pending-fixed
     
  • Jeffrey Hobbs

    Jeffrey Hobbs - 2006-03-28

    Logged In: YES
    user_id=72656

    MATH_LIBS is included in TCL_LIBS for unix, which is where
    -lm would be, unless 'sin' is in libc on OSF.

     
  • Richard Calmbach

    • status: pending-fixed --> open-fixed
     
  • Richard Calmbach

    Logged In: YES
    user_id=687758

    The output of

    nm -Pn libm.a | grep sin

    includes this line:

    sin T 0x00000000000010 0x00000000000008

    and the man page defines type 'T' as "External text". I
    assume this means 'sin' is actually defined in libm.a.

    We don't really use OSF1 any more, but if there is some
    quick test you want me to do, let me know. All I know is
    that the rather simple fix given solved the problem at the time.