qemu-arm-static has target_prpsinfo missing pr_pid field so target_prpsinfo is too small

Mark Millard marklmi at yahoo.com
Sat Jan 5 23:48:55 UTC 2019


[The context here is FreeBSD head -r341836 based and ports head -r488859 based.]

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

Note: struct target_prpsinfo is in (for my context):

/wrkdirs/usr/ports/emulators/qemu-user-static/work/qemu-bsd-user-4ef7d07/bsd-user/elfload.c

For armv7 (and likely armv6) the following code:

        printf("sizeof(struct prpsinfo) = %lu\n", (unsigned long) sizeof(struct prpsinfo));
        printf("pr_version %lu\n", (unsigned long) offsetof(struct prpsinfo, pr_version));
        printf("pr_psinfosz %lu\n", (unsigned long) offsetof(struct prpsinfo, pr_psinfosz));
        printf("pr_fname %lu\n", (unsigned long) offsetof(struct prpsinfo, pr_fname));
        printf("pr_psargs %lu\n", (unsigned long) offsetof(struct prpsinfo, pr_psargs));
        printf("pr_pid %lu\n", (unsigned long) offsetof(struct prpsinfo, pr_pid));

produces:

sizeof(struct prpsinfo) = 112
pr_version 0
pr_psinfosz 4
pr_fname 8
pr_psargs 25
pr_pid 108

However gdb reports for qemu-arm-static (on amd64):

(gdb) p/d sizeof(struct target_prpsinfo)
$7 = 108
(gdb) p/d &((struct target_prpsinfo *)0)->pr_version
$8 = 0
(gdb) p/d &((struct target_prpsinfo *)0)->pr_psinfosz
$9 = 4
(gdb) p/d &((struct target_prpsinfo *)0)->pr_fname   
$10 = 8
(gdb) p/d &((struct target_prpsinfo *)0)->pr_psargs
$11 = 25
(gdb) p/d &((struct target_prpsinfo *)0)->pr_pid   
There is no member named pr_pid.

So the fields prior to pr_pid have matching offsets and there
is no extra padding added before pr_pid for native armv7.


/usr/include/sys/procinfo.h has:

typedef struct prpsinfo {
    int         pr_version;     /* Version number of struct (1) */
    size_t      pr_psinfosz;    /* sizeof(prpsinfo_t) (1) */
    char        pr_fname[PRFNAMESZ+1];  /* Command name, null terminated (1) */
    char        pr_psargs[PRARGSZ+1];   /* Arguments, null terminated (1) */
    pid_t       pr_pid;         /* Process ID (1a) */
} prpsinfo_t;

pr_pid was added in -r308009 (2016-oct-28) and is in 11.2 .

/wrkdirs/usr/ports/emulators/qemu-user-static/work/qemu-bsd-user-4ef7d07/bsd-user/elfload.c
has:

typedef struct target_prpsinfo {
    int32_t     pr_version;     /* Version number of struct (1) */
    abi_ulong   pr_psinfosz;    /* sizeof(prpsinfo_t) (1) */
    char        pr_fname[TARGET_PRFNAMESZ+1]; /* Command name + NULL (1) */
    char        pr_psargs[TARGET_PRARGSZ+1];  /* Arguments + NULL (1) */
} target_prpsinfo_t;


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



More information about the freebsd-ports mailing list