]> git.ipfire.org Git - thirdparty/libtool.git/commitdiff
*** empty log message ***
authorGordon Matzigkeit <gord@gnu.ai.mit.edu>
Tue, 29 Jul 1997 18:31:08 +0000 (18:31 +0000)
committerGordon Matzigkeit <gord@gnu.org>
Tue, 29 Jul 1997 18:31:08 +0000 (18:31 +0000)
ChangeLog
NEWS
demo/dlmain.c
doc/libtool.texi
doc/platforms.texi
ltconfig.in
ltmain.sh.in

index d5c7b466c094067c58fd7fb31fc199e4bc778362..92fce9de74321399fdebb6701d0e35adef6cc3cf 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,8 +1,28 @@
+Tue Jul 29 11:52:10 1997  Gordon Matzigkeit  <gord@gnu.ai.mit.edu>
+
+       * ltmain.sh.in: Add NLS environment variable handling copied from
+       ltconfig.in.  Reported by Akim Demaille.
+
+       * demo/dlmain.c (main): Use dld_preloaded_symbol_count to display
+       a message about the sortedness of the symbol table.
+
+       * ltconfig.in (nlist): Use an nlist convenience variable, so that
+       code can be shared directly with ltmain.sh.in.
+
+       * ltconfig.in, ltmain.sh.in (dld_preloaded_symbol_count): Count up
+       the number of symbols in the dld_preloaded_symbols.  Set to `-1'
+       if the list wasn't both sorted and counted.  This allows
+       applications to do a quick binary search, if they are so inclined.
+
 Fri Jul 25 10:13:49 1997  Gordon Matzigkeit  <gord@gnu.ai.mit.edu>
 
        * ltmain.sh.in (link): Remove code for `-version-file', since it
-       has been long-deprecated.
-       Disable static linking if hardcode_direct is unsupported.
+       has been long-deprecated.
+
+       Disable static linking if hardcode_direct is unsupported and there
+       is no working link_static_flag.  This provides correct behaviour
+       for all cases on AIX 3, regardless of whether collect2 is broken
+       or not.  Reported by Mark Kettenis.
 
        * ltconfig.in: Fix typo in test polarity.  From Mark Kettenis.
 
diff --git a/NEWS b/NEWS
index 682732db3e80cef9737109deb3f9641a2995ea35..c6bf3315aa13153d292a7e5d96462485171b652e 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -1,13 +1,16 @@
 NEWS - list of user-visible changes between releases of GNU libtool.
 
-New in 1.0a:
+New in 1.0b:
 * Bug fixes.
-* Full support for dynamically loaded modules, even on static-only
-  platforms, via new `-dlopen' and `-pre-dlopen' link flags.
-* New tests for a BSD-compatible `nm' program, required for dlopened
-  modules.
+* Full support for broken collect2 on AIX 3.  Now, shared libraries
+  can be built with all working versions of GCC.
 * Deleted `dlname' mode.  Dlopen applications should only use the
   runtime search method described in (libtool)Finding the dlname.
