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-arm
mailing list