[patch] Fix 64-bit->32-bit vDSO reporting
Roland McGrath
roland at hack.frob.com
Wed Oct 10 22:27:35 UTC 2012
The problem is indeed obvious. I really wish there were a better way to
detect the bit-width of the process than looking at /proc/PID/exe, but
perhaps there really isn't.
What about just looking at the first 8 bytes of the auxv data? The first
element is never AT_NULL, so it will have a nonzero a_type. No a_type
value will ever be more than UINT32_MAX. So for big-endian, the first four
bytes being zero says it's 64-bit. For little-endian, it's not so easy
without assuming that the first a_val is nonzero. That's actually reliable
enough in practice, but it feels wrong. Maybe there is something better
for little-endian that I'm not thinking of.
> + ssize_t nread = read (fd, &buf, sizeof buf);
Use pread_retry.
> + unsigned char buf[5];
[...]
> + close (fd);
> + if (nread != sizeof (buf) || buf[0] != ELFMAG0 || buf[1] != ELFMAG1
> + || buf[2] != ELFMAG2 || buf[3] != ELFMAG3
> + || (buf[4] != ELFCLASS64 && buf[4] != ELFCLASS32))
> + return -1;
> +
> + return buf[4] == ELFCLASS64 ? 64 : 32;
Please use the EI_* macros instead of literal indices and size.
I'd just make it return the [EI_CLASS] value and compare against
that in grovel_auxv.
Thanks,
Roland
More information about the elfutils-devel
mailing list