]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
Fix crashes on other platforms caused by interference from Darwin weak symbol support.
authorRichard Mudgett <rmudgett@digium.com>
Mon, 19 Dec 2011 21:31:34 +0000 (21:31 +0000)
committerRichard Mudgett <rmudgett@digium.com>
Mon, 19 Dec 2011 21:31:34 +0000 (21:31 +0000)
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

configure
configure.ac

index fa9e20719ad96ef92db4538a3cd802f3c60cb776..692794621ff9b48f834ab2998c4299b7a5338971 100755 (executable)
--- a/configure
+++ b/configure
@@ -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"
 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; }
+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"
+
+
+       ;;
+       *)
+       # 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; }
@@ -23874,6 +24017,8 @@ 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; }
index 566f6ae547a5ace3b77acc226844286bef0e8391..d3a828cfa6c862df9eaf564b728f78de4bdf1d8c 100644 (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}"