libtool
[Top][All Lists]
Advanced

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

Re: Supporting -export-dynamic on AIX


From: Albert Chin
Subject: Re: Supporting -export-dynamic on AIX
Date: Tue, 20 Jun 2006 12:12:31 -0500
User-agent: Mutt/1.5.6i

On Sun, Jun 11, 2006 at 01:14:23AM -0500, Albert Chin wrote:
> On Sat, Jun 10, 2006 at 07:12:34PM -0500, Albert Chin wrote:
> > On Sun, Jun 11, 2006 at 01:04:17AM +0200, Ralf Wildenhues wrote:
> > > * Albert Chin wrote on Sat, Jun 10, 2006 at 08:49:29PM CEST:
> > > > On Sat, Jun 10, 2006 at 08:29:44PM +0200, Ralf Wildenhues wrote:
> > > > > * Albert Chin wrote on Sat, Jun 10, 2006 at 08:08:15PM CEST:
> > > > > > Any reason we don't use -bexpall to support -export-dynamic on AIX?
> > > > > 
> > > > > Yes, as commented in libtool.m4:
> > > 
> > > > I think this is still correct. How should I fix it?
> > > 
> > > Well.  In what way(s) do gaim and galculator fail, and why?
> > > Is there a way to reproduce the failure without much hassle
> > > such as lots of required packages, maybe even a stripped down
> > > test case?  Are those packages doing something we may want
> > > to allow, or is it impossible to realize portably anyway?
> > > I'm sorry but I cannot answer your question without more
> > > information.  (That is not to say that I could otherwise ;-)
> > 
> > When I say "how should I fix it", I mean what's the best way to
> > implement -export-dynamic on AIX. Maybe a new export_dynamic_cmds
> > command that creates the symbols ala export_symbols_cmds and then
> > export_dynamic_flag_spec to add the ld flag to export the symbols from
> > export_symbols_cmds to the binary?
> 
> I'm thinking of a patch along the lines of the one below. What do you
> think?

Well, this has some problems. First, if only export_dynamic_flag_spec
is set, the new export list code is wrong. Fixed in the patch below.

The second problem is when libtool is passed multiple source files,
rather than object files to create the executable. This method totally
fails then. What to do in this case?

-- 
albert chin (address@hidden)

-- snip snip
Index: libtool.m4
===================================================================
RCS file: /cvsroot/libtool/libtool/Attic/libtool.m4,v
retrieving revision 1.314.2.158
diff -u -p -r1.314.2.158 libtool.m4
--- libtool.m4  12 Jun 2006 05:25:26 -0000      1.314.2.158
+++ libtool.m4  20 Jun 2006 17:09:14 -0000
@@ -2911,6 +2911,13 @@ case $host_os in
 
       exp_sym_flag='-bexport'
       no_entry_flag='-bnoentry'
