* [Qemu-devel] [PATCH v15 1/9] rules.mak: fix $(obj) to a real relative path
2014-01-13 16:59 [Qemu-devel] [PATCH v15 0/9] Shared library module support Paolo Bonzini
@ 2014-01-13 16:59 ` Paolo Bonzini
2014-01-13 16:59 ` [Qemu-devel] [PATCH v15 2/9] rules.mak: allow per object cflags and libs Paolo Bonzini
` (8 subsequent siblings)
9 siblings, 0 replies; 27+ messages in thread
From: Paolo Bonzini @ 2014-01-13 16:59 UTC (permalink / raw)
To: qemu-devel; +Cc: peter.maydell, famz, mjt, alex, mrezanin, vilanova, rth
From: Fam Zheng <famz@redhat.com>
Makefile.target includes rule.mak and unnested common-obj-y, then prefix
them with '../', this will ignore object specific QEMU_CFLAGS in subdir
Makefile.objs:
$(obj)/curl.o: QEMU_CFLAGS += $(CURL_CFLAGS)
Because $(obj) here is './block', instead of '../block'. This doesn't
hurt compiling because we basically build all .o from top Makefile,
before entering Makefile.target, but it will affact arriving per-object
libs support.
The starting point of $(obj) is passed in as argument of unnest-vars, as
well as nested variables, so that different Makefiles can pass in a
right value.
Signed-off-by: Fam Zheng <famz@redhat.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
Makefile | 14 ++++++++++++++
Makefile.objs | 17 +----------------
Makefile.target | 17 +++++++++++++----
configure | 1 +
rules.mak | 14 +++++++++-----
5 files changed, 38 insertions(+), 25 deletions(-)
diff --git a/Makefile b/Makefile
index bdff4e4..423ace5 100644
--- a/Makefile
+++ b/Makefile
@@ -122,6 +122,16 @@ defconfig:
ifneq ($(wildcard config-host.mak),)
include $(SRC_PATH)/Makefile.objs
+endif
+
+dummy := $(call unnest-vars,, \
+ stub-obj-y \
+ util-obj-y \
+ qga-obj-y \
+ block-obj-y \
+ common-obj-y)
+
+ifneq ($(wildcard config-host.mak),)
include $(SRC_PATH)/tests/Makefile
endif
ifeq ($(CONFIG_SMARTCARD_NSS),y)
@@ -130,6 +140,10 @@ endif
all: $(DOCS) $(TOOLS) $(HELPERS-y) recurse-all
+vl.o: QEMU_CFLAGS+=$(GPROF_CFLAGS)
+
+vl.o: QEMU_CFLAGS+=$(SDL_CFLAGS)
+
config-host.h: config-host.h-timestamp
config-host.h-timestamp: config-host.mak
qemu-options.def: $(SRC_PATH)/qemu-options.hx
diff --git a/Makefile.objs b/Makefile.objs
index 2b6c1fe..91235a6 100644
--- a/Makefile.objs
+++ b/Makefile.objs
@@ -41,7 +41,7 @@ libcacard-y += libcacard/vcardt.o
# single QEMU executable should support all CPUs and machines.
ifeq ($(CONFIG_SOFTMMU),y)
-common-obj-y = $(block-obj-y) blockdev.o blockdev-nbd.o block/
+common-obj-y = blockdev.o blockdev-nbd.o block/
common-obj-y += net/
common-obj-y += readline.o
common-obj-y += qdev-monitor.o device-hotplug.o
@@ -110,18 +110,3 @@ version-lobj-$(CONFIG_WIN32) += $(BUILD_DIR)/version.lo
# by libqemuutil.a. These should be moved to a separate .json schema.
qga-obj-y = qga/ qapi-types.o qapi-visit.o
qga-vss-dll-obj-y = qga/
-
-vl.o: QEMU_CFLAGS+=$(GPROF_CFLAGS)
-
-vl.o: QEMU_CFLAGS+=$(SDL_CFLAGS)
-
-QEMU_CFLAGS+=$(GLIB_CFLAGS)
-
-nested-vars += \
- stub-obj-y \
- util-obj-y \
- qga-obj-y \
- qga-vss-dll-obj-y \
- block-obj-y \
- common-obj-y
-dummy := $(call unnest-vars)
diff --git a/Makefile.target b/Makefile.target
index af6ac7e..9a6e7dd 100644
--- a/Makefile.target
+++ b/Makefile.target
@@ -139,13 +139,22 @@ endif # CONFIG_SOFTMMU
# Workaround for http://gcc.gnu.org/PR55489, see configure.
%/translate.o: QEMU_CFLAGS += $(TRANSLATE_OPT_CFLAGS)
-nested-vars += obj-y
+dummy := $(call unnest-vars,,obj-y)
-# This resolves all nested paths, so it must come last
+# we are making another call to unnest-vars with different vars, protect obj-y,
+# it can be overriden in subdir Makefile.objs
+obj-y-save := $(obj-y)
+
+block-obj-y :=
+common-obj-y :=
include $(SRC_PATH)/Makefile.objs
+dummy := $(call unnest-vars,..,block-obj-y common-obj-y)
+
+# Now restore obj-y
+obj-y := $(obj-y-save)
-all-obj-y = $(obj-y)
-all-obj-y += $(addprefix ../, $(common-obj-y))
+all-obj-y = $(obj-y) $(common-obj-y)
+all-obj-$(CONFIG_SOFTMMU) += $(block-obj-y)
ifndef CONFIG_HAIKU
LIBS+=-lm
diff --git a/configure b/configure
index 3782a6a..4990648 100755
--- a/configure
+++ b/configure
@@ -2345,6 +2345,7 @@ fi
if $pkg_config --atleast-version=$glib_req_ver gthread-2.0; then
glib_cflags=`$pkg_config --cflags gthread-2.0`
glib_libs=`$pkg_config --libs gthread-2.0`
+ CFLAGS="$glib_cflags $CFLAGS"
LIBS="$glib_libs $LIBS"
libs_qga="$glib_libs $libs_qga"
else
diff --git a/rules.mak b/rules.mak
index 49edb9b..7d27602 100644
--- a/rules.mak
+++ b/rules.mak
@@ -138,9 +138,6 @@ clean: clean-timestamp
# magic to descend into other directories
-obj := .
-old-nested-dirs :=
-
define push-var
$(eval save-$2-$1 = $(value $1))
$(eval $1 :=)
@@ -154,9 +151,11 @@ endef
define unnest-dir
$(foreach var,$(nested-vars),$(call push-var,$(var),$1/))
-$(eval obj := $(obj)/$1)
+$(eval obj-parent-$1 := $(obj))
+$(eval obj := $(if $(obj),$(obj)/$1,$1))
$(eval include $(SRC_PATH)/$1/Makefile.objs)
-$(eval obj := $(patsubst %/$1,%,$(obj)))
+$(eval obj := $(obj-parent-$1))
+$(eval obj-parent-$1 := )
$(foreach var,$(nested-vars),$(call pop-var,$(var),$1/))
endef
@@ -171,7 +170,12 @@ $(if $(nested-dirs),
endef
define unnest-vars
+$(eval obj := $1)
+$(eval nested-vars := $2)
+$(eval old-nested-dirs := )
$(call unnest-vars-1)
+$(if $1,$(foreach v,$(nested-vars),$(eval \
+ $v := $(addprefix $1/,$($v)))))
$(foreach var,$(nested-vars),$(eval $(var) := $(filter-out %/, $($(var)))))
$(shell mkdir -p $(sort $(foreach var,$(nested-vars),$(dir $($(var))))))
$(foreach var,$(nested-vars), $(eval \
--
1.7.1
^ permalink raw reply related [flat|nested] 27+ messages in thread
* [Qemu-devel] [PATCH v15 2/9] rules.mak: allow per object cflags and libs
2014-01-13 16:59 [Qemu-devel] [PATCH v15 0/9] Shared library module support Paolo Bonzini
2014-01-13 16:59 ` [Qemu-devel] [PATCH v15 1/9] rules.mak: fix $(obj) to a real relative path Paolo Bonzini
@ 2014-01-13 16:59 ` Paolo Bonzini
2014-01-13 16:59 ` [Qemu-devel] [PATCH v15 3/9] block: use per-object " Paolo Bonzini
` (7 subsequent siblings)
9 siblings, 0 replies; 27+ messages in thread
From: Paolo Bonzini @ 2014-01-13 16:59 UTC (permalink / raw)
To: qemu-devel; +Cc: peter.maydell, famz, mjt, alex, mrezanin, vilanova, rth
From: Fam Zheng <famz@redhat.com>
Adds extract-libs in LINK to expand any "per object libs", the syntax to define
such a libs options is like:
foo.o-libs := $(CURL_LIBS)
in block/Makefile.objs.
Similarly,
foo.o-cflags := $(FOO_CFLAGS)
is also supported.
"foo.o" must be listed in a nested var (e.g. common-obj-y) to make the
option variables effective.
Signed-off-by: Fam Zheng <famz@redhat.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
rules.mak | 19 ++++++++++++++++---
1 files changed, 16 insertions(+), 3 deletions(-)
diff --git a/rules.mak b/rules.mak
index 7d27602..9398268 100644
--- a/rules.mak
+++ b/rules.mak
@@ -21,15 +21,17 @@ QEMU_DGFLAGS += -MMD -MP -MT $@ -MF $(*D)/$(*F).d
# Same as -I$(SRC_PATH) -I., but for the nested source/object directories
QEMU_INCLUDES += -I$(<D) -I$(@D)
+extract-libs = $(strip $(foreach o,$1,$($o-libs)))
+
%.o: %.c
- $(call quiet-command,$(CC) $(QEMU_INCLUDES) $(QEMU_CFLAGS) $(QEMU_DGFLAGS) $(CFLAGS) -c -o $@ $<," CC $(TARGET_DIR)$@")
+ $(call quiet-command,$(CC) $(QEMU_INCLUDES) $(QEMU_CFLAGS) $(QEMU_DGFLAGS) $(CFLAGS) $($@-cflags) -c -o $@ $<," CC $(TARGET_DIR)$@")
%.o: %.rc
$(call quiet-command,$(WINDRES) -I. -o $@ $<," RC $(TARGET_DIR)$@")
ifeq ($(LIBTOOL),)
LINK = $(call quiet-command,$(CC) $(QEMU_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@ \
$(sort $(filter %.o, $1)) $(filter-out %.o, $1) $(version-obj-y) \
- $(LIBS)," LINK $(TARGET_DIR)$@")
+ $(call extract-libs,$^) $(LIBS)," LINK $(TARGET_DIR)$@")
else
LIBTOOL += $(if $(V),,--quiet)
%.lo: %.c
@@ -45,7 +47,7 @@ LINK = $(call quiet-command,\
$(sort $(filter %.o, $1)) $(filter-out %.o, $1) \
$(if $(filter %.lo %.la,$^),$(version-lobj-y),$(version-obj-y)) \
$(if $(filter %.lo %.la,$^),$(LIBTOOLFLAGS)) \
- $(LIBS),$(if $(filter %.lo %.la,$^),"lt LINK ", " LINK ")"$(TARGET_DIR)$@")
+ $(call extract-libs,$^) $(LIBS),$(if $(filter %.lo %.la,$^),"lt LINK ", " LINK ")"$(TARGET_DIR)$@")
endif
%.asm: %.S
@@ -149,11 +151,22 @@ $(eval $1 = $(value save-$2-$1) $$(subdir-$2-$1))
$(eval save-$2-$1 :=)
endef
+define fix-obj-vars
+$(foreach v,$($1), \
+ $(if $($v-cflags), \
+ $(eval $2$v-cflags := $($v-cflags)) \
+ $(eval $v-cflags := )) \
+ $(if $($v-libs), \
+ $(eval $2$v-libs := $($v-libs)) \
+ $(eval $v-libs := )))
+endef
+
define unnest-dir
$(foreach var,$(nested-vars),$(call push-var,$(var),$1/))
$(eval obj-parent-$1 := $(obj))
$(eval obj := $(if $(obj),$(obj)/$1,$1))
$(eval include $(SRC_PATH)/$1/Makefile.objs)
+$(foreach v,$(nested-vars),$(call fix-obj-vars,$v,$(if $(obj),$(obj)/)))
$(eval obj := $(obj-parent-$1))
$(eval obj-parent-$1 := )
$(foreach var,$(nested-vars),$(call pop-var,$(var),$1/))
--
1.7.1
^ permalink raw reply related [flat|nested] 27+ messages in thread
* [Qemu-devel] [PATCH v15 3/9] block: use per-object cflags and libs
2014-01-13 16:59 [Qemu-devel] [PATCH v15 0/9] Shared library module support Paolo Bonzini
2014-01-13 16:59 ` [Qemu-devel] [PATCH v15 1/9] rules.mak: fix $(obj) to a real relative path Paolo Bonzini
2014-01-13 16:59 ` [Qemu-devel] [PATCH v15 2/9] rules.mak: allow per object cflags and libs Paolo Bonzini
@ 2014-01-13 16:59 ` Paolo Bonzini
2014-01-13 16:59 ` [Qemu-devel] [PATCH v15 4/9] darwin: do not use -mdynamic-no-pic Paolo Bonzini
` (6 subsequent siblings)
9 siblings, 0 replies; 27+ messages in thread
From: Paolo Bonzini @ 2014-01-13 16:59 UTC (permalink / raw)
To: qemu-devel; +Cc: peter.maydell, famz, mjt, alex, mrezanin, vilanova, rth
From: Fam Zheng <famz@redhat.com>
No longer adds flags and libs for them to global variables, instead
create config-host.mak variables like FOO_CFLAGS and FOO_LIBS, which is
used as per object cflags and libs.
This removes unwanted dependencies from libcacard.
Signed-off-by: Fam Zheng <famz@redhat.com>
[Split from Fam's patch to enable modules. - Paolo]
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
block/Makefile.objs | 13 ++++++++++++-
configure | 25 ++++++++++---------------
2 files changed, 22 insertions(+), 16 deletions(-)
diff --git a/block/Makefile.objs b/block/Makefile.objs
index 4e8c91e..a1db63f 100644
--- a/block/Makefile.objs
+++ b/block/Makefile.objs
@@ -23,4 +23,15 @@ common-obj-y += commit.o
common-obj-y += mirror.o
common-obj-y += backup.o
-$(obj)/curl.o: QEMU_CFLAGS+=$(CURL_CFLAGS)
+iscsi.o-cflags := $(LIBISCSI_CFLAGS)
+iscsi.o-libs := $(LIBISCSI_LIBS)
+curl.o-cflags := $(CURL_CFLAGS)
+curl.o-libs := $(CURL_LIBS)
+rbd.o-cflags := $(RBD_CFLAGS)
+rbd.o-libs := $(RBD_LIBS)
+gluster.o-cflags := $(GLUSTERFS_CFLAGS)
+gluster.o-libs := $(GLUSTERFS_LIBS)
+ssh.o-cflags := $(LIBSSH2_CFLAGS)
+ssh.o-libs := $(LIBSSH2_LIBS)
+qcow.o-libs := -lz
+linux-aio.o-libs := -laio
diff --git a/configure b/configure
index 4990648..9d71867 100755
--- a/configure
+++ b/configure
@@ -2303,8 +2303,6 @@ EOF
curl_libs=`$curlconfig --libs 2>/dev/null`
if compile_prog "$curl_cflags" "$curl_libs" ; then
curl=yes
- libs_tools="$curl_libs $libs_tools"
- libs_softmmu="$curl_libs $libs_softmmu"
else
if test "$curl" = "yes" ; then
feature_not_found "curl"
@@ -2460,8 +2458,6 @@ EOF
rbd_libs="-lrbd -lrados"
if compile_prog "" "$rbd_libs" ; then
rbd=yes
- libs_tools="$rbd_libs $libs_tools"
- libs_softmmu="$rbd_libs $libs_softmmu"
else
if test "$rbd" = "yes" ; then
feature_not_found "rados block device"
@@ -2478,9 +2474,6 @@ if test "$libssh2" != "no" ; then
libssh2_cflags=`$pkg_config libssh2 --cflags`
libssh2_libs=`$pkg_config libssh2 --libs`
libssh2=yes
- libs_tools="$libssh2_libs $libs_tools"
- libs_softmmu="$libssh2_libs $libs_softmmu"
- QEMU_CFLAGS="$QEMU_CFLAGS $libssh2_cflags"
else
if test "$libssh2" = "yes" ; then
error_exit "libssh2 >= $min_libssh2_version required for --enable-libssh2"
@@ -2526,8 +2519,6 @@ int main(void) { io_setup(0, NULL); io_set_eventfd(NULL, 0); eventfd(0, 0); retu
EOF
if compile_prog "" "-laio" ; then
linux_aio=yes
- libs_softmmu="$libs_softmmu -laio"
- libs_tools="$libs_tools -laio"
else
if test "$linux_aio" = "yes" ; then
feature_not_found "linux AIO"
@@ -2696,9 +2687,6 @@ if test "$glusterfs" != "no" ; then
glusterfs="yes"
glusterfs_cflags=`$pkg_config --cflags glusterfs-api`
glusterfs_libs=`$pkg_config --libs glusterfs-api`
- CFLAGS="$CFLAGS $glusterfs_cflags"
- libs_tools="$glusterfs_libs $libs_tools"
- libs_softmmu="$glusterfs_libs $libs_softmmu"
if $pkg_config --atleast-version=5 glusterfs-api; then
glusterfs_discard="yes"
fi
@@ -3066,11 +3054,9 @@ EOF
libiscsi="yes"
libiscsi_cflags=$($pkg_config --cflags libiscsi)
libiscsi_libs=$($pkg_config --libs libiscsi)
- CFLAGS="$CFLAGS $libiscsi_cflags"
- LIBS="$LIBS $libiscsi_libs"
elif compile_prog "" "-liscsi" ; then
libiscsi="yes"
- LIBS="$LIBS -liscsi"
+ libiscsi_libs="-liscsi"
else
if test "$libiscsi" = "yes" ; then
feature_not_found "libiscsi"
@@ -4068,6 +4054,7 @@ fi
if test "$curl" = "yes" ; then
echo "CONFIG_CURL=y" >> $config_host_mak
echo "CURL_CFLAGS=$curl_cflags" >> $config_host_mak
+ echo "CURL_LIBS=$curl_libs" >> $config_host_mak
fi
if test "$brlapi" = "yes" ; then
echo "CONFIG_BRLAPI=y" >> $config_host_mak
@@ -4160,6 +4147,8 @@ if test "$libiscsi" = "yes" ; then
if test "$libiscsi_version" = "1.4.0"; then
echo "CONFIG_LIBISCSI_1_4=y" >> $config_host_mak
fi
+ echo "LIBISCSI_CFLAGS=$libiscsi_cflags" >> $config_host_mak
+ echo "LIBISCSI_LIBS=$libiscsi_libs" >> $config_host_mak
fi
if test "$seccomp" = "yes"; then
@@ -4181,6 +4170,8 @@ if test "$qom_cast_debug" = "yes" ; then
fi
if test "$rbd" = "yes" ; then
echo "CONFIG_RBD=y" >> $config_host_mak
+ echo "RBD_CFLAGS=$rbd_cflags" >> $config_host_mak
+ echo "RBD_LIBS=$rbd_libs" >> $config_host_mak
fi
echo "CONFIG_COROUTINE_BACKEND=$coroutine" >> $config_host_mak
@@ -4224,6 +4215,8 @@ fi
if test "$glusterfs" = "yes" ; then
echo "CONFIG_GLUSTERFS=y" >> $config_host_mak
+ echo "GLUSTERFS_CFLAGS=$glusterfs_cflags" >> $config_host_mak
+ echo "GLUSTERFS_LIBS=$glusterfs_libs" >> $config_host_mak
fi
if test "$glusterfs_discard" = "yes" ; then
@@ -4232,6 +4225,8 @@ fi
if test "$libssh2" = "yes" ; then
echo "CONFIG_LIBSSH2=y" >> $config_host_mak
+ echo "LIBSSH2_CFLAGS=$libssh2_cflags" >> $config_host_mak
+ echo "LIBSSH2_LIBS=$libssh2_libs" >> $config_host_mak
fi
if test "$virtio_blk_data_plane" = "yes" ; then
--
1.7.1
^ permalink raw reply related [flat|nested] 27+ messages in thread
* [Qemu-devel] [PATCH v15 4/9] darwin: do not use -mdynamic-no-pic
2014-01-13 16:59 [Qemu-devel] [PATCH v15 0/9] Shared library module support Paolo Bonzini
` (2 preceding siblings ...)
2014-01-13 16:59 ` [Qemu-devel] [PATCH v15 3/9] block: use per-object " Paolo Bonzini
@ 2014-01-13 16:59 ` Paolo Bonzini
2014-01-13 22:11 ` Peter Maydell
2014-01-13 16:59 ` [Qemu-devel] [PATCH v15 5/9] build-sys: introduce common-obj-m and block-obj-m for DSO Paolo Bonzini
` (5 subsequent siblings)
9 siblings, 1 reply; 27+ messages in thread
From: Paolo Bonzini @ 2014-01-13 16:59 UTC (permalink / raw)
To: qemu-devel; +Cc: peter.maydell, famz, mjt, alex, mrezanin, vilanova, rth
While -mdynamic-no-pic can speed up the code somewhat, it is only used
on the legacy PowerPC Mac OS X, and I am not sure if anyone is still
testing that. Disabling PIC can cause problems when enabling modules,
so do not do that.
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
configure | 2 --
1 files changed, 0 insertions(+), 2 deletions(-)
diff --git a/configure b/configure
index 9d71867..99434e6 100755
--- a/configure
+++ b/configure
@@ -516,8 +516,6 @@ Darwin)
if [ "$cpu" = "x86_64" ] ; then
QEMU_CFLAGS="-arch x86_64 $QEMU_CFLAGS"
LDFLAGS="-arch x86_64 $LDFLAGS"
- else
- QEMU_CFLAGS="-mdynamic-no-pic $QEMU_CFLAGS"
fi
cocoa="yes"
audio_drv_list="coreaudio"
--
1.7.1
^ permalink raw reply related [flat|nested] 27+ messages in thread
* Re: [Qemu-devel] [PATCH v15 4/9] darwin: do not use -mdynamic-no-pic
2014-01-13 16:59 ` [Qemu-devel] [PATCH v15 4/9] darwin: do not use -mdynamic-no-pic Paolo Bonzini
@ 2014-01-13 22:11 ` Peter Maydell
0 siblings, 0 replies; 27+ messages in thread
From: Peter Maydell @ 2014-01-13 22:11 UTC (permalink / raw)
To: Paolo Bonzini
Cc: Fam Zheng, Michael Tokarev, QEMU Developers, Andreas Färber,
Alex Bligh, Miroslav Rezanina, Lluís Vilanova,
Richard Henderson
On 13 January 2014 16:59, Paolo Bonzini <pbonzini@redhat.com> wrote:
> While -mdynamic-no-pic can speed up the code somewhat, it is only used
> on the legacy PowerPC Mac OS X, and I am not sure if anyone is still
> testing that. Disabling PIC can cause problems when enabling modules,
> so do not do that.
>
> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Ccing Andreas, who I think still runs QEMU on PPC MacOSX.
Given that modules don't build on MacOSX as far as I can tell
anyway, why break PPC builds for their sake?
> ---
> configure | 2 --
> 1 files changed, 0 insertions(+), 2 deletions(-)
>
> diff --git a/configure b/configure
> index 9d71867..99434e6 100755
> --- a/configure
> +++ b/configure
> @@ -516,8 +516,6 @@ Darwin)
> if [ "$cpu" = "x86_64" ] ; then
> QEMU_CFLAGS="-arch x86_64 $QEMU_CFLAGS"
> LDFLAGS="-arch x86_64 $LDFLAGS"
> - else
> - QEMU_CFLAGS="-mdynamic-no-pic $QEMU_CFLAGS"
> fi
> cocoa="yes"
> audio_drv_list="coreaudio"
> --
> 1.7.1
thanks
-- PMM
^ permalink raw reply [flat|nested] 27+ messages in thread
* [Qemu-devel] [PATCH v15 5/9] build-sys: introduce common-obj-m and block-obj-m for DSO
2014-01-13 16:59 [Qemu-devel] [PATCH v15 0/9] Shared library module support Paolo Bonzini
` (3 preceding siblings ...)
2014-01-13 16:59 ` [Qemu-devel] [PATCH v15 4/9] darwin: do not use -mdynamic-no-pic Paolo Bonzini
@ 2014-01-13 16:59 ` Paolo Bonzini
2014-01-13 16:59 ` [Qemu-devel] [PATCH v15 6/9] module: implement module loading Paolo Bonzini
` (4 subsequent siblings)
9 siblings, 0 replies; 27+ messages in thread
From: Paolo Bonzini @ 2014-01-13 16:59 UTC (permalink / raw)
To: qemu-devel; +Cc: peter.maydell, famz, mjt, alex, mrezanin, vilanova, rth
From: Fam Zheng <famz@redhat.com>
Add necessary rules and flags for shared object generation.
$(common-obj-m) will include $(block-obj-m), like $(common-obj-y) does
for $(block-obj-y). The new rules introduced here are:
0) For all %.so compiling:
QEMU_CFLAGS += -fPIC
1) %.o in $(common-obj-m) is compiled to %.o, then linked to %.so.
2) %.mo in $(common-obj-m) is the placeholder for %.so for pattern
matching in Makefile. It's linked to "-shared" with all its dependencies
(multiple *.o) as input. Which means the list of depended objects must
be specified in each sub-Makefile.objs:
foo.mo-objs := bar.o baz.o qux.o
in the same style with foo.o-cflags and foo.o-libs. The objects here
will be prefixed with "$(obj)/" if it's a subdirectory Makefile.objs.
Also introduce --enable-modules in configure, the option will enable
support of shared object build. Otherwise objects are static linked to
executables.
Signed-off-by: Fam Zheng <famz@redhat.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
Makefile | 9 +++++++--
Makefile.objs | 2 ++
Makefile.target | 6 +++++-
configure | 14 ++++++++++++++
rules.mak | 54 +++++++++++++++++++++++++++++++++++++++++++++---------
5 files changed, 73 insertions(+), 12 deletions(-)
diff --git a/Makefile b/Makefile
index 423ace5..9de66cb 100644
--- a/Makefile
+++ b/Makefile
@@ -129,7 +129,9 @@ dummy := $(call unnest-vars,, \
util-obj-y \
qga-obj-y \
block-obj-y \
- common-obj-y)
+ block-obj-m \
+ common-obj-y \
+ common-obj-m)
ifneq ($(wildcard config-host.mak),)
include $(SRC_PATH)/tests/Makefile
@@ -138,7 +140,7 @@ ifeq ($(CONFIG_SMARTCARD_NSS),y)
include $(SRC_PATH)/libcacard/Makefile
endif
-all: $(DOCS) $(TOOLS) $(HELPERS-y) recurse-all
+all: $(DOCS) $(TOOLS) $(HELPERS-y) recurse-all modules
vl.o: QEMU_CFLAGS+=$(GPROF_CFLAGS)
@@ -256,6 +258,9 @@ clean:
rm -f qemu-options.def
find . -name '*.[oda]' -type f -exec rm -f {} +
find . -name '*.l[oa]' -type f -exec rm -f {} +
+ find . -name '*.so' -type f -exec rm -f {} +
+ find . -name '*.mo' -type f -exec rm -f {} +
+ find . -name '*.dll' -type f -exec rm -f {} +
rm -f $(filter-out %.tlb,$(TOOLS)) $(HELPERS-y) qemu-ga TAGS cscope.* *.pod *~ */*~
rm -f fsdev/*.pod
rm -rf .libs */.libs
diff --git a/Makefile.objs b/Makefile.objs
index 91235a6..072d2e5 100644
--- a/Makefile.objs
+++ b/Makefile.objs
@@ -19,6 +19,8 @@ block-obj-y += qemu-coroutine.o qemu-coroutine-lock.o qemu-coroutine-io.o
block-obj-y += qemu-coroutine-sleep.o
block-obj-y += coroutine-$(CONFIG_COROUTINE_BACKEND).o
+block-obj-m = block/
+
ifeq ($(CONFIG_VIRTIO)$(CONFIG_VIRTFS)$(CONFIG_PCI),yyy)
# Lots of the fsdev/9pcode is pulled in by vl.c via qemu_fsdev_add.
# only pull in the actual virtio-9p device if we also enabled virtio.
diff --git a/Makefile.target b/Makefile.target
index 9a6e7dd..3945260 100644
--- a/Makefile.target
+++ b/Makefile.target
@@ -148,7 +148,11 @@ obj-y-save := $(obj-y)
block-obj-y :=
common-obj-y :=
include $(SRC_PATH)/Makefile.objs
-dummy := $(call unnest-vars,..,block-obj-y common-obj-y)
+dummy := $(call unnest-vars,.., \
+ block-obj-y \
+ block-obj-m \
+ common-obj-y \
+ common-obj-m)
# Now restore obj-y
obj-y := $(obj-y-save)
diff --git a/configure b/configure
index 99434e6..6b46c66 100755
--- a/configure
+++ b/configure
@@ -205,6 +205,9 @@ mingw32="no"
gcov="no"
gcov_tool="gcov"
EXESUF=""
+DSOSUF=".so"
+LDFLAGS_SHARED="-shared"
+modules="no"
prefix="/usr/local"
mandir="\${prefix}/share/man"
datadir="\${prefix}/share"
@@ -513,6 +516,7 @@ OpenBSD)
Darwin)
bsd="yes"
darwin="yes"
+ LDFLAGS_SHARED="-bundle"
if [ "$cpu" = "x86_64" ] ; then
QEMU_CFLAGS="-arch x86_64 $QEMU_CFLAGS"
LDFLAGS="-arch x86_64 $LDFLAGS"
@@ -606,6 +610,7 @@ fi
if test "$mingw32" = "yes" ; then
EXESUF=".exe"
+ DSOSUF=".dll"
QEMU_CFLAGS="-DWIN32_LEAN_AND_MEAN -DWINVER=0x501 $QEMU_CFLAGS"
# enable C99/POSIX format strings (needs mingw32-runtime 3.15 or later)
QEMU_CFLAGS="-D__USE_MINGW_ANSI_STDIO=1 $QEMU_CFLAGS"
@@ -672,6 +677,8 @@ for opt do
;;
--disable-debug-info)
;;
+ --enable-modules) modules="yes"
+ ;;
--cpu=*)
;;
--target-list=*) target_list="$optarg"
@@ -1124,6 +1131,7 @@ Advanced options (experts only):
--sysconfdir=PATH install config in PATH$confsuffix
--localstatedir=PATH install local state in PATH (set at runtime on win32)
--with-confsuffix=SUFFIX suffix for QEMU data inside datadir and sysconfdir [$confsuffix]
+ --enable-modules enable modules support
--enable-debug-tcg enable TCG debugging
--disable-debug-tcg disable TCG debugging (default)
--enable-debug-info enable debugging information (default)
@@ -3736,6 +3744,7 @@ echo "python $python"
if test "$slirp" = "yes" ; then
echo "smbd $smbd"
fi
+echo "module support $modules"
echo "host CPU $cpu"
echo "host big endian $bigendian"
echo "target list $target_list"
@@ -3858,6 +3867,9 @@ echo "libs_softmmu=$libs_softmmu" >> $config_host_mak
echo "ARCH=$ARCH" >> $config_host_mak
+if test "$modules" = "yes"; then
+ echo "CONFIG_MODULES=y" >> $config_host_mak
+fi
if test "$debug_tcg" = "yes" ; then
echo "CONFIG_DEBUG_TCG=y" >> $config_host_mak
fi
@@ -4353,6 +4365,8 @@ echo "LIBTOOLFLAGS=$LIBTOOLFLAGS" >> $config_host_mak
echo "LIBS+=$LIBS" >> $config_host_mak
echo "LIBS_TOOLS+=$libs_tools" >> $config_host_mak
echo "EXESUF=$EXESUF" >> $config_host_mak
+echo "DSOSUF=$DSOSUF" >> $config_host_mak
+echo "LDFLAGS_SHARED=$LDFLAGS_SHARED" >> $config_host_mak
echo "LIBS_QGA+=$libs_qga" >> $config_host_mak
echo "POD2MAN=$POD2MAN" >> $config_host_mak
echo "TRANSLATE_OPT_CFLAGS=$TRANSLATE_OPT_CFLAGS" >> $config_host_mak
diff --git a/rules.mak b/rules.mak
index 9398268..fb3482b 100644
--- a/rules.mak
+++ b/rules.mak
@@ -21,7 +21,11 @@ QEMU_DGFLAGS += -MMD -MP -MT $@ -MF $(*D)/$(*F).d
# Same as -I$(SRC_PATH) -I., but for the nested source/object directories
QEMU_INCLUDES += -I$(<D) -I$(@D)
-extract-libs = $(strip $(foreach o,$1,$($o-libs)))
+extract-libs = $(strip $(sort $(foreach o,$1,$($o-libs)) \
+ $(foreach o,$(call expand-objs,$1),$($o-libs))))
+expand-objs = $(strip $(sort $(filter %.o,$1)) \
+ $(foreach o,$(filter %.mo,$1),$($o-objs)) \
+ $(filter-out %.o %.mo,$1))
%.o: %.c
$(call quiet-command,$(CC) $(QEMU_INCLUDES) $(QEMU_CFLAGS) $(QEMU_DGFLAGS) $(CFLAGS) $($@-cflags) -c -o $@ $<," CC $(TARGET_DIR)$@")
@@ -30,8 +34,8 @@ extract-libs = $(strip $(foreach o,$1,$($o-libs)))
ifeq ($(LIBTOOL),)
LINK = $(call quiet-command,$(CC) $(QEMU_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@ \
- $(sort $(filter %.o, $1)) $(filter-out %.o, $1) $(version-obj-y) \
- $(call extract-libs,$^) $(LIBS)," LINK $(TARGET_DIR)$@")
+ $(call expand-objs,$1) $(version-obj-y) \
+ $(call extract-libs,$1) $(LIBS)," LINK $(TARGET_DIR)$@")
else
LIBTOOL += $(if $(V),,--quiet)
%.lo: %.c
@@ -42,12 +46,12 @@ LIBTOOL += $(if $(V),,--quiet)
$(call quiet-command,$(LIBTOOL) --mode=compile --tag=CC dtrace -o $@ -G -s $<, " lt GEN $(TARGET_DIR)$@")
LINK = $(call quiet-command,\
- $(if $(filter %.lo %.la,$^),$(LIBTOOL) --mode=link --tag=CC \
+ $(if $(filter %.lo %.la,$1),$(LIBTOOL) --mode=link --tag=CC \
)$(CC) $(QEMU_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@ \
- $(sort $(filter %.o, $1)) $(filter-out %.o, $1) \
- $(if $(filter %.lo %.la,$^),$(version-lobj-y),$(version-obj-y)) \
- $(if $(filter %.lo %.la,$^),$(LIBTOOLFLAGS)) \
- $(call extract-libs,$^) $(LIBS),$(if $(filter %.lo %.la,$^),"lt LINK ", " LINK ")"$(TARGET_DIR)$@")
+ $(call expand-objs,$1) \
+ $(if $(filter %.lo %.la,$1),$(version-lobj-y),$(version-obj-y)) \
+ $(if $(filter %.lo %.la,$1),$(LIBTOOLFLAGS)) \
+ $(call extract-libs,$1) $(LIBS),$(if $(filter %.lo %.la,$1),"lt LINK ", " LINK ")"$(TARGET_DIR)$@")
endif
%.asm: %.S
@@ -65,6 +69,17 @@ endif
%.o: %.dtrace
$(call quiet-command,dtrace -o $@ -G -s $<, " GEN $(TARGET_DIR)$@")
+%$(DSOSUF): QEMU_CFLAGS += -fPIC
+%$(DSOSUF): LDFLAGS += $(LDFLAGS_SHARED)
+%$(DSOSUF): %.mo libqemustub.a
+ $(call LINK,$^)
+
+.PHONY: modules
+modules:
+
+%.mo:
+ $(call quiet-command,touch $@," GEN $(TARGET_DIR)$@")
+
%$(EXESUF): %.o
$(call LINK,$^)
@@ -158,7 +173,10 @@ $(foreach v,$($1), \
$(eval $v-cflags := )) \
$(if $($v-libs), \
$(eval $2$v-libs := $($v-libs)) \
- $(eval $v-libs := )))
+ $(eval $v-libs := )) \
+ $(if $($v-objs), \
+ $(eval $2$v-objs := $(addprefix $2,$($v-objs))) \
+ $(eval $v-objs := )))
endef
define unnest-dir
@@ -182,6 +200,15 @@ $(if $(nested-dirs),
$(call unnest-vars-1))
endef
+define add-modules
+$(foreach o,$(filter %.o,$($1)),
+ $(eval $(patsubst %.o,%.mo,$o): $o) \
+ $(eval $(patsubst %.o,%.mo,$o)-objs := $o))
+$(foreach o,$(filter %.mo,$($1)),$(eval \
+ $o: $($o-objs)))
+$(eval modules-m += $(patsubst %.o,%.mo,$($1)))
+endef
+
define unnest-vars
$(eval obj := $1)
$(eval nested-vars := $2)
@@ -193,4 +220,13 @@ $(foreach var,$(nested-vars),$(eval $(var) := $(filter-out %/, $($(var)))))
$(shell mkdir -p $(sort $(foreach var,$(nested-vars),$(dir $($(var))))))
$(foreach var,$(nested-vars), $(eval \
-include $(addsuffix *.d, $(sort $(dir $($(var)))))))
+$(foreach v,$(filter %-m,$(nested-vars)), \
+ $(call add-modules,$v))
+
+$(if $(CONFIG_MODULES), \
+ $(eval modules: $(patsubst %.mo,%$(DSOSUF),$(modules-m))), \
+ $(foreach v,$(filter %-m,$(nested-vars)), \
+ $(eval $(patsubst %-m,%-y,$v) += $($v)) \
+ $(eval $v := )))
+
endef
--
1.7.1
^ permalink raw reply related [flat|nested] 27+ messages in thread
* [Qemu-devel] [PATCH v15 6/9] module: implement module loading
2014-01-13 16:59 [Qemu-devel] [PATCH v15 0/9] Shared library module support Paolo Bonzini
` (4 preceding siblings ...)
2014-01-13 16:59 ` [Qemu-devel] [PATCH v15 5/9] build-sys: introduce common-obj-m and block-obj-m for DSO Paolo Bonzini
@ 2014-01-13 16:59 ` Paolo Bonzini
2014-01-13 22:05 ` Peter Maydell
` (2 more replies)
2014-01-13 16:59 ` [Qemu-devel] [PATCH v15 7/9] Makefile: install modules with "make install" Paolo Bonzini
` (3 subsequent siblings)
9 siblings, 3 replies; 27+ messages in thread
From: Paolo Bonzini @ 2014-01-13 16:59 UTC (permalink / raw)
To: qemu-devel; +Cc: peter.maydell, famz, mjt, alex, mrezanin, vilanova, rth
From: Fam Zheng <famz@redhat.com>
This patch adds loading, stamp checking and initialization of modules.
The init function of dynamic module is no longer directly called as
__attribute__((constructor)) in static linked version, it is called
only after passed the checking of presense of stamp symbol:
qemu_stamp_$(date +%s$$$RANDOM)
With this, modules built from a different tree/version/configure will
not be loaded.
The module loading code requires gmodule-2.0.
Signed-off-by: Fam Zheng <famz@redhat.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
Makefile | 3 +
configure | 31 +++++++++-----
include/qemu/module.h | 12 +++++
rules.mak | 7 ++-
scripts/create_config | 14 ++++++
util/module.c | 107 ++++++++++++++++++++++++++++++++++++++++++++++++-
6 files changed, 158 insertions(+), 16 deletions(-)
diff --git a/Makefile b/Makefile
index 9de66cb..670ce44 100644
--- a/Makefile
+++ b/Makefile
@@ -203,6 +203,9 @@ Makefile: $(version-obj-y) $(version-lobj-y)
libqemustub.a: $(stub-obj-y)
libqemuutil.a: $(util-obj-y) qapi-types.o qapi-visit.o
+block-modules = $(foreach o,$(block-obj-m),"$(basename $(subst /,-,$o))",) NULL
+util/module.o-cflags = -D'CONFIG_BLOCK_MODULES=$(block-modules)'
+
######################################################################
qemu-img.o: qemu-img-cmds.h
diff --git a/configure b/configure
index 6b46c66..c382044 100755
--- a/configure
+++ b/configure
@@ -677,7 +677,8 @@ for opt do
;;
--disable-debug-info)
;;
- --enable-modules) modules="yes"
+ --enable-modules)
+ modules="yes"
;;
--cpu=*)
;;
@@ -1130,7 +1131,7 @@ Advanced options (experts only):
--libdir=PATH install libraries in PATH
--sysconfdir=PATH install config in PATH$confsuffix
--localstatedir=PATH install local state in PATH (set at runtime on win32)
- --with-confsuffix=SUFFIX suffix for QEMU data inside datadir and sysconfdir [$confsuffix]
+ --with-confsuffix=SUFFIX suffix for QEMU data inside datadir/libdir/sysconfdir [$confsuffix]
--enable-modules enable modules support
--enable-debug-tcg enable TCG debugging
--disable-debug-tcg disable TCG debugging (default)
@@ -2346,15 +2347,19 @@ if test "$mingw32" = yes; then
else
glib_req_ver=2.12
fi
-if $pkg_config --atleast-version=$glib_req_ver gthread-2.0; then
- glib_cflags=`$pkg_config --cflags gthread-2.0`
- glib_libs=`$pkg_config --libs gthread-2.0`
- CFLAGS="$glib_cflags $CFLAGS"
- LIBS="$glib_libs $LIBS"
- libs_qga="$glib_libs $libs_qga"
-else
- error_exit "glib-$glib_req_ver required to compile QEMU"
-fi
+
+for i in gthread-2.0 gmodule-2.0; do
+ if $pkg_config --atleast-version=$glib_req_ver $i; then
+ glib_cflags=`$pkg_config --cflags $i`
+ glib_libs=`$pkg_config --libs $i`
+ CFLAGS="$glib_cflags $CFLAGS"
+ LIBS="$glib_libs $LIBS"
+ libs_qga="$glib_libs $libs_qga"
+ else
+ error_exit "glib-$glib_req_ver required to compile QEMU"
+ fi
+done
+
##########################################
# pixman support probe
@@ -3628,6 +3633,7 @@ if test "$mingw32" = "yes" ; then
fi
qemu_confdir=$sysconfdir$confsuffix
+moddir=$libdir$confsuffix
qemu_datadir=$datadir$confsuffix
qemu_localedir="$datadir/locale"
@@ -3718,6 +3724,7 @@ echo "Install prefix $prefix"
echo "BIOS directory `eval echo $qemu_datadir`"
echo "binary directory `eval echo $bindir`"
echo "library directory `eval echo $libdir`"
+echo "module directory `eval echo $moddir`"
echo "libexec directory `eval echo $libexecdir`"
echo "include directory `eval echo $includedir`"
echo "config directory `eval echo $sysconfdir`"
@@ -3849,6 +3856,7 @@ echo all: >> $config_host_mak
echo "prefix=$prefix" >> $config_host_mak
echo "bindir=$bindir" >> $config_host_mak
echo "libdir=$libdir" >> $config_host_mak
+echo "moddir=$moddir" >> $config_host_mak
echo "libexecdir=$libexecdir" >> $config_host_mak
echo "includedir=$includedir" >> $config_host_mak
echo "mandir=$mandir" >> $config_host_mak
@@ -3867,6 +3875,7 @@ echo "libs_softmmu=$libs_softmmu" >> $config_host_mak
echo "ARCH=$ARCH" >> $config_host_mak
+echo "CONFIG_STAMP=`date +%s`_$$_$RANDOM" >> $config_host_mak
if test "$modules" = "yes"; then
echo "CONFIG_MODULES=y" >> $config_host_mak
fi
diff --git a/include/qemu/module.h b/include/qemu/module.h
index c4ccd57..47b7f1d 100644
--- a/include/qemu/module.h
+++ b/include/qemu/module.h
@@ -14,11 +14,22 @@
#ifndef QEMU_MODULE_H
#define QEMU_MODULE_H
+#ifdef BUILD_DSO
+void DSO_STAMP_FUN(void);
+/* For error message, this function is an identification of qemu module */
+void qemu_module_dummy(void);
+
+#define module_init(function, type) \
+static void __attribute__((constructor)) do_qemu_init_ ## function(void) { \
+ register_dso_module_init(function, type); \
+}
+#else
/* This should not be used directly. Use block_init etc. instead. */
#define module_init(function, type) \
static void __attribute__((constructor)) do_qemu_init_ ## function(void) { \
register_module_init(function, type); \
}
+#endif
typedef enum {
MODULE_INIT_BLOCK,
@@ -34,6 +45,7 @@ typedef enum {
#define type_init(function) module_init(function, MODULE_INIT_QOM)
void register_module_init(void (*fn)(void), module_init_type type);
+void register_dso_module_init(void (*fn)(void), module_init_type type);
void module_call_init(module_init_type type);
diff --git a/rules.mak b/rules.mak
index fb3482b..b3f7a85 100644
--- a/rules.mak
+++ b/rules.mak
@@ -69,9 +69,9 @@ endif
%.o: %.dtrace
$(call quiet-command,dtrace -o $@ -G -s $<, " GEN $(TARGET_DIR)$@")
-%$(DSOSUF): QEMU_CFLAGS += -fPIC
+%$(DSOSUF): QEMU_CFLAGS += -fPIC -DBUILD_DSO
%$(DSOSUF): LDFLAGS += $(LDFLAGS_SHARED)
-%$(DSOSUF): %.mo libqemustub.a
+%$(DSOSUF): %.mo libqemustub.a module-common.o
$(call LINK,$^)
.PHONY: modules
@@ -206,7 +206,8 @@ $(foreach o,$(filter %.o,$($1)),
$(eval $(patsubst %.o,%.mo,$o)-objs := $o))
$(foreach o,$(filter %.mo,$($1)),$(eval \
$o: $($o-objs)))
-$(eval modules-m += $(patsubst %.o,%.mo,$($1)))
+$(eval t := $(patsubst %.o,%.mo,$($1)))
+$(foreach o,$t,$(eval modules-m += $o)))
endef
define unnest-vars
diff --git a/scripts/create_config b/scripts/create_config
index b1adbf5..d7ba61d 100755
--- a/scripts/create_config
+++ b/scripts/create_config
@@ -26,6 +26,17 @@ case $line in
# save for the next definitions
prefix=${line#*=}
;;
+ moddir=*)
+ eval "moddir=\"${line#*=}\""
+ echo "#define CONFIG_MODDIR \"$moddir\""
+ ;;
+ CONFIG_STAMP=*)
+ echo "#define DSO_STAMP_FUN qemu_stamp_${line#*=}"
+ echo "#define DSO_STAMP_FUN_STR \"qemu_stamp_${line#*=}\""
+ ;;
+ CONFIG_MODULES=*)
+ echo "#define CONFIG_MODULES \"${line#*=}\""
+ ;;
CONFIG_AUDIO_DRIVERS=*)
drivers=${line#*=}
echo "#define CONFIG_AUDIO_DRIVERS \\"
@@ -104,6 +115,9 @@ case $line in
value=${line#*=}
echo "#define $name $value"
;;
+ DSOSUF=*)
+ echo "#define HOST_DSOSUF \"${line#*=}\""
+ ;;
esac
done # read
diff --git a/util/module.c b/util/module.c
index 7acc33d..c4115be 100644
--- a/util/module.c
+++ b/util/module.c
@@ -13,6 +13,7 @@
* GNU GPL, version 2 or (at your option) any later version.
*/
+#include <gmodule.h>
#include "qemu-common.h"
#include "qemu/queue.h"
#include "qemu/module.h"
@@ -21,13 +22,16 @@ typedef struct ModuleEntry
{
void (*init)(void);
QTAILQ_ENTRY(ModuleEntry) node;
+ module_init_type type;
} ModuleEntry;
typedef QTAILQ_HEAD(, ModuleEntry) ModuleTypeList;
static ModuleTypeList init_type_list[MODULE_INIT_MAX];
-static void init_types(void)
+static ModuleTypeList dso_init_list;
+
+static void init_lists(void)
{
static int inited;
int i;
@@ -40,6 +44,8 @@ static void init_types(void)
QTAILQ_INIT(&init_type_list[i]);
}
+ QTAILQ_INIT(&dso_init_list);
+
inited = 1;
}
@@ -48,7 +54,7 @@ static ModuleTypeList *find_type(module_init_type type)
{
ModuleTypeList *l;
- init_types();
+ init_lists();
l = &init_type_list[type];
@@ -62,20 +68,117 @@ void register_module_init(void (*fn)(void), module_init_type type)
e = g_malloc0(sizeof(*e));
e->init = fn;
+ e->type = type;
l = find_type(type);
QTAILQ_INSERT_TAIL(l, e, node);
}
+void register_dso_module_init(void (*fn)(void), module_init_type type)
+{
+ ModuleEntry *e;
+
+ init_lists();
+
+ e = g_malloc0(sizeof(*e));
+ e->init = fn;
+ e->type = type;
+
+ QTAILQ_INSERT_TAIL(&dso_init_list, e, node);
+}
+
+static void module_load(module_init_type type);
+
void module_call_init(module_init_type type)
{
ModuleTypeList *l;
ModuleEntry *e;
+ module_load(type);
l = find_type(type);
QTAILQ_FOREACH(e, l, node) {
e->init();
}
}
+
+#ifdef CONFIG_MODULES
+static void module_load_file(const char *fname)
+{
+ GModule *g_module;
+ void (*sym)(void);
+ const char *dsosuf = HOST_DSOSUF;
+ int len = strlen(fname);
+ int suf_len = strlen(dsosuf);
+ ModuleEntry *e, *next;
+
+ if (len <= suf_len || strcmp(&fname[len - suf_len], dsosuf)) {
+ /* wrong suffix */
+ return;
+ }
+ if (access(fname, F_OK)) {
+ return;
+ }
+
+ assert(QTAILQ_EMPTY(&dso_init_list));
+
+ g_module = g_module_open(fname, G_MODULE_BIND_LAZY | G_MODULE_BIND_LOCAL);
+ if (!g_module) {
+ fprintf(stderr, "Failed to load module: %s\n",
+ g_module_error());
+ return;
+ }
+ if (!g_module_symbol(g_module, DSO_STAMP_FUN_STR, (gpointer *)&sym)) {
+ fprintf(stderr, "Failed to initialize module: %s\n",
+ fname);
+ /* Print some info if this is a QEMU module (but from different build),
+ * this will make debugging user problems easier. */
+ if (g_module_symbol(g_module, "qemu_module_dummy", (gpointer *)&sym)) {
+ fprintf(stderr,
+ "Note: only modules from the same build can be loaded.\n");
+ }
+ g_module_close(g_module);
+ } else {
+ QTAILQ_FOREACH(e, &dso_init_list, node) {
+ register_module_init(e->init, e->type);
+ }
+ }
+
+ QTAILQ_FOREACH_SAFE(e, &dso_init_list, node, next) {
+ QTAILQ_REMOVE(&dso_init_list, e, node);
+ g_free(e);
+ }
+}
+#endif
+
+void module_load(module_init_type type)
+{
+#ifdef CONFIG_MODULES
+ char *fname = NULL;
+ const char **mp;
+ static const char *block_modules[] = {
+ CONFIG_BLOCK_MODULES
+ };
+
+ if (!g_module_supported()) {
+ return;
+ }
+
+ switch (type) {
+ case MODULE_INIT_BLOCK:
+ mp = block_modules;
+ break;
+ /* no other types have dynamic modules for now*/
+ default:
+ return;
+ }
+
+ for ( ; *mp; mp++) {
+ fname = g_strdup_printf("%s/%s%s", CONFIG_MODDIR, *mp, HOST_DSOSUF);
+ module_load_file(fname);
+ g_free(fname);
+ }
+
+#endif
+}
--
1.7.1
^ permalink raw reply related [flat|nested] 27+ messages in thread
* Re: [Qemu-devel] [PATCH v15 6/9] module: implement module loading
2014-01-13 16:59 ` [Qemu-devel] [PATCH v15 6/9] module: implement module loading Paolo Bonzini
@ 2014-01-13 22:05 ` Peter Maydell
2014-01-14 3:21 ` Fam Zheng
2014-01-13 22:09 ` Peter Maydell
2014-01-13 22:15 ` Richard Henderson
2 siblings, 1 reply; 27+ messages in thread
From: Peter Maydell @ 2014-01-13 22:05 UTC (permalink / raw)
To: Paolo Bonzini
Cc: Fam Zheng, Michael Tokarev, QEMU Developers, Alex Bligh,
Miroslav Rezanina, Lluís Vilanova, Richard Henderson
On 13 January 2014 16:59, Paolo Bonzini <pbonzini@redhat.com> wrote:
> From: Fam Zheng <famz@redhat.com>
>
> This patch adds loading, stamp checking and initialization of modules.
>
> The init function of dynamic module is no longer directly called as
> __attribute__((constructor)) in static linked version, it is called
> only after passed the checking of presense of stamp symbol:
>
> qemu_stamp_$(date +%s$$$RANDOM)
>
> +echo "CONFIG_STAMP=`date +%s`_$$_$RANDOM" >> $config_host_mak
This is not really a good idea because $RANDOM is a bashism
and our configure script is a generic POSIX shell script. In
particular if you configure on Ubuntu you're likely to find that /bin/sh
is dash and $RANDOM silently expands to the empty string.
(One day I will clean up the tempfile generation stuff to fix
its misuse of $RANDOM...)
> +void DSO_STAMP_FUN(void);
> +/* For error message, this function is an identification of qemu module */
What is this comment trying to say?
> +void qemu_module_dummy(void);
thanks
-- PMM
^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [Qemu-devel] [PATCH v15 6/9] module: implement module loading
2014-01-13 22:05 ` Peter Maydell
@ 2014-01-14 3:21 ` Fam Zheng
0 siblings, 0 replies; 27+ messages in thread
From: Fam Zheng @ 2014-01-14 3:21 UTC (permalink / raw)
To: Peter Maydell
Cc: Michael Tokarev, QEMU Developers, Alex Bligh, Paolo Bonzini,
Miroslav Rezanina, Lluís Vilanova, Richard Henderson
On Mon, 01/13 22:05, Peter Maydell wrote:
> On 13 January 2014 16:59, Paolo Bonzini <pbonzini@redhat.com> wrote:
> > From: Fam Zheng <famz@redhat.com>
> >
> > This patch adds loading, stamp checking and initialization of modules.
> >
> > The init function of dynamic module is no longer directly called as
> > __attribute__((constructor)) in static linked version, it is called
> > only after passed the checking of presense of stamp symbol:
> >
> > qemu_stamp_$(date +%s$$$RANDOM)
> >
>
> > +echo "CONFIG_STAMP=`date +%s`_$$_$RANDOM" >> $config_host_mak
>
> This is not really a good idea because $RANDOM is a bashism
> and our configure script is a generic POSIX shell script. In
> particular if you configure on Ubuntu you're likely to find that /bin/sh
> is dash and $RANDOM silently expands to the empty string.
>
> (One day I will clean up the tempfile generation stuff to fix
> its misuse of $RANDOM...)
>
So what's the best way to generate random number here?
> > +void DSO_STAMP_FUN(void);
> > +/* For error message, this function is an identification of qemu module */
>
> What is this comment trying to say?
Existence of this symbol indicates it *is* a qemu module. Where we continue to
check for existence of DSO_STAMP_FUN, and report it's only the wrong version.
Thanks,
Fam
^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [Qemu-devel] [PATCH v15 6/9] module: implement module loading
2014-01-13 16:59 ` [Qemu-devel] [PATCH v15 6/9] module: implement module loading Paolo Bonzini
2014-01-13 22:05 ` Peter Maydell
@ 2014-01-13 22:09 ` Peter Maydell
2014-01-14 3:18 ` Fam Zheng
2014-01-13 22:15 ` Richard Henderson
2 siblings, 1 reply; 27+ messages in thread
From: Peter Maydell @ 2014-01-13 22:09 UTC (permalink / raw)
To: Paolo Bonzini
Cc: Fam Zheng, Michael Tokarev, QEMU Developers, Alex Bligh,
Miroslav Rezanina, Lluís Vilanova, Richard Henderson
On 13 January 2014 16:59, Paolo Bonzini <pbonzini@redhat.com> wrote:
> From: Fam Zheng <famz@redhat.com>
>
> This patch adds loading, stamp checking and initialization of modules.
>
> The init function of dynamic module is no longer directly called as
> __attribute__((constructor)) in static linked version, it is called
> only after passed the checking of presense of stamp symbol:
>
> qemu_stamp_$(date +%s$$$RANDOM)
>
> With this, modules built from a different tree/version/configure will
> not be loaded.
>
> The module loading code requires gmodule-2.0.
>
> Signed-off-by: Fam Zheng <famz@redhat.com>
> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
> ---
> Makefile | 3 +
> configure | 31 +++++++++-----
> include/qemu/module.h | 12 +++++
> rules.mak | 7 ++-
> scripts/create_config | 14 ++++++
> util/module.c | 107 ++++++++++++++++++++++++++++++++++++++++++++++++-
> 6 files changed, 158 insertions(+), 16 deletions(-)
>
> diff --git a/Makefile b/Makefile
> index 9de66cb..670ce44 100644
> --- a/Makefile
> +++ b/Makefile
> @@ -203,6 +203,9 @@ Makefile: $(version-obj-y) $(version-lobj-y)
> libqemustub.a: $(stub-obj-y)
> libqemuutil.a: $(util-obj-y) qapi-types.o qapi-visit.o
>
> +block-modules = $(foreach o,$(block-obj-m),"$(basename $(subst /,-,$o))",) NULL
> +util/module.o-cflags = -D'CONFIG_BLOCK_MODULES=$(block-modules)'
> +
> ######################################################################
>
> qemu-img.o: qemu-img-cmds.h
> diff --git a/configure b/configure
> index 6b46c66..c382044 100755
> --- a/configure
> +++ b/configure
> @@ -677,7 +677,8 @@ for opt do
> ;;
> --disable-debug-info)
> ;;
> - --enable-modules) modules="yes"
> + --enable-modules)
> + modules="yes"
> ;;
> --cpu=*)
> ;;
> @@ -1130,7 +1131,7 @@ Advanced options (experts only):
> --libdir=PATH install libraries in PATH
> --sysconfdir=PATH install config in PATH$confsuffix
> --localstatedir=PATH install local state in PATH (set at runtime on win32)
> - --with-confsuffix=SUFFIX suffix for QEMU data inside datadir and sysconfdir [$confsuffix]
> + --with-confsuffix=SUFFIX suffix for QEMU data inside datadir/libdir/sysconfdir [$confsuffix]
> --enable-modules enable modules support
> --enable-debug-tcg enable TCG debugging
> --disable-debug-tcg disable TCG debugging (default)
> @@ -2346,15 +2347,19 @@ if test "$mingw32" = yes; then
> else
> glib_req_ver=2.12
> fi
> -if $pkg_config --atleast-version=$glib_req_ver gthread-2.0; then
> - glib_cflags=`$pkg_config --cflags gthread-2.0`
> - glib_libs=`$pkg_config --libs gthread-2.0`
> - CFLAGS="$glib_cflags $CFLAGS"
> - LIBS="$glib_libs $LIBS"
> - libs_qga="$glib_libs $libs_qga"
> -else
> - error_exit "glib-$glib_req_ver required to compile QEMU"
> -fi
> +
> +for i in gthread-2.0 gmodule-2.0; do
> + if $pkg_config --atleast-version=$glib_req_ver $i; then
> + glib_cflags=`$pkg_config --cflags $i`
> + glib_libs=`$pkg_config --libs $i`
> + CFLAGS="$glib_cflags $CFLAGS"
> + LIBS="$glib_libs $LIBS"
> + libs_qga="$glib_libs $libs_qga"
> + else
> + error_exit "glib-$glib_req_ver required to compile QEMU"
> + fi
> +done
Also, isn't this going to give rather unhelpful error messages if
the system has glib and gthread but not gmodule? (Or is it
guaranteed that they come as a set? If so then we can either
not bother checking or print a "your system's glib seems to be
busted" message...)
thanks
-- PMM
^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [Qemu-devel] [PATCH v15 6/9] module: implement module loading
2014-01-13 22:09 ` Peter Maydell
@ 2014-01-14 3:18 ` Fam Zheng
0 siblings, 0 replies; 27+ messages in thread
From: Fam Zheng @ 2014-01-14 3:18 UTC (permalink / raw)
To: Peter Maydell
Cc: Michael Tokarev, QEMU Developers, Alex Bligh, Paolo Bonzini,
Miroslav Rezanina, Lluís Vilanova, Richard Henderson
On Mon, 01/13 22:09, Peter Maydell wrote:
> On 13 January 2014 16:59, Paolo Bonzini <pbonzini@redhat.com> wrote:
> > From: Fam Zheng <famz@redhat.com>
> >
> > This patch adds loading, stamp checking and initialization of modules.
> >
> > The init function of dynamic module is no longer directly called as
> > __attribute__((constructor)) in static linked version, it is called
> > only after passed the checking of presense of stamp symbol:
> >
> > qemu_stamp_$(date +%s$$$RANDOM)
> >
> > With this, modules built from a different tree/version/configure will
> > not be loaded.
> >
> > The module loading code requires gmodule-2.0.
> >
> > Signed-off-by: Fam Zheng <famz@redhat.com>
> > Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
> > ---
> > Makefile | 3 +
> > configure | 31 +++++++++-----
> > include/qemu/module.h | 12 +++++
> > rules.mak | 7 ++-
> > scripts/create_config | 14 ++++++
> > util/module.c | 107 ++++++++++++++++++++++++++++++++++++++++++++++++-
> > 6 files changed, 158 insertions(+), 16 deletions(-)
> >
> > diff --git a/Makefile b/Makefile
> > index 9de66cb..670ce44 100644
> > --- a/Makefile
> > +++ b/Makefile
> > @@ -203,6 +203,9 @@ Makefile: $(version-obj-y) $(version-lobj-y)
> > libqemustub.a: $(stub-obj-y)
> > libqemuutil.a: $(util-obj-y) qapi-types.o qapi-visit.o
> >
> > +block-modules = $(foreach o,$(block-obj-m),"$(basename $(subst /,-,$o))",) NULL
> > +util/module.o-cflags = -D'CONFIG_BLOCK_MODULES=$(block-modules)'
> > +
> > ######################################################################
> >
> > qemu-img.o: qemu-img-cmds.h
> > diff --git a/configure b/configure
> > index 6b46c66..c382044 100755
> > --- a/configure
> > +++ b/configure
> > @@ -677,7 +677,8 @@ for opt do
> > ;;
> > --disable-debug-info)
> > ;;
> > - --enable-modules) modules="yes"
> > + --enable-modules)
> > + modules="yes"
> > ;;
> > --cpu=*)
> > ;;
> > @@ -1130,7 +1131,7 @@ Advanced options (experts only):
> > --libdir=PATH install libraries in PATH
> > --sysconfdir=PATH install config in PATH$confsuffix
> > --localstatedir=PATH install local state in PATH (set at runtime on win32)
> > - --with-confsuffix=SUFFIX suffix for QEMU data inside datadir and sysconfdir [$confsuffix]
> > + --with-confsuffix=SUFFIX suffix for QEMU data inside datadir/libdir/sysconfdir [$confsuffix]
> > --enable-modules enable modules support
> > --enable-debug-tcg enable TCG debugging
> > --disable-debug-tcg disable TCG debugging (default)
> > @@ -2346,15 +2347,19 @@ if test "$mingw32" = yes; then
> > else
> > glib_req_ver=2.12
> > fi
> > -if $pkg_config --atleast-version=$glib_req_ver gthread-2.0; then
> > - glib_cflags=`$pkg_config --cflags gthread-2.0`
> > - glib_libs=`$pkg_config --libs gthread-2.0`
> > - CFLAGS="$glib_cflags $CFLAGS"
> > - LIBS="$glib_libs $LIBS"
> > - libs_qga="$glib_libs $libs_qga"
> > -else
> > - error_exit "glib-$glib_req_ver required to compile QEMU"
> > -fi
> > +
> > +for i in gthread-2.0 gmodule-2.0; do
> > + if $pkg_config --atleast-version=$glib_req_ver $i; then
> > + glib_cflags=`$pkg_config --cflags $i`
> > + glib_libs=`$pkg_config --libs $i`
> > + CFLAGS="$glib_cflags $CFLAGS"
> > + LIBS="$glib_libs $LIBS"
> > + libs_qga="$glib_libs $libs_qga"
> > + else
> > + error_exit "glib-$glib_req_ver required to compile QEMU"
> > + fi
> > +done
>
> Also, isn't this going to give rather unhelpful error messages if
> the system has glib and gthread but not gmodule? (Or is it
> guaranteed that they come as a set? If so then we can either
> not bother checking or print a "your system's glib seems to be
> busted" message...)
>
I think they all usually come with one glib package. But it doean't hurt to
check, it's easy enough to include $i in the error message.
Fam
^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [Qemu-devel] [PATCH v15 6/9] module: implement module loading
2014-01-13 16:59 ` [Qemu-devel] [PATCH v15 6/9] module: implement module loading Paolo Bonzini
2014-01-13 22:05 ` Peter Maydell
2014-01-13 22:09 ` Peter Maydell
@ 2014-01-13 22:15 ` Richard Henderson
2014-01-14 3:06 ` Fam Zheng
2 siblings, 1 reply; 27+ messages in thread
From: Richard Henderson @ 2014-01-13 22:15 UTC (permalink / raw)
To: Paolo Bonzini, qemu-devel
Cc: peter.maydell, famz, mjt, alex, mrezanin, vilanova
On 01/13/2014 08:59 AM, Paolo Bonzini wrote:
> +echo "CONFIG_STAMP=`date +%s`_$$_$RANDOM" >> $config_host_mak
I really really don't like random numbers that make for non-repeatable builds.
It's a quality-assurance nightmare.
If you want a non-random number unique to the build, try
git log -n1 --format=format:%H
and perhaps a file containing that hash created by scripts/make-release.
r~
^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [Qemu-devel] [PATCH v15 6/9] module: implement module loading
2014-01-13 22:15 ` Richard Henderson
@ 2014-01-14 3:06 ` Fam Zheng
2014-01-14 14:47 ` Richard Henderson
0 siblings, 1 reply; 27+ messages in thread
From: Fam Zheng @ 2014-01-14 3:06 UTC (permalink / raw)
To: Richard Henderson
Cc: peter.maydell, mjt, qemu-devel, alex, Paolo Bonzini, mrezanin,
vilanova
On Mon, 01/13 14:15, Richard Henderson wrote:
> On 01/13/2014 08:59 AM, Paolo Bonzini wrote:
> > +echo "CONFIG_STAMP=`date +%s`_$$_$RANDOM" >> $config_host_mak
>
> I really really don't like random numbers that make for non-repeatable builds.
> It's a quality-assurance nightmare.
Can you elaborate this, please?
>
> If you want a non-random number unique to the build, try
>
> git log -n1 --format=format:%H
>
> and perhaps a file containing that hash created by scripts/make-release.
What if the source code is not in a git tree, for example a tarball?
Thanks,
Fam
^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [Qemu-devel] [PATCH v15 6/9] module: implement module loading
2014-01-14 3:06 ` Fam Zheng
@ 2014-01-14 14:47 ` Richard Henderson
2014-01-14 15:19 ` Paolo Bonzini
0 siblings, 1 reply; 27+ messages in thread
From: Richard Henderson @ 2014-01-14 14:47 UTC (permalink / raw)
To: Fam Zheng
Cc: peter.maydell, mjt, qemu-devel, alex, Paolo Bonzini, mrezanin,
vilanova
On 01/13/2014 07:06 PM, Fam Zheng wrote:
> On Mon, 01/13 14:15, Richard Henderson wrote:
>> On 01/13/2014 08:59 AM, Paolo Bonzini wrote:
>>> +echo "CONFIG_STAMP=`date +%s`_$$_$RANDOM" >> $config_host_mak
>>
>> I really really don't like random numbers that make for non-repeatable builds.
>> It's a quality-assurance nightmare.
>
> Can you elaborate this, please?
Build systems like we use at Red Hat want to be able to produce bit-for-bit
identical binaries when given the exact same input. Using random numbers
during the build process prevents that.
>> and perhaps a file containing that hash created by scripts/make-release.
>
> What if the source code is not in a git tree, for example a tarball?
You just quoted my answer to that.
Alternately, take a page from gcc and produce a number from a hash of the
relevant object file(s).
r~
^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [Qemu-devel] [PATCH v15 6/9] module: implement module loading
2014-01-14 14:47 ` Richard Henderson
@ 2014-01-14 15:19 ` Paolo Bonzini
2014-01-14 15:25 ` Peter Maydell
2014-01-14 15:45 ` Daniel P. Berrange
0 siblings, 2 replies; 27+ messages in thread
From: Paolo Bonzini @ 2014-01-14 15:19 UTC (permalink / raw)
To: Richard Henderson
Cc: peter.maydell, Fam Zheng, mjt, qemu-devel, alex, mrezanin,
vilanova
Il 14/01/2014 15:47, Richard Henderson ha scritto:
>>>> +echo "CONFIG_STAMP=`date +%s`_$$_$RANDOM" >> $config_host_mak
>>> >>
>>> >> I really really don't like random numbers that make for non-repeatable builds.
>>> >> It's a quality-assurance nightmare.
>> >
>> > Can you elaborate this, please?
> Build systems like we use at Red Hat want to be able to produce bit-for-bit
> identical binaries when given the exact same input. Using random numbers
> during the build process prevents that.
I totally agree, but AIUI people wanted the symbol to be something that
you couldn't know in advance (e.g. when compiling an out-of-tree
module). For some definition of "couldn't" and "in advance".
I think we should simply drop the requirement to check a symbol in the
modules.
Paolo
>>> >> and perhaps a file containing that hash created by scripts/make-release.
>> >
>> > What if the source code is not in a git tree, for example a tarball?
> You just quoted my answer to that.
^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [Qemu-devel] [PATCH v15 6/9] module: implement module loading
2014-01-14 15:19 ` Paolo Bonzini
@ 2014-01-14 15:25 ` Peter Maydell
2014-01-14 15:31 ` Paolo Bonzini
2014-01-14 15:45 ` Daniel P. Berrange
1 sibling, 1 reply; 27+ messages in thread
From: Peter Maydell @ 2014-01-14 15:25 UTC (permalink / raw)
To: Paolo Bonzini
Cc: Fam Zheng, Michael Tokarev, QEMU Developers, Alex Bligh,
Miroslav Rezanina, Lluís Vilanova, Richard Henderson
On 14 January 2014 15:19, Paolo Bonzini <pbonzini@redhat.com> wrote:
> Il 14/01/2014 15:47, Richard Henderson ha scritto:
>> Build systems like we use at Red Hat want to be able to produce bit-for-bit
>> identical binaries when given the exact same input. Using random numbers
>> during the build process prevents that.
>
> I totally agree, but AIUI people wanted the symbol to be something that
> you couldn't know in advance (e.g. when compiling an out-of-tree
> module). For some definition of "couldn't" and "in advance".
>
> I think we should simply drop the requirement to check a symbol in the
> modules.
I definitely think we want at least a basic molly-guard on
"module not compiled for this qemu"; we need not attempt
to make it impervious to somebody who's determined to get
around it, because that's impossible. Something like the
git hash / file hash rth proposes seems reasonable.
thanks
-- PMM
^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [Qemu-devel] [PATCH v15 6/9] module: implement module loading
2014-01-14 15:25 ` Peter Maydell
@ 2014-01-14 15:31 ` Paolo Bonzini
2014-01-14 15:43 ` Richard Henderson
2014-01-14 15:47 ` Daniel P. Berrange
0 siblings, 2 replies; 27+ messages in thread
From: Paolo Bonzini @ 2014-01-14 15:31 UTC (permalink / raw)
To: Peter Maydell
Cc: Fam Zheng, Michael Tokarev, QEMU Developers, Alex Bligh,
Miroslav Rezanina, Lluís Vilanova, Richard Henderson
Il 14/01/2014 16:25, Peter Maydell ha scritto:
> I definitely think we want at least a basic molly-guard on
> "module not compiled for this qemu"; we need not attempt
> to make it impervious to somebody who's determined to get
> around it, because that's impossible. Something like the
> git hash / file hash rth proposes seems reasonable.
What about the SHA1 of configure?
Paolo
^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [Qemu-devel] [PATCH v15 6/9] module: implement module loading
2014-01-14 15:31 ` Paolo Bonzini
@ 2014-01-14 15:43 ` Richard Henderson
2014-01-14 15:47 ` Daniel P. Berrange
1 sibling, 0 replies; 27+ messages in thread
From: Richard Henderson @ 2014-01-14 15:43 UTC (permalink / raw)
To: Paolo Bonzini, Peter Maydell
Cc: Fam Zheng, Michael Tokarev, QEMU Developers, Alex Bligh,
Miroslav Rezanina, Lluís Vilanova
On 01/14/2014 07:31 AM, Paolo Bonzini wrote:
> Il 14/01/2014 16:25, Peter Maydell ha scritto:
>> I definitely think we want at least a basic molly-guard on
>> "module not compiled for this qemu"; we need not attempt
>> to make it impervious to somebody who's determined to get
>> around it, because that's impossible. Something like the
>> git hash / file hash rth proposes seems reasonable.
>
> What about the SHA1 of configure?
That doesn't change enough to be worthwhile.
r~
^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [Qemu-devel] [PATCH v15 6/9] module: implement module loading
2014-01-14 15:31 ` Paolo Bonzini
2014-01-14 15:43 ` Richard Henderson
@ 2014-01-14 15:47 ` Daniel P. Berrange
1 sibling, 0 replies; 27+ messages in thread
From: Daniel P. Berrange @ 2014-01-14 15:47 UTC (permalink / raw)
To: Paolo Bonzini
Cc: Peter Maydell, Fam Zheng, Michael Tokarev, QEMU Developers,
Alex Bligh, Miroslav Rezanina, Lluís Vilanova,
Richard Henderson
On Tue, Jan 14, 2014 at 04:31:00PM +0100, Paolo Bonzini wrote:
> Il 14/01/2014 16:25, Peter Maydell ha scritto:
> > I definitely think we want at least a basic molly-guard on
> > "module not compiled for this qemu"; we need not attempt
> > to make it impervious to somebody who's determined to get
> > around it, because that's impossible. Something like the
> > git hash / file hash rth proposes seems reasonable.
>
> What about the SHA1 of configure?
On its own that is insufficiently variable but if you combined with the
version + pkgversion strings that would be more viable - assuming the
RPM build passed '--pkgversion %{release}' to make it change on each
new build produced.
Daniel
--
|: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :|
|: http://libvirt.org -o- http://virt-manager.org :|
|: http://autobuild.org -o- http://search.cpan.org/~danberr/ :|
|: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :|
^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [Qemu-devel] [PATCH v15 6/9] module: implement module loading
2014-01-14 15:19 ` Paolo Bonzini
2014-01-14 15:25 ` Peter Maydell
@ 2014-01-14 15:45 ` Daniel P. Berrange
2014-01-15 8:28 ` Fam Zheng
1 sibling, 1 reply; 27+ messages in thread
From: Daniel P. Berrange @ 2014-01-14 15:45 UTC (permalink / raw)
To: Paolo Bonzini
Cc: peter.maydell, Fam Zheng, mjt, qemu-devel, alex, mrezanin,
vilanova, Richard Henderson
On Tue, Jan 14, 2014 at 04:19:41PM +0100, Paolo Bonzini wrote:
> Il 14/01/2014 15:47, Richard Henderson ha scritto:
> >>>> +echo "CONFIG_STAMP=`date +%s`_$$_$RANDOM" >> $config_host_mak
> >>> >>
> >>> >> I really really don't like random numbers that make for non-repeatable builds.
> >>> >> It's a quality-assurance nightmare.
> >> >
> >> > Can you elaborate this, please?
> > Build systems like we use at Red Hat want to be able to produce bit-for-bit
> > identical binaries when given the exact same input. Using random numbers
> > during the build process prevents that.
>
> I totally agree, but AIUI people wanted the symbol to be something that
> you couldn't know in advance (e.g. when compiling an out-of-tree
> module). For some definition of "couldn't" and "in advance".
You can't stop a determined person. The goal is really just to make sure
they have to jump through painful hoops if they're going to delibrately
ignore our policy that this is not for 3rd party out of tree modules to
use.
When doing RHEL / Fedora builds, we *do* want this to change each time
the RPM is rebuilt for a new release. eg any time we add a new patch
to the RPM we want it to change, but if you're just rebuilding an
src.rpm without making changes we don't need it to be different.
You could use a sha256 sum of 'configure content + version + pkgversion'
to get something that'd change each time distros did a formal new build,
but would still allow reproducible builds.
Regards,
Daniel
--
|: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :|
|: http://libvirt.org -o- http://virt-manager.org :|
|: http://autobuild.org -o- http://search.cpan.org/~danberr/ :|
|: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :|
^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [Qemu-devel] [PATCH v15 6/9] module: implement module loading
2014-01-14 15:45 ` Daniel P. Berrange
@ 2014-01-15 8:28 ` Fam Zheng
0 siblings, 0 replies; 27+ messages in thread
From: Fam Zheng @ 2014-01-15 8:28 UTC (permalink / raw)
To: Daniel P. Berrange
Cc: peter.maydell, mjt, qemu-devel, alex, Paolo Bonzini, mrezanin,
vilanova, Richard Henderson
On Tue, 01/14 15:45, Daniel P. Berrange wrote:
> On Tue, Jan 14, 2014 at 04:19:41PM +0100, Paolo Bonzini wrote:
> > Il 14/01/2014 15:47, Richard Henderson ha scritto:
> > >>>> +echo "CONFIG_STAMP=`date +%s`_$$_$RANDOM" >> $config_host_mak
> > >>> >>
> > >>> >> I really really don't like random numbers that make for non-repeatable builds.
> > >>> >> It's a quality-assurance nightmare.
> > >> >
> > >> > Can you elaborate this, please?
> > > Build systems like we use at Red Hat want to be able to produce bit-for-bit
> > > identical binaries when given the exact same input. Using random numbers
> > > during the build process prevents that.
> >
> > I totally agree, but AIUI people wanted the symbol to be something that
> > you couldn't know in advance (e.g. when compiling an out-of-tree
> > module). For some definition of "couldn't" and "in advance".
>
> You can't stop a determined person. The goal is really just to make sure
> they have to jump through painful hoops if they're going to delibrately
> ignore our policy that this is not for 3rd party out of tree modules to
> use.
>
> When doing RHEL / Fedora builds, we *do* want this to change each time
> the RPM is rebuilt for a new release. eg any time we add a new patch
> to the RPM we want it to change, but if you're just rebuilding an
> src.rpm without making changes we don't need it to be different.
>
> You could use a sha256 sum of 'configure content + version + pkgversion'
> to get something that'd change each time distros did a formal new build,
> but would still allow reproducible builds.
This sounds like a nice solution, I'll adopt. Thanks.
Fam
^ permalink raw reply [flat|nested] 27+ messages in thread
* [Qemu-devel] [PATCH v15 7/9] Makefile: install modules with "make install"
2014-01-13 16:59 [Qemu-devel] [PATCH v15 0/9] Shared library module support Paolo Bonzini
` (5 preceding siblings ...)
2014-01-13 16:59 ` [Qemu-devel] [PATCH v15 6/9] module: implement module loading Paolo Bonzini
@ 2014-01-13 16:59 ` Paolo Bonzini
2014-01-13 16:59 ` [Qemu-devel] [PATCH v15 8/9] .gitignore: ignore module related files (dll, so, mo) Paolo Bonzini
` (2 subsequent siblings)
9 siblings, 0 replies; 27+ messages in thread
From: Paolo Bonzini @ 2014-01-13 16:59 UTC (permalink / raw)
To: qemu-devel; +Cc: peter.maydell, famz, mjt, alex, mrezanin, vilanova, rth
From: Fam Zheng <famz@redhat.com>
Install all the modules to ${MODDIR}.
Signed-off-by: Fam Zheng <famz@redhat.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
Makefile | 6 ++++++
1 files changed, 6 insertions(+), 0 deletions(-)
diff --git a/Makefile b/Makefile
index 670ce44..a91f119 100644
--- a/Makefile
+++ b/Makefile
@@ -371,6 +371,12 @@ install-datadir install-localstatedir
ifneq ($(TOOLS),)
$(INSTALL_PROG) $(STRIP_OPT) $(TOOLS) "$(DESTDIR)$(bindir)"
endif
+ifneq ($(CONFIG_MODULES),)
+ $(INSTALL_DIR) "$(DESTDIR)$(moddir)"
+ for s in $(patsubst %.mo,%$(DSOSUF),$(modules-m)); do \
+ $(INSTALL_PROG) $(STRIP_OPT) $$s "$(DESTDIR)$(moddir)/$${s//\//-}"; \
+ done
+endif
ifneq ($(HELPERS-y),)
$(INSTALL_DIR) "$(DESTDIR)$(libexecdir)"
$(INSTALL_PROG) $(STRIP_OPT) $(HELPERS-y) "$(DESTDIR)$(libexecdir)"
--
1.7.1
^ permalink raw reply related [flat|nested] 27+ messages in thread
* [Qemu-devel] [PATCH v15 8/9] .gitignore: ignore module related files (dll, so, mo)
2014-01-13 16:59 [Qemu-devel] [PATCH v15 0/9] Shared library module support Paolo Bonzini
` (6 preceding siblings ...)
2014-01-13 16:59 ` [Qemu-devel] [PATCH v15 7/9] Makefile: install modules with "make install" Paolo Bonzini
@ 2014-01-13 16:59 ` Paolo Bonzini
2014-01-13 16:59 ` [Qemu-devel] [PATCH v15 9/9] block: convert block drivers linked with libs to modules Paolo Bonzini
2014-01-13 22:01 ` [Qemu-devel] [PATCH v15 0/9] Shared library module support Peter Maydell
9 siblings, 0 replies; 27+ messages in thread
From: Paolo Bonzini @ 2014-01-13 16:59 UTC (permalink / raw)
To: qemu-devel; +Cc: peter.maydell, famz, mjt, alex, mrezanin, vilanova, rth
From: Fam Zheng <famz@redhat.com>
Signed-off-by: Fam Zheng <famz@redhat.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
.gitignore | 3 +++
1 files changed, 3 insertions(+), 0 deletions(-)
diff --git a/.gitignore b/.gitignore
index 1c9d63d..7702b0c 100644
--- a/.gitignore
+++ b/.gitignore
@@ -64,6 +64,9 @@ fsdev/virtfs-proxy-helper.pod
*.cp
*.dvi
*.exe
+*.dll
+*.so
+*.mo
*.fn
*.ky
*.log
--
1.7.1
^ permalink raw reply related [flat|nested] 27+ messages in thread
* [Qemu-devel] [PATCH v15 9/9] block: convert block drivers linked with libs to modules
2014-01-13 16:59 [Qemu-devel] [PATCH v15 0/9] Shared library module support Paolo Bonzini
` (7 preceding siblings ...)
2014-01-13 16:59 ` [Qemu-devel] [PATCH v15 8/9] .gitignore: ignore module related files (dll, so, mo) Paolo Bonzini
@ 2014-01-13 16:59 ` Paolo Bonzini
2014-01-13 22:01 ` [Qemu-devel] [PATCH v15 0/9] Shared library module support Peter Maydell
9 siblings, 0 replies; 27+ messages in thread
From: Paolo Bonzini @ 2014-01-13 16:59 UTC (permalink / raw)
To: qemu-devel; +Cc: peter.maydell, famz, mjt, alex, mrezanin, vilanova, rth
From: Fam Zheng <famz@redhat.com>
The converted block drivers are:
curl
iscsi
rbd
ssh
glusterfs
Signed-off-by: Fam Zheng <famz@redhat.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
configure | 10 +++++-----
1 files changed, 5 insertions(+), 5 deletions(-)
diff --git a/configure b/configure
index c382044..1f0c5b8 100755
--- a/configure
+++ b/configure
@@ -4071,7 +4071,7 @@ if test "$bswap_h" = "yes" ; then
echo "CONFIG_MACHINE_BSWAP_H=y" >> $config_host_mak
fi
if test "$curl" = "yes" ; then
- echo "CONFIG_CURL=y" >> $config_host_mak
+ echo "CONFIG_CURL=m" >> $config_host_mak
echo "CURL_CFLAGS=$curl_cflags" >> $config_host_mak
echo "CURL_LIBS=$curl_libs" >> $config_host_mak
fi
@@ -4162,7 +4162,7 @@ if test "$glx" = "yes" ; then
fi
if test "$libiscsi" = "yes" ; then
- echo "CONFIG_LIBISCSI=y" >> $config_host_mak
+ echo "CONFIG_LIBISCSI=m" >> $config_host_mak
if test "$libiscsi_version" = "1.4.0"; then
echo "CONFIG_LIBISCSI_1_4=y" >> $config_host_mak
fi
@@ -4188,7 +4188,7 @@ if test "$qom_cast_debug" = "yes" ; then
echo "CONFIG_QOM_CAST_DEBUG=y" >> $config_host_mak
fi
if test "$rbd" = "yes" ; then
- echo "CONFIG_RBD=y" >> $config_host_mak
+ echo "CONFIG_RBD=m" >> $config_host_mak
echo "RBD_CFLAGS=$rbd_cflags" >> $config_host_mak
echo "RBD_LIBS=$rbd_libs" >> $config_host_mak
fi
@@ -4233,7 +4233,7 @@ if test "$getauxval" = "yes" ; then
fi
if test "$glusterfs" = "yes" ; then
- echo "CONFIG_GLUSTERFS=y" >> $config_host_mak
+ echo "CONFIG_GLUSTERFS=m" >> $config_host_mak
echo "GLUSTERFS_CFLAGS=$glusterfs_cflags" >> $config_host_mak
echo "GLUSTERFS_LIBS=$glusterfs_libs" >> $config_host_mak
fi
@@ -4243,7 +4243,7 @@ if test "$glusterfs_discard" = "yes" ; then
fi
if test "$libssh2" = "yes" ; then
- echo "CONFIG_LIBSSH2=y" >> $config_host_mak
+ echo "CONFIG_LIBSSH2=m" >> $config_host_mak
echo "LIBSSH2_CFLAGS=$libssh2_cflags" >> $config_host_mak
echo "LIBSSH2_LIBS=$libssh2_libs" >> $config_host_mak
fi
--
1.7.1
^ permalink raw reply related [flat|nested] 27+ messages in thread
* Re: [Qemu-devel] [PATCH v15 0/9] Shared library module support
2014-01-13 16:59 [Qemu-devel] [PATCH v15 0/9] Shared library module support Paolo Bonzini
` (8 preceding siblings ...)
2014-01-13 16:59 ` [Qemu-devel] [PATCH v15 9/9] block: convert block drivers linked with libs to modules Paolo Bonzini
@ 2014-01-13 22:01 ` Peter Maydell
2014-01-14 7:47 ` Fam Zheng
9 siblings, 1 reply; 27+ messages in thread
From: Peter Maydell @ 2014-01-13 22:01 UTC (permalink / raw)
To: Paolo Bonzini
Cc: Fam Zheng, Michael Tokarev, QEMU Developers, Alex Bligh,
Miroslav Rezanina, Lluís Vilanova, Richard Henderson
On 13 January 2014 16:59, Paolo Bonzini <pbonzini@redhat.com> wrote:
> This is based on Fam's patches from October. Very few changes
> apart from rebasing:
>
> * I split his patch 8 in two parts. There is benefit in
> using per-object cflags and libs even before the module-loading
> machinery gets in.
>
> * I added a new patch "darwin: do not use -mdynamic-no-pic".
> CCing Alex Graf for it.
>
> * applied the small change I had requested a small change in patch 2
>
> I'm not sending a pull request yet because of these two changes,
> but I'll be sending one in a few days.
This doesn't build on MacOSX if you try to enable modules with
--enable-modules:
make: *** No rule to make target `block/curl.so', needed by `modules'. Stop.
Should we have configure refuse to allow modules if the host
platform doesn't support it?
thanks
-- PMM
^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [Qemu-devel] [PATCH v15 0/9] Shared library module support
2014-01-13 22:01 ` [Qemu-devel] [PATCH v15 0/9] Shared library module support Peter Maydell
@ 2014-01-14 7:47 ` Fam Zheng
0 siblings, 0 replies; 27+ messages in thread
From: Fam Zheng @ 2014-01-14 7:47 UTC (permalink / raw)
To: Peter Maydell
Cc: Michael Tokarev, QEMU Developers, Alex Bligh, Paolo Bonzini,
Miroslav Rezanina, Lluís Vilanova, Richard Henderson
On Mon, 01/13 22:01, Peter Maydell wrote:
> On 13 January 2014 16:59, Paolo Bonzini <pbonzini@redhat.com> wrote:
> > This is based on Fam's patches from October. Very few changes
> > apart from rebasing:
> >
> > * I split his patch 8 in two parts. There is benefit in
> > using per-object cflags and libs even before the module-loading
> > machinery gets in.
> >
> > * I added a new patch "darwin: do not use -mdynamic-no-pic".
> > CCing Alex Graf for it.
> >
> > * applied the small change I had requested a small change in patch 2
> >
> > I'm not sending a pull request yet because of these two changes,
> > but I'll be sending one in a few days.
>
> This doesn't build on MacOSX if you try to enable modules with
> --enable-modules:
>
module-common.c is missing in patch 6/9, so it failed.
Fam
^ permalink raw reply [flat|nested] 27+ messages in thread