libtool
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

hardcode_direct problem on HP-UX/PA


From: Albert Chin
Subject: hardcode_direct problem on HP-UX/PA
Date: Tue, 25 Apr 2006 13:52:00 -0500
User-agent: Mutt/1.5.6i

Why is hardcode_direct=yes on HP-UX/PA? From libtool.m4:
  _LT_TAGDECL([], [hardcode_direct], [0],
      [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes
      DIR into the resulting binary])

On HP-UX/PA, hardcode_direct=yes and hardcode_minus_L=yes. On this
platform, when you link a shared library with the full path to the .sl
file on the command-line, it embeds the dependent library path as a
"static" entry in the newly-created library. It does not add DIR to
the library runtime path.

On HP-UX/PA, library entries in a shared library are either "static"
or "dynamic". Library entries marked "dynamic" can use the library
runtime path to locate a dependent "dynamic" library if the path
specified for the "dyanmic" library is not found while library entries
marked "static" cannot. Thus, if a library with "static" entries is
relocated, simply setting SHLIB_PATH to the new location won't locate
all the dependent libraries.

As an example, while linking libpng-1.2.4 with latest 1.5 CVS:
  $ /bin/sh ./libtool --tag=CC --mode=link cc  -g
  -I/opt/TWWfsw/zlib11/include    -Wl,+s,+b,/opt/TWWfsw/zlib11/lib
  -L/opt/TWWfsw/zlib11/lib -lz   -o libpng.la -rpath
  /opt/build/china/libpng12/lib -version-info 2:2:0 png.lo pngerror.lo
  pngget.lo pngmem.lo pngpread.lo pngrio.lo pngread.lo pngrtran.lo
  pngrutil.lo pngset.lo pngtrans.lo pngwio.lo pngwrite.lo pngwtran.lo
  pngwutil.lo  -lm 
  cc -b -Wl,+h -Wl,libpng.sl.2 -Wl,+b -Wl,/opt/build/china/libpng12/lib
  -o .libs/libpng.sl.2.2  .libs/png.o .libs/pngerror.o .libs/pngget.o
  .libs/pngmem.o .libs/pngpread.o .libs/pngrio.o .libs/pngread.o
  .libs/pngrtran.o .libs/pngrutil.o .libs/pngset.o .libs/pngtrans.o
  .libs/pngwio.o .libs/pngwrite.o .libs/pngwtran.o .libs/pngwutil.o
  -L/opt/TWWfsw/zlib11/lib /opt/TWWfsw/zlib11/lib/libz.sl -lm -lc
  -Wl,+s -Wl,+b -Wl,/opt/TWWfsw/zlib11/lib
  ...
  $ chatr .libs/libpng.sl.2.2
  .libs/libpng.sl.2.2: 
           shared library 
           shared library dynamic path search:
               SHLIB_PATH     enabled   second 
               embedded path  enabled   first 
/opt/build/china/libpng12/lib:/opt/TWWfsw/zlib11/lib
           internal name:
               libpng.sl.2
           shared library list:
               static    /opt/TWWfsw/zlib11/lib/libz.sl.2
               dynamic   /usr/lib/libm.2
               dynamic   /usr/lib/libc.2
           ...

  $ cp /opt/TWWfsw/zlib11/lib/libz.sl.2 /tmp
  # mv /opt/TWWfsw/zlib11 /opt/TWWfsw/zlib11-
  $ SHLIB_PATH=/tmp ldd .libs/libpng.sl.2.2
          /usr/lib/libc.2 =>      /usr/lib/libc.2
          /usr/lib/libdld.2 =>    /usr/lib/libdld.2
          /usr/lib/libc.2 =>      /usr/lib/libc.2
          /usr/lib/libm.2 =>      /usr/lib/libm.2
  /usr/lib/dld.sl: Can't open shared library: /opt/TWWfsw/zlib11/lib/libz.sl.2
  /usr/lib/dld.sl: No such file or directory

Linking with hardcode_direct=no:
  $ /bin/sh ./libtool --tag=CC --mode=link cc  -g
  -I/opt/TWWfsw/zlib11/include    -Wl,+s,+b,/opt/TWWfsw/zlib11/lib
  -L/opt/TWWfsw/zlib11/lib -lz   -o libpng.la -rpath
  /opt/build/china/libpng12/lib -version-info 2:2:0 png.lo pngerror.lo
  pngget.lo pngmem.lo pngpread.lo pngrio.lo pngread.lo pngrtran.lo
  pngrutil.lo pngset.lo pngtrans.lo pngwio.lo pngwrite.lo pngwtran.lo
  pngwutil.lo  -lm 
  rm -fr  .libs/libpng.a .libs/libpng.la .libs/libpng.lai
  .libs/libpng.sl .libs/libpng.sl.2 .libs/libpng.sl.2.2
  cc -b -Wl,+h -Wl,libpng.sl.2 -Wl,+b -Wl,/opt/build/china/libpng12/lib
  -o .libs/libpng.sl.2.2  .libs/png.o .libs/pngerror.o .libs/pngget.o
  .libs/pngmem.o .libs/pngpread.o .libs/pngrio.o .libs/pngread.o
  .libs/pngrtran.o .libs/pngrutil.o .libs/pngset.o .libs/pngtrans.o
  .libs/pngwio.o .libs/pngwrite.o .libs/pngwtran.o .libs/pngwutil.o
  -L/opt/TWWfsw/zlib11/lib -lz -lm -lc  -Wl,+s -Wl,+b
  -Wl,/opt/TWWfsw/zlib11/lib
  ...

  $ chatr .libs/libpng.sl.2.2
  .libs/libpng.sl.2.2: 
           shared library 
           shared library dynamic path search:
               SHLIB_PATH     enabled   second 
               embedded path  enabled   first 
/opt/build/china/libpng12/lib:/opt/TWWfsw/zlib11/lib
           internal name:
               libpng.sl.2
           shared library list:
               dynamic   /opt/TWWfsw/zlib11/lib/libz.sl.2
               dynamic   /usr/lib/libm.2
               dynamic   /usr/lib/libc.2
           ...
  $ cp /opt/TWWfsw/zlib11/lib/libz.sl.2 /tmp
  # mv /opt/TWWfsw/zlib11 /opt/TWWfsw/zlib11-
  $ SHLIB_PATH=/tmp ldd .libs/libpng.sl.2.2
          /usr/lib/libc.2 =>      /usr/lib/libc.2
          /usr/lib/libdld.2 =>    /usr/lib/libdld.2
          /usr/lib/libc.2 =>      /usr/lib/libc.2
          /usr/lib/libm.2 =>      /usr/lib/libm.2
          /opt/TWWfsw/zlib11/lib/libz.sl.2 =>     /tmp/libz.sl.2
          /usr/lib/libc.2 =>      /usr/lib/libc.2

How do we solve this? Either we set hardcode_direct=no for these
platforms or, in ltmain.in, make it smart enough to check and use
hardcode_minus_L=yes before hardcode_direct=yes.

-- 
albert chin (address@hidden)




reply via email to

[Prev in Thread] Current Thread [Next in Thread]