qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH] windows build: -lssp added to qga-vss.dll libra


From: Stefan Weil
Subject: Re: [Qemu-devel] [PATCH] windows build: -lssp added to qga-vss.dll libraries list
Date: Thu, 12 Mar 2015 22:31:36 +0100
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Icedove/31.5.0

Am 12.03.2015 um 15:08 schrieb Paolo Bonzini:

On 11/03/2015 20:59, Stefan Weil wrote:
Am 11.03.2015 um 18:10 schrieb Joseph Hindin:
When building qga-bss.dll with 64-bit mingw toolchain v. 4.9.2, the
Typo: qga-vss.dll

qga-vss.dll linking fails with unresolved symbols from libssp,
stack protection support, like the following message:

.../qga/vss-win32/install.cpp:52: undefined reference to
`__stack_chk_fail'

The patch fixes the problem by adding libssp to the qga-vss.dll
libraries list.

Signed-off-by: Joseph Hindin <address@hidden>
---
   qga/vss-win32/Makefile.objs | 2 +-
   1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/qga/vss-win32/Makefile.objs b/qga/vss-win32/Makefile.objs
index 6a69d50..bd0840d 100644
--- a/qga/vss-win32/Makefile.objs
+++ b/qga/vss-win32/Makefile.objs
@@ -5,7 +5,7 @@ qga-vss-dll-obj-y += requester.o provider.o install.o
   obj-qga-vss-dll-obj-y = $(addprefix $(obj)/, $(qga-vss-dll-obj-y))
   $(obj-qga-vss-dll-obj-y): QEMU_CXXFLAGS = $(filter-out
-Wstrict-prototypes -Wmissing-prototypes -Wnested-externs
-Wold-style-declaration -Wold-style-definition -Wredundant-decls
-fstack-protector-all, $(QEMU_CFLAGS)) -Wno-unknown-pragmas
-Wno-delete-non-virtual-dtor
   -$(obj)/qga-vss.dll: LDFLAGS = -shared
-Wl,--add-stdcall-alias,--enable-stdcall-fixup -lole32 -loleaut32
-lshlwapi -luuid -static
+$(obj)/qga-vss.dll: LDFLAGS = -shared
-Wl,--add-stdcall-alias,--enable-stdcall-fixup -lole32 -loleaut32
-lshlwapi -luuid -lssp -static
   $(obj)/qga-vss.dll: $(obj-qga-vss-dll-obj-y)
$(SRC_PATH)/$(obj)/qga-vss.def
       $(call quiet-command,$(CXX) -o $@ $(qga-vss-dll-obj-y)
$(SRC_PATH)/qga/vss-win32/qga-vss.def $(CXXFLAGS) $(LDFLAGS),"  LINK
$(TARGET_DIR)$@")
Adding -lssp works, but adding -fstack-protector-all to the linker flags
also works and might be the better solution.

-$(obj)/qga-vss.dll: LDFLAGS = -shared
-Wl,--add-stdcall-alias,--enable-stdcall-fixup -lole32 -loleaut32
-lshlwapi -luuid -static
+$(obj)/qga-vss.dll: LDFLAGS = -fstack-protector-all -shared
-Wl,--add-stdcall-alias,--enable-stdcall-fixup -lole32 -loleaut32
-lshlwapi -luuid -static

Could you please try that and send an updated patch? Please cc it also
to qemu-trivial.
Actually it's not trivial...

There is already an attempt to avoid the stack protector in
qga/vss-win32/Makefile.objs:

$(obj-qga-vss-dll-obj-y): QEMU_CXXFLAGS = $(filter-out -Wstrict-prototypes \
     -Wmissing-prototypes -Wnested-externs -Wold-style-declaration \
     -Wold-style-definition -Wredundant-decls -fstack-protector-all, \
     $(QEMU_CFLAGS)) -Wno-unknown-pragmas -Wno-delete-non-virtual-dtor

Perhaps you're using -fstack-protector-strong, and so the above line
should use "-fstack-protector%"?

Instead, if using the stack protector is fine, -fstack-protector-all
should not be filtered out in the above line.

In that case, I agree with Stefan that using -f is cleaner than -lssp,
but it's even cleaner to make the flags match (i.e. it's unclean to
have -fstack-protector-strong in the CFLAGS and -fstack-protector-all
in the LDFLAGS).  So I'd do something like this to get the right flag:

diff --git a/configure b/configure
index 7ba4bcb..0e84b22 100755
--- a/configure
+++ b/configure
@@ -1510,6 +1510,7 @@ if test "$stack_protector" != "no"; then
      # setups fail only on a .c->.o compile and some only at link time
      if do_cc $QEMU_CFLAGS -Werror $flag -c -o $TMPO $TMPC &&
         compile_prog "-Werror $flag" ""; then
+      stack_protector=$flag
        QEMU_CFLAGS="$QEMU_CFLAGS $flag"
        LIBTOOLFLAGS="$LIBTOOLFLAGS -Wc,$flag"
        sp_on=1
@@ -5003,6 +5004,7 @@ echo "LDFLAGS_NOPIE=$LDFLAGS_NOPIE" >> $config_host_mak
  echo "LIBTOOLFLAGS=$LIBTOOLFLAGS" >> $config_host_mak
  echo "LIBS+=$LIBS" >> $config_host_mak
  echo "LIBS_TOOLS+=$libs_tools" >> $config_host_mak
+echo "STACK_PROTECTOR_FLAG=$stack_protector" >> $config_host_mak
  echo "EXESUF=$EXESUF" >> $config_host_mak
  echo "DSOSUF=$DSOSUF" >> $config_host_mak
  echo "LDFLAGS_SHARED=$LDFLAGS_SHARED" >> $config_host_mak


and then use it in qga/vss-win32/Makefile.objs.

Thanks,

Paolo

Indeed, it's not trivial. Builds for Windows obviously are never trivial. :-(

My previous experience was gained with a Debian Jessie hosted cross build.
Now I have cross built on my standard environment with Debian Wheezy,
and there these modifications were needed:

diff --git a/qga/vss-win32/Makefile.objs b/qga/vss-win32/Makefile.objs
index 6a69d50..c501738 100644
--- a/qga/vss-win32/Makefile.objs
+++ b/qga/vss-win32/Makefile.objs
@@ -3,7 +3,7 @@
 qga-vss-dll-obj-y += requester.o provider.o install.o

 obj-qga-vss-dll-obj-y = $(addprefix $(obj)/, $(qga-vss-dll-obj-y))
-$(obj-qga-vss-dll-obj-y): QEMU_CXXFLAGS = $(filter-out -Wstrict-prototypes -Wmissing-prototypes -Wnested-externs -Wold-style-declaration -Wold-style-definition -Wredundant-decls -fstack-protector-all, $(QEMU_CFLAGS)) -Wno-unknown-pragmas -Wno-delete-non-virtual-dtor +$(obj-qga-vss-dll-obj-y): QEMU_CXXFLAGS = $(filter-out -Wno-override-init -Wstrict-prototypes -Wmissing-prototypes -Wnested-externs -Wold-style-declaration -Wold-style-definition -Wredundant-decls -fstack-protector-all, $(QEMU_CFLAGS)) -Wno-unknown-pragmas

$(obj)/qga-vss.dll: LDFLAGS = -shared -Wl,--add-stdcall-alias,--enable-stdcall-fixup -lole32 -loleaut32 -lshlwapi -luuid -static $(obj)/qga-vss.dll: $(obj-qga-vss-dll-obj-y) $(SRC_PATH)/$(obj)/qga-vss.def
diff --git a/rules.mak b/rules.mak
index 7738121..bad44ba 100644
--- a/rules.mak
+++ b/rules.mak
@@ -102,7 +102,11 @@ endif
 %.o: %.dtrace
     $(call quiet-command,dtrace -o $@ -G -s $<, "  GEN $(TARGET_DIR)$@")

+ifdef CONFIG_WIN32
+%$(DSOSUF): CFLAGS += -DBUILD_DSO
+else
 %$(DSOSUF): CFLAGS += -fPIC -DBUILD_DSO
+endif
 %$(DSOSUF): LDFLAGS += $(LDFLAGS_SHARED)
 %$(DSOSUF): %.mo
     $(call LINK,$^)

Nothing with stack protection, but some compiler flags had to be removed...

Stefan




reply via email to

[Prev in Thread] Current Thread [Next in Thread]