]> git.ipfire.org Git - thirdparty/squid.git/commitdiff
Bug 2778: fix linking issues using SunCC
authorFrancesco Chemolli <kinkie@squid-cache.org>
Fri, 6 Nov 2009 16:22:16 +0000 (17:22 +0100)
committerFrancesco Chemolli <kinkie@squid-cache.org>
Fri, 6 Nov 2009 16:22:16 +0000 (17:22 +0100)
SunCC doesn't handle inline extern functions, and misses some duplicate
code detection features gcc has; as a result squid-specific operator new and
operator delete get defined multiple times and fail linking.
Implemented a compiler-specific workaround by de-inlining the code.
Improved Solaris OS detection logic (and dropped _SQUID_SUNOS_ which was not
used anyways)

compat/compat.h
compat/os/solaris.h
compat/osdetect.h
include/SquidNew.h
src/SquidNew.cc

index 160029171180cda5f86a060f0fa4ce7f462c08e1..fc9eb9360e2730b853cf08efee12d6e532e96d98 100644 (file)
@@ -49,6 +49,7 @@
 /* OS-macro wrapping should be done inside the OS .h */
 /*****************************************************/
 
+#include "compat/os/solaris.h"
 #include "compat/os/aix.h"
 #include "compat/os/dragonfly.h"
 #include "compat/os/freebsd.h"
@@ -60,7 +61,6 @@
 #include "compat/os/os2.h"
 #include "compat/os/qnx.h"
 #include "compat/os/sgi.h"
-#include "compat/os/solaris.h"
 #include "compat/os/sunos.h"
 #include "compat/os/windows.h"
 
index 7c63a9bf51adb26193307d4a9b0bc6e5ab7d9d07..b77db6de67c419af98fdf158e4456113ef9b4edb 100644 (file)
@@ -5,7 +5,8 @@
 #ifndef SQUID_OS_SOLARIS_H
 #define SQUID_OS_SOLARIS_H
 
-#ifdef _SQUID_SOLARIS_
+
+#if _SQUID_SOLARIS_
 
 /*
  * On Solaris 9 x86, gcc may includes a "fixed" set of old system
@@ -44,6 +45,13 @@ SQUIDCEXTERN int getpagesize(void);
 SQUIDCEXTERN int gethostname(char *, int);
 #endif
 
+/*
+ * SunPro CC handles extern inline as inline, PLUS extern symbols.
+ */
+
+#if !defined(_SQUID_EXTERNNEW_) && defined(__SUNPRO_CC)
+#define _SQUID_EXTERNNEW_ extern
+#endif
 
 
 #endif /* _SQUID_SOLARIS_ */
index 847173fbece5a25078d88af011cdafb0660649f0..7a68dc705f1a5ee473b7759942b274facdaf8e57 100644 (file)
  *     or other definitions within this if-else structure.
  */
 
-#if defined(__sun__) || defined(__sun) /* SUN */
-# define _SQUID_SUN_
-# if defined(__SVR4)           /* SOLARIS */
-#  define _SQUID_SOLARIS_
-# else /* SUNOS */
-#  define _SQUID_SUNOS_
-# endif
+/* SUN SOLARIS / OPENSOLARIS */
+#if defined(__sun__) || defined(__sun) || defined(__SUNPRO_CC) || defined(__SunOS_OSversion)
+#define _SQUID_SOLARIS_ 1
 
 #elif defined(__hpux)          /* HP-UX - SysV-like? */
-#define _SQUID_HPUX_
-#define _SQUID_SYSV_
+#define _SQUID_HPUX_ 1
+#define _SQUID_SYSV_ 1
 
 #elif defined(__osf__)         /* OSF/1 */
-#define _SQUID_OSF_
+#define _SQUID_OSF_ 1
 
 #elif defined(__ultrix)                /* Ultrix */
-#define _SQUID_ULTRIX_
+#define _SQUID_ULTRIX_ 1
 
 #elif defined(_AIX)            /* AIX */
-#define _SQUID_AIX_
+#define _SQUID_AIX_ 1
 
