[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH 1/2] Use POSIX nm to simplify AIX export_symbols_cmds.
From: |
Michael Haubenwallner |
Subject: |
[PATCH 1/2] Use POSIX nm to simplify AIX export_symbols_cmds. |
Date: |
Wed, 2 Mar 2016 17:19:22 +0100 |
* m4/libtool.m4 (LT_PATH_NM): Detect POSIX-compatible nm for AIX. In
BSD mode, the AIX nm does not tell whether a symbol is weak, need to use
POSIX mode instead.
(_LT_CMD_GLOBAL_SYMBOLS): Support POSIX-compatible nm. Reorder to allow
for platform specific hooks during transformation of global_symbol_pipe
into C source code. For AIX, set hook to transform even weak text
symbols as text symbols.
(_LT_LINKER_SHLIBS): Use global_symbol_pipe to simplify forming the
export_symbols_cmds for AIX.
---
m4/libtool.m4 | 101 ++++++++++++++++++++++++++++++++--------------------------
1 file changed, 55 insertions(+), 46 deletions(-)
diff --git a/m4/libtool.m4 b/m4/libtool.m4
index 2c0e657..6134522 100644
--- a/m4/libtool.m4
+++ b/m4/libtool.m4
@@ -3755,10 +3755,10 @@ _LT_DECL([], [want_nocaseglob], [1],
# LT_PATH_NM
# ----------
-# find the pathname to a BSD- or MS-compatible name lister
+# find the pathname to a BSD-, POSIX- or MS-compatible name lister
AC_DEFUN([LT_PATH_NM],
[AC_REQUIRE([AC_PROG_CC])dnl
-AC_CACHE_CHECK([for BSD- or MS-compatible name lister (nm)], lt_cv_path_NM,
+AC_CACHE_CHECK([for BSD-, POSIX- or MS-compatible name lister (nm)],
lt_cv_path_NM,
[if test -n "$NM"; then
# Let the user override the test.
lt_cv_path_NM=$NM
@@ -3808,6 +3808,26 @@ else
: ${lt_cv_path_NM=no}
fi])
if test no != "$lt_cv_path_NM"; then
+ case $host_os in
+ aix[[4-9]]*)
+ # With AIX nm we need the '-l' flag to get the "weak" information
+ # for the Import File, but '-l' is ignored with the '-B' flag. So
+ # we use the '-P' (POSIX) flag instead. As users often provide the
+ # '-B' flag, which conflicts with '-P', we drop any provided flag.
+ # AIX nm needs the '-C' flag to disable demangling. For both GNU
+ # and AIX nm, the '-g' flag shows public (global) symbols only,
+ # and the '-p' flag disables sorting to improve performance.
+ set dummy $lt_cv_path_NM
+ case address@hidden|@2 -V 2>&1` in
+ *GNU* | *'with BFD'*)
+ lt_cv_path_NM="@S|@2 -Bgp"
+ ;;
+ *)
+ lt_cv_path_NM="@S|@2 -PlCgp"
+ ;;
+ esac
+ ;;
+ esac
NM=$lt_cv_path_NM
else
# Didn't find any BSD compatible name lister, look for dumpbin.
@@ -3832,7 +3852,7 @@ fi
test -z "$NM" && NM=nm
_LT_SET_TOOL_ABI_FLAG([NM])
AC_SUBST([NM])
-_LT_DECL([], [NM], [1], [A BSD- or MS-compatible name lister])dnl
+_LT_DECL([], [NM], [1], [A BSD-, POSIX- or MS-compatible name lister])dnl
AC_CACHE_CHECK([the name lister ($NM) interface], [lt_cv_nm_interface],
[lt_cv_nm_interface="BSD nm"
@@ -3847,6 +3867,8 @@ AC_CACHE_CHECK([the name lister ($NM) interface],
[lt_cv_nm_interface],
cat conftest.out >&AS_MESSAGE_LOG_FD
if $GREP 'External.*some_variable' conftest.out > /dev/null; then
lt_cv_nm_interface="MS dumpbin"
+ elif $GREP '^[[ ]]*_*some_variable' conftest.out > /dev/null; then
+ lt_cv_nm_interface="POSIX nm"
fi
rm -f conftest*])
])# LT_PATH_NM
@@ -4012,8 +4034,33 @@ symcode='[[BCDEGRST]]'
# Regexp to match symbols that can be accessed directly from C.
sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)'
+if test "$lt_cv_nm_interface" = "MS dumpbin"; then
+ # Gets list of data symbols to import.
+ lt_cv_sys_global_symbol_to_import="sed -n -e 's/^I .* \(.*\)$/\1/p'"
+ # Adjust the below global symbol transforms to fixup imported variables.
+ lt_cdecl_hook=" -e 's/^I .* \(.*\)$/extern __declspec(dllimport) char \1;/p'"
+ lt_c_name_hook=" -e 's/^I .* \(.*\)$/ {\"\1\", (void *) 0},/p'"
+ lt_c_name_lib_hook="\
+ -e 's/^I .* \(lib.*\)$/ {\"\1\", (void *) 0},/p'\
+ -e 's/^I .* \(.*\)$/ {\"lib\1\", (void *) 0},/p'"
+else
+ # Disable hooks by default.
+ lt_cv_sys_global_symbol_to_import=
+ lt_cdecl_hook=
+ lt_c_name_hook=
+ lt_c_name_lib_hook=
+fi
+
# Define system-specific variables.
case $host_os in
+aix[[4-9]]*)
+ case `$NM -V 2>&1` in
+ *GNU* | *'with BFD'*) ;;
+ *)
+ symcode='[[BDLTVWZ]]'
+ lt_cdecl_hook=" -e 's/^W/T/p'" # weak text symbol
+ esac
+ ;;
aix*)
symcode='[[BCDT]]'
;;
@@ -4054,23 +4101,6 @@ case `$NM -V 2>&1` in
symcode='[[ABCDGIRSTW]]' ;;
esac
-if test "$lt_cv_nm_interface" = "MS dumpbin"; then
- # Gets list of data symbols to import.
- lt_cv_sys_global_symbol_to_import="sed -n -e 's/^I .* \(.*\)$/\1/p'"
- # Adjust the below global symbol transforms to fixup imported variables.
- lt_cdecl_hook=" -e 's/^I .* \(.*\)$/extern __declspec(dllimport) char \1;/p'"
- lt_c_name_hook=" -e 's/^I .* \(.*\)$/ {\"\1\", (void *) 0},/p'"
- lt_c_name_lib_hook="\
- -e 's/^I .* \(lib.*\)$/ {\"\1\", (void *) 0},/p'\
- -e 's/^I .* \(.*\)$/ {\"lib\1\", (void *) 0},/p'"
-else
- # Disable hooks by default.
- lt_cv_sys_global_symbol_to_import=
- lt_cdecl_hook=
- lt_c_name_hook=
- lt_c_name_lib_hook=
-fi
-
# Transform an extracted symbol line into a proper C declaration.
# Some systems (esp. on ia64) link data and code symbols differently,
# so use this general approach.
@@ -4128,6 +4158,9 @@ for ac_symprfx in "" "_"; do
" s[1]~/address@hidden/{print f,s[1],s[1]; next};"\
" s[1]~prfx {split(s[1],t,\"@\"); print f,t[1],substr(t[1],length(prfx))}"\
" ' prfx=^$ac_symprfx]"
+ elif test "$lt_cv_nm_interface" = "POSIX nm"; then
+ symxfrm="\\2 $ac_symprfx\\1 \\1"
+ lt_cv_sys_global_symbol_pipe="sed -n -e 's/^[[
]]*$ac_symprfx$sympat[[ ]][[ ]]*\($symcode$symcode*\)[[ ]][[
]]*.*$opt_cr$/$symxfrm/p'"
else
lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[
]]\($symcode$symcode*\)[[ ]][[
]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'"
fi
@@ -5009,19 +5042,7 @@ m4_if([$1], [CXX], [
_LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*']
case $host_os in
aix[[4-9]]*)
- # If we're using GNU nm, then we don't want the "-C" option.
- # -C means demangle to GNU nm, but means don't demangle to AIX nm.
- # Without the "-l" option, or with the "-B" option, AIX nm treats
- # weak defined symbols like other global defined symbols, whereas
- # GNU nm marks them as "W".
- # While the 'weak' keyword is ignored in the Export File, we need
- # it in the Import File for the 'aix-soname' feature, so we have
- # to replace the "-B" option with "-P" for AIX nm.
- if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
- _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience |
awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 ==
"W")) && ([substr](\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" }
else { print \$ 3 } } }'\'' | sort -u > $export_symbols'
- else
- _LT_TAGVAR(export_symbols_cmds, $1)='`func_echo_all $NM | $SED -e
'\''s/B\([[^B]]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$
2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "L") || (\$ 2 == "W")
|| (\$ 2 == "V") || (\$ 2 == "Z")) && ([substr](\$ 1,1,1) != ".")) { if ((\$ 2
== "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print
\$ 1 } } }'\'' | sort -u > $export_symbols'
- fi
+ _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience |
$global_symbol_pipe | $EGREP -v " ($exclude_expsyms)$" | awk '\''{ kw = "" }
/^[[VWZ]] / { kw = " weak" } { print $ 3 kw }'\'' | sort -u > $export_symbols'
;;
pw32*)
_LT_TAGVAR(export_symbols_cmds, $1)=$ltdll_cmds
@@ -5464,19 +5485,7 @@ _LT_EOF
exp_sym_flag='-Bexport'
no_entry_flag=
else
- # If we're using GNU nm, then we don't want the "-C" option.
- # -C means demangle to GNU nm, but means don't demangle to AIX nm.
- # Without the "-l" option, or with the "-B" option, AIX nm treats
- # weak defined symbols like other global defined symbols, whereas
- # GNU nm marks them as "W".
- # While the 'weak' keyword is ignored in the Export File, we need
- # it in the Import File for the 'aix-soname' feature, so we have
- # to replace the "-B" option with "-P" for AIX nm.
- if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
- _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience |
awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 ==
"W")) && ([substr](\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" }
else { print \$ 3 } } }'\'' | sort -u > $export_symbols'
- else
- _LT_TAGVAR(export_symbols_cmds, $1)='`func_echo_all $NM | $SED -e
'\''s/B\([[^B]]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$
2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "L") || (\$ 2 == "W")
|| (\$ 2 == "V") || (\$ 2 == "Z")) && ([substr](\$ 1,1,1) != ".")) { if ((\$ 2
== "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print
\$ 1 } } }'\'' | sort -u > $export_symbols'
- fi
+ _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience |
$global_symbol_pipe | $EGREP -v " ($exclude_expsyms)$" | awk '\''{ kw = "" }
/^[[VWZ]] / { kw = " weak" } { print $ 3 kw }'\'' | sort -u > $export_symbols'
aix_use_runtimelinking=no
# Test if we are trying to use run time linking or normal
--
2.4.6
[PATCH 2/2] AIX: Stop exporting any _GLOBAL__ symbol., Michael Haubenwallner, 2016/03/02