[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [PATCH 1/2] Use POSIX nm to simplify AIX export_symbols_cmds.
From: |
David Edelsohn |
Subject: |
Re: [PATCH 1/2] Use POSIX nm to simplify AIX export_symbols_cmds. |
Date: |
Mon, 21 Mar 2016 13:14:54 -0400 |
On Mon, Mar 21, 2016 at 12:50 PM, Michael Haubenwallner
<address@hidden> wrote:
>
> On 03/21/2016 03:47 PM, David Edelsohn wrote:
>> On Mon, Mar 21, 2016 at 4:49 AM, Michael Haubenwallner
>> <address@hidden> wrote:
>>>
>>> On 03/20/2016 01:04 AM, David Edelsohn wrote:
>>>> I agree with this in principle, but I'm not convinced that the patch
>>>> itself is correct.
>>>
>>> Thanks!
>>>
>>>> I also would have split the MS-compatible part of the patch as a
>>>> separate step. It is not listed in the ChangeLog and just confuses
>>>> the patch.
>>>
>>> This is just a reordering of existing code - these lines are removed
>>> below, and the ChangeLog part is "Reorder to allow for platform specific
>>> hooks during transformation of global_symbol_pipe into C source code."
>>>
>>>> I don't see that this emits TLS symbols. Global TLS symbols are not
>>>> in the symcode list.
>>>
>>> Isn't the "L" for TLS symbols?
>>>
>>> + symcode='[[BDLTVWZ]]'
>>
>> Sorry, I was confused by the two cases for "aix" and the case for
>> "GNU" within AIX.
>>
>>>
>>> But indeed I've failed to identify the symcode of "weak TLS" symbols,
>>> except for "L*" with AIX nm in unspecified mode (nm -l, no -B or -P)
>>> Neither AIX nm nor GNU nm docs explicitly tell about weak TLS symbols.
>>> Is it possible for TLS symbols to be weak at all?
>
> For GNU nm I've identified the "C" (common) symcode to be "weak" as well.
>
> But still I'm unsure about TLS symbols: Always import them as "strong"?
>
We're limited to strong TLS symbols.
>>>> Global symbol pipe and exclude symbols somehow restricts the symbols
>>>> to the non "dot" symbols?
>>>
>>> Yes - but this is what the existing code does as well:
>>> '... && ([substr](\$ 1,1,1) != ".") ..'
>>
>> Is that in your patch or existing code? Your patch removes the
>> current substr($3,1,1).
>
> In current code there is substr($3,1,1) for GNU nm (BSD mode) and
> substr($1,1,1) for AIX nm (POSIX mode), both identifying the "dot"
> symbols as to be *removed* from the list of exported symbols.
>
> This patch leaves removal of the "dot" symbols up to $global_symbol_pipe,
> which does remove them due to not being a valid C symbol name.
>
>>>> The export_symbols_cmds awk command does not have matching quotes, so
>>>> I don't know what is going on.
>>>>
>>>> awk '\''{ kw = "" } /^[[VWZ]] / { kw = " weak" } { print $ 3 kw }'\''
>>>>
>>>> you're starting and ending with '\" which seems odd. why aren't these
>>>> complementary?
>>>
>>> The awk argument is passed between ['], as it contains ["].
>>> Escaping [\] the ['] is done outside any other string. Read as:
>>> _LT_TAGVAR(...)=['$NM ... | awk '][\']['{ ... }'][\'][' | sort ...']
>>> Indeed I can add [] here if you like.
>>
>> Ah, well, this is turning into a very complex statement. GCC requires
>> GNU Awk and most developers use Bash, but does this work correctly
>> with AIX awk and AIX Ksh?
>
> This awk program is quite simple and works with AIX awk too. The AWK
> variable is not promoted into the final libtool script, and I don't
> want to have projects using libtool to require GNU Awk in general.
>
> Most shells do not take [\] within two ['] as escapement,
> so I do the escaping of ['] outside any string. Usually,
> $ echo '\''
> will leave you with a string open to be continued, while
> $ echo \'
> gives a single ['].
>
> And this one doesn't feel more readable either:
> _LT_TAGVAR(...)='$NM ... | awk '"'"'{ ... }'"'"' | sort ...'
>
> What about this one:
> _LT_TAGVAR(...)='$NM ... | awk '[\']'{ ... }'[\']' | sort ...'
>
I think we're lost all pretense of elegance, so whatever works.
Thanks, David
> Thanks!
> /haubi/
>
>>>
>>>>
>>>> Thanks, David
>>>>
>>>> On Wed, Mar 2, 2016 at 11:19 AM, Michael Haubenwallner
>>>> <address@hidden> wrote:
>>>>> * 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"; the
>>>>> # 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