-#elif defined(__linux__)       /* Linux */
-#define _SQUID_LINUX_
+#elif defined(__linux__)       /* Linux. WARNING: solaris-x86 also sets this */
+#define _SQUID_LINUX_ 1
 
 #elif defined(__FreeBSD__)     /* FreeBSD */
-#define _SQUID_FREEBSD_
+#define _SQUID_FREEBSD_ 1
 
 #elif defined(__FreeBSD_kernel__)      /* GNU/kFreeBSD */
-#define _SQUID_KFREEBSD_
+#define _SQUID_KFREEBSD_ 1
 
 #elif defined(__sgi__) || defined(sgi) || defined(__sgi)       /* SGI */
-#define _SQUID_SGI_
+#define _SQUID_SGI_ 1
 
 #elif defined(__NeXT__)
-#define _SQUID_NEXT_
+#define _SQUID_NEXT_ 1
 
-#elif defined(__bsdi__)
-#define _SQUID_BSDI_           /* BSD/OS */
+#elif defined(__bsdi__)                /* BSD/OS */
+#define _SQUID_BSDI_ 1
 
 #elif defined(__NetBSD__)
-#define _SQUID_NETBSD_
+#define _SQUID_NETBSD_ 1
 
 #elif defined(__OpenBSD__)
-#define _SQUID_OPENBSD_
+#define _SQUID_OPENBSD_ 1
 
 #elif defined(__DragonFly__)
-#define _SQUID_DRAGONFLY_
+#define _SQUID_DRAGONFLY_ 1
 
 #elif defined(__CYGWIN32__)  || defined(__CYGWIN__)
-#define _SQUID_CYGWIN_
-#define _SQUID_WIN32_
+#define _SQUID_CYGWIN_ 1
+#define _SQUID_WIN32_ 1
 
 #elif defined(WIN32) || defined(WINNT) || defined(__WIN32__) || defined(__WIN32)
 /* We are using _SQUID_MSWIN_ define in cf.data.pre, so
    it must be defined to 1 to avoid the build failure of cfgen.
  */
 #define _SQUID_MSWIN_ 1
-#define _SQUID_WIN32_
+#define _SQUID_WIN32_ 1
 
 #elif defined(__APPLE__)
-#define _SQUID_APPLE_
+#define _SQUID_APPLE_ 1
 
 #elif defined(sony_news) && defined(__svr4)
-#define _SQUID_NEWSOS6_
+#define _SQUID_NEWSOS6_ 1
 
 #elif defined(__QNX__)
-#define _SQUID_QNX_
+#define _SQUID_QNX_ 1
 
 #elif defined(__EMX__) || defined(OS2) || defined(__OS2__)
-#define _SQUID_OS2_
+#define _SQUID_OS2_ 1
 
 #endif /* OS automatic detection */
 
index 37b50c83efc86695519e219f05f3cb73de3fc127..e30f7b46c12ed9b0ded05d8e634ad270f965af20 100644 (file)
@@ -35,6 +35,7 @@
 
 #include "util.h"
 
+#ifndef __SUNPRO_CC
 /* Any code using libstdc++ must have externally resolvable overloads
  * for void * operator new - which means in the .o for the binary,
  * or in a shared library. static libs don't propogate the symbol
@@ -60,4 +61,7 @@ _SQUID_EXTERNNEW_ void operator delete[] (void *address) throw()
     xfree (address);
 }
 
+
+#endif /* __SUNPRO_CC */
+
 #endif /* SQUID_NEW_H */
index f6e7dcce3770ab9b4cb03f441525b81a4d06ca88..74ba3719e4c18eb5dfb9ac3a3460562615cad2ad 100644 (file)
  *
  */
 
-#define _SQUID_EXTERNNEW_
+/* #define _SQUID_EXTERNNEW_ */ /* Why? kinkie */
 #include "squid.h"
+
+
+#ifdef __SUNPRO_CC
+
+#include <new>
+void *operator new(size_t size) throw (std::bad_alloc)
+{
+    return xmalloc(size);
+}
+void operator delete (void *address) throw()
+{
+    xfree (address);
+}
+void *operator new[] (size_t size) throw (std::bad_alloc)
+{
+    return xmalloc(size);
+}
+void operator delete[] (void *address) throw()
+{
+    xfree (address);
+}
+
+#endif /* __SUNPRO_CC */