[libvirt] libvirt and mingw64 x64, bad idea?

Eric Blake eblake at redhat.com
Tue Jan 24 00:20:50 UTC 2012


On 01/23/2012 03:29 PM, Marc-André Lureau wrote:
> Hi,
> 
> I tried to update the fedora mingw package to follow the mingw64
> packaging guideline and allow build for x86 and x64. But I got into
> build warning and errors for x86_64. (using Fedora Cross project repo:
> http://build1.openftd.org/fedora-cross/fedora-cross.repo,
> x86_64-w64-mingw32-gcc (GCC) 4.6.2 20110908 and later)
> 

> The somewhat worrying error is:
> 
> util/command.c:54:1: error: static assertion failed: "verify
> (sizeof(pid_t) <= sizeof(int))"
> 
> /* We have quite a bit of changes to make if this doesn't hold.  */
> verify(sizeof(pid_t) <= sizeof(int));

Oh my.  I guess it makes sense - while Linux pid_t is just a
(linearly-incrementing) index into an array of kernel structs, other
OS's use pid_t as the actual kernel pointer to the location in physical
memory where the process information is stored; so if you have 64-bit
pointers, you have a 64-bit pid_t.

Alas, this means that any interface where we are operating on pid_t, but
passed an int, are broken.  Thankfully, I don't see any interface like
that in libvirt.c, and we are free to change any internal functions
without breaking the ABI.

I did a rough audit of command.c, virpidfile.c, and util.c; it actually
looks like all the interfaces that deal with a process were correctly
using pid_t; so maybe that compile-time assertion stems from an older
revision of code where we still had a bad interface, since fixed.

</me searches...>

Ah, the real reason is that we do 'printf("%d", pid)', which obviously
doesn't work.  We have to audit all of those instances, and swap them to
'printf("%llu", (unsigned long long) pid)', or something equally gross
(and even %ul is insufficient, no thanks to mingw64 having 'long' being
just 32 bits).

> There are a few other warnings, see attached files.
> 
> Is this going to be something difficult and worth to fix?

Definitely worth fixing.

  CC     malloca.lo
malloca.c: In function 'mmalloca':
malloca.c:88:18: warning: cast from pointer to integer of different size
[-Wpointer-to-int-cast]
malloca.c: In function 'freea':
malloca.c:121:25: warning: cast from pointer to integer of different
size [-Wpointer-to-int-cast]

This is a bug in gnulib; can you redirect it there (as it will affect
more than just libvirt).

  CC     fcntl.lo
fcntl.c: In function 'dupfd':
fcntl.c:97:40: warning: cast from pointer to integer of different size
[-Wpointer-to-int-cast]

Likewise.

  CC     poll.lo
poll.c: In function 'IsSocketHandle':
poll.c:83:7: warning: cast from pointer to integer of different size
[-Wpointer-to-int-cast]
poll.c: In function 'windows_compute_revents':
poll.c:187:12: warning: cast from pointer to integer of different size
[-Wpointer-to-int-cast]

Likewise.

  CC     select.lo
select.c: In function 'IsSocketHandle':
select.c:90:7: warning: cast from pointer to integer of different size
[-Wpointer-to-int-cast]
select.c: In function 'windows_poll_handle':
select.c:175:16: warning: cast from pointer to integer of different size
[-Wpointer-to-int-cast]
select.c: In function 'rpl_select':
select.c:288:13: warning: cast from pointer to integer of different size
[-Wpointer-to-int-cast]
select.c:303:13: warning: cast from pointer to integer of different size
[-Wpointer-to-int-cast]

Likewise.

  CC     stat.lo
stat.c: In function 'rpl_stat':
stat.c:67:3: warning: passing argument 2 of 'orig_stat' from
incompatible pointer type [enabled by default]
stat.c:31:1: note: expected 'struct _stat64 *' but argument is of type
'struct stat *'
stat.c:113:11: warning: passing argument 2 of 'orig_stat' from
incompatible pointer type [enabled by default]
stat.c:31:1: note: expected 'struct _stat64 *' but argument is of type
'struct stat *'

Likewise, and especially nasty if gnulib doesn't get it right.

  CC     libvirt_util_la-command.lo
util/command.c:54:1: error: static assertion failed: "verify
(sizeof(pid_t) <= sizeof(int))"
util/command.c: In function 'virCommandRun':
util/command.c:1882:9: warning: passing argument 2 of '_fstat64' from
incompatible pointer type [enabled by default]

This may be fixed once we import gnulib fixes.

/usr/x86_64-w64-mingw32/sys-root/mingw/include/sys/stat.h:71:23: note:
expected 'struct _stat64 *' but argument is of type 'struct stat *'
util/command.c:1886:10: warning: passing argument 2 of '_fstat64' from
incompatible pointer type [enabled by default]
/usr/x86_64-w64-mingw32/sys-root/mingw/include/sys/stat.h:71:23: note:
expected 'struct _stat64 *' but argument is of type 'struct stat *'
util/command.c:1890:10: warning: passing argument 2 of '_fstat64' from
incompatible pointer type [enabled by default]
/usr/x86_64-w64-mingw32/sys-root/mingw/include/sys/stat.h:71:23: note:
expected 'struct _stat64 *' but argument is of type 'struct stat *'
util/command.c: In function 'virCommandRunAsync':
util/command.c:2118:9: warning: format '%d' expects argument of type
'int', but argument 7 has type 'pid_t' [-Wformat]

Yep, that's the sort of thing that we have to touch up in order to
remove the assertion.

-- 
Eric Blake   eblake at redhat.com    +1-919-301-3266
Libvirt virtualization library http://libvirt.org

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 620 bytes
Desc: OpenPGP digital signature
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20120123/d1dde602/attachment-0001.sig>


More information about the libvir-list mailing list