qemu-x86_64-static has target_freebsd_flock being too large (__packed use issue)

Mark Millard marklmi at yahoo.com
Sat Jan 5 03:40:01 UTC 2019


[qemu-aarch64-static has the same problem but qemu-armv7-sstatic does not. The context here
is FreeBSD head -r341836 based and ports head -r488859 based.]

Note: I assume that "struct target_freebsd_flock" is meant to match the memory layout
of the target's native "struct flock". Otherwise the reported differences
below could be irrelevant.

For amd64 and aarch64 the following code:

        printf("sizeof(struct flock) = %lu\n", (unsigned long) sizeof(struct flock));
        printf("l_start %lu\n", (unsigned long) offsetof(struct flock, l_start));
        printf("l_len %lu\n", (unsigned long) offsetof(struct flock, l_len));
        printf("l_pid %lu\n", (unsigned long) offsetof(struct flock, l_pid));
        printf("l_type %lu\n", (unsigned long) offsetof(struct flock, l_type));
        printf("l_whence %lu\n", (unsigned long) offsetof(struct flock, l_whence));
        printf("l_sysid %lu\n", (unsigned long) offsetof(struct flock, l_sysid));
 

produces:

sizeof(struct flock) = 32
l_start 0
l_len 8
l_pid 16
l_type 20
l_whence 22
l_sysid 24


However gdb reports for qemu-x86_64-static and qemu-aarch64-static
and qemu-arm-static:

(gdb) p/d sizeof(struct target_freebsd_flock)
$10 = 28
(gdb) p/d &((struct target_freebsd_flock *)0)->l_start  
$11 = 0
(gdb) p/d &((struct target_freebsd_flock *)0)->l_len  
$12 = 8
(gdb) p/d &((struct target_freebsd_flock *)0)->l_pid
$13 = 16
(gdb) p/d &((struct target_freebsd_flock *)0)->l_type
$14 = 20
(gdb) p/d &((struct target_freebsd_flock *)0)->l_whence
$15 = 22
(gdb) p/d &((struct target_freebsd_flock *)0)->l_sysid 
$16 = 24

So only the overall size is different for this information. But:

struct target_freebsd_flock {
    int64_t l_start;
    int64_t l_len;
    int32_t l_pid;
    int16_t l_type;
    int16_t l_whence;
    int32_t l_sysid;
} QEMU_PACKED;

with a potential packed vs. /usr/include/sys/fcntl.h :

struct flock {
        off_t   l_start;        /* starting offset */
        off_t   l_len;          /* len = 0 means until end of file */
        pid_t   l_pid;          /* lock owner */
        short   l_type;         /* lock type: read/write, etc. */
        short   l_whence;       /* type of l_start */
        int     l_sysid;        /* remote system id or zero for local */
};

with no potential __packed.


===
Mark Millard
marklmi at yahoo.com
( dsl-only.net went
away in early 2018-Mar)



More information about the freebsd-ports mailing list