From: Thomas Tanner Date: Sat, 17 Jul 1999 09:00:53 +0000 (+0000) Subject: * NEWS, TODO: updated (pic flags) X-Git-Tag: multi-language-fork~56 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=cbc1402596a724c08162a5027a6ffae00c700dde;p=thirdparty%2Flibtool.git * NEWS, TODO: updated (pic flags) * libtool.m4 (AC_PROG_LIBTOOL): added --with-pic flag * ltconfig.in: new pic_mode variable and --prefer[-non]-pic flags, fixed the strip check (reported by Keith Bostic ) * ltmain.in (compile mode): build only PIC/non-PIC code depending on pic_mode * libltdl/README: document the supported dlopen interfaces * doc/libtool.texi (tests): documented new tests * tests/Makefile.am: added new tests * tests/demo-pic.test: new test to test --with-pic * tests/demo-nopic.test: new test to test --without-pic * tests/build-relink2.test: variant of build-relink.test that uses depdemo --- diff --git a/ChangeLog b/ChangeLog index 4336eefb8..56b7cc5a6 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,19 @@ +1999-07-17 Thomas Tanner + + * NEWS, TODO: updated (pic flags) + * libtool.m4 (AC_PROG_LIBTOOL): added --with-pic flag + * ltconfig.in: new pic_mode variable and --prefer[-non]-pic flags, + fixed the strip check (reported by Keith Bostic ) + * ltmain.in (compile mode): build only PIC/non-PIC code depending + on pic_mode + * libltdl/README: document the supported dlopen interfaces + * doc/libtool.texi (tests): documented new tests + * tests/Makefile.am: added new tests + * tests/demo-pic.test: new test to test --with-pic + * tests/demo-nopic.test: new test to test --without-pic + * tests/build-relink2.test: variant of build-relink.test that + uses depdemo + 1999-07-09 Olly Betts * doc/libtool.texi (C++ Libraries): fixed a typo. diff --git a/NEWS b/NEWS index 688390a8c..2361e45a9 100644 --- a/NEWS +++ b/NEWS @@ -1,5 +1,9 @@ NEWS - list of user-visible changes between releases of GNU Libtool +New in 1.3d: 1999-??-??; CVS version 1.3c, Libtool team: +* New --with-pic flag to control the generation of PIC/non-PIC code. +* Various bugfixes + New in 1.3b: 1999-07-02; CVS version 1.3a, Libtool team: * Complete inter-library dependencies support. It's now possible to link libtool libraries against other libtool libraries. diff --git a/TODO b/TODO index e9ddb9763..7278a739a 100644 --- a/TODO +++ b/TODO @@ -33,13 +33,6 @@ In the future: possible would greatly improve libltdl's ability to be embedded in and used by other systems. -* Pavel Roskin writes about --enable-pic-static: - Is it true that the objects which are suitable for building shared - libraries are always suitable for building static libraries? If yes, - would it be a good idea to have an option which would enable building - shared and static libraries from the same object files. 50% speedup is - worth considering IMHO. - * Support -dlopen/dlpreopen for libraries. This requires adding two new variables (dlopen/dlpreopen) to the pseudo-library and later dlopening them when a program is linked diff --git a/doc/libtool.texi b/doc/libtool.texi index 4d8803f1a..a2193379a 100644 --- a/doc/libtool.texi +++ b/doc/libtool.texi @@ -3295,6 +3295,8 @@ shared libraries (@samp{--disable-static}). @itemx demo-static.test @itemx demo-shared.test @itemx demo-nofast.test +@itemx demo-pic.test +@itemx demo-nopic.test @pindex demo-conf.test @pindex demo-exec.test @pindex demo-inst.test @@ -3303,6 +3305,8 @@ shared libraries (@samp{--disable-static}). @pindex demo-static.test @pindex demo-shared.test @pindex demo-nofast.test +@pindex demo-pic.test +@pindex demo-nopic.test These programs check to see that the @file{demo} subdirectory of the libtool distribution can be configured, built, installed, and uninstalled correctly. @@ -3317,7 +3321,10 @@ libtool configurations: @file{demo-conf.test} configures (@samp{--disable-shared}), and @file{demo-shared.test} builds only shared libraries (@samp{--disable-static}). @file{demo-nofast.test} configures @file{demo/libtool} to -disable the fast-install mode (@samp{--enable-fast-install=no}. +disable the fast-install mode (@samp{--enable-fast-install=no}). +@file{demo-pic.test} configures @file{demo/libtool} to +prefer building PIC code (@samp{--with-pic}), @file{demo-nopic.test} +to prefer non-PIC code (@samp{--without-pic}). @item deplibs.test @pindex deplibs.test diff --git a/libltdl/README b/libltdl/README index 0b08ae281..e57b99f21 100644 --- a/libltdl/README +++ b/libltdl/README @@ -1 +1,9 @@ This is GNU libltdl, a system independent dlopen wrapper for GNU libtool. + +It supports the following dlopen interfaces: +* dlopen (Solaris, Linux and various BSD flavors) +* shl_load (HP-UX) +* LoadLibrary (Win16 and Win32) +* load_add_on (BeOS) +* GNU DLD (emulates dynamic linking for static libraries) +* libtool's dlpreopen diff --git a/libtool.m4 b/libtool.m4 index 2ad32064d..fc24e1176 100644 --- a/libtool.m4 +++ b/libtool.m4 @@ -21,7 +21,7 @@ ## configuration script generated by Autoconf, you may include it under ## the same distribution terms that you use for the rest of that program. -# serial 40 AC_PROG_LIBTOOL +# serial 41 AC_PROG_LIBTOOL AC_DEFUN(AC_PROG_LIBTOOL, [AC_REQUIRE([AC_LIBTOOL_SETUP])dnl @@ -82,6 +82,12 @@ AC_ARG_ENABLE(libtool-lock, test "x$enable_libtool_lock" = xno && libtool_flags="$libtool_flags --disable-lock" test x"$silent" = xyes && libtool_flags="$libtool_flags --silent" +AC_ARG_WITH(pic, + [ --with-pic try to use only PIC/non-PIC objects [default=use both]], + pic_mode="$withval", pic_mode=default) +test x"$pic_mode" = xyes && libtool_flags="$libtool_flags --prefer-pic" +test x"$pic_mode" = xno && libtool_flags="$libtool_flags --prefer-non-pic" + # Some flags need to be propagated to the compiler or linker for good # libtool support. case "$host" in diff --git a/ltconfig.in b/ltconfig.in index 535fcb42d..a0817d0db 100755 --- a/ltconfig.in +++ b/ltconfig.in @@ -187,6 +187,7 @@ enable_static=yes enable_fast_install=yes enable_dlopen=unknown enable_win32_dll=no +pic_mode=default ltmain= silent= srcdir= @@ -257,6 +258,8 @@ Generate a system-specific libtool script. --version output version information and exit --with-gcc assume that the GNU C compiler will be used --with-gnu-ld assume that the C compiler uses the GNU linker + --prefer-pic try to use only PIC objects + --prefer-non-pic try to use only non-PIC objects --disable-lock disable file locking --cache-file=FILE configure cache file @@ -298,6 +301,9 @@ EOM --with-gcc) with_gcc=yes ;; --with-gnu-ld) with_gnu_ld=yes ;; + --prefer-pic) pic_mode=yes ;; + --prefer-non-pic) pic_mode=no ;; + --disable-lock) need_locks=no ;; --cache-file=*) cache_file="$optarg" ;; @@ -1669,7 +1675,7 @@ fi echo "$ac_t$hardcode_action" 1>&6 echo $ac_n "checking whether stripping libraries is possible... $ac_c" 1>&6 -if test -n "$STRIP" && $STRIP -V | grep "GNU strip" >/dev/null; then +if test -n "$STRIP" && $STRIP -V 2>&1 | grep "GNU strip" >/dev/null; then test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" test -z "$striplib" && striplib="$STRIP --strip-unneeded" echo "${ac_t}yes" 1>&6 @@ -2280,6 +2286,19 @@ elif test "$shlibpath_overrides_runpath" = yes || enable_fast_install=needless fi +# Check whether we must set pic_mode to default +test -z "$pic_flag" && pic_mode=default +# On Cygwin there's no "real" PIC flag so we must build both object types +case "$host_os" in +cygwin* | mingw* | os2*) + pic_mode=default + ;; +esac +if test $pic_mode = no && test "$deplibs_check_method" != pass_all; then + # non-PIC code in shared libraries is not supported + pic_mode=default +fi + if test "x$enable_dlopen" != xyes; then enable_dlopen=unknown enable_dlopen_self=unknown @@ -2902,6 +2921,7 @@ exeext="$exeext" # Additional compiler flags for building library objects. pic_flag=$pic_flag +pic_mode=$pic_mode # Does compiler simultaneously support -c and -o options? compiler_c_o=$compiler_c_o diff --git a/ltmain.in b/ltmain.in index 807bff95e..33575ce5a 100644 --- a/ltmain.in +++ b/ltmain.in @@ -434,8 +434,13 @@ compiler." # Without this assignment, base_compile gets emptied. fbsd_hideous_sh_bug=$base_compile - # All platforms use -DPIC, to notify preprocessed assembler code. - command="$base_compile $pic_flag -DPIC $srcfile" + if test "$pic_mode" != no; then + # All platforms use -DPIC, to notify preprocessed assembler code. + command="$base_compile $pic_flag -DPIC $srcfile" + else + # Don't build PIC code + command="$base_compile $srcfile" + fi if test "$build_old_libs" = yes; then lo_libobj="$libobj" dir=`$echo "X$libobj" | $Xsed -e 's%/[^/]*$%%'` @@ -506,7 +511,8 @@ compiler." fi # If we have no pic_flag, then copy the object into place and finish. - if test -z "$pic_flag" && test "$build_old_libs" = yes; then + if (test -z "$pic_flag" || test "$pic_mode" != default) && + test "$build_old_libs" = yes; then # Rename the .lo from within objdir to obj if test -f $obj; then $show $rm $obj @@ -538,7 +544,13 @@ compiler." # Only build a position-dependent object if we build old libraries. if test "$build_old_libs" = yes; then - command="$base_compile $srcfile" + if test "$pic_mode" != yes; then + # Don't build PIC code + command="$base_compile $srcfile" + else + # All platforms use -DPIC, to notify preprocessed assembler code. + command="$base_compile $pic_flag -DPIC $srcfile" + fi if test "$compiler_c_o" = yes; then command="$command -o $obj" output_obj="$obj" @@ -2613,7 +2625,7 @@ EOF exit 0 fi - if test -n "$pic_flag"; then + if test -n "$pic_flag" || test "$pic_mode" != default; then # Only do commands if we really have different PIC objects. reload_objs="$libobjs $reload_conv_objs" output="$libobj" diff --git a/tests/Makefile.am b/tests/Makefile.am index 9385a4590..83f4a13d9 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -18,13 +18,15 @@ TESTS = cdemo-static.test cdemo-make.test cdemo-exec.test \ mdemo-inst.test mdemo-unst.test dryrun.test \ demo-nofast.test demo-make.test demo-exec.test \ demo-inst.test demo-unst.test \ + demo-pic.test demo-make.test demo-exec.test \ + demo-nopic.test demo-make.test demo-exec.test \ depdemo-nofast.test depdemo-make.test depdemo-exec.test \ depdemo-inst.test depdemo-unst.test \ cdemo-shared.test cdemo-make.test cdemo-exec.test \ demo-shared.test demo-make.test demo-exec.test demo-inst.test \ hardcode.test build-relink.test noinst-link.test demo-unst.test \ depdemo-shared.test depdemo-make.test depdemo-exec.test \ - depdemo-inst.test depdemo-unst.test \ + depdemo-inst.test build-relink2.test depdemo-unst.test \ mdemo-shared.test mdemo-make.test mdemo-exec.test \ mdemo-inst.test mdemo-unst.test \ assign.test link.test link-2.test nomode.test \ diff --git a/tests/build-relink2.test b/tests/build-relink2.test new file mode 100755 index 000000000..370fb4fc6 --- /dev/null +++ b/tests/build-relink2.test @@ -0,0 +1,121 @@ +#! /bin/sh +# build-relink2.test - check to see whether shlibpath overrides runpath + +# Test script header. +need_prefix=yes +if test -z "$srcdir"; then + srcdir=`echo "$0" | sed 's%/[^/]*$%%'` + test "$srcdir" = "$0" && srcdir=. + test "${VERBOSE+set}" != "set" && VERBOSE=yes +fi +. $srcdir/defs || exit 1 + +# Check that things are built. +if test -f $prefix/lib/extra/libl3.la && cd ../depdemo && test -f l3/libl3.la; then : +else + echo "You must run depdemo-inst.test before $0" 1>&2 + exit 77 +fi + +# Check to make sure we have a dynamic library. +library_names=NONE +eval `egrep -e '^library_names=' ./l3/libl3.la 2>/dev/null` + +if test "$library_names" = NONE; then + echo "library_names not set in ../depdemo/l3/libl3.la" 1>&2 + exit 1 +elif test -z "$library_names"; then + echo "= Exiting: ../depdemo/l3/libl3.la is not a shared library" + exit 77 +fi + +# Unfortunately, we need access to libtool internals for this test. +objdir=NONE +eval `egrep -e '^objdir=' ./libtool 2>/dev/null` +if test "$objdir" = NONE; then + echo "objdir not set in ../depdemo/libtool" 1>&2 + exit 1 +fi + +shlibpath_overrides_runpath=NONE +eval `egrep -e '^shlibpath_overrides_runpath=' ./libtool 2>/dev/null` +if test "$shlibpath_overrides_runpath" = NONE; then + echo "shlibpath_overrides_runpath not set in ../depdemo/libtool" 1>&2 + exit 1 +fi + +hardcode_action=NONE +eval `egrep -e '^hardcode_action=' ./libtool 2>/dev/null` +if test "$hardcode_action" = NONE; then + echo "hardcode_action not set in ../depdemo/libtool" 1>&2 + exit 1 +fi + +hardcode_direct=NONE +eval `egrep -e '^hardcode_direct=' ./libtool 2>/dev/null` +if test "$hardcode_direct" = NONE; then + echo "hardcode_direct not set in ../depdemo/libtool" 1>&2 + exit 1 +fi + +hardcode_into_libs=NONE +eval `egrep -e '^hardcode_into_libs=' ./libtool 2>/dev/null` +if test "$hardcode_into_libs" = NONE; then + echo "hardcode_into_libs not set in ../depdemo/libtool" 1>&2 + exit 1 +fi + +./depdemo # so that it links on-demand if needed + +echo "removing libl3.la from ../depdemo/l3" +rm -rf l3/libl3.la l3/$objdir + +echo "running ../depdemo/depdemo" +if ./depdemo; then + : +elif test "x,$hardcode_action,$hardcode_direct" = x,relink,yes; then + echo "Ok, uninstalled programs fail after uninstalled libraries are removed" + echo "This works in other configurations, but not in this particular one" +else + echo "= Exiting: ../depdemo/depdemo does not run, maybe libl3 was not installed" + exit 1 +fi + +echo "linking a broken ../depdemo/l3/libl3.la" +if (cd l3; $make libl3.la libl3_la_OBJECTS=../l2/l2.lo); then + : +else + echo "= Exiting: cannot link broken libl3.la" + exit 1 +fi +rm -f l3/libl3.la + +echo "running ../depdemo/depdemo with broken libl3.la" +if (./depdemo) 2>&1; then + echo "= Exiting: ../depdemo/depdemo runs even though libl3.la is incomplete" + echo "shlibpath_overrides_runpath should be set to no" + exit 1 +else + echo "Failed, as expected" +fi + +if test "x$hardcode_action" = xrelink || + test "x$hardcode_into_libs" = xyes; then + echo "= Exiting: install-time relinking is required" + exit 0 +fi + +if test "$shlibpath_overrides_runpath" != yes; then + rm -f $objdir/lt-depdemo || exit 1 + cp $objdir/depdemo $objdir/lt-depdemo || exit 1 + echo "running ../depdemo/depdemo with installed libl3.la" + if ./depdemo; then + echo "Worked, as expected" + else + echo "shlibpath_overrides_runpath should be set to yes" + status=1 + fi + rm -f $objdir/lt-depdemo +fi + +exit $status diff --git a/tests/demo-nopic.test b/tests/demo-nopic.test new file mode 100755 index 000000000..9c4e60e6b --- /dev/null +++ b/tests/demo-nopic.test @@ -0,0 +1,30 @@ +#! /bin/sh +# demo-nopic.test - try configuring the ../demo subdirectory + +# Test script header. +need_prefix=no +if test -z "$srcdir"; then + srcdir=`echo "$0" | sed 's%/[^/]*$%%'` + test "$srcdir" = "$0" && srcdir=. + test "${VERBOSE+set}" != "set" && VERBOSE=yes +fi +. $srcdir/defs || exit 1 + +# Maybe we have a VPATH build, in which case, create a new subdir. +test -d ../demo || mkdir ../demo + +# Change to our build directory. +cd ../demo || exit 1 + +# Possibly clean up the distribution. +if test -f Makefile; then + echo "= Running $make distclean in ../demo" + $make distclean +fi +rm -f config.cache + +# Configure the demonstration. +echo "= Configuring in ../demo (prefix=$prefix) with --without-pic" +CONFIG_SITE=/dev/null ${CONFIG_SHELL-/bin/sh} $srcdir/../demo/configure --srcdir=$srcdir/../demo --prefix=$prefix --with-pic=no || exit 1 + +exit 0 diff --git a/tests/demo-pic.test b/tests/demo-pic.test new file mode 100755 index 000000000..9a4224f27 --- /dev/null +++ b/tests/demo-pic.test @@ -0,0 +1,30 @@ +#! /bin/sh +# demo-pic.test - try configuring the ../demo subdirectory + +# Test script header. +need_prefix=no +if test -z "$srcdir"; then + srcdir=`echo "$0" | sed 's%/[^/]*$%%'` + test "$srcdir" = "$0" && srcdir=. + test "${VERBOSE+set}" != "set" && VERBOSE=yes +fi +. $srcdir/defs || exit 1 + +# Maybe we have a VPATH build, in which case, create a new subdir. +test -d ../demo || mkdir ../demo + +# Change to our build directory. +cd ../demo || exit 1 + +# Possibly clean up the distribution. +if test -f Makefile; then + echo "= Running $make distclean in ../demo" + $make distclean +fi +rm -f config.cache + +# Configure the demonstration. +echo "= Configuring in ../demo (prefix=$prefix) with --with-pic" +CONFIG_SITE=/dev/null ${CONFIG_SHELL-/bin/sh} $srcdir/../demo/configure --srcdir=$srcdir/../demo --prefix=$prefix --with-pic=yes || exit 1 + +exit 0