[alsa-devel] [Alsa-devel] Static build of alsa-lib

Takashi Iwai tiwai at suse.de
Tue Mar 20 17:01:25 CET 2007


At Tue, 20 Mar 2007 08:13:41 -0700 (PDT),
Ciaccia wrote:
> 
> Hi Takashi,
> It's clear that the concept of dynamic loading doesn't
> conflict with static library, I think my original
> question was not completely clear. 
> 
> I would like to port a sound application (just PCM, no
> midi or other stuff) to an embedded system. The core
> of this embedded system is a Cirrus EP9302 ARM
> processor, which supports hardware floating points.
> 
> ARM processors have several ABIs (EABI, OABI, ???) and
> programs compiled using one ABI are not linkable
> (neither at compile time, nor at run time) with other
> binaries, because of the different format. This is a
> problem for binary distributions (such as Debian),
> since the same binary does not work on all ARM
> architectures.
> 
> For a reason I really don't understand, EP9302
> hardware floating point binaries only work when
> compiled with -static (don't ask me why...), and
> therefore I wanted to have a "static" (=without shared
> libraries) ALSA application. If this would not be
> possible I can always use OSS (which does not requires
> shared objects to be loaded at run time), but I still
> think it should be possible to develop ALSA
> applications for architectures where dynamic loading
> is not available...
> 
> Is there a way to achieve this?

Sure, what I meant is that the patch had no function to disable the
libdl and libpthread explicitly but only checked.  The new patch
below, for example, can give you options --with-libdl and
--with-pthread.  For disabling libdl, pass --with-libdl=no.

If this works for you, I'll apply it to the upstream.


Takashi


diff -r 6d0a999aef24 Makefile.am
--- a/Makefile.am	Fri Mar 16 15:22:27 2007 +0100
+++ b/Makefile.am	Tue Mar 20 16:55:23 2007 +0100
@@ -1,4 +1,7 @@ SUBDIRS=doc include src modules
-SUBDIRS=doc include src modules
+SUBDIRS=doc include src
+if BUILD_MODULES
+SUBDIRS += modules
+endif
 if BUILD_PCM_PLUGIN_SHM
 SUBDIRS += aserver
 endif
diff -r 6d0a999aef24 configure.in
--- a/configure.in	Fri Mar 16 15:22:27 2007 +0100
+++ b/configure.in	Tue Mar 20 16:55:00 2007 +0100
@@ -148,6 +148,44 @@ else
 else
   AC_MSG_RESULT(no)
 fi
+
+ALSA_DEPLIBS=""
+if test "$softfloat" != "yes"; then
+  ALSA_DEPLIBS="-lm"
+fi
+
+dnl Check for libdl
+AC_MSG_CHECKING(for libdl)
+AC_ARG_WITH(libdl,
+  [  --with-libdl        Use libdl for plugins (default = yes)],
+  [ have_libdl="$withval" ], [ have_libdl="yes" ])
+if test "$have_libdl" = "yes"; then
+  AC_CHECK_LIB([dl], [dlsym], [HAVE_LIBDL="yes"])
+  if test "$HAVE_LIBDL" = "yes" ; then
+    ALSA_DEPLIBS="$ALSA_DEPLIBS -ldl"
+    AC_DEFINE([HAVE_LIBDL], 1, [Have libdl])
+  fi
+else
+  AC_MSG_RESULT(no)
+fi
+AM_CONDITIONAL(BUILD_MODULES, test "$HAVE_LIBDL"="yes")
+
+dnl Check for pthread
+AC_MSG_CHECKING(for pthread)
+AC_ARG_WITH(pthread,
+  [  --with-pthread      Use pthread (default = yes)],
+  [ have_pthread="$withval" ], [ have_pthread="yes" ])
+if test "$have_pthread" = "yes"; then
+  AC_CHECK_LIB([pthread], [pthread_join], [HAVE_LIBPTHREAD="yes"])
+  if test "$HAVE_LIBPTHREAD" = "yes"; then
+    ALSA_DEPLIBS="$ALSA_DEPLIBS -lpthread"
+    AC_DEFINE([HAVE_LIBPTHREAD], 1, [Have libpthread])
+  fi
+else
+  AC_MSG_RESULT(no)
+fi
+
+AC_SUBST(ALSA_DEPLIBS)
 
 dnl Check for architecture
 AC_MSG_CHECKING(for architecture)
@@ -318,6 +356,21 @@ fi
 
 if test "$build_pcm_ioplug" = "yes"; then
   build_pcm_extplug="yes"
+fi
+
+if test "$HAVE_LIBDL" != "yes"; then
+  build_pcm_meter="no"
+  build_pcm_ladspa="no"
+  build_pcm_pcm_ioplug="no"
+  build_pcm_pcm_extplug="no"
+fi
+
+if test "$HAVE_LIBPTHREAD" != "yes"; then
+  build_pcm_share="no"
+fi
+
+if test "$softfloat" != "yes"; then
+  build_pcm_lfloat="no"
 fi
 
 AM_CONDITIONAL(BUILD_PCM_PLUGIN, test x$build_pcm_plugin = xyes)
diff -r 6d0a999aef24 include/local.h
--- a/include/local.h	Fri Mar 16 15:22:27 2007 +0100
+++ b/include/local.h	Tue Mar 20 16:16:36 2007 +0100
@@ -36,6 +36,11 @@
 #include "config.h"
 #ifdef SUPPORT_RESMGR
 #include <resmgr.h>
+#endif
+#ifdef HAVE_LIBDL
+#include <dlfcn.h>
+#else
+#define RTLD_NOW	0
 #endif
 
 #define _snd_config_iterator list_head
diff -r 6d0a999aef24 src/Makefile.am
--- a/src/Makefile.am	Fri Mar 16 15:22:27 2007 +0100
+++ b/src/Makefile.am	Tue Mar 20 16:16:36 2007 +0100
@@ -41,7 +41,7 @@ libasound_la_LIBADD += alisp/libalisp.la
 libasound_la_LIBADD += alisp/libalisp.la
 endif
 SUBDIRS += compat conf
-libasound_la_LIBADD += compat/libcompat.la -lm -ldl -lpthread
+libasound_la_LIBADD += compat/libcompat.la @ALSA_DEPLIBS@
 
 libasound_la_LDFLAGS = -version-info $(COMPATNUM) $(VSYMS)
 
diff -r 6d0a999aef24 src/async.c
--- a/src/async.c	Fri Mar 16 15:22:27 2007 +0100
+++ b/src/async.c	Tue Mar 20 16:16:36 2007 +0100
@@ -151,9 +151,11 @@ int snd_async_del_handler(snd_async_hand
 	if (!list_empty(&handler->hlist))
 		goto _end;
 	switch (handler->type) {
+#ifdef BUILD_PCM
 	case SND_ASYNC_HANDLER_PCM:
 		err = snd_pcm_async(handler->u.pcm, -1, 1);
 		break;
+#endif
 	case SND_ASYNC_HANDLER_CTL:
 		err = snd_ctl_async(handler->u.ctl, -1, 1);
 		break;
diff -r 6d0a999aef24 src/conf.c
--- a/src/conf.c	Fri Mar 16 15:22:27 2007 +0100
+++ b/src/conf.c	Tue Mar 20 16:16:36 2007 +0100
@@ -415,12 +415,13 @@ beginning:</P>
 
 
 #include <stdarg.h>
-#include <dlfcn.h>
 #include <limits.h>
 #include <sys/stat.h>
-#include <pthread.h>
 #include <locale.h>
 #include "local.h"
+#ifdef HAVE_LIBPTHREAD
+#include <pthread.h>
+#endif
 
 #ifndef DOC_HIDDEN
 
@@ -3080,7 +3081,9 @@ int snd_config_update_r(snd_config_t **_
 	return 1;
 }
 
+#ifdef HAVE_LIBPTHREAD
 static pthread_mutex_t snd_config_update_mutex = PTHREAD_MUTEX_INITIALIZER;
+#endif
 
 /** 
  * \brief Updates #snd_config by rereading the global configuration files (if needed).
@@ -3099,9 +3102,13 @@ int snd_config_update(void)
 {
 	int err;
 
+#ifdef HAVE_LIBPTHREAD
 	pthread_mutex_lock(&snd_config_update_mutex);
+#endif
 	err = snd_config_update_r(&snd_config, &snd_config_global_update, NULL);
+#ifdef HAVE_LIBPTHREAD
 	pthread_mutex_unlock(&snd_config_update_mutex);
+#endif
 	return err;
 }
 
@@ -3128,15 +3135,18 @@ int snd_config_update_free(snd_config_up
  */
 int snd_config_update_free_global(void)
 {
+#ifdef HAVE_LIBPTHREAD
 	pthread_mutex_lock(&snd_config_update_mutex);
+#endif
 	if (snd_config)
 		snd_config_delete(snd_config);
 	snd_config = NULL;
 	if (snd_config_global_update)
 		snd_config_update_free(snd_config_global_update);
 	snd_config_global_update = NULL;
+#ifdef HAVE_LIBPTHREAD
 	pthread_mutex_unlock(&snd_config_update_mutex);
-
+#endif
 	/* FIXME: better to place this in another place... */
 	snd_dlobj_cache_cleanup();
 
diff -r 6d0a999aef24 src/confmisc.c
--- a/src/confmisc.c	Fri Mar 16 15:22:27 2007 +0100
+++ b/src/confmisc.c	Tue Mar 20 16:16:36 2007 +0100
@@ -946,6 +946,8 @@ SND_DLSYM_BUILD_VERSION(snd_func_card_na
 SND_DLSYM_BUILD_VERSION(snd_func_card_name, SND_CONFIG_DLSYM_VERSION_EVALUATE);
 #endif
 
+#ifdef BUILD_PCM
+
 /**
  * \brief Returns the pcm identification of a device.
  * \param dst The function puts the handle to the result configuration node
@@ -1198,6 +1200,8 @@ int snd_func_private_pcm_subdevice(snd_c
 #ifndef DOC_HIDDEN
 SND_DLSYM_BUILD_VERSION(snd_func_private_pcm_subdevice, SND_CONFIG_DLSYM_VERSION_EVALUATE);
 #endif
+
+#endif /* BUILD_PCM */
 
 /**
  * \brief Copies the specified configuration node.
diff -r 6d0a999aef24 src/control/control.c
--- a/src/control/control.c	Fri Mar 16 15:22:27 2007 +0100
+++ b/src/control/control.c	Tue Mar 20 16:16:36 2007 +0100
@@ -47,7 +47,6 @@ and IEC958 structure.
 #include <string.h>
 #include <fcntl.h>
 #include <signal.h>
-#include <dlfcn.h>
 #include <sys/poll.h>
 #include "control_local.h"
 
diff -r 6d0a999aef24 src/control/hcontrol.c
--- a/src/control/hcontrol.c	Fri Mar 16 15:22:27 2007 +0100
+++ b/src/control/hcontrol.c	Tue Mar 20 16:16:36 2007 +0100
@@ -48,11 +48,13 @@ to reduce overhead accessing the real co
 #include <string.h>
 #include <fcntl.h>
 #include <sys/ioctl.h>
-#include <pthread.h>
 #ifndef DOC_HIDDEN
 #define __USE_GNU
 #endif
 #include "control_local.h"
+#ifdef HAVE_LIBPTHREAD
+#include <pthread.h>
+#endif
 
 #ifndef DOC_HIDDEN
 #define NOT_FOUND 1000000000
@@ -420,17 +422,22 @@ static void snd_hctl_sort(snd_hctl_t *hc
 static void snd_hctl_sort(snd_hctl_t *hctl)
 {
 	unsigned int k;
+#ifdef HAVE_LIBPTHREAD
 	static pthread_mutex_t sync_lock = PTHREAD_MUTEX_INITIALIZER;
+#endif
 
 	assert(hctl);
 	assert(hctl->compare);
 	INIT_LIST_HEAD(&hctl->elems);
 
+#ifdef HAVE_LIBPTHREAD
 	pthread_mutex_lock(&sync_lock);
+#endif
 	compare_hctl = hctl;
 	qsort(hctl->pelems, hctl->count, sizeof(*hctl->pelems), hctl_compare);
+#ifdef HAVE_LIBPTHREAD
 	pthread_mutex_unlock(&sync_lock);
-
+#endif
 	for (k = 0; k < hctl->count; k++)
 		list_add_tail(&hctl->pelems[k]->list, &hctl->elems);
 }
diff -r 6d0a999aef24 src/dlmisc.c
--- a/src/dlmisc.c	Fri Mar 16 15:22:27 2007 +0100
+++ b/src/dlmisc.c	Tue Mar 20 16:51:13 2007 +0100
@@ -28,7 +28,6 @@
  */
 
 #define _GNU_SOURCE
-#include <dlfcn.h>
 #include "list.h"
 #include "local.h"
 
@@ -53,13 +52,19 @@ void *snd_dlopen(const char *name, int m
 	if (name == NULL)
 		return &snd_dlsym_start;
 #else
+#ifdef HAVE_LIBDL
 	if (name == NULL) {
 		Dl_info dlinfo;
 		if (dladdr(snd_dlopen, &dlinfo) > 0)
 			name = dlinfo.dli_fname;
 	}
 #endif
+#endif
+#ifdef HAVE_LIBDL
 	return dlopen(name, mode);
+#else
+	return NULL;
+#endif
 }
 
 /**
@@ -76,7 +81,11 @@ int snd_dlclose(void *handle)
 	if (handle == &snd_dlsym_start)
 		return 0;
 #endif
+#ifdef HAVE_LIBDL
 	return dlclose(handle);
+#else
+	return 0;
+#endif
 }
 
 /**
@@ -91,6 +100,7 @@ int snd_dlclose(void *handle)
  */
 static int snd_dlsym_verify(void *handle, const char *name, const char *version)
 {
+#ifdef HAVE_LIBDL
 	int res;
 	char *vname;
 	
@@ -107,6 +117,9 @@ static int snd_dlsym_verify(void *handle
 	if (res < 0)
 		SNDERR("unable to verify version for symbol %s", name);
 	return res;
+#else
+	return 0;
+#endif
 }
 
 /**
@@ -139,10 +152,16 @@ void *snd_dlsym(void *handle, const char
 		return NULL;
 	}
 #endif
-	err = snd_dlsym_verify(handle, name, version);
-	if (err < 0)
-		return NULL;
+#ifdef HAVE_LIBDL
+	if (version) {
+		err = snd_dlsym_verify(handle, name, version);
+		if (err < 0)
+			return NULL;
+	}
 	return dlsym(handle, name);
+#else
+	return NULL;
+#endif
 }
 
 /*
diff -r 6d0a999aef24 src/hwdep/hwdep.c
--- a/src/hwdep/hwdep.c	Fri Mar 16 15:22:27 2007 +0100
+++ b/src/hwdep/hwdep.c	Tue Mar 20 16:16:36 2007 +0100
@@ -33,7 +33,6 @@
 #include <unistd.h>
 #include <string.h>
 #include <fcntl.h>
-#include <dlfcn.h>
 #include <sys/ioctl.h>
 #include "hwdep_local.h"
 
diff -r 6d0a999aef24 src/mixer/simple_abst.c
--- a/src/mixer/simple_abst.c	Fri Mar 16 15:22:27 2007 +0100
+++ b/src/mixer/simple_abst.c	Tue Mar 20 16:52:35 2007 +0100
@@ -82,14 +82,14 @@ static int try_open(snd_mixer_class_t *c
 		free(xlib);
 		return -ENXIO;
 	}
-	event_func = dlsym(h, "alsa_mixer_simple_event");
+	event_func = snd_dlsym(h, "alsa_mixer_simple_event", NULL);
 	if (event_func == NULL) {
 		SNDERR("Symbol 'alsa_mixer_simple_event' was not found in '%s'", xlib);
 		snd_dlclose(h);
 		free(xlib);
 		return -ENXIO;
 	}
-	init_func = dlsym(h, "alsa_mixer_simple_init");
+	init_func = snd_dlsym(h, "alsa_mixer_simple_init", NULL);
 	if (init_func == NULL) {
 		SNDERR("Symbol 'alsa_mixer_simple_init' was not found in '%s'", xlib);
 		snd_dlclose(h);
diff -r 6d0a999aef24 src/pcm/pcm.c
--- a/src/pcm/pcm.c	Fri Mar 16 15:22:27 2007 +0100
+++ b/src/pcm/pcm.c	Tue Mar 20 16:16:36 2007 +0100
@@ -634,7 +634,6 @@ playback devices.
 #include <malloc.h>
 #include <stdarg.h>
 #include <signal.h>
-#include <dlfcn.h>
 #include <sys/poll.h>
 #include <sys/shm.h>
 #include <sys/mman.h>
diff -r 6d0a999aef24 src/pcm/pcm_hooks.c
--- a/src/pcm/pcm_hooks.c	Fri Mar 16 15:22:27 2007 +0100
+++ b/src/pcm/pcm_hooks.c	Tue Mar 20 16:16:36 2007 +0100
@@ -27,7 +27,6 @@
  *
  */
   
-#include <dlfcn.h>
 #include "pcm_local.h"
 #include "pcm_generic.h"
 
diff -r 6d0a999aef24 src/pcm/pcm_ladspa.c
--- a/src/pcm/pcm_ladspa.c	Fri Mar 16 15:22:27 2007 +0100
+++ b/src/pcm/pcm_ladspa.c	Tue Mar 20 16:16:36 2007 +0100
@@ -33,7 +33,6 @@
  */
   
 #include <dirent.h>
-#include <dlfcn.h>
 #include <locale.h>
 #include <math.h>
 #include "pcm_local.h"
diff -r 6d0a999aef24 src/pcm/pcm_rate.c
--- a/src/pcm/pcm_rate.c	Fri Mar 16 15:22:27 2007 +0100
+++ b/src/pcm/pcm_rate.c	Tue Mar 20 16:51:41 2007 +0100
@@ -29,7 +29,6 @@
  */
 #include <inttypes.h>
 #include <byteswap.h>
-#include <dlfcn.h>
 #include "pcm_local.h"
 #include "pcm_plugin.h"
 #include "pcm_rate.h"
@@ -1326,7 +1325,7 @@ int snd_pcm_rate_open(snd_pcm_t **pcmp, 
 			free(rate);
 			return -ENOENT;
 		}
-		open_func = dlsym(h, open_name);
+		open_func = snd_dlsym(h, open_name, NULL);
 		if (! open_func) {
 			SNDERR("Cannot find function %s", open_name);
 			snd_dlclose(h);
diff -r 6d0a999aef24 src/rawmidi/rawmidi.c
--- a/src/rawmidi/rawmidi.c	Fri Mar 16 15:22:27 2007 +0100
+++ b/src/rawmidi/rawmidi.c	Tue Mar 20 16:16:36 2007 +0100
@@ -139,7 +139,6 @@ This example shows open and read/write r
 #include <stdarg.h>
 #include <unistd.h>
 #include <string.h>
-#include <dlfcn.h>
 #include "rawmidi_local.h"
 
 /**
diff -r 6d0a999aef24 src/seq/seq.c
--- a/src/seq/seq.c	Fri Mar 16 15:22:27 2007 +0100
+++ b/src/seq/seq.c	Tue Mar 20 16:16:36 2007 +0100
@@ -777,7 +777,6 @@ void event_filter(snd_seq_t *seq, snd_se
 
 */
 
-#include <dlfcn.h>
 #include <sys/poll.h>
 #include "seq_local.h"
 
diff -r 6d0a999aef24 src/timer/timer.c
--- a/src/timer/timer.c	Fri Mar 16 15:22:27 2007 +0100
+++ b/src/timer/timer.c	Tue Mar 20 16:16:36 2007 +0100
@@ -72,7 +72,6 @@ This example shows opening a timer devic
 #include <unistd.h>
 #include <string.h>
 #include <fcntl.h>
-#include <dlfcn.h>
 #include <signal.h>
 #include <sys/ioctl.h>
 #include "timer_local.h"
diff -r 6d0a999aef24 src/timer/timer_query.c
--- a/src/timer/timer_query.c	Fri Mar 16 15:22:27 2007 +0100
+++ b/src/timer/timer_query.c	Tue Mar 20 16:16:36 2007 +0100
@@ -31,7 +31,6 @@
 #include <unistd.h>
 #include <string.h>
 #include <fcntl.h>
-#include <dlfcn.h>
 #include <sys/ioctl.h>
 #include "timer_local.h"
 
diff -r 6d0a999aef24 utils/alsa.pc.in
--- a/utils/alsa.pc.in	Fri Mar 16 15:22:27 2007 +0100
+++ b/utils/alsa.pc.in	Tue Mar 20 16:16:36 2007 +0100
@@ -8,7 +8,7 @@ Version: @VERSION@
 Version: @VERSION@
 Requires: 
 Libs: -L${libdir} -lasound
-Libs.private: -lm -ldl -lpthread
+Libs.private: @ALSA_DEPLIBS@
 # -I${includedir}/alsa below is just for backward compatibility
 # (it was set so mistakely in the older version)
 Cflags: -I${includedir} -I${includedir}/alsa


More information about the Alsa-devel mailing list