#if defined(SOLARISDL) && !defined(USE_PROC_FOR_LIBRARIES)
-STATIC struct link_map *
-GC_FirstDLOpenedLinkMap(void)
-{
- extern ElfW(Dyn) _DYNAMIC;
+ EXTERN_C_BEGIN
+ extern ElfW(Dyn) _DYNAMIC;
+ EXTERN_C_END
+
+ STATIC struct link_map *
+ GC_FirstDLOpenedLinkMap(void)
+ {
ElfW(Dyn) *dp;
static struct link_map * cachedResult = 0;
static ElfW(Dyn) *dynStructureAddr = 0;
}
}
return cachedResult;
-}
+ }
#endif /* SOLARISDL ... */
# endif
# ifdef HOST_ANDROID
/* Android headers might have no such definition for some targets. */
- int dl_iterate_phdr(int (*cb)(struct dl_phdr_info *, size_t, void *),
- void *data);
+ EXTERN_C_BEGIN
+ extern int dl_iterate_phdr(int (*cb)(struct dl_phdr_info *,
+ size_t, void *),
+ void *data);
+ EXTERN_C_END
# endif
#endif /* __GLIBC__ >= 2 || HOST_ANDROID */
/* We have the header files for a glibc that includes dl_iterate_phdr.*/
/* It may still not be available in the library on the target system. */
/* Thus we also treat it as a weak symbol. */
+ EXTERN_C_BEGIN
# pragma weak dl_iterate_phdr
+ EXTERN_C_END
#endif
#if defined(HAVE_DL_ITERATE_PHDR)
#endif /* !HAVE_DL_ITERATE_PHDR */
+EXTERN_C_BEGIN
#ifdef __GNUC__
# pragma weak _DYNAMIC
#endif
extern ElfW(Dyn) _DYNAMIC[];
+EXTERN_C_END
STATIC struct link_map *
GC_FirstDLOpenedLinkMap(void)
#include <loader.h>
+EXTERN_C_BEGIN
extern char *sys_errlist[];
extern int sys_nerr;
extern int errno;
+EXTERN_C_END
GC_INNER void GC_register_dynamic_libraries(void)
{
#include <errno.h>
#include <dl.h>
+EXTERN_C_BEGIN
extern char *sys_errlist[];
extern int sys_nerr;
+EXTERN_C_END
GC_INNER void GC_register_dynamic_libraries(void)
{
/* broken, since the user program may define data_start, in which */
/* case we lose. Nonetheless, we try both, preferring __data_start.*/
/* We assume gcc-compatible pragmas. */
+ EXTERN_C_BEGIN
# pragma weak __data_start
# pragma weak data_start
extern int __data_start[], data_start[];
# pragma weak __dso_handle
extern int _etext[], __dso_handle[];
# endif
+ EXTERN_C_END
# endif /* LINUX */
ptr_t GC_data_start = NULL;
#if defined(NETBSD) && defined(__ELF__)
ptr_t GC_data_start = NULL;
+ EXTERN_C_BEGIN
extern char **environ;
+ EXTERN_C_END
GC_INNER void GC_init_netbsd_elf(void)
{
# ifdef THREADS
# include <sys/syscall.h>
+ EXTERN_C_BEGIN
extern sigset_t __syscall(quad_t, ...);
+ EXTERN_C_END
# endif
/* Don't use GC_find_limit() because siglongjmp() outside of the */
/* field in /proc/self/stat */
# ifdef USE_LIBC_PRIVATES
+ EXTERN_C_BEGIN
# pragma weak __libc_stack_end
extern ptr_t __libc_stack_end;
-# endif
-
-# ifdef IA64
-# ifdef USE_LIBC_PRIVATES
+# ifdef IA64
# pragma weak __libc_ia64_register_backing_store_base
extern ptr_t __libc_ia64_register_backing_store_base;
# endif
+ EXTERN_C_END
+# endif
+# ifdef IA64
GC_INNER ptr_t GC_get_register_stack_base(void)
{
ptr_t result;
}
# define GET_MAIN_STACKBASE_SPECIAL
#elif defined(SYMBIAN)
+ EXTERN_C_BEGIN
extern int GC_get_main_symbian_stack_base(void);
+ EXTERN_C_END
+
ptr_t GC_get_main_stack_base(void)
{
return (ptr_t)GC_get_main_symbian_stack_base();
# else /* !OS2 && !Windows && !AMIGA && !OPENBSD */
-void GC_register_data_segments(void)
-{
+# if !defined(PCR) && !defined(MACOS) && defined(REDIRECT_MALLOC) \
+ && defined(GC_SOLARIS_THREADS)
+ EXTERN_C_BEGIN
+ extern caddr_t sbrk(int);
+ EXTERN_C_END
+# endif
+
+ void GC_register_data_segments(void)
+ {
# if !defined(PCR) && !defined(MACOS)
# if defined(REDIRECT_MALLOC) && defined(GC_SOLARIS_THREADS)
/* As of Solaris 2.3, the Solaris threads implementation */
/* sbrk at process startup. It needs to be scanned, so that */
/* we don't lose some malloc allocated data structures */
/* hanging from it. We're on thin ice here ... */
- extern caddr_t sbrk(int);
-
GC_ASSERT(DATASTART);
{
ptr_t p = (ptr_t)sbrk(0);
/* Dynamic libraries are added at every collection, since they may */
/* change. */
-}
+ }
# endif /* !AMIGA */
# endif /* !MSWIN32 && !MSWINCE */
# define OPT_MAP_ANON 0
#endif
-#ifdef SYMBIAN
- extern char* GC_get_private_path_and_zero_file(void);
-#endif
-
# ifdef MSWIN_XBOX1
void *durango_get_mem(size_t bytes, size_t page_size)
{
}
# else
+# if defined(SYMBIAN) && !defined(USE_MMAP_ANON)
+ EXTERN_C_BEGIN
+ extern char *GC_get_private_path_and_zero_file(void);
+ EXTERN_C_END
+# endif
+
STATIC ptr_t GC_unix_mmap_get_mem(size_t bytes)
{
void *result;
if (!EXPECT(initialized, TRUE)) {
# ifdef SYMBIAN
- char* path = GC_get_private_path_and_zero_file();
+ char *path = GC_get_private_path_and_zero_file();
zero_fd = open(path, O_RDWR | O_CREAT, 0666);
free(path);
# else
#ifdef PTHREAD_REGISTER_CANCEL_WEAK_STUBS
/* Workaround "undefined reference" linkage errors on some targets. */
- void __pthread_register_cancel() __attribute__((__weak__));
- void __pthread_unregister_cancel() __attribute__((__weak__));
- void __pthread_register_cancel() {}
- void __pthread_unregister_cancel() {}
+ EXTERN_C_BEGIN
+ extern void __pthread_register_cancel(void) __attribute__((__weak__));
+ extern void __pthread_unregister_cancel(void) __attribute__((__weak__));
+ EXTERN_C_END
+
+ void __pthread_register_cancel(void) {}
+ void __pthread_unregister_cancel(void) {}
#endif
#endif /* GC_PTHREADS */