I want to build QEMU 4.2.0's plugin module on Windows 7/10 with Mingw, but the building process faild.
The step I follow is listed below:
1. create "dsp_build" diretory under source file folder
2. change directory to dsp_build , and run ../configure --target-list=dsp-softmmu --cross-prefix=x86_64-w64-mingw32- --enable-gtk --enable-sdl --enable-debug --enable-plugins
3. build qemu project
4. switch dir to /dsp_build, make -C tests/plugin, yeilds error:
CC bb.o
D:/emu_devl/qemu_src/qemu-sr-dsp-a/qemu_tidsp_c3x/tests/plugin/bb.c:17:24: error: variable 'qemu_plugin_version' definition is marked dllimport
17 | QEMU_PLUGIN_EXPORT int qemu_plugin_version = QEMU_PLUGIN_VERSION;
| ^~~~~~~~~~~~~~~~~~~
D:/emu_devl/qemu_src/qemu-sr-dsp-a/qemu_tidsp_c3x/tests/plugin/bb.c:17:24: warning: 'qemu_plugin_version' redeclared without dllimport attribute: previous dllimport ignored [-Wattributes]
D:/emu_devl/qemu_src/qemu-sr-dsp-a/qemu_tidsp_c3x/tests/plugin/bb.c: In function 'vcpu_tb_exec':
D:/emu_devl/qemu_src/qemu-sr-dsp-a/qemu_tidsp_c3x/tests/plugin/bb.c:33:29: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]
33 | unsigned long n_insns = (unsigned long)udata;
| ^
D:/emu_devl/qemu_src/qemu-sr-dsp-a/qemu_tidsp_c3x/tests/plugin/bb.c: In function 'vcpu_tb_trans':
D:/emu_devl/qemu_src/qemu-sr-dsp-a/qemu_tidsp_c3x/tests/plugin/bb.c:51:46: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]
51 | (void *)n_insns);
5. Then , I modified the QEMU_flags and the compilation command arguments($(CC) ..) in the makefile :
BUILD_DIR := $(CURDIR)/../..
include $(BUILD_DIR)/config-host.mak
include $(SRC_PATH)/rules.mak
$(call set-vpath, $(SRC_PATH)/tests/plugin)
NAMES :=
NAMES += bb
NAMES += empty
NAMES += insn
NAMES += mem
NAMES += hotblocks
NAMES += howvec
NAMES += hotpages
SONAMES := $(addsuffix .so,$(addprefix lib,$(NAMES)))
QEMU_CFLAGS += -fPIC -DBUILDING_DLL #added -DBUILDING_DLL
QEMU_CFLAGS += -I$(SRC_PATH)/include/qemu
all: $(SONAMES)
lib%.so: %.o
$(CC) -fPIC -shared -o $@ $^ $(LDLIBS) -L /c/msys64/mingw64/lib/ -lglib-2.0
# original cmd: $(CC) -shared -Wl,-soname,$@ -o $@ $^ $(LDLIBS)
clean:
rm -f *.o *.so *.d
rm -Rf .libs
.PHONY: all clean
6. Executing make yeilds:
make: enter “/d/emu_devl/qemu_src/qemu-sr-dsp-a/qemu_tidsp_c3x/build_dsp/tests/plugin”
CC bb.o
x86_64-w64-mingw32-gcc -fPIC -shared -o libbb.so bb.o -L /c/msys64/mingw64/lib/ -lglib-2.0
C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/10.1.0/../../../../x86_64-w64-mingw32/bin/ld.exe: bb.o: in function `plugin_exit':
D:/emu_devl/qemu_src/qemu-sr-dsp-a/qemu_tidsp_c3x/tests/plugin/bb.c:28: undefined reference to `qemu_plugin_outs'
C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/10.1.0/../../../../x86_64-w64-mingw32/bin/ld.exe: D:/emu_devl/qemu_src/qemu-sr-dsp-a/qemu_tidsp_c3x/tests/plugin/bb.c:29: undefined reference to `__stack_chk_fail'
C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/10.1.0/../../../../x86_64-w64-mingw32/bin/ld.exe: bb.o: in function `vcpu_tb_trans':
D:/emu_devl/qemu_src/qemu-sr-dsp-a/qemu_tidsp_c3x/tests/plugin/bb.c:41: undefined reference to `qemu_plugin_tb_n_insns'
C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/10.1.0/../../../../x86_64-w64-mingw32/bin/ld.exe: D:/emu_devl/qemu_src/qemu-sr-dsp-a/qemu_tidsp_c3x/tests/plugin/bb.c:44: undefined reference to `qemu_plugin_register_vcpu_tb_exec_inline'
C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/10.1.0/../../../../x86_64-w64-mingw32/bin/ld.exe: D:/emu_devl/qemu_src/qemu-sr-dsp-a/qemu_tidsp_c3x/tests/plugin/bb.c:46: undefined reference to `qemu_plugin_register_vcpu_tb_exec_inline'
C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/10.1.0/../../../../x86_64-w64-mingw32/bin/ld.exe: D:/emu_devl/qemu_src/qemu-sr-dsp-a/qemu_tidsp_c3x/tests/plugin/bb.c:49: undefined reference to `qemu_plugin_register_vcpu_tb_exec_cb'
C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/10.1.0/../../../../x86_64-w64-mingw32/bin/ld.exe: bb.o: in function `qemu_plugin_install':
D:/emu_devl/qemu_src/qemu-sr-dsp-a/qemu_tidsp_c3x/tests/plugin/bb.c:63: undefined reference to `qemu_plugin_register_vcpu_tb_trans_cb'
C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/10.1.0/../../../../x86_64-w64-mingw32/bin/ld.exe: D:/emu_devl/qemu_src/qemu-sr-dsp-a/qemu_tidsp_c3x/tests/plugin/bb.c:64: undefined reference to `qemu_plugin_register_atexit_cb'
C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/10.1.0/../../../../x86_64-w64-mingw32/bin/ld.exe: bb.o:bb.c:(.rdata$.refptr.__stack_chk_guard[.refptr.__stack_chk_guard]+0x0): undefined reference to `__stack_chk_guard'
collect2.exe: error: ld returned 1 exit status
It looks like linking problem(fail to link functions defined in api.c, core.c...), but I have no idea what goes wrong. If I mannualy add api.o, core.o in the compilation command, still get error like undefined reference to '__stack_chk_guard'.
My collegue can build 4.2.0 plugins on Ubuntu Linux without any problem.
If I keep "-Wl,-soname,$@" in the command , I got similar linking errors.
makefile:
SONAMES := $(addsuffix .dll,$(addprefix lib,$(NAMES)))
QEMU_CFLAGS += -fPIC -fno-stack- protector -DBUILDING_DLL PATH)/include/ qemu
QEMU_CFLAGS += -I$(SRC_
all: $(SONAMES)
lib%.dll: %.o
$(CC) -shared -Wl,-soname,$@ -o $@ $^ $(LDLIBS)
output: w64-mingw32- gcc -shared -Wl,-soname, libbb.dll -o libbb.dll bb.o mingw64/ bin/../ lib/gcc/ x86_64- w64-mingw32/ 9.3.0/. ./../.. /../x86_ 64-w64- mingw32/ bin/ld. exe: bb.o: in function `g_autoptr_ cleanup_ generic_ gfree': mingw64/ include/ glib-2. 0/glib/ glib-autocleanu ps.h:28: undefined reference to `g_free' mingw64/ bin/../ lib/gcc/ x86_64- w64-mingw32/ 9.3.0/. ./../.. /../x86_ 64-w64- mingw32/ bin/ld. exe: bb.o: in function `plugin_exit': Project/ simdsp/ qemu-4. 2.0/tests/ plugin/ bb.c:27: undefined reference to `g_strdup_printf' mingw64/ bin/../ lib/gcc/ x86_64- w64-mingw32/ 9.3.0/. ./../.. /../x86_ 64-w64- mingw32/ bin/ld. exe: C:/QRS_ Project/ simdsp/ qemu-4. 2.0/tests/ plugin/ bb.c:29: undefined reference to `qemu_plugin_outs' mingw64/ bin/../ lib/gcc/ x86_64- w64-mingw32/ 9.3.0/. ./../.. /../x86_ 64-w64- mingw32/ bin/ld. exe: bb.o: in function `vcpu_tb_trans': Project/ simdsp/ qemu-4. 2.0/tests/ plugin/ bb.c:42: undefined reference to `qemu_plugin_ tb_n_insns' mingw64/ bin/../ lib/gcc/ x86_64- w64-mingw32/ 9.3.0/. ./../.. /../x86_ 64-w64- mingw32/ bin/ld. exe: C:/QRS_ Project/ simdsp/ qemu-4. 2.0/tests/ plugin/ bb.c:45: undefined reference to `qemu_plugin_ register_ vcpu_tb_ exec_inline' mingw64/ bin/../ lib/gcc/ x86_64- w64-mingw32/ 9.3.0/. ./../.. /../x86_ 64-w64- mingw32/ bin/ld. exe: C:/QRS_ Project/ simdsp/ qemu-4. 2.0/tests/ plugin/ bb.c:47: undefined reference to `qemu_plugin_ register_ vcpu_tb_ exec_inline' mingw64/ bin/../ lib/gcc/ x86_64- w64-mingw32/ 9.3.0/. ./../.. /../x86_ 64-w64- mingw32/ bin/ld. exe: C:/QRS_ Project/ simdsp/ qemu-4. 2.0/tests/ plugin/ bb.c:50: undefined reference to `qemu_plugin_ register_ vcpu_tb_ exec_cb' mingw64/ bin/../ lib/gcc/ x86_64- w64-mingw32/ 9.3.0/. ./../.. /../x86_ 64-w64- mingw32/ bin/ld. exe: bb.o: in function `qemu_plugin_ install' : Project/ simdsp/ qemu-4. 2.0/tests/ plugin/ bb.c:64: undefined reference to `qemu_plugin_ register_ vcpu_tb_ trans_cb' mingw64/ bin/../ lib/gcc/ x86_64- w64-mingw32/ 9.3.0/. ./../.. /../x86_ 64-w64- mingw32/ bin/ld. exe: C:/QRS_ Project/ simdsp/ qemu-4. 2.0/tests/ plugin/ bb.c:65: undefined reference to `qemu_plugin_ register_ atexit_ cb'
x86_64-
C:/msys64/
C:/msys64/
C:/msys64/
C:/QRS_
C:/msys64/
C:/msys64/
C:/QRS_
C:/msys64/
C:/msys64/
C:/msys64/
C:/msys64/
C:/QRS_
C:/msys64/
collect2.exe: error: ld returned 1 exit status
On windows, I replace $LDLIBS with $LIBS here, because $LDLIBS seems undefined. But still yields linking error, except.
lib%.dll: %.o
$(CC) -shared -Wl,-soname,$@ -o $@ $^ $(LIBS)"
x86_64- w64-mingw32- gcc -shared -Wl,-soname, libbb.dll -o libbb.dll bb.o -ldl -LC:/msys64/ mingw64/ lib -lz -LC:/msys64/ mingw64/ lib -lgmodule-2.0 -pthread -lglib-2.0 -lintl -LC:/msys64/ mingw64/ lib -lgthread-2.0 -pthread -lglib-2.0 -lintl -lwinmm -lws2_32 -liphlpapi mingw64/ bin/../ lib/gcc/ x86_64- w64-mingw32/ 9.3.0/. ./../.. /../x86_ 64-w64- mingw32/ bin/ld. exe: bb.o: in function `plugin_exit': Project/ simdsp/ qemu-4. 2.0/tests/ plugin/ bb.c:29: undefined reference to `qemu_plugin_outs'
C:/msys64/
C:/QRS_
C...