Adding support for loading DSO with -device option. Example Makefile for out of tree modules: #v+ DEVICENAME=pcnet2
hw-obj-y=pcnet-pci.o hw-obj-y+=pcnet.o include rules.mak .PHONY: all QEMU_CFLAGS=-I../qemu-kvm -I../qemu-kvm/hw QEMU_CFLAGS+=-I../qemu-kvm/fpu -I../qemu-kvm/include QEMU_CFLAGS+=-I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include QEMU_CFLAGS+=-DTARGET_PHYS_ADDR_BITS=64 -fPIC LDFLAGS+=-shared LIBNAME=libqemu_$(DEVICENAME).so all: $(LIBNAME) $(LIBNAME): $(hw-obj-y) $(call LINK,$^) clean: rm -f *.o rm -f *.d rm -f $(LIBNAME) # Include automatically generated dependency files -include $(patsubst %.o, %.d, $(hw-obj-y)) #v- Signed-off-by: Dominik Żeromski <dzero...@gmail.com> --- Makefile.target | 4 +++- hw/qdev-monitor.c | 11 +++++++++++ 2 files changed, 14 insertions(+), 1 deletions(-) diff --git a/Makefile.target b/Makefile.target index 74f7a4a..7fd9245 100644 --- a/Makefile.target +++ b/Makefile.target @@ -130,7 +130,9 @@ obj-$(CONFIG_HAVE_GET_MEMORY_MAPPING) += memory_mapping.o obj-$(CONFIG_HAVE_CORE_DUMP) += dump.o obj-$(CONFIG_NO_GET_MEMORY_MAPPING) += memory_mapping-stub.o obj-$(CONFIG_NO_CORE_DUMP) += dump-stub.o -LIBS+=-lz +LIBS+=-lz -ldl + +LDFLAGS+=-rdynamic QEMU_CFLAGS += $(VNC_TLS_CFLAGS) QEMU_CFLAGS += $(VNC_SASL_CFLAGS) diff --git a/hw/qdev-monitor.c b/hw/qdev-monitor.c index 7915b45..3b5b0b0 100644 --- a/hw/qdev-monitor.c +++ b/hw/qdev-monitor.c @@ -17,6 +17,8 @@ * License along with this library; if not, see <http://www.gnu.org/licenses/>. */ +#include <dlfcn.h> + #include "qdev.h" #include "monitor.h" #include "qmp-commands.h" @@ -402,6 +404,8 @@ DeviceState *qdev_device_add(QemuOpts *opts) const char *driver, *path, *id; DeviceState *qdev; BusState *bus; + void *libhandle; + char libname[NAME_MAX]; driver = qemu_opt_get(opts, "driver"); if (!driver) { @@ -419,7 +423,14 @@ DeviceState *qdev_device_add(QemuOpts *opts) obj = object_class_by_name(driver); } } + if (!obj) { + snprintf(libname, sizeof(libname), "libqemu_%s.so", driver); + libhandle = dlopen(libname, RTLD_NOW); + if (libhandle != NULL) { + obj = object_class_by_name(driver); + } + } if (!obj) { qerror_report(QERR_INVALID_PARAMETER_VALUE, "driver", "device type"); return NULL; -- 1.7.0.4