Fix crashes on other platforms caused by interference from Darwin weak symbol support.

Support weak symbols on a platform specific basis.  The Mac OS X (Darwin)
support must be isolated from the other platforms because it has caused
other platforms to crash.  Several other platforms including Linux have
GCC versions that define the weak attribute.  However, this attribute is
only setup for use in the code by Darwin.

(closes issue ASTERISK-18728)
Reported by: Ben Klang

Review: https://reviewboard.asterisk.org/r/1617/


git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/1.8@348647 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
Richard Mudgett
2011-12-19 21:31:34 +00:00
parent 6dbb78d453
commit 4a5ed19cd7
2 changed files with 177 additions and 4 deletions

147
configure vendored
View File

@@ -1,5 +1,5 @@
#! /bin/sh
# From configure.ac Revision: 338609 .
# From configure.ac Revision: 339719 .
# Guess values for system-dependent variables and create Makefiles.
# Generated by GNU Autoconf 2.63 for asterisk trunk.
#
@@ -23521,6 +23521,17 @@ CFLAGS="$saved_CFLAGS"
# Support weak symbols on a platform specific basis. The Mac OS X
# (Darwin) support must be isolated from the other platforms because
# it has caused other platforms to fail.
#
case "${OSARCH}" in
darwin*)
# Allow weak symbol support on Darwin platforms only because there
# is active community support for it.
# However, Darwin seems to break weak symbols for each new version.
#
{ $as_echo "$as_me:$LINENO: checking for compiler 'attribute weak_import' support" >&5
$as_echo_n "checking for compiler 'attribute weak_import' support... " >&6; }
saved_CFLAGS="$CFLAGS"
@@ -23639,6 +23650,10 @@ CFLAGS="$saved_CFLAGS"
# Several other platforms including Linux have GCC versions that
# define the weak attribute. However, this attribute is only
# setup for use in the code by Darwin.
{ $as_echo "$as_me:$LINENO: checking for compiler 'attribute weak' support" >&5
$as_echo_n "checking for compiler 'attribute weak' support... " >&6; }
saved_CFLAGS="$CFLAGS"
@@ -23756,6 +23771,10 @@ fi
CFLAGS="$saved_CFLAGS"
;;
linux-gnu)
# Primarily support weak symbols on Linux platforms.
#
{ $as_echo "$as_me:$LINENO: checking for compiler 'attribute weakref' support" >&5
$as_echo_n "checking for compiler 'attribute weakref' support... " >&6; }
@@ -23874,6 +23893,132 @@ fi
CFLAGS="$saved_CFLAGS"
;;
*)
# Allow weak symbols on other platforms. However, any problems
# with this feature on other platforms must be fixed by the
# community.
#
{ $as_echo "$as_me:$LINENO: checking for compiler 'attribute weakref' support" >&5
$as_echo_n "checking for compiler 'attribute weakref' support... " >&6; }
saved_CFLAGS="$CFLAGS"
CFLAGS="$CFLAGS -Wall -Wno-unused -Werror"
PBX_WEAKREF=0
if test "xweakref("foo")" = "x"
then
cat >conftest.$ac_ext <<_ACEOF
/* confdefs.h. */
_ACEOF
cat confdefs.h >>conftest.$ac_ext
cat >>conftest.$ac_ext <<_ACEOF
/* end confdefs.h. */
static void __attribute__((weakref)) *test(void *muffin, ...) {return (void *) 0;}
int
main ()
{
;
return 0;
}
_ACEOF
rm -f conftest.$ac_objext
if { (ac_try="$ac_compile"
case "(($ac_try" in
*\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
*) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
$as_echo "$ac_try_echo") >&5
(eval "$ac_compile") 2>conftest.er1
ac_status=$?
grep -v '^ *+' conftest.er1 >conftest.err
rm -f conftest.er1
cat conftest.err >&5
$as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } && {
test -z "$ac_c_werror_flag" ||
test ! -s conftest.err
} && test -s conftest.$ac_objext; then
{ $as_echo "$as_me:$LINENO: result: yes" >&5
$as_echo "yes" >&6; }
PBX_WEAKREF=1
cat >>confdefs.h <<_ACEOF
#define HAVE_ATTRIBUTE_weakref 1
_ACEOF
else
$as_echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
{ $as_echo "$as_me:$LINENO: result: no" >&5
$as_echo "no" >&6; }
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
else
cat >conftest.$ac_ext <<_ACEOF
/* confdefs.h. */
_ACEOF
cat confdefs.h >>conftest.$ac_ext
cat >>conftest.$ac_ext <<_ACEOF
/* end confdefs.h. */
static void __attribute__((weakref("foo"))) *test(void *muffin, ...) {return (void *) 0;}
int
main ()
{
;
return 0;
}
_ACEOF
rm -f conftest.$ac_objext
if { (ac_try="$ac_compile"
case "(($ac_try" in
*\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
*) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
$as_echo "$ac_try_echo") >&5
(eval "$ac_compile") 2>conftest.er1
ac_status=$?
grep -v '^ *+' conftest.er1 >conftest.err
rm -f conftest.er1
cat conftest.err >&5
$as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } && {
test -z "$ac_c_werror_flag" ||
test ! -s conftest.err
} && test -s conftest.$ac_objext; then
{ $as_echo "$as_me:$LINENO: result: yes" >&5
$as_echo "yes" >&6; }
PBX_WEAKREF=1
cat >>confdefs.h <<_ACEOF
#define HAVE_ATTRIBUTE_weakref 1
_ACEOF
else
$as_echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
{ $as_echo "$as_me:$LINENO: result: no" >&5
$as_echo "no" >&6; }
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
fi
CFLAGS="$saved_CFLAGS"
;;
esac
{ $as_echo "$as_me:$LINENO: checking for -ffunction-sections support" >&5
$as_echo_n "checking for -ffunction-sections support... " >&6; }

View File

@@ -886,9 +886,37 @@ AST_GCC_ATTRIBUTE(always_inline)
AST_GCC_ATTRIBUTE(deprecated)
AST_GCC_ATTRIBUTE(sentinel)
AST_GCC_ATTRIBUTE(warn_unused_result)
AST_GCC_ATTRIBUTE(weak_import, [], [], PBX_WEAKREF)
AST_GCC_ATTRIBUTE(weak, [], [], PBX_WEAKREF)
AST_GCC_ATTRIBUTE(weakref, [weakref("foo")], static, PBX_WEAKREF)
# Support weak symbols on a platform specific basis. The Mac OS X
# (Darwin) support must be isolated from the other platforms because
# it has caused other platforms to fail.
#
case "${OSARCH}" in
darwin*)
# Allow weak symbol support on Darwin platforms only because there
# is active community support for it.
# However, Darwin seems to break weak symbols for each new version.
#
AST_GCC_ATTRIBUTE(weak_import, [], [], PBX_WEAKREF)
# Several other platforms including Linux have GCC versions that
# define the weak attribute. However, this attribute is only
# setup for use in the code by Darwin.
AST_GCC_ATTRIBUTE(weak, [], [], PBX_WEAKREF)
;;
linux-gnu)
# Primarily support weak symbols on Linux platforms.
#
AST_GCC_ATTRIBUTE(weakref, [weakref("foo")], static, PBX_WEAKREF)
;;
*)
# Allow weak symbols on other platforms. However, any problems
# with this feature on other platforms must be fixed by the
# community.
#
AST_GCC_ATTRIBUTE(weakref, [weakref("foo")], static, PBX_WEAKREF)
;;
esac
AC_MSG_CHECKING(for -ffunction-sections support)
saved_CFLAGS="${CFLAGS}"