Skip to content

x86_64 Auxillary vector reports platform as i686 which doesn't match the linux kernel

Host environment

  • Operating system: Debian GNU/Linux 11 (bullseye)
  • OS/kernel version: 5.10.0-13-amd64
  • Architecture: x86-64
  • QEMU flavor: qemu-x86_64-static
  • QEMU version: qemu-x86_64 version 5.2.0 (Debian 1:5.2+dfsg-11+deb11u1)
  • QEMU command line:
     qemu-x86_64-static print-platform

Emulated/Virtualized environment

  • Operating system: Linux
  • OS/kernel version: 5.10.0-13-amd64
  • Architecture: x86-64

Description of problem

Based on the kernel source in the auxiliary vector AT_PLATFORM should be x86_64 (confirmed by running outside qemu). However qemu sets it to i686.

This was originally reported with docker-for-mac, but was reduced on x86_64 which is why it is pointless

Steps to reproduce

  1. Compile the following for x86_64 (statically if you don't want have an x86_64 dynamic linker) (code originally from https://stackoverflow.com/questions/26520163/accessing-auxiliary-vectors-c)
#include <stdio.h>
#include <elf.h>

int main(int argc, char** argv, char* envp[]) {
  Elf64_auxv_t *auxv;
  while(*envp++ != NULL);

  /*from stack diagram above: *envp = NULL marks end of envp*/
  int i = 0 ;
  for (auxv = (Elf64_auxv_t *)envp; auxv->a_type != AT_NULL; auxv++)
    /* auxv->a_type = AT_NULL marks the end of auxv */
  {
    if( auxv->a_type == AT_PLATFORM)
      printf("AT_PLATFORM is: %s\n", ((char*)auxv->a_un.a_val));
  }
}
  1. Run with qemu-x86_64-static
  2. See AT_PLATFORM is: i686
  3. Compare to "real" x86_64 bit system which gives AT_PLATFORM is: x86_64

Additional information

I think that adding #define ELF_PLATFORM "x86_64" here should work (but I don't fully understand the code). Otherwise we just end up getting the 32-bit case.

To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information