+* Experimental support for dynamically loaded modules, even on
+  static-only platforms, via new `-dlopen' and `-pre-dlopen' link
+  flags.
+* New tests for a BSD-compatible `nm' program, required for dlopened
+  modules.
 \f
 New in 1.0:
 * Bug fixes.
index f52d5def162d22eae74457f0d4938162c3802fd6..90afd7a7ecff18a800d7c1f0852c71338f507d35 100644 (file)
@@ -28,6 +28,7 @@ struct dld_symlist
 };
 
 extern struct dld_symlist dld_preloaded_symbols[];
+extern int dld_preloaded_symbol_count;
 
 int
 main (argc, argv)
@@ -41,6 +42,11 @@ main (argc, argv)
 
   printf ("Welcome to *modular* GNU Hell!\n");
 
+  if (dld_preloaded_symbol_count < 0)
+    printf ("Sorry, the symbol list is not sorted and unique.\n");
+  else
+    printf ("Yippee!  The symbol list is both sorted and unique.\n");
+
   /* Look up the symbols we require for this demonstration. */
   s = dld_preloaded_symbols;
   while (s->name)
index bfc5c9d08c492876da0dfc972148cd2132210955..9ac33addde30e9677cd8f4fa72ce97ff6d3cd266 100644 (file)
@@ -164,7 +164,8 @@ Tips for interface design
 
 Dlopened modules
 
-* Exporting dynamic symbols::   Preparing files to be dlopened.
+* Building modules::            Creating dlopenable objects and libraries.
+* Dlpreopening::
 * Finding the dlname::          Choosing the right file to @code{dlopen(3)}.
 * Dlopen issues::               Unresolved problems that need your attention.
 
@@ -1879,18 +1880,10 @@ interpreted language.  In fact, dlopen calls are frequently used in
 language interpreters to provide an efficient way to extend the
 language.
 
-On most operating systems, dlopened modules must be compiled as PIC.
-This restriction simplifies the implementation of the @code{dlopen(3)}
-family of functions by avoiding symbol relocation.  ``True'' dlopen
-implementations, such as the unportable GNU DLD 3 implementation
-(@pxref{Top,, Introduction, dld, The DLD Manual}), don't have this
-restriction, as they can perform relocation at runtime.
-
-As of version @value{VERSION}, libtool provides only minimal support for
-dlopened modules, and this support is guaranteed to change and be
-redesigned in the near future.  Because there is not a very high
-proportion of applications that use dlopening, adding this support to
-libtool was not deemed a priority for the 1.0 release.
+As of version @value{VERSION}, libtool provides experimental support for
+dlopened modules, which does not radically simplify the development of
+dlopening applications.  However, this support is designed to be a
+portable foundation for generic, higher-level dlopen functions.
 
 This chapter discusses the preliminary support that libtool offers, and
 how you as a dlopen application developer might use libtool to generate
@@ -1899,21 +1892,23 @@ experimental features, and not to rely on them for easy answers to the
 problems associated with dlopened modules.
 
 @menu
-* Exporting dynamic symbols::   Preparing files to be dlopened.
+* Building modules::            Creating dlopenable objects and libraries.
+* Dlpreopening::
 * Finding the dlname::          Choosing the right file to @code{dlopen(3)}.
 * Dlopen issues::               Unresolved problems that need your attention.
 @end menu
 
-@node Exporting dynamic symbols
-@section Exporting dynamic symbols
+@node Building modules
+@section Building modules to dlopen
 
-In order for a symbol to be dynamically resolved (typically using the
-@code{dlsym(3)} function), it must be specially declared in the object
-module where it is defined.
+On some operating systems, a program symbol must be specially declared
+in order to be dynamically resolved with the @code{dlsym(3)} (or
+equivalent) function.
 
 Libtool provides the @samp{-export-dynamic} link flag (@pxref{Link
 mode}), which does this declaration.  You need to use this flag if you
-are linking a shared library that will be dlopened.
+are linking an application program that dlopens other modules or a
+libtool library that will also be dlopened.
 
 For example, if we wanted to build a shared library, @file{libhello},
 that would later be dlopened by an application, we would add
@@ -1936,6 +1931,42 @@ burger$ @kbd{libtool gcc -export-dynamic -o hell-dlopener main.o}
 burger$
 @end example
 
+@node Dlpreopening
+@section Dlpreopening
+
+Libtool provides special support for dlopening libtool object and
+libtool library files, so that their symbols can be resolved @emph{even
+on platforms without any @code{dlopen(3)} and @code{dlsym(3)}
+functions.}.
+
+Consider the following alternative ways of loading code into your
+program, in order of increasing ``laziness'':
+
+@enumerate 1
+@item
+Linking against object files that become part of the program executable,
+whether or not they are referenced.  If an object file cannot be found,
+then the linker refuses to create the executable.
+
+@item
+Declaring a static library to the linker, so that it is searched at link
+time in order to satisfy any undefined references in the above object
+files.  If the static library cannot be found, then the linker refuses
+to link the executable.
+
+@item
+Declaring a shared library to the runtime linker, so that it is searched
+at runtime in order to satisfy any undefined references in the above
+files.  If the shared library cannot be found, then the dynamic linker
+aborts the program before it runs.
+
+@item
+Dlopening a module, so that the application can resolve its own,
+dynamically-computed references.  If there is an error opening the
+module, then the application can
+@end enumerate
+
+
 @node Finding the dlname
 @section Finding the correct name to dlopen
 @cindex Names of dynamic modules
index b463871f006a862ee8be391d3ddc335089a06bb1..7af819ca279c889014184b8253e1544ac800a695 100644 (file)
@@ -23,8 +23,8 @@ mips-sgi-irix6.2             cc -n32   0.9       ok
 mipsel-unknown-openbsd2.1    gcc       1.0       ok
 powerpc-ibm-aix4.1.4.0       xlc       1.0       ok
 powerpc-ibm-aix4.1.4.0       gcc       1.0       ok
-rs6000-ibm-aix3.2.5          xlc       0.9h      ok
-rs6000-ibm-aix3.2.5          gcc       0.9h      ok*
+rs6000-ibm-aix3.2.5          xlc       1.0a      ok
+rs6000-ibm-aix3.2.5          gcc       1.0a      ok*
 sparc-sun-linux2.1.23        gcc       0.9h      ok
 sparc-sun-sunos4.1.4         cc        1.0       ok
 sparc-sun-sunos4.1.4         gcc       1.0       ok
@@ -34,5 +34,6 @@ sparc-sun-solaris2.5         cc        1.0a      ok
 sparc-sun-solaris2.5         gcc       1.0a      ok
 --------------------------------------------------------
 
-* Libtool will not build shared libraries because of a bug in
-GCC 2.7.2.2's collect2 linker program.
+* Some versions of GCC's collect2 linker program cannot link trivial
+static binaries on AIX 3.  For these configurations, libtool's `-static'
+flag has no effect.
index 7c075b15297841bf8dddd3011efd5f6b8d88d3c7..62c1fabe2b3240c38863026c1bf3db512e88cba2 100755 (executable)
@@ -65,8 +65,6 @@ old_LN_S="$LN_S"
 old_NM="$NM"
 old_RANLIB="$RANLIB"
 
