[strace/strace] static assert (#133)

Jory A. Pratt notifications at github.com
Sat May 23 17:32:36 UTC 2020

> On Fri, Apr 10, 2020 at 01:20:03PM -0700, Jory A. Pratt wrote: In file included from static_assert.h:11, from v4l2.c:13: xlat/v4l2_ioctl_cmds.h:43:1: error: static assertion failed: "VIDIOC_QUERYBUF != _IOWR(\'V\', 9, struct_v4l2_buffer)" 43 | static_assert((VIDIOC_QUERYBUF) == (_IOWR('V', 9, struct_v4l2_buffer)), "VIDIOC_QUERYBUF != _IOWR('V', 9, struct_v4l2_buffer)"); | ^~~~~~~~~~~~~ xlat/v4l2_ioctl_cmds.h:64:1: error: static assertion failed: "VIDIOC_QBUF != _IOWR(\'V\', 15, struct_v4l2_buffer)" 64 | static_assert((VIDIOC_QBUF) == (_IOWR('V', 15, struct_v4l2_buffer)), "VIDIOC_QBUF != _IOWR('V', 15, struct_v4l2_buffer)"); | ^~~~~~~~~~~~~ xlat/v4l2_ioctl_cmds.h:71:1: error: static assertion failed: "VIDIOC_DQBUF != _IOWR(\'V\', 17, struct_v4l2_buffer)" 71 | static_assert((VIDIOC_DQBUF) == (_IOWR('V', 17, struct_v4l2_buffer)), "VIDIOC_DQBUF != _IOWR('V', 17, struct_v4l2_buffer)"); This is build using linux-headers-5.6 with musl-1.2.0, this is a regression as 5.5 compiles fine.
> The reason why 5.5 compiles fine is that the check was introduced in 5.6, but the problem lies elsewhere. Definitions of VIDIOC_QUERYBUF, VIDIOC_QBUF, and VIDIOC_DQBUF in <linux/videodev2.h> use struct v4l2_buffer which in turn uses struct timeval. The size of struct timeval on a traditional 32-bit architecture like x86 depends on libc and its version thanks to time_t problem. As result, the value of VIDIOC_QUERYBUF on a traditional 32-bit architecture like x86 depends on libc and its version. When v4l2.c is compiled in mpers mode to handle x86 and x32 personality syscalls on x86_64, the value for VIDIOC_QUERYBUF is taken from the appropriate linux/*/ioctls_inc*.h file. There is only one value there for each architecture, not two. If you are unhappy enough to have time_t size different from the one used to generate that ioctls_inc file, you get this failed assertion. The kernel starting with Linux kernel commit v5.6-rc1~93^2~102 supports both sets of ioctl values, but strace will recognize and decode only one of them so far. I don't see an easy fix of this issue for early adopters of 64-bit time_t on 32-bit architectures, sorry.
> […](#)
> -- ldv

I find this rather funny you want to keep talking about 32bit issues, this problem is seen in 64bit systems such as ppc64 aarch64 which are far from 32bit arch.

You are receiving this because you commented.
Reply to this email directly or view it on GitHub:
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.strace.io/pipermail/strace-devel/attachments/20200523/0ef5584c/attachment.html>

More information about the Strace-devel mailing list