Skip to content

Commit

Permalink
threadlib: Fix LIBMULTITHREAD on platforms where --as-needed is enabled.
Browse files Browse the repository at this point in the history
Reported by Erik Auerswald <auerswal@unix-ag.uni-kl.de>
in <https://lists.gnu.org/archive/html/coreutils/2018-06/msg00063.html>.

* m4/threadlib.m4 (gl_THREADLIB_BODY): Check whether the linker supports
--as-needed/--no-as-needed and --push-state/--pop-state. When defining
USE_POSIX_THREADS_WEAK or USE_SOLARIS_THREADS_WEAK or
USE_PTH_THREADS_WEAK, define LIBMULTITHREAD in such a way that -lpthread
/ -lthread / -lpth does not get optimized away by a preceding
--as-needed option.
  • Loading branch information
bhaible committed Jun 26, 2018
1 parent d7cf3b8 commit 4263209
Show file tree
Hide file tree
Showing 2 changed files with 93 additions and 1 deletion.
12 changes: 12 additions & 0 deletions ChangeLog
Original file line number Diff line number Diff line change
@@ -1,3 +1,15 @@
2018-06-25 Bruno Haible <bruno@clisp.org>

threadlib: Fix LIBMULTITHREAD on platforms where --as-needed is enabled.
Reported by Erik Auerswald <auerswal@unix-ag.uni-kl.de>
in <https://lists.gnu.org/archive/html/coreutils/2018-06/msg00063.html>.
* m4/threadlib.m4 (gl_THREADLIB_BODY): Check whether the linker supports
--as-needed/--no-as-needed and --push-state/--pop-state. When defining
USE_POSIX_THREADS_WEAK or USE_SOLARIS_THREADS_WEAK or
USE_PTH_THREADS_WEAK, define LIBMULTITHREAD in such a way that -lpthread
/ -lthread / -lpth does not get optimized away by a preceding
--as-needed option.

2018-06-25 Bruno Haible <bruno@clisp.org>

Continue to use spaces for indentation, not tabs.
Expand Down
82 changes: 81 additions & 1 deletion m4/threadlib.m4
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# threadlib.m4 serial 13
# threadlib.m4 serial 14
dnl Copyright (C) 2005-2018 Free Software Foundation, Inc.
dnl This file is free software; the Free Software Foundation
dnl gives unlimited permission to copy and/or distribute it,
Expand Down Expand Up @@ -153,6 +153,36 @@ int main ()
*" -static "*) gl_cv_have_weak=no ;;
esac
])
dnl Check whether the linker supports the --as-needed/--no-as-needed options.
dnl Assume GCC, so that we can use the -Wl option.
AC_CACHE_CHECK([whether the linker supports --as-needed],
[gl_cv_linker_have_as_needed],
[if test -n "$GCC"; then
gl_saved_ldflags="$LDFLAGS"
LDFLAGS="$gl_saved_ldflags -Wl,--as-needed -Wl,--no-as-needed"
AC_LINK_IFELSE([AC_LANG_PROGRAM()],
[gl_cv_linker_have_as_needed=yes],
[gl_cv_linker_have_as_needed=no])
LDFLAGS="$gl_saved_ldflags"
else
gl_cv_linker_have_as_needed=no
fi
])
dnl Check whether the linker supports the --push-state/--pop-state options.
dnl Assume GCC, so that we can use the -Wl option.
AC_CACHE_CHECK([whether the linker supports --push-state],
[gl_cv_linker_have_push_state],
[if test -n "$GCC"; then
gl_saved_ldflags="$LDFLAGS"
LDFLAGS="$gl_saved_ldflags -Wl,--push-state -Wl,--pop-state"
AC_LINK_IFELSE([AC_LANG_PROGRAM()],
[gl_cv_linker_have_push_state=yes],
[gl_cv_linker_have_push_state=no])
LDFLAGS="$gl_saved_ldflags"
else
gl_cv_linker_have_push_state=no
fi
])
if test "$gl_use_threads" = yes || test "$gl_use_threads" = posix; then
# On OSF/1, the compiler needs the flag -pthread or -D_REENTRANT so that
# it groks <pthread.h>. It's added above, in gl_THREADLIB_EARLY_BODY.
Expand Down Expand Up @@ -231,6 +261,32 @@ int main ()
[Define if references to the POSIX multithreading library should be made weak.])
LIBTHREAD=
LTLIBTHREAD=
dnl On platforms where GCC enables --as-needed by default, attempt
dnl to make sure that LIBMULTITHREAD really links with -lpthread.
dnl Otherwise linking with LIBMULTITHREAD has no effect; then
dnl the weak symbols are not defined and thus evaluate to NULL.
case "$LIBMULTITHREAD" in
"") ;;
-pthread)
if test $gl_cv_linker_have_as_needed = yes; then
if test $gl_cv_linker_have_push_state = yes; then
LIBMULTITHREAD="$LIBMULTITHREAD -Wl,--push-state -Wl,--no-as-needed -lpthread -Wl,--pop-state"
else
LIBMULTITHREAD="$LIBMULTITHREAD -Wl,--no-as-needed -lpthread"
fi
fi
;;
*)
if test $gl_cv_linker_have_as_needed = yes; then
if test $gl_cv_linker_have_push_state = yes; then
LIBMULTITHREAD="-Wl,--push-state -Wl,--no-as-needed $LIBMULTITHREAD -Wl,--pop-state"
else
LIBMULTITHREAD="-Wl,--no-as-needed $LIBMULTITHREAD"
fi
fi
;;
esac
# TODO: May need to modify LTLIBMULTITHREAD similarly.
fi
fi
fi
Expand Down Expand Up @@ -263,6 +319,18 @@ int main ()
[Define if references to the old Solaris multithreading library should be made weak.])
LIBTHREAD=
LTLIBTHREAD=
dnl On platforms where GCC enables --as-needed by default, attempt
dnl to make sure that LIBMULTITHREAD really links with -lthread.
dnl Otherwise linking with LIBMULTITHREAD has no effect; then
dnl the weak symbols are not defined and thus evaluate to NULL.
if test $gl_cv_linker_have_as_needed = yes; then
if test $gl_cv_linker_have_push_state = yes; then
LIBMULTITHREAD="-Wl,--push-state -Wl,--no-as-needed $LIBMULTITHREAD -Wl,--pop-state"
else
LIBMULTITHREAD="-Wl,--no-as-needed $LIBMULTITHREAD"
fi
fi
# TODO: May need to modify LTLIBMULTITHREAD similarly.
fi
fi
fi
Expand Down Expand Up @@ -291,6 +359,18 @@ int main ()
[Define if references to the GNU Pth multithreading library should be made weak.])
LIBTHREAD=
LTLIBTHREAD=
dnl On platforms where GCC enables --as-needed by default, attempt
dnl to make sure that LIBMULTITHREAD really links with -lpth.
dnl Otherwise linking with LIBMULTITHREAD has no effect; then
dnl the weak symbols are not defined and thus evaluate to NULL.
if test $gl_cv_linker_have_as_needed = yes; then
if test $gl_cv_linker_have_push_state = yes; then
LIBMULTITHREAD="-Wl,--push-state -Wl,--no-as-needed $LIBMULTITHREAD -Wl,--pop-state"
else
LIBMULTITHREAD="-Wl,--no-as-needed $LIBMULTITHREAD"
fi
fi
# TODO: May need to modify LTLIBMULTITHREAD similarly.
fi
fi
else
Expand Down

0 comments on commit 4263209

Please sign in to comment.