diff --git a/Makefile.rules b/Makefile.rules
index db44a876ba755208480c34a6a3fd625a7e38d421..65eb62f8db477dfb6e7e36e295484f3d8a1946a9 100644
--- a/Makefile.rules
+++ b/Makefile.rules
@@ -51,8 +51,13 @@ endif
 # per-target settings will be applied
 CC_CFLAGS=$(PTHREAD_CFLAGS) $(ASTCFLAGS)
 CXX_CFLAGS=$(PTHREAD_CFLAGS) $(filter-out -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations $(AST_DECLARATION_AFTER_STATEMENT),$(ASTCFLAGS))
-CC_LDFLAGS_SO=$(PTHREAD_CFLAGS) $(ASTLDFLAGS) $(SOLINK)
-CXX_LDFLAGS_SO=$(PTHREAD_CFLAGS) $(ASTLDFLAGS) $(SOLINK)
+
+ifeq ($(GNU_LD),1)
+SO_SUPPRESS_SYMBOLS=-Wl,--version-script,$(if $(wildcard $(subst .so,.exports,$@)),$(subst .so,.exports,$@),$(ASTTOPDIR)/default.exports)
+endif
+
+CC_LDFLAGS_SO=$(PTHREAD_CFLAGS) $(ASTLDFLAGS) $(SOLINK) $(SO_SUPPRESS_SYMBOLS)
+CXX_LDFLAGS_SO=$(PTHREAD_CFLAGS) $(ASTLDFLAGS) $(SOLINK) $(SO_SUPPRESS_SYMBOLS)
 CC_LIBS=$(PTHREAD_LIBS) $(LIBS)
 CXX_LIBS=$(PTHREAD_LIBS) $(LIBS)
 
diff --git a/build_tools/strip_nonapi b/build_tools/strip_nonapi
deleted file mode 100755
index 17492e6f83d8f032965336a321630f14cad1735a..0000000000000000000000000000000000000000
--- a/build_tools/strip_nonapi
+++ /dev/null
@@ -1,38 +0,0 @@
-#!/bin/sh -e
-
-# This script is designed to remove all non-API global symbols from an object
-# file. The only global symbols that should be retained are those that belong
-# to the official namespace. Unfortunately doing this is platform-specific, as
-# the object file manipulation tools are not consistent across platforms.
-#
-# On platforms where this script does not know what to do, the object file
-# will retain non-API global symbols, and this may have unpleasant side effects.
-#
-# Prefixes that belong to the official namespace are:
-#	ast_
-#	_ast_
-#	__ast_
-#	astman_
-#	pbx_
-#	resample_
-
-FILTER="${GREP} -v -e ^ast_ -e ^_ast_ -e ^__ast_ -e ^astman_ -e ^pbx_ -e ^resample_"
-
-case "${PROC}" in
-	powerpc64)
-		TEXTSYM=" D "
-		;;
-	*)
-		TEXTSYM=" T "
-		;;
-esac
-
-case "${OSARCH}" in
-    linux-gnu|FreeBSD)
-	nm ${1} | ${GREP} -e "$TEXTSYM" | cut -d" " -f3 | ${FILTER} > striplist
-	sed -e "s/^/-N /" striplist | xargs -n 40 ${STRIP} ${1}
-	rm -f striplist
-	;;
-    *)
-	;;
-esac
diff --git a/default.exports b/default.exports
new file mode 100644
index 0000000000000000000000000000000000000000..5e767549c47d22e877c78bf7d7feac6d0744bddf
--- /dev/null
+++ b/default.exports
@@ -0,0 +1,4 @@
+{
+	local:
+		*;
+};
diff --git a/include/asterisk/astobj2.h b/include/asterisk/astobj2.h
index c8a464ed715a04dd14585e5e8d1c879d9b1d96fd..fa6b67cc5b4ef63c69643d51c0f5764f0de77ac0 100644
--- a/include/asterisk/astobj2.h
+++ b/include/asterisk/astobj2.h
@@ -402,17 +402,17 @@ typedef void (*ao2_destructor_fn)(void *);
 #ifdef REF_DEBUG
 
 
-#define ao2_t_alloc(arg1, arg2, arg3) _ao2_alloc_debug((arg1), (arg2), (arg3),  __FILE__, __LINE__, __PRETTY_FUNCTION__)
-#define ao2_alloc(arg1, arg2)         _ao2_alloc_debug((arg1), (arg2), "",  __FILE__, __LINE__, __PRETTY_FUNCTION__)
+#define ao2_t_alloc(arg1, arg2, arg3) __ao2_alloc_debug((arg1), (arg2), (arg3),  __FILE__, __LINE__, __PRETTY_FUNCTION__)
+#define ao2_alloc(arg1, arg2)         __ao2_alloc_debug((arg1), (arg2), "",  __FILE__, __LINE__, __PRETTY_FUNCTION__)
 
 #else
 
-#define ao2_t_alloc(arg1,arg2,arg3) _ao2_alloc((arg1), (arg2))
-#define ao2_alloc(arg1,arg2)        _ao2_alloc((arg1), (arg2))
+#define ao2_t_alloc(arg1,arg2,arg3) __ao2_alloc((arg1), (arg2))
+#define ao2_alloc(arg1,arg2)        __ao2_alloc((arg1), (arg2))
 
 #endif
-void *_ao2_alloc_debug(const size_t data_size, ao2_destructor_fn destructor_fn, char *tag, char *file, int line, const char *funcname);
-void *_ao2_alloc(const size_t data_size, ao2_destructor_fn destructor_fn);
+void *__ao2_alloc_debug(const size_t data_size, ao2_destructor_fn destructor_fn, char *tag, char *file, int line, const char *funcname);
+void *__ao2_alloc(const size_t data_size, ao2_destructor_fn destructor_fn);
 
 
 /*! \brief
@@ -437,14 +437,14 @@ void *_ao2_alloc(const size_t data_size, ao2_destructor_fn destructor_fn);
  */
 
 #ifdef REF_DEBUG
-#define ao2_t_ref(arg1,arg2,arg3) _ao2_ref_debug((arg1), (arg2), (arg3),  __FILE__, __LINE__, __PRETTY_FUNCTION__)
-#define ao2_ref(arg1,arg2)        _ao2_ref_debug((arg1), (arg2), "",  __FILE__, __LINE__, __PRETTY_FUNCTION__)
+#define ao2_t_ref(arg1,arg2,arg3) __ao2_ref_debug((arg1), (arg2), (arg3),  __FILE__, __LINE__, __PRETTY_FUNCTION__)
+#define ao2_ref(arg1,arg2)        __ao2_ref_debug((arg1), (arg2), "",  __FILE__, __LINE__, __PRETTY_FUNCTION__)
 #else
-#define ao2_t_ref(arg1,arg2,arg3) _ao2_ref((arg1), (arg2))
-#define ao2_ref(arg1,arg2)        _ao2_ref((arg1), (arg2))
+#define ao2_t_ref(arg1,arg2,arg3) __ao2_ref((arg1), (arg2))
+#define ao2_ref(arg1,arg2)        __ao2_ref((arg1), (arg2))
 #endif