-test -z "$AR" && AR=ar
-
 # Parse the command line options.
 args=
 prev=
@@ -275,6 +273,9 @@ host_os=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
 old_archive_cmds='$AR cru $oldlib$oldobjs'
 old_postinstall_cmds='chmod 644 $oldlib'
 
+# Set a sane default for `AR'.
+test -z "$AR" && AR=ar
+
 # If RANLIB is not set, then run the test.
 if test "${RANLIB+set}" != "set"; then
   result=no
@@ -771,23 +772,36 @@ EOF
 # LINENO
 if { (eval echo $progname:771: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; } && test -s conftest.o; then
   # Now try to grab the symbols. LINENO
-  if { echo "$progname:773: eval \"$NM conftest.o | $global_symbol_pipe > conftest.nm\"" >&5; eval "$NM conftest.o | $global_symbol_pipe > conftest.nm 2>&5"; } && test -s conftest.nm; then
+  nlist=conftest.nm
+  if { echo "$progname:773: eval \"$NM conftest.o | $global_symbol_pipe > $nlist\"" >&5; eval "$NM conftest.o | $global_symbol_pipe > $nlist 2>&5"; } && test -s "$nlist"; then
 
     # Try sorting and uniquifying the output.
-    sort conftest.nm | uniq > conftest.nmT && mv -f conftest.nmT conftest.nm
+    if sort "$nlist" | uniq > "$nlist"T; then
+      mv -f "$nlist"T "$nlist"
+      wcout=`wc "$nlist" 2>/dev/null`
+      count=`echo "$wcout" | sed 's/^[         ]*\([0-9][0-9]*\).*$/\1/'`
+      test "$wcout" = "$count" && count=-1
+    else
+      rm -f "$nlist"T
+      count=-1
+    fi
 
     # Make sure that we snagged all the symbols we need.
-    if egrep ' nm_test_var$' conftest.nm >/dev/null; then
-      if egrep ' nm_test_func$' conftest.nm >/dev/null; then
+    if egrep ' nm_test_var$' "$nlist" >/dev/null; then
+      if egrep ' nm_test_func$' "$nlist" >/dev/null; then
         # Now generate the symbol file.
-        sed 's/^.* \(.*\)$/extern char \1;/' < conftest.nm > conftest.c
-       cat <<\EOF >> conftest.c
+        sed 's/^.* \(.*\)$/extern char \1;/' < "$nlist" > conftest.c
+
+       cat <<EOF >> conftest.c
 #if defined (__STDC__) && __STDC__
 # define __ptr_t void *
 #else
 # define __ptr_t char *
 #endif
 
+/* The number of symbols in dld_preloaded_symbols, -1 if unsorted. */
+int dld_preloaded_symbol_count = $count;
+
 /* The mapping between symbol names and symbols. */
 struct {
   char *name;
@@ -796,7 +810,7 @@ struct {
 dld_preloaded_symbols[] =
 {
 EOF
-        sed 's/^\(.*\) \(.*\)$/  {"\1", \&\2},/' < conftest.nm >> conftest.c
+        sed 's/^\(.*\) \(.*\)$/  {"\1", \&\2},/' < "$nlist" >> conftest.c
         cat <<\EOF >> conftest.c
   {0},
 };
@@ -817,10 +831,10 @@ EOF
         LIBS="$save_LIBS"
       fi
     else
-      echo "cannot find nm_test_func in conftest.nm" >&5
+      echo "cannot find nm_test_func in $nlist" >&5
     fi
   else
-    echo "cannot find nm_test_var in conftest.nm" >&5
+    echo "cannot find nm_test_var in $nlist" >&5
   fi
 else
   echo "$progname: failed program was:" >&5
index 570e968a625438c367efa92fdfbce6fbbf866bbe..1ce3b3f05a350823d71232f15c443cbf9749e5c7 100644 (file)
@@ -38,6 +38,13 @@ mv="mv -f"
 objdir=.libs
 rm="rm -f"
 
+# NLS nuisances.
+# Only set LANG and LC_ALL to C if already set.
+# These must not be set unconditionally because not all systems understand
+# e.g. LANG=C (notably SCO).
+if test "${LC_ALL+set}" = set; then LC_ALL=C; export LC_ALL; fi
+if test "${LANG+set}"   = set; then LANG=C;   export LANG;   fi
+
 if test "$LTCONFIG_VERSION" != "$VERSION"; then
   echo "$progname: ltconfig version \`$LTCONFIG_VERSION' does not match $PROGRAM version \`$VERSION'" 1>&2
   echo "Fatal configuration error.  See the $PACKAGE docs for more information." 1>&2
@@ -972,8 +979,16 @@ if test -z "$show_help"; then
         # Parse the name list into a C file.
         echo "creating $dlsyms"
         if test -z "$run"; then
-          # Try sorting and uniquifying the output.
-          sort "$nlist" | uniq > "$nlist"T && mv -f "$nlist"T "$nlist"
+         # Try sorting and uniquifying the output.
+         if sort "$nlist" | uniq > "$nlist"T; then
+           mv -f "$nlist"T "$nlist"
+           wcout=`wc "$nlist" 2>/dev/null`
+           count=`echo "$wcout" | sed 's/^[    ]*\([0-9][0-9]*\).*$/\1/'`
+           test "$wcout" = "$count" && count=-1
+         else
+           rm -f "$nlist"T
+           count=-1
+         fi
 
           cat <<EOF > "$dlsyms"
 /* $dlsyms - symbol resolution table for \`$output' dlsym emulation. */
@@ -982,13 +997,13 @@ if test -z "$show_help"; then
 /* External symbol declarations for the compiler. */
 EOF
           if test -f "$nlist"; then
-            # Prevent the only kind of circular reference mistake we can make.
-            sed -e '/ dld_preloaded_symbols$/d' -e 's/^.* \(.*\)$/extern char \1;/' < "$nlist" >> "$dlsyms"
+            # Prevent the only kind of circular reference mistakes we can make.
+            sed -e '/ dld_preloaded_symbol\(s\|_count\)$/d' -e 's/^.* \(.*\)$/extern char \1;/' < "$nlist" >> "$dlsyms"
           else
             echo "/* NONE */" >> "$dlsyms"
           fi
 
-          cat <<\EOF >> "$dlsyms"
+          cat <<EOF >> "$dlsyms"
 
 #if defined (__STDC__) && __STDC__
 # define __ptr_t void *
@@ -996,6 +1011,9 @@ EOF
 # define __ptr_t char *
 #endif
 
+/* The number of symbols in dld_preloaded_symbols, -1 if unsorted. */
+int dld_preloaded_symbol_count = $count;
+
 /* The mapping between symbol names and symbols. */
 struct {
   char *name;