Cannot build qemu utils (qemu-img.exe, qemu-edid.exe, qemu-io.exe) statically with MSYS64 on Windows because intl and iconv libs are not loaded

Bug #1845185 reported by Adrian Vladu
8
This bug affects 1 person
Affects Status Importance Assigned to Milestone
QEMU
Expired
Undecided
Unassigned

Bug Description

Using MSYS2 and mingw32 instructions from https://wiki.qemu.org/Hosts/W32#Native_builds_with_MSYS2, I could not statically build the qemu-utils using the latest qemu master branch.

Steps to reproduce the issue:
1. Install MSYS2 on a Windows 10 x64 box
2. Install required mingw64 toolchain: pacman -S base-devel mingw-w64-x86_64-toolchain git python mingw-w64-x86_64-glib2 mingw64/mingw-w64-x86_64-gtk3 mingw64/mingw-w64-x86_64-SDL2
3. clone qemu
4. Run configure for static build for the tools only
  ./configure --disable-user --disable-system --disable-docs --enable-tools --disable-guest-agent --disable-capstone --disable-sheepdog --enable-debug --static
  # I had to remove sheepdog, capstone and guest agent because other errors popped out, but let's not go in the rabbit hole.
5. Run 'make -j'. the following errors appeared, signaling that intl lib is not loaded. If I add intl lib, iconv lib needs to be loaded too.

make: *** [/home/ader1990/qemu/rules.mak:124: qemu-img.exe] Error 1
make: *** Waiting for unfinished jobs....
C:/msys64l/mingw64/lib\libglib-2.0.a(giowin32.c.obj):(.text+0x1522): undefined reference to `libintl_sprintf'
C:/msys64l/mingw64/lib\libglib-2.0.a(giowin32.c.obj):(.text+0x154f): undefined reference to `libintl_sprintf'
C:/msys64l/mingw64/lib\libglib-2.0.a(giowin32.c.obj):(.text+0x157e): undefined reference to `libintl_sprintf'
C:/msys64l/mingw64/lib\libglib-2.0.a(giowin32.c.obj):(.text+0x15ad): undefined reference to `libintl_sprintf'
C:/msys64l/mingw64/lib\libglib-2.0.a(giowin32.c.obj):(.text+0x15dc): undefined reference to `libintl_sprintf'
C:/msys64l/mingw64/lib\libglib-2.0.a(giowin32.c.obj):(.text+0x1622): more undefined references to `libintl_sprintf' follow
C:/msys64l/mingw64/lib\libglib-2.0.a(ggettext.c.obj):(.text+0x43): undefined reference to `libintl_textdomain'
C:/msys64l/mingw64/lib\libglib-2.0.a(ggettext.c.obj):(.text+0x52): undefined reference to `libintl_gettext'
C:/msys64l/mingw64/lib\libglib-2.0.a(ggettext.c.obj):(.text+0x203): undefined reference to `libintl_bindtextdomain'
C:/msys64l/mingw64/lib\libglib-2.0.a(ggettext.c.obj):(.text+0x21e): undefined reference to `libintl_bind_textdomain_codeset'
C:/msys64l/mingw64/lib\libglib-2.0.a(ggettext.c.obj):(.text+0x2c1): undefined reference to `libintl_dgettext'
C:/msys64l/mingw64/lib\libglib-2.0.a(ggettext.c.obj):(.text+0x4e1): undefined reference to `libintl_dcgettext'
C:/msys64l/mingw64/lib\libglib-2.0.a(ggettext.c.obj):(.text+0x53a): undefined reference to `libintl_dngettext'

Patch to fix the issue (added intl and iconv to the libs):

diff --git a/configure b/configure
index 30aad233d1..e2ab8ef026 100755
--- a/configure
+++ b/configure
@@ -920,7 +920,7 @@ if test "$mingw32" = "yes" ; then
   DSOSUF=".dll"
   # MinGW needs -mthreads for TLS and macro _MT.
   QEMU_CFLAGS="-mthreads $QEMU_CFLAGS"
- LIBS="-lwinmm -lws2_32 -liphlpapi $LIBS"
+ LIBS="-lwinmm -lws2_32 -liphlpapi -lintl -liconv $LIBS"
   write_c_skeleton;
   if compile_prog "" "-liberty" ; then
     LIBS="-liberty $LIBS"

Adrian Vladu (avladu)
description: updated
summary: Cannot build qemu utils (qemu-img.exe, qemu-edid.exe, qemu-io.exe)
- statically with MSYS2 on Windows
+ statically with MSYS2 on Windows because intl and iconv libs are not
+ loaded
Adrian Vladu (avladu)
tags: added: mingw32 msys windows
Adrian Vladu (avladu)
summary: Cannot build qemu utils (qemu-img.exe, qemu-edid.exe, qemu-io.exe)
- statically with MSYS2 on Windows because intl and iconv libs are not
+ statically with MSYS64 on Windows because intl and iconv libs are not
loaded
Revision history for this message
Peter Maydell (pmaydell) wrote :

I think this is probably a bug in the packaging of glib. What does "pkg-config --static --libs glib-2.0" say? If it doesn't say that you need to add -lintl -liconv to do a static link against glib, then that's a glib packaging bug. If it does say you need those flags, then we have a QEMU configure script bug where we're failing to get the link line correct (but we should fix it by using pkg-config correctly, not by manually adding the libraries to the LIBS variable).

I'm not sure how much this applies to Windows, but in general we don't support static linking for anything except the linux-user executables, largely because so often the libraries we depend on don't ship with correct pkg-config data for how to statically link them.

Revision history for this message
Adrian Vladu (avladu) wrote :

I checked the glib package static deps:
pkg-config.exe --static --libs glib-2.0
-LC:/msys64/mingw64/lib -lintl -lglib-2.0 -lws2_32 -lole32 -lwinmm -lshlwapi -pthread -lpcre

Let me know if there is anything I can do next to get this issue fixed (if it is fixable).

Thank you,
Adrian

Revision history for this message
James Le Cuirot (chewi) wrote :

There is an open glib issue about this. See my comment. I'll try to address it myself.

https://gitlab.gnome.org/GNOME/glib/-/issues/1851#note_603599

Revision history for this message
Philippe Mathieu-Daudé (philmd) wrote :

James, do you know if this has been fixed in GLib 2.65.0?

Revision history for this message
James Le Cuirot (chewi) wrote :

My distribution has not added 2.65.0 yet but it should be fixed now, yes.

Revision history for this message
Thomas Huth (th-huth) wrote :

The QEMU project is currently considering to move its bug tracking to
another system. For this we need to know which bugs are still valid
and which could be closed already. Thus we are setting older bugs to
"Incomplete" now.

If you still think this bug report here is valid, then please switch
the state back to "New" within the next 60 days, otherwise this report
will be marked as "Expired". Or please mark it as "Fix Released" if
the problem has been solved with a newer version of QEMU already.

Thank you and sorry for the inconvenience.

Changed in qemu:
status: New → Incomplete
Revision history for this message
Launchpad Janitor (janitor) wrote :

[Expired for QEMU because there has been no activity for 60 days.]

Changed in qemu:
status: Incomplete → Expired
To post a comment you must log in.
This report contains Public information  
Everyone can see this information.

Other bug subscribers

Remote bug watches

Bug watches keep track of this bug in other bug trackers.