-int _ao2_ref_debug(void *o, int delta, char *tag, char *file, int line, const char *funcname);
-int _ao2_ref(void *o, int delta);
+int __ao2_ref_debug(void *o, int delta, char *tag, char *file, int line, const char *funcname);
+int __ao2_ref(void *o, int delta);
 
 /*! \brief
  * Lock an object.
@@ -455,8 +455,8 @@ int _ao2_ref(void *o, int delta);
 #ifndef DEBUG_THREADS
 int ao2_lock(void *a);
 #else
-#define ao2_lock(a) _ao2_lock(a, __FILE__, __PRETTY_FUNCTION__, __LINE__, #a)
-int _ao2_lock(void *a, const char *file, const char *func, int line, const char *var);
+#define ao2_lock(a) __ao2_lock(a, __FILE__, __PRETTY_FUNCTION__, __LINE__, #a)
+int __ao2_lock(void *a, const char *file, const char *func, int line, const char *var);
 #endif
 
 /*! \brief
@@ -468,8 +468,8 @@ int _ao2_lock(void *a, const char *file, const char *func, int line, const char
 #ifndef DEBUG_THREADS
 int ao2_unlock(void *a);
 #else
-#define ao2_unlock(a) _ao2_unlock(a, __FILE__, __PRETTY_FUNCTION__, __LINE__, #a)
-int _ao2_unlock(void *a, const char *file, const char *func, int line, const char *var);
+#define ao2_unlock(a) __ao2_unlock(a, __FILE__, __PRETTY_FUNCTION__, __LINE__, #a)
+int __ao2_unlock(void *a, const char *file, const char *func, int line, const char *var);
 #endif
 
 /*! \brief
@@ -481,8 +481,8 @@ int _ao2_unlock(void *a, const char *file, const char *func, int line, const cha
 #ifndef DEBUG_THREADS
 int ao2_trylock(void *a);
 #else
-#define ao2_trylock(a) _ao2_trylock(a, __FILE__, __PRETTY_FUNCTION__, __LINE__, #a)
-int _ao2_trylock(void *a, const char *file, const char *func, int line, const char *var);
+#define ao2_trylock(a) __ao2_trylock(a, __FILE__, __PRETTY_FUNCTION__, __LINE__, #a)
+int __ao2_trylock(void *a, const char *file, const char *func, int line, const char *var);
 #endif
 
 /*!
@@ -686,15 +686,15 @@ struct ao2_container;
  */
 
 #ifdef REF_DEBUG
-#define ao2_t_container_alloc(arg1,arg2,arg3,arg4) _ao2_container_alloc_debug((arg1), (arg2), (arg3), (arg4),  __FILE__, __LINE__, __PRETTY_FUNCTION__)
-#define ao2_container_alloc(arg1,arg2,arg3)        _ao2_container_alloc_debug((arg1), (arg2), (arg3), "",  __FILE__, __LINE__, __PRETTY_FUNCTION__)
+#define ao2_t_container_alloc(arg1,arg2,arg3,arg4) __ao2_container_alloc_debug((arg1), (arg2), (arg3), (arg4),  __FILE__, __LINE__, __PRETTY_FUNCTION__)
+#define ao2_container_alloc(arg1,arg2,arg3)        __ao2_container_alloc_debug((arg1), (arg2), (arg3), "",  __FILE__, __LINE__, __PRETTY_FUNCTION__)
 #else
-#define ao2_t_container_alloc(arg1,arg2,arg3,arg4) _ao2_container_alloc((arg1), (arg2), (arg3))
-#define ao2_container_alloc(arg1,arg2,arg3)        _ao2_container_alloc((arg1), (arg2), (arg3))
+#define ao2_t_container_alloc(arg1,arg2,arg3,arg4) __ao2_container_alloc((arg1), (arg2), (arg3))
+#define ao2_container_alloc(arg1,arg2,arg3)        __ao2_container_alloc((arg1), (arg2), (arg3))
 #endif