+
+      if $NM -V 2>&1 | grep 'GNU' > /dev/null; then
+       _LT_AC_TAGVAR(export_dynamic_symbols_cmds, $1)='$NM -Bpg $objs | awk 
'\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && 
([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols'
+      else
+       _LT_AC_TAGVAR(export_dynamic_symbols_cmds, $1)='$NM -BCpg $objs | awk 
'\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && 
([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols'
+      fi
+      _LT_AC_TAGVAR(export_dynamic_flag_spec, 
$1)="\${wl}$exp_sym_flag:\$export_symbols"
     fi
 
     # When large executables or shared objects are built, AIX ld can
@@ -3950,6 +3957,7 @@ _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=
 _LT_AC_TAGVAR(allow_undefined_flag, $1)=
 _LT_AC_TAGVAR(always_export_symbols, $1)=no
 _LT_AC_TAGVAR(archive_expsym_cmds, $1)=
+_LT_AC_TAGVAR(export_dynamic_symbols_cmds, $1)=
 _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)=
 _LT_AC_TAGVAR(hardcode_direct, $1)=no
 _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)=
@@ -4178,6 +4186,7 @@ if test -f "$ltmain"; then
     _LT_AC_TAGVAR(lt_prog_compiler_pic, $1) \
     _LT_AC_TAGVAR(lt_prog_compiler_static, $1) \
     _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) \
+    _LT_AC_TAGVAR(export_dynamic_symbols_cmds, $1) \
     _LT_AC_TAGVAR(export_dynamic_flag_spec, $1) \
     _LT_AC_TAGVAR(thread_safe_flag_spec, $1) \
     _LT_AC_TAGVAR(whole_archive_flag_spec, $1) \
@@ -4212,6 +4221,7 @@ if test -f "$ltmain"; then
     _LT_AC_TAGVAR(old_archive_from_new_cmds, $1) | \
     _LT_AC_TAGVAR(archive_cmds, $1) | \
     _LT_AC_TAGVAR(archive_expsym_cmds, $1) | \
+    _LT_AC_TAGVAR(export_dynamic_symbols_cmds, $1) | \
     _LT_AC_TAGVAR(module_cmds, $1) | \
     _LT_AC_TAGVAR(module_expsym_cmds, $1) | \
     _LT_AC_TAGVAR(old_archive_from_expsyms_cmds, $1) | \
@@ -4424,6 +4434,7 @@ link_static_flag=$lt_[]_LT_AC_TAGVAR(lt_
 no_builtin_flag=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)
 
 # Compiler flag to allow reflexive dlopens.
+export_dynamic_symbols_cmds=$lt_[]_LT_AC_TAGVAR(export_dynamic_symbols_cmds, 
$1)
 export_dynamic_flag_spec=$lt_[]_LT_AC_TAGVAR(export_dynamic_flag_spec, $1)
 
 # Compiler flag to generate shared objects directly from archives.
@@ -5449,6 +5460,7 @@ ifelse([$1],[CXX],[
   _LT_AC_TAGVAR(archive_expsym_cmds, $1)=
   _LT_AC_TAGVAR(old_archive_From_new_cmds, $1)=
   _LT_AC_TAGVAR(old_archive_from_expsyms_cmds, $1)=
+  _LT_AC_TAGVAR(export_dynamic_symbols_cmds, $1)=
   _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)=
   _LT_AC_TAGVAR(whole_archive_flag_spec, $1)=
   _LT_AC_TAGVAR(thread_safe_flag_spec, $1)=
@@ -5757,8 +5769,11 @@ _LT_EOF
        # -C means demangle to AIX nm, but means don't demangle with GNU nm
        if $NM -V 2>&1 | grep 'GNU' > /dev/null; then
          _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs 
$convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == 
"B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > 
$export_symbols'
+         _LT_AC_TAGVAR(export_dynamic_symbols_cmds, $1)='$NM -Bpg $objs | awk 
'\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && 
([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols'
        else
          _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs 
$convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == 
"B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > 
$export_symbols'
+         _LT_AC_TAGVAR(export_dynamic_symbols_cmds, $1)='$NM -BCpg $objs | awk 
'\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && 
([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols'
+        _LT_AC_TAGVAR(export_dynamic_flag_spec, 
$1)="\${wl}$exp_sym_flag:\$export_symbols"
        fi
        aix_use_runtimelinking=no
 
Index: ltmain.in
===================================================================
RCS file: /cvsroot/libtool/libtool/Attic/ltmain.in,v
retrieving revision 1.334.2.132
diff -u -p -r1.334.2.132 ltmain.in
--- ltmain.in   12 Jun 2006 05:25:26 -0000      1.334.2.132
+++ ltmain.in   20 Jun 2006 17:09:14 -0000
@@ -1993,7 +1993,32 @@ EOF
       exit $EXIT_FAILURE
     fi
 
-    if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; 
then
+    if test "$export_dynamic" = yes &&
+       { test -n "$export_dynamic_symbols_cmds" ||
+        test -n "$export_dynamic_flag_spec"; }; then
+      if test -n "$export_dynamic_symbols_cmds"; then
+       $show "generating symbol list for \`$output'"
+       export_symbols="$output.exp"
+       $run $rm $export_symbols
+       cmds=$export_dynamic_symbols_cmds
+       save_ifs="$IFS"; IFS='~'
+       for cmd in $cmds; do
+         IFS="$save_ifs"
+         eval cmd=\"$cmd\"
+         if len=`expr "X$cmd" : ".*"` &&
+            test "$len" -le "$max_cmd_len" || test "$max_cmd_len" -le -1; then
+           $show "$cmd"
+           $run eval "$cmd" || exit $?
+           skipped_export=false
+         else
+           # The command line is too long to execute in one step.
+           $show "using reloadable object file for export list..."
+           skipped_export=:
+         fi
+       done
+       IFS="$save_ifs"
+      fi
+
       eval arg=\"$export_dynamic_flag_spec\"
       compile_command="$compile_command $arg"
       finalize_command="$finalize_command $arg"
@@ -4780,6 +4805,11 @@ static const void *lt_preloaded_setup() 
          $run $rm "$output_objdir/${outputname}S.${objext}"
        fi
 
+       if test "$export_dynamic" = yes &&
+          test -n "$export_dynamic_symbols_cmds"; then
+         $run $rm $export_symbols
+       fi
+
        exit $exit_status
       fi
 




reply via email to

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