On Tue, 2022-08-02 at 11:10 +0000, YunQiang Su wrote: > If we cannot get info from options and cpuinfo, we try to get from: > 1. getauxval(AT_BASE_PLATFORM), introduced since Linux 5.7 > 2. _MIPS_ARCH from host compiler. > > This can fix the wrong loader usage on r5/r6 platform with > -march=native.
/* snip */ > if (argc < 1) > - return NULL; > + goto fallback_cpu; I don't think this should be changed, if argc < 1 it means the spec (disambiguation: the thing printed by "gcc -dumpspecs", hard coded in gnu-user.h) is wrong. It cannot happen with the built-in spec, but if a user specifies a bad custom spec with "-spec", we shouldn't be tricked. > arch = strcmp (argv[0], "arch") == 0; > if (!arch && strcmp (argv[0], "tune")) > - return NULL; > + goto fallback_cpu; Likewise. > f = fopen ("/proc/cpuinfo", "r"); > if (f == NULL) > - return NULL; > + goto fallback_cpu; OK. > +fallback_cpu: > +/*FIXME: how about other OSes, like FreeBSD? */ https://reviews.freebsd.org/D12743 added elf_aux_info as a counterpart of getauxinfo, but it looks like FreeBSD does not have AT_BASE_PLATFORM. > +#ifdef __linux__ > + /*Note: getauxval may return NULL as: > + * AT_BASE_PLATFORM is supported since Linux 5.7 > + * Or from older version of qemu-user > + * */ > + if (cpu == NULL) > + cpu = (const char *) getauxval (AT_BASE_PLATFORM); getauxval is added in Glibc-2.16 so it will fail to build on hosts with old glibc or other libc implementation. Check if getauxval and AT_BASE_PLATFORM are available (in gcc/configure.ac) instead of an inaccurate "#ifdef __linux__". > +#endif > + > if (cpu == NULL) > +#if defined (_MIPS_ARCH) > + cpu = _MIPS_ARCH; > +#else Ok. > return NULL; > +#endif > > return concat ("-m", argv[0], "=", cpu, NULL); > }