-struct ao2_container *_ao2_container_alloc(const unsigned int n_buckets,
+struct ao2_container *__ao2_container_alloc(const unsigned int n_buckets,
 										  ao2_hash_fn *hash_fn, ao2_callback_fn *cmp_fn);
-struct ao2_container *_ao2_container_alloc_debug(const unsigned int n_buckets,
+struct ao2_container *__ao2_container_alloc_debug(const unsigned int n_buckets,
 												ao2_hash_fn *hash_fn, ao2_callback_fn *cmp_fn,
 												char *tag, char *file, int line, const char *funcname);
 
@@ -730,14 +730,14 @@ int ao2_container_count(struct ao2_container *c);
  */
 #ifdef REF_DEBUG
 
-#define ao2_t_link(arg1, arg2, arg3) _ao2_link_debug((arg1), (arg2), (arg3),  __FILE__, __LINE__, __PRETTY_FUNCTION__)
-#define ao2_link(arg1, arg2)         _ao2_link_debug((arg1), (arg2), "",  __FILE__, __LINE__, __PRETTY_FUNCTION__)
+#define ao2_t_link(arg1, arg2, arg3) __ao2_link_debug((arg1), (arg2), (arg3),  __FILE__, __LINE__, __PRETTY_FUNCTION__)
+#define ao2_link(arg1, arg2)         __ao2_link_debug((arg1), (arg2), "",  __FILE__, __LINE__, __PRETTY_FUNCTION__)
 #else
-#define ao2_t_link(arg1, arg2, arg3) _ao2_link((arg1), (arg2))
-#define ao2_link(arg1, arg2)         _ao2_link((arg1), (arg2))
+#define ao2_t_link(arg1, arg2, arg3) __ao2_link((arg1), (arg2))
+#define ao2_link(arg1, arg2)         __ao2_link((arg1), (arg2))
 #endif
-void *_ao2_link_debug(struct ao2_container *c, void *new_obj, char *tag, char *file, int line, const char *funcname);
-void *_ao2_link(struct ao2_container *c, void *newobj);
+void *__ao2_link_debug(struct ao2_container *c, void *new_obj, char *tag, char *file, int line, const char *funcname);
+void *__ao2_link(struct ao2_container *c, void *newobj);
 
 /*!
  * \brief Remove an object from the container
@@ -756,14 +756,14 @@ void *_ao2_link(struct ao2_container *c, void *newobj);
  *       refcount will be decremented).
  */
 #ifdef REF_DEBUG
-#define ao2_t_unlink(arg1, arg2, arg3) _ao2_unlink_debug((arg1), (arg2), (arg3),  __FILE__, __LINE__, __PRETTY_FUNCTION__)
-#define ao2_unlink(arg1, arg2)         _ao2_unlink_debug((arg1), (arg2), "",  __FILE__, __LINE__, __PRETTY_FUNCTION__)
+#define ao2_t_unlink(arg1, arg2, arg3) __ao2_unlink_debug((arg1), (arg2), (arg3),  __FILE__, __LINE__, __PRETTY_FUNCTION__)
+#define ao2_unlink(arg1, arg2)         __ao2_unlink_debug((arg1), (arg2), "",  __FILE__, __LINE__, __PRETTY_FUNCTION__)
 #else
-#define ao2_t_unlink(arg1, arg2, arg3) _ao2_unlink((arg1), (arg2))
-#define ao2_unlink(arg1, arg2)         _ao2_unlink((arg1), (arg2))
+#define ao2_t_unlink(arg1, arg2, arg3) __ao2_unlink((arg1), (arg2))
+#define ao2_unlink(arg1, arg2)         __ao2_unlink((arg1), (arg2))
 #endif
-void *_ao2_unlink_debug(struct ao2_container *c, void *obj, char *tag, char *file, int line, const char *funcname);
-void *_ao2_unlink(struct ao2_container *c, void *obj);
+void *__ao2_unlink_debug(struct ao2_container *c, void *obj, char *tag, char *file, int line, const char *funcname);
+void *__ao2_unlink(struct ao2_container *c, void *obj);
 
 
 /*! \brief Used as return value if the flag OBJ_MULTIPLE is set */
@@ -851,16 +851,16 @@ struct ao2_list {
  * be used to free the additional reference possibly created by this function.
  */
 #ifdef REF_DEBUG
-#define ao2_t_callback(arg1,arg2,arg3,arg4,arg5) _ao2_callback_debug((arg1), (arg2), (arg3), (arg4), (arg5), __FILE__, __LINE__, __PRETTY_FUNCTION__)
-#define ao2_callback(arg1,arg2,arg3,arg4)        _ao2_callback_debug((arg1), (arg2), (arg3), (arg4), "", __FILE__, __LINE__, __PRETTY_FUNCTION__)
+#define ao2_t_callback(arg1,arg2,arg3,arg4,arg5) __ao2_callback_debug((arg1), (arg2), (arg3), (arg4), (arg5), __FILE__, __LINE__, __PRETTY_FUNCTION__)
+#define ao2_callback(arg1,arg2,arg3,arg4)        __ao2_callback_debug((arg1), (arg2), (arg3), (arg4), "", __FILE__, __LINE__, __PRETTY_FUNCTION__)
 #else
-#define ao2_t_callback(arg1,arg2,arg3,arg4,arg5) _ao2_callback((arg1), (arg2), (arg3), (arg4))
-#define ao2_callback(arg1,arg2,arg3,arg4)        _ao2_callback((arg1), (arg2), (arg3), (arg4))
+#define ao2_t_callback(arg1,arg2,arg3,arg4,arg5) __ao2_callback((arg1), (arg2), (arg3), (arg4))
+#define ao2_callback(arg1,arg2,arg3,arg4)        __ao2_callback((arg1), (arg2), (arg3), (arg4))
 #endif
-void *_ao2_callback_debug(struct ao2_container *c, enum search_flags flags,
+void *__ao2_callback_debug(struct ao2_container *c, enum search_flags flags,
 						  ao2_callback_fn *cb_fn, void *arg, char *tag,
 						  char *file, int line, const char *funcname);
-void *_ao2_callback(struct ao2_container *c,
+void *__ao2_callback(struct ao2_container *c,
 					enum search_flags flags,
 					ao2_callback_fn *cb_fn, void *arg);
 
@@ -880,16 +880,16 @@ void *_ao2_callback(struct ao2_container *c,
  * \see ao2_callback()
  */
 #ifdef REF_DEBUG
-#define ao2_t_callback_data(arg1,arg2,arg3,arg4,arg5,arg6) _ao2_callback_data_debug((arg1), (arg2), (arg3), (arg4), (arg5), (arg6), __FILE__, __LINE__, __PRETTY_FUNCTION__)
-#define ao2_callback_data(arg1,arg2,arg3,arg4,arg5)        _ao2_callback_data_debug((arg1), (arg2), (arg3), (arg4), (arg5), "", __FILE__, __LINE__, __PRETTY_FUNCTION__)
+#define ao2_t_callback_data(arg1,arg2,arg3,arg4,arg5,arg6) __ao2_callback_data_debug((arg1), (arg2), (arg3), (arg4), (arg5), (arg6), __FILE__, __LINE__, __PRETTY_FUNCTION__)
+#define ao2_callback_data(arg1,arg2,arg3,arg4,arg5)        __ao2_callback_data_debug((arg1), (arg2), (arg3), (arg4), (arg5), "", __FILE__, __LINE__, __PRETTY_FUNCTION__)
 #else
-#define ao2_t_callback_data(arg1,arg2,arg3,arg4,arg5,arg6) _ao2_callback_data((arg1), (arg2), (arg3), (arg4), (arg5))
-#define ao2_callback_data(arg1,arg2,arg3,arg4,arg5)        _ao2_callback_data((arg1), (arg2), (arg3), (arg4), (arg5))
+#define ao2_t_callback_data(arg1,arg2,arg3,arg4,arg5,arg6) __ao2_callback_data((arg1), (arg2), (arg3), (arg4), (arg5))
+#define ao2_callback_data(arg1,arg2,arg3,arg4,arg5)        __ao2_callback_data((arg1), (arg2), (arg3), (arg4), (arg5))
 #endif
-void *_ao2_callback_data_debug(struct ao2_container *c, enum search_flags flags,
+void *__ao2_callback_data_debug(struct ao2_container *c, enum search_flags flags,
 						  ao2_callback_data_fn *cb_fn, void *arg, void *data, char *tag,
 						  char *file, int line, const char *funcname);
-void *_ao2_callback_data(struct ao2_container *c,
+void *__ao2_callback_data(struct ao2_container *c,
 					enum search_flags flags,
 					ao2_callback_data_fn *cb_fn, void *arg, void *data);
 
@@ -897,14 +897,14 @@ void *_ao2_callback_data(struct ao2_container *c,
  * XXX possibly change order of arguments ?
  */
 #ifdef REF_DEBUG
-#define ao2_t_find(arg1,arg2,arg3,arg4) _ao2_find_debug((arg1), (arg2), (arg3), (arg4), __FILE__, __LINE__, __PRETTY_FUNCTION__)
-#define ao2_find(arg1,arg2,arg3)        _ao2_find_debug((arg1), (arg2), (arg3), "", __FILE__, __LINE__, __PRETTY_FUNCTION__)
+#define ao2_t_find(arg1,arg2,arg3,arg4) __ao2_find_debug((arg1), (arg2), (arg3), (arg4), __FILE__, __LINE__, __PRETTY_FUNCTION__)
+#define ao2_find(arg1,arg2,arg3)        __ao2_find_debug((arg1), (arg2), (arg3), "", __FILE__, __LINE__, __PRETTY_FUNCTION__)
 #else
-#define ao2_t_find(arg1,arg2,arg3,arg4) _ao2_find((arg1), (arg2), (arg3))
-#define ao2_find(arg1,arg2,arg3)        _ao2_find((arg1), (arg2), (arg3))
+#define ao2_t_find(arg1,arg2,arg3,arg4) __ao2_find((arg1), (arg2), (arg3))
+#define ao2_find(arg1,arg2,arg3)        __ao2_find((arg1), (arg2), (arg3))
 #endif
-void *_ao2_find_debug(struct ao2_container *c, void *arg, enum search_flags flags, char *tag, char *file, int line, const char *funcname);
-void *_ao2_find(struct ao2_container *c, void *arg, enum search_flags flags);
+void *__ao2_find_debug(struct ao2_container *c, void *arg, enum search_flags flags, char *tag, char *file, int line, const char *funcname);
+void *__ao2_find(struct ao2_container *c, void *arg, enum search_flags flags);
 
 /*! \brief
  *
@@ -1003,14 +1003,14 @@ struct ao2_iterator {
 
 struct ao2_iterator ao2_iterator_init(struct ao2_container *c, int flags);
 #ifdef REF_DEBUG
-#define ao2_t_iterator_next(arg1, arg2) _ao2_iterator_next_debug((arg1), (arg2),  __FILE__, __LINE__, __PRETTY_FUNCTION__)
-#define ao2_iterator_next(arg1)         _ao2_iterator_next_debug((arg1), "",  __FILE__, __LINE__, __PRETTY_FUNCTION__)
+#define ao2_t_iterator_next(arg1, arg2) __ao2_iterator_next_debug((arg1), (arg2),  __FILE__, __LINE__, __PRETTY_FUNCTION__)
+#define ao2_iterator_next(arg1)         __ao2_iterator_next_debug((arg1), "",  __FILE__, __LINE__, __PRETTY_FUNCTION__)
 #else
-#define ao2_t_iterator_next(arg1, arg2) _ao2_iterator_next((arg1))
-#define ao2_iterator_next(arg1)         _ao2_iterator_next((arg1))
+#define ao2_t_iterator_next(arg1, arg2) __ao2_iterator_next((arg1))
+#define ao2_iterator_next(arg1)         __ao2_iterator_next((arg1))
 #endif
-void *_ao2_iterator_next_debug(struct ao2_iterator *a, char *tag, char *file, int line, const char *funcname);
-void *_ao2_iterator_next(struct ao2_iterator *a);
+void *__ao2_iterator_next_debug(struct ao2_iterator *a, char *tag, char *file, int line, const char *funcname);
+void *__ao2_iterator_next(struct ao2_iterator *a);
 
 /* extra functions */
 void ao2_bt(void);	/* backtrace */
diff --git a/main/Makefile b/main/Makefile
index aec3d7ed6e612fff5e01164171e56d14a2684e65..eee481c145475c7b9730afc15c791d6ec8339083 100644
--- a/main/Makefile
+++ b/main/Makefile
@@ -111,6 +111,10 @@ ifneq ($(findstring USE_HOARD_ALLOCATOR,$(MENUSELECT_CFLAGS)),)
   endif
 endif
 
+ifeq ($(GNU_LD),1)
+ASTLINK+=-Wl,--version-script,asterisk.exports
+endif
+
 CHECK_SUBDIR:	# do nothing, just make sure that we recurse in the subdir/
 
 editline/libedit.a: CHECK_SUBDIR
@@ -171,15 +175,14 @@ ifneq ($(findstring ENABLE_UPLOADS,$(MENUSELECT_CFLAGS)),)
 GMIMELDFLAGS+=$(GMIME_LIB)
 endif
 
-$(MAIN_TGT): $(OBJS) editline/libedit.a db1-ast/libdb1.a $(AST_EMBED_LDSCRIPTS)
+$(MAIN_TGT): $(OBJS) editline/libedit.a db1-ast/libdb1.a $(AST_EMBED_LDSCRIPTS) asterisk.exports
 	@$(CC) -c -o buildinfo.o $(ASTCFLAGS) buildinfo.c
-	$(ECHO_PREFIX) echo "   [LD] $^ -> $@"
+	$(ECHO_PREFIX) echo "   [LD] $(OBJS) editline/libedit.a db1-ast/libdb1.a $(AST_EMBED_LDSCRIPTS) -> $@"
 ifneq ($(findstring chan_h323,$(MENUSELECT_CHANNELS)),)
-	$(CMD_PREFIX) $(CC) $(STATIC_BUILD) -o $@ $(ASTLINK) $(AST_EMBED_LDFLAGS) $(ASTLDFLAGS) $^ buildinfo.o $(AST_LIBS) $(AST_EMBED_LIBS) $(GMIMELDFLAGS)
+	$(CMD_PREFIX) $(CC) $(STATIC_BUILD) -o $@ $(ASTLINK) $(AST_EMBED_LDFLAGS) $(ASTLDFLAGS) $(OBJS) editline/libedit.a db1-ast/libdb1.a $(AST_EMBED_LDSCRIPTS) buildinfo.o $(AST_LIBS) $(AST_EMBED_LIBS) $(GMIMELDFLAGS)
 else
-	$(CMD_PREFIX) $(CXX) $(STATIC_BUILD) -o $@ $(ASTLINK) $(AST_EMBED_LDFLAGS) $(ASTLDFLAGS) $(H323LDFLAGS) $^ buildinfo.o $(AST_LIBS) $(AST_EMBED_LIBS) $(H323LDLIBS) $(GMIMELDFLAGS)
+	$(CMD_PREFIX) $(CXX) $(STATIC_BUILD) -o $@ $(ASTLINK) $(AST_EMBED_LDFLAGS) $(ASTLDFLAGS) $(H323LDFLAGS) $(OBJS) editline/libedit.a db1-ast/libdb1.a $(AST_EMBED_LDSCRIPTS) buildinfo.o $(AST_LIBS) $(AST_EMBED_LIBS) $(H323LDLIBS) $(GMIMELDFLAGS)
 endif
-	$(CMD_PREFIX) $(ASTTOPDIR)/build_tools/strip_nonapi $@ || rm $@
 
 clean::
 	rm -f asterisk
diff --git a/main/asterisk.exports b/main/asterisk.exports
new file mode 100644
index 0000000000000000000000000000000000000000..f18c0fff06062aad14bb3bb2918408235bc603e3
--- /dev/null
+++ b/main/asterisk.exports
@@ -0,0 +1,28 @@
+{
+	global:
+		ast_*;
+		_ast_*;
+		__ast_*;
+		pbx_*;
+		astman_*;
+		ao2_*;
+		__ao2_*;
+		option_debug;
+		option_verbose;
+		dahdi_chan_name;
+		dahdi_chan_name_len;
+		dahdi_chan_mode;
+		cid_di;
+		cid_dr;
+		clidsb;
+		MD5*;
+		sched_*;
+		io_*;
+		jb_*;
+		channelreloadreason2txt;
+		devstate2str;
+		manager_event;
+		dialed_interface_info;
+	local:
+		*;
+};
diff --git a/main/astobj2.c b/main/astobj2.c
index 7dd4c7ec102acb9b2f19990c693bab801f531ae6..36d943843c73177cbcbd685550c87ecc5dae78cc 100644
--- a/main/astobj2.c
+++ b/main/astobj2.c
@@ -134,20 +134,20 @@ enum ao2_callback_type {
 
 /* the underlying functions common to debug and non-debug versions */
 
-static int __ao2_ref(void *user_data, const int delta);
-static void *__ao2_alloc(size_t data_size, ao2_destructor_fn destructor_fn);
-static struct ao2_container *__ao2_container_alloc(struct ao2_container *c, const uint n_buckets, ao2_hash_fn *hash_fn,
-											ao2_callback_fn *cmp_fn);
-static struct bucket_list *__ao2_link(struct ao2_container *c, void *user_data, const char *file, int line, const char *func);
-static void *__ao2_callback(struct ao2_container *c,
-	const enum search_flags flags, void *cb_fn, void *arg, void *data, enum ao2_callback_type type,
-					 char *tag, char *file, int line, const char *funcname);
-static void * __ao2_iterator_next(struct ao2_iterator *a, struct bucket_list **q);
+static int internal_ao2_ref(void *user_data, const int delta);
+static void *internal_ao2_alloc(size_t data_size, ao2_destructor_fn destructor_fn);
+static struct ao2_container *internal_ao2_container_alloc(struct ao2_container *c, const uint n_buckets, ao2_hash_fn *hash_fn,
+							  ao2_callback_fn *cmp_fn);
+static struct bucket_list *internal_ao2_link(struct ao2_container *c, void *user_data, const char *file, int line, const char *func);
+static void *internal_ao2_callback(struct ao2_container *c,
+				   const enum search_flags flags, void *cb_fn, void *arg, void *data, enum ao2_callback_type type,
+				   char *tag, char *file, int line, const char *funcname);
+static void *internal_ao2_iterator_next(struct ao2_iterator *a, struct bucket_list **q);
 
 #ifndef DEBUG_THREADS
 int ao2_lock(void *user_data)
 #else
-int _ao2_lock(void *user_data, const char *file, const char *func, int line, const char *var)
+int __ao2_lock(void *user_data, const char *file, const char *func, int line, const char *var)
 #endif
 {
 	struct astobj2 *p = INTERNAL_OBJ(user_data);
@@ -169,7 +169,7 @@ int _ao2_lock(void *user_data, const char *file, const char *func, int line, con
 #ifndef DEBUG_THREADS
 int ao2_unlock(void *user_data)
 #else
-int _ao2_unlock(void *user_data, const char *file, const char *func, int line, const char *var)
+int __ao2_unlock(void *user_data, const char *file, const char *func, int line, const char *var)
 #endif
 {
 	struct astobj2 *p = INTERNAL_OBJ(user_data);
@@ -191,7 +191,7 @@ int _ao2_unlock(void *user_data, const char *file, const char *func, int line, c
 #ifndef DEBUG_THREADS
 int ao2_trylock(void *user_data)
 #else
-int _ao2_trylock(void *user_data, const char *file, const char *func, int line, const char *var)
+int __ao2_trylock(void *user_data, const char *file, const char *func, int line, const char *var)
 #endif
 {
 	struct astobj2 *p = INTERNAL_OBJ(user_data);
@@ -227,7 +227,7 @@ void *ao2_object_get_lockaddr(void *obj)
  */
 
 
-int _ao2_ref_debug(void *user_data, const int delta, char *tag, char *file, int line, const char *funcname)
+int __ao2_ref_debug(void *user_data, const int delta, char *tag, char *file, int line, const char *funcname)
 {
 	struct astobj2 *obj = INTERNAL_OBJ(user_data);
 	
@@ -244,20 +244,20 @@ int _ao2_ref_debug(void *user_data, const int delta, char *tag, char *file, int
 			fprintf(refo, "%p **call destructor** %s:%d:%s (%s)\n", user_data, file, line, funcname, tag); 	 
 			fclose(refo);
 	}
-	return __ao2_ref(user_data, delta);
+	return internal_ao2_ref(user_data, delta);
 }
 
-int _ao2_ref(void *user_data, const int delta)
+int __ao2_ref(void *user_data, const int delta)
 {
 	struct astobj2 *obj = INTERNAL_OBJ(user_data);
 
 	if (obj == NULL)
 		return -1;
 
-	return __ao2_ref(user_data, delta);
+	return internal_ao2_ref(user_data, delta);
 }
 
-static int __ao2_ref(void *user_data, const int delta)
+static int internal_ao2_ref(void *user_data, const int delta)
 {
 	struct astobj2 *obj = INTERNAL_OBJ(user_data);
 	int current_value;
@@ -303,7 +303,7 @@ static int __ao2_ref(void *user_data, const int delta)
  * We always alloc at least the size of a void *,
  * for debugging purposes.
  */
-static void *__ao2_alloc(size_t data_size, ao2_destructor_fn destructor_fn)
+static void *internal_ao2_alloc(size_t data_size, ao2_destructor_fn destructor_fn)
 {
 	/* allocation */
 	struct astobj2 *obj;
@@ -332,13 +332,13 @@ static void *__ao2_alloc(size_t data_size, ao2_destructor_fn destructor_fn)
 	return EXTERNAL_OBJ(obj);
 }
 
-void *_ao2_alloc_debug(size_t data_size, ao2_destructor_fn destructor_fn, char *tag, char *file, int line, const char *funcname)
+void *__ao2_alloc_debug(size_t data_size, ao2_destructor_fn destructor_fn, char *tag, char *file, int line, const char *funcname)
 {
 	/* allocation */
 	void *obj;
 	FILE *refo = fopen(REF_FILE,"a");
 
-	obj = __ao2_alloc(data_size, destructor_fn);
+	obj = internal_ao2_alloc(data_size, destructor_fn);
 
 	if (obj == NULL)
 		return NULL;
@@ -352,9 +352,9 @@ void *_ao2_alloc_debug(size_t data_size, ao2_destructor_fn destructor_fn, char *
 	return obj;
 }
 
-void *_ao2_alloc(size_t data_size, ao2_destructor_fn destructor_fn)
+void *__ao2_alloc(size_t data_size, ao2_destructor_fn destructor_fn)
 {
-	return __ao2_alloc(data_size, destructor_fn);
+	return internal_ao2_alloc(data_size, destructor_fn);
 }
 
 
@@ -418,8 +418,8 @@ static int hash_zero(const void *user_obj, const int flags)
 /*
  * A container is just an object, after all!
  */
-static struct ao2_container *__ao2_container_alloc(struct ao2_container *c, const unsigned int n_buckets, ao2_hash_fn *hash_fn,
-											ao2_callback_fn *cmp_fn)
+static struct ao2_container *internal_ao2_container_alloc(struct ao2_container *c, const unsigned int n_buckets, ao2_hash_fn *hash_fn,
+							  ao2_callback_fn *cmp_fn)
 {
 	/* XXX maybe consistency check on arguments ? */
 	/* compute the container size */
@@ -439,28 +439,27 @@ static struct ao2_container *__ao2_container_alloc(struct ao2_container *c, cons
 	return c;
 }
 
-struct ao2_container *_ao2_container_alloc_debug(const unsigned int n_buckets, ao2_hash_fn *hash_fn,
-		ao2_callback_fn *cmp_fn, char *tag, char *file, int line, const char *funcname)
+struct ao2_container *__ao2_container_alloc_debug(const unsigned int n_buckets, ao2_hash_fn *hash_fn,
+						  ao2_callback_fn *cmp_fn, char *tag, char *file, int line, const char *funcname)
 {
 	/* XXX maybe consistency check on arguments ? */
 	/* compute the container size */
 	size_t container_size = sizeof(struct ao2_container) + n_buckets * sizeof(struct bucket);
-	struct ao2_container *c = _ao2_alloc_debug(container_size, container_destruct_debug, tag, file, line, funcname);
+	struct ao2_container *c = __ao2_alloc_debug(container_size, container_destruct_debug, tag, file, line, funcname);
 
-	return __ao2_container_alloc(c, n_buckets, hash_fn, cmp_fn);
+	return internal_ao2_container_alloc(c, n_buckets, hash_fn, cmp_fn);
 }
 
-struct ao2_container *
-_ao2_container_alloc(const unsigned int n_buckets, ao2_hash_fn *hash_fn,
-		ao2_callback_fn *cmp_fn)
+struct ao2_container *__ao2_container_alloc(const unsigned int n_buckets, ao2_hash_fn *hash_fn,
+					    ao2_callback_fn *cmp_fn)
 {
 	/* XXX maybe consistency check on arguments ? */
 	/* compute the container size */
 
 	size_t container_size = sizeof(struct ao2_container) + n_buckets * sizeof(struct bucket);
-	struct ao2_container *c = _ao2_alloc(container_size, container_destruct);
+	struct ao2_container *c = __ao2_alloc(container_size, container_destruct);
 
-	return __ao2_container_alloc(c, n_buckets, hash_fn, cmp_fn);
+	return internal_ao2_container_alloc(c, n_buckets, hash_fn, cmp_fn);
 }
 
 /*!
@@ -486,7 +485,7 @@ struct bucket_list {
  * link an object to a container
  */
 
-static struct bucket_list *__ao2_link(struct ao2_container *c, void *user_data, const char *file, int line, const char *func)
+static struct bucket_list *internal_ao2_link(struct ao2_container *c, void *user_data, const char *file, int line, const char *func)
 {
 	int i;
 	/* create a new list entry */
@@ -516,23 +515,23 @@ static struct bucket_list *__ao2_link(struct ao2_container *c, void *user_data,
 	return p;
 }
 
-void *_ao2_link_debug(struct ao2_container *c, void *user_data, char *tag, char *file, int line, const char *funcname)
+void *__ao2_link_debug(struct ao2_container *c, void *user_data, char *tag, char *file, int line, const char *funcname)
 {
-	struct bucket_list *p = __ao2_link(c, user_data, file, line, funcname);
+	struct bucket_list *p = internal_ao2_link(c, user_data, file, line, funcname);
 
 	if (p) {
-		_ao2_ref_debug(user_data, +1, tag, file, line, funcname);
+		__ao2_ref_debug(user_data, +1, tag, file, line, funcname);
 		ao2_unlock(c);
 	}
 	return p;
 }
 
-void *_ao2_link(struct ao2_container *c, void *user_data)
+void *__ao2_link(struct ao2_container *c, void *user_data)
 {
-	struct bucket_list *p = __ao2_link(c, user_data, __FILE__, __LINE__, __PRETTY_FUNCTION__);
+	struct bucket_list *p = internal_ao2_link(c, user_data, __FILE__, __LINE__, __PRETTY_FUNCTION__);
 
 	if (p) {
-		_ao2_ref(user_data, +1);
+		__ao2_ref(user_data, +1);
 		ao2_unlock(c);
 	}
 	return p;
@@ -550,23 +549,23 @@ int ao2_match_by_addr(void *user_data, void *arg, int flags)
  * Unlink an object from the container
  * and destroy the associated * ao2_bucket_list structure.
  */
-void *_ao2_unlink_debug(struct ao2_container *c, void *user_data, char *tag,
-					   char *file, int line, const char *funcname)
+void *__ao2_unlink_debug(struct ao2_container *c, void *user_data, char *tag,
+			 char *file, int line, const char *funcname)
 {
 	if (INTERNAL_OBJ(user_data) == NULL)	/* safety check on the argument */
 		return NULL;
 
-	_ao2_callback_debug(c, OBJ_UNLINK | OBJ_POINTER | OBJ_NODATA, ao2_match_by_addr, user_data, tag, file, line, funcname);
+	__ao2_callback_debug(c, OBJ_UNLINK | OBJ_POINTER | OBJ_NODATA, ao2_match_by_addr, user_data, tag, file, line, funcname);
 
 	return NULL;
 }
 
-void *_ao2_unlink(struct ao2_container *c, void *user_data)
+void *__ao2_unlink(struct ao2_container *c, void *user_data)
 {
 	if (INTERNAL_OBJ(user_data) == NULL)	/* safety check on the argument */
 		return NULL;
 
-	_ao2_callback(c, OBJ_UNLINK | OBJ_POINTER | OBJ_NODATA, ao2_match_by_addr, user_data);
+	__ao2_callback(c, OBJ_UNLINK | OBJ_POINTER | OBJ_NODATA, ao2_match_by_addr, user_data);
 
 	return NULL;
 }
@@ -595,9 +594,9 @@ static int cb_true_data(void *user_data, void *arg, void *data, int flags)
  * aren't an excessive load to the system, as the callback should not be
  * called as often as, say, the ao2_ref func is called.
  */
-static void *__ao2_callback(struct ao2_container *c,
-	const enum search_flags flags, void *cb_fn, void *arg, void *data, enum ao2_callback_type type,
-	char *tag, char *file, int line, const char *funcname)
+static void *internal_ao2_callback(struct ao2_container *c,
+				   const enum search_flags flags, void *cb_fn, void *arg, void *data, enum ao2_callback_type type,
+				   char *tag, char *file, int line, const char *funcname)
 {
 	int i, last;	/* search boundaries */
 	void *ret = NULL;
@@ -675,9 +674,9 @@ static void *__ao2_callback(struct ao2_container *c,
 				/* it is important to handle this case before the unlink */
 				ret = EXTERNAL_OBJ(cur->astobj);
 				if (tag)
-					_ao2_ref_debug(ret, 1, tag, file, line, funcname);
+					__ao2_ref_debug(ret, 1, tag, file, line, funcname);
 				else
-					_ao2_ref(ret, 1);
+					__ao2_ref(ret, 1);
 			}
 
 			if (flags & OBJ_UNLINK) {	/* must unlink */
@@ -689,9 +688,9 @@ static void *__ao2_callback(struct ao2_container *c,
 				/* update number of elements and version */
 				ast_atomic_fetchadd_int(&c->elements, -1);
 				if (tag)
-					_ao2_ref_debug(EXTERNAL_OBJ(x->astobj), -1, tag, file, line, funcname);
+					__ao2_ref_debug(EXTERNAL_OBJ(x->astobj), -1, tag, file, line, funcname);
 				else
-					_ao2_ref(EXTERNAL_OBJ(x->astobj), -1);
+					__ao2_ref(EXTERNAL_OBJ(x->astobj), -1);
 				free(x);	/* free the link record */
 			}
 
@@ -715,45 +714,45 @@ static void *__ao2_callback(struct ao2_container *c,
 	return ret;
 }
 
-void *_ao2_callback_debug(struct ao2_container *c,
-						 const enum search_flags flags,
-						 ao2_callback_fn *cb_fn, void *arg,
-						 char *tag, char *file, int line, const char *funcname)
+void *__ao2_callback_debug(struct ao2_container *c,
+			   const enum search_flags flags,
+			   ao2_callback_fn *cb_fn, void *arg,
+			   char *tag, char *file, int line, const char *funcname)
 {
-	return __ao2_callback(c,flags, cb_fn, arg, NULL, DEFAULT, tag, file, line, funcname);
+	return internal_ao2_callback(c,flags, cb_fn, arg, NULL, DEFAULT, tag, file, line, funcname);
 }
 
-void *_ao2_callback(struct ao2_container *c, const enum search_flags flags,
-                    ao2_callback_fn *cb_fn, void *arg)
+void *__ao2_callback(struct ao2_container *c, const enum search_flags flags,
+		     ao2_callback_fn *cb_fn, void *arg)
 {
-	return __ao2_callback(c,flags, cb_fn, arg, NULL, DEFAULT, NULL, NULL, 0, NULL);
+	return internal_ao2_callback(c,flags, cb_fn, arg, NULL, DEFAULT, NULL, NULL, 0, NULL);
 }
 
-void *_ao2_callback_data_debug(struct ao2_container *c,
-						 const enum search_flags flags,
-						 ao2_callback_data_fn *cb_fn, void *arg, void *data,
-						 char *tag, char *file, int line, const char *funcname)
+void *__ao2_callback_data_debug(struct ao2_container *c,
+				const enum search_flags flags,
+				ao2_callback_data_fn *cb_fn, void *arg, void *data,
+				char *tag, char *file, int line, const char *funcname)
 {
-	return __ao2_callback(c, flags, cb_fn, arg, data, WITH_DATA, tag, file, line, funcname);
+	return internal_ao2_callback(c, flags, cb_fn, arg, data, WITH_DATA, tag, file, line, funcname);
 }
 
-void *_ao2_callback_data(struct ao2_container *c, const enum search_flags flags,
-					ao2_callback_data_fn *cb_fn, void *arg, void *data)
+void *__ao2_callback_data(struct ao2_container *c, const enum search_flags flags,
+			  ao2_callback_data_fn *cb_fn, void *arg, void *data)
 {
-	return __ao2_callback(c, flags, cb_fn, arg, data, WITH_DATA, NULL, NULL, 0, NULL);
+	return internal_ao2_callback(c, flags, cb_fn, arg, data, WITH_DATA, NULL, NULL, 0, NULL);
 }
 
 /*!
  * the find function just invokes the default callback with some reasonable flags.
  */
-void *_ao2_find_debug(struct ao2_container *c, void *arg, enum search_flags flags, char *tag, char *file, int line, const char *funcname)
+void *__ao2_find_debug(struct ao2_container *c, void *arg, enum search_flags flags, char *tag, char *file, int line, const char *funcname)
 {
-	return _ao2_callback_debug(c, flags, c->cmp_fn, arg, tag, file, line, funcname);
+	return __ao2_callback_debug(c, flags, c->cmp_fn, arg, tag, file, line, funcname);
 }
 
-void *_ao2_find(struct ao2_container *c, void *arg, enum search_flags flags)
+void *__ao2_find(struct ao2_container *c, void *arg, enum search_flags flags)
 {
-	return _ao2_callback(c, flags, c->cmp_fn, arg);
+	return __ao2_callback(c, flags, c->cmp_fn, arg);
 }
 
 /*!
@@ -772,7 +771,7 @@ struct ao2_iterator ao2_iterator_init(struct ao2_container *c, int flags)
 /*
  * move to the next element in the container.
  */
-static void * __ao2_iterator_next(struct ao2_iterator *a, struct bucket_list **q)
+static void *internal_ao2_iterator_next(struct ao2_iterator *a, struct bucket_list **q)
 {
 	int lim;
 	struct bucket_list *p = NULL;
@@ -827,16 +826,16 @@ found:
 	return ret;
 }
 
-void * _ao2_iterator_next_debug(struct ao2_iterator *a, char *tag, char *file, int line, const char *funcname)
+void *__ao2_iterator_next_debug(struct ao2_iterator *a, char *tag, char *file, int line, const char *funcname)
 {
 	struct bucket_list *p;
 	void *ret = NULL;
 
-	ret = __ao2_iterator_next(a, &p);
+	ret = internal_ao2_iterator_next(a, &p);
 	
 	if (p) {
 		/* inc refcount of returned object */
-		_ao2_ref_debug(ret, 1, tag, file, line, funcname);
+		__ao2_ref_debug(ret, 1, tag, file, line, funcname);
 	}
 
 	if (!(a->flags & F_AO2I_DONTLOCK))
@@ -845,16 +844,16 @@ void * _ao2_iterator_next_debug(struct ao2_iterator *a, char *tag, char *file, i
 	return ret;
 }
 
-void * _ao2_iterator_next(struct ao2_iterator *a)
+void *__ao2_iterator_next(struct ao2_iterator *a)
 {
 	struct bucket_list *p = NULL;
 	void *ret = NULL;
 
-	ret = __ao2_iterator_next(a, &p);
+	ret = internal_ao2_iterator_next(a, &p);
 	
 	if (p) {
 		/* inc refcount of returned object */
-		_ao2_ref(ret, 1);
+		__ao2_ref(ret, 1);
 	}
 
 	if (!(a->flags & F_AO2I_DONTLOCK))
@@ -868,13 +867,13 @@ void * _ao2_iterator_next(struct ao2_iterator *a)
  */
 static int cd_cb(void *obj, void *arg, int flag)
 {
-	_ao2_ref(obj, -1);
+	__ao2_ref(obj, -1);
 	return 0;
 }
 	
 static int cd_cb_debug(void *obj, void *arg, int flag)
 {
-	_ao2_ref_debug(obj, -1, "deref object via container destroy",  __FILE__, __LINE__, __PRETTY_FUNCTION__);
+	__ao2_ref_debug(obj, -1, "deref object via container destroy",  __FILE__, __LINE__, __PRETTY_FUNCTION__);
 	return 0;
 }
 	
@@ -883,7 +882,7 @@ static void container_destruct(void *_c)
 	struct ao2_container *c = _c;
 	int i;
 
-	_ao2_callback(c, OBJ_UNLINK, cd_cb, NULL);
+	__ao2_callback(c, OBJ_UNLINK, cd_cb, NULL);
 
 	for (i = 0; i < c->n_buckets; i++) {
 		struct bucket_list *current;
@@ -903,7 +902,7 @@ static void container_destruct_debug(void *_c)
 	struct ao2_container *c = _c;
 	int i;
 
-	_ao2_callback_debug(c, OBJ_UNLINK, cd_cb_debug, NULL, "container_destruct_debug called", __FILE__, __LINE__, __PRETTY_FUNCTION__);
+	__ao2_callback_debug(c, OBJ_UNLINK, cd_cb_debug, NULL, "container_destruct_debug called", __FILE__, __LINE__, __PRETTY_FUNCTION__);
 
 	for (i = 0; i < c->n_buckets; i++) {
 		struct bucket_list *current;
diff --git a/makeopts.in b/makeopts.in
index ef02abd1bba60713a45865ecd0006af135770e6d..56ad56fc402df8b0bf464e48cc4ee0486090f96d 100644
--- a/makeopts.in
+++ b/makeopts.in
@@ -47,6 +47,8 @@ GC_LDFLAGS=@GC_LDFLAGS@
 PTHREAD_CFLAGS=@PTHREAD_CFLAGS@
 PTHREAD_LIBS=@PTHREAD_LIBS@
 
+GNU_LD=@GNU_LD@
+
 prefix = @prefix@
 exec_prefix = @exec_prefix@
 
diff --git a/res/res_adsi.exports b/res/res_adsi.exports
new file mode 100644
index 0000000000000000000000000000000000000000..a4119dc1fd1d08ec7ae0d67ca51a5b4d715eeca9
--- /dev/null
+++ b/res/res_adsi.exports
@@ -0,0 +1,33 @@
+{
+	global:
+		ast_adsi_available;
+		ast_adsi_begin_download;
+		ast_adsi_channel_restore;
+		ast_adsi_clear_screen;
+		ast_adsi_clear_soft_keys;
+		ast_adsi_connect_session;
+		ast_adsi_data_mode;
+		ast_adsi_disconnect_session;
+		ast_adsi_display;
+		ast_adsi_download_connect;
+		ast_adsi_download_disconnect;
+		ast_adsi_end_download;
+		ast_adsi_get_cpeid;
+		ast_adsi_get_cpeinfo;
+		ast_adsi_input_control;
+		ast_adsi_input_format;
+		ast_adsi_load_session;
+		ast_adsi_load_soft_key;
+		ast_adsi_print;
+		ast_adsi_query_cpeid;
+		ast_adsi_query_cpeinfo;
+		ast_adsi_read_encoded_dtmf;
+		ast_adsi_set_keys;
+		ast_adsi_set_line;
+		ast_adsi_transmit_message;
+		ast_adsi_transmit_message_full;
+		ast_adsi_unload_session;
+		ast_adsi_voice_mode;
+	local:
+		*;
+};
diff --git a/res/res_agi.exports b/res/res_agi.exports
new file mode 100644
index 0000000000000000000000000000000000000000..e1b11968fae25f30ece29f83ae6ed0c0a4abf33c
--- /dev/null
+++ b/res/res_agi.exports
@@ -0,0 +1,7 @@
+{
+	global:
+		ast_agi_register;
+		ast_agi_unregister;
+	local:
+		*;
+};
diff --git a/res/res_config_odbc.c b/res/res_config_odbc.c
index 8da1e29153f6f31ba4018e212aba26de65a7ffd2..bb43de607b973d9d5a66dd75e33501554ea80a04 100644
--- a/res/res_config_odbc.c
+++ b/res/res_config_odbc.c
@@ -1067,7 +1067,7 @@ static int reload_module(void)
 	return 0;
 }
 
-AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_GLOBAL_SYMBOLS, "Realtime ODBC configuration",
+AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_DEFAULT, "Realtime ODBC configuration",
 		.load = load_module,
 		.unload = unload_module,
 		.reload = reload_module,
diff --git a/res/res_config_pgsql.c b/res/res_config_pgsql.c
index 877901243c26b515f5bdd10feaee50f92d671caa..609f0b2ae3ceb1cbca2958b38b508944d02ac970 100644
--- a/res/res_config_pgsql.c
+++ b/res/res_config_pgsql.c
@@ -1530,7 +1530,7 @@ static char *handle_cli_realtime_pgsql_status(struct ast_cli_entry *e, int cmd,
 }
 
 /* needs usecount semantics defined */
-AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_GLOBAL_SYMBOLS, "PostgreSQL RealTime Configuration Driver",
+AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_DEFAULT, "PostgreSQL RealTime Configuration Driver",
 		.load = load_module,
 		.unload = unload_module,
 		.reload = reload
diff --git a/res/res_features.exports b/res/res_features.exports
new file mode 100644
index 0000000000000000000000000000000000000000..344a652c8ec05f5f7a050a2bb9ba8d8f4a20f5f9
--- /dev/null
+++ b/res/res_features.exports
@@ -0,0 +1,13 @@
+{
+	global:
+		ast_bridge_call;
+		ast_masq_park_call;
+		ast_park_call;
+		ast_parking_ext;
+		ast_pickup_call;
+		ast_pickup_ext;
+		ast_register_feature;
+		ast_unregister_feature;
+	local:
+		*;
+};
diff --git a/res/res_jabber.exports b/res/res_jabber.exports
new file mode 100644
index 0000000000000000000000000000000000000000..8df1fee0e899569b4aecf64e7cc335caf7f63772
--- /dev/null
+++ b/res/res_jabber.exports
@@ -0,0 +1,13 @@
+{
+	global:
+		ast_aji_create_chat;
+		ast_aji_disconnect;
+		ast_aji_get_client;
+		ast_aji_get_clients;
+		ast_aji_increment_mid;
+		ast_aji_invite_chat;
+		ast_aji_join_chat;
+		ast_aji_send;
+	local:
+		*;
+};
diff --git a/res/res_monitor.exports b/res/res_monitor.exports
new file mode 100644
index 0000000000000000000000000000000000000000..4352dc8b61a1043873935b525e2ec8ea55e7dc35
--- /dev/null
+++ b/res/res_monitor.exports
@@ -0,0 +1,11 @@
+{
+	global:
+		ast_monitor_change_fname;
+		ast_monitor_pause;
+		ast_monitor_setjoinfiles;
+		ast_monitor_start;
+		ast_monitor_stop;
+		ast_monitor_unpause;
+	local:
+		*;
+};
diff --git a/res/res_odbc.exports b/res/res_odbc.exports
new file mode 100644
index 0000000000000000000000000000000000000000..1e38d49dad8c189783acaaa0d17c9d1475446768
--- /dev/null
+++ b/res/res_odbc.exports
@@ -0,0 +1,11 @@
+{
+	global:
+		ast_odbc_backslash_is_escape;
+		ast_odbc_prepare_and_execute;
+		ast_odbc_release_obj;
+		ast_odbc_request_obj;
+		ast_odbc_sanity_check;
+		ast_odbc_smart_execute;
+	local:
+		*;
+};
diff --git a/res/res_smdi.exports b/res/res_smdi.exports
new file mode 100644
index 0000000000000000000000000000000000000000..7fe3edff30dc14de8cbd859c37d290fdcbb6e869
--- /dev/null
+++ b/res/res_smdi.exports
@@ -0,0 +1,18 @@
+{
+	global:
+		ast_smdi_interface_find;
+		ast_smdi_interface_unref;
+		ast_smdi_md_message_destroy;
+		ast_smdi_md_message_pop;
+		ast_smdi_md_message_putback;
+		ast_smdi_md_message_wait;
+		ast_smdi_mwi_message_destroy;
+		ast_smdi_mwi_message_pop;
+		ast_smdi_mwi_message_putback;
+		ast_smdi_mwi_message_wait;
+		ast_smdi_mwi_message_wait_station;
+		ast_smdi_mwi_set;
+		ast_smdi_mwi_unset;
+	local:
+		*;
+};
diff --git a/res/res_snmp.c b/res/res_snmp.c
index f3cedfb1d6123ca763a95154d3f93dad62ecca3b..635330e9271f687510ab49001373527506f1356b 100644
--- a/res/res_snmp.c
+++ b/res/res_snmp.c
@@ -115,7 +115,7 @@ static int unload_module(void)
 	return ((thread != AST_PTHREADT_NULL) ? pthread_join(thread, NULL) : 0);
 }
 
-AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_GLOBAL_SYMBOLS, "SNMP [Sub]Agent for Asterisk",
+AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_DEFAULT, "SNMP [Sub]Agent for Asterisk",
 		.load = load_module,
 		.unload = unload_module,
 		);
diff --git a/res/res_speech.exports b/res/res_speech.exports
new file mode 100644
index 0000000000000000000000000000000000000000..2266607357c8016488483ca0b0bf6bdcbbfb3321
--- /dev/null
+++ b/res/res_speech.exports
@@ -0,0 +1,21 @@
+{
+	global:
+		ast_speech_change;
+		ast_speech_change_results_type;
+		ast_speech_change_state;
+		ast_speech_destroy;
+		ast_speech_dtmf;
+		ast_speech_grammar_activate;
+		ast_speech_grammar_deactivate;
+		ast_speech_grammar_load;
+		ast_speech_grammar_unload;
+		ast_speech_new;
+		ast_speech_register;
+		ast_speech_results_free;
+		ast_speech_results_get;
+		ast_speech_start;
+		ast_speech_unregister;
+		ast_speech_write;
+	local:
+		*;
+};