--- glibc-2.3.2/sysdeps/i386/dl-machine.h.orig 2003-11-01 15:52:17.000000000 -0500 +++ glibc-2.3.2/sysdeps/i386/dl-machine.h 2003-11-01 15:52:55.000000000 -0500 @@ -25,6 +25,7 @@ #include #include #include +#include /* Return nonzero iff ELF header is compatible with the running host. */ static inline int __attribute__ ((unused)) @@ -357,6 +358,10 @@ dl_platform_init (void) if (GL(dl_platform) != NULL && *GL(dl_platform) == '\0') /* Avoid an empty string which would disturb us. */ GL(dl_platform) = NULL; + +#ifdef DL_ADJUST_PROCINFO + DL_ADJUST_PROCINFO; +#endif } static inline Elf32_Addr --- glibc-2.3.2/sysdeps/unix/sysv/linux/i386/dl-procinfo.h.orig 2003-11-01 15:50:41.000000000 -0500 +++ glibc-2.3.2/sysdeps/unix/sysv/linux/i386/dl-procinfo.h 2003-11-01 15:51:48.000000000 -0500 @@ -126,4 +126,20 @@ _dl_string_platform (const char *str) return -1; }; +#define DL_ADJUST_PROCINFO dl_adjust_procinfo () + +static inline void +__attribute__ ((unused, always_inline)) +dl_adjust_procinfo (void) +{ + if (GL(dl_osversion) < 0x020400) + { + /* Unfortunately, while the capability is named OSFXSR, it's + actually hardware FXSR direct from CPUID. And we can't test + CR4 ourselves, because we're in protected mode. Disable it + for kernels which might not have actually enabled OSFXSR. */ + GL(dl_hwcap) &= ~(HWCAP_I386_OSFXSR | HWCAP_I386_XMM | HWCAP_I386_XMM2); + } +} + #endif /* dl-procinfo.h */ --- glibc-2.3.2/sysdeps/generic/libc-start.c.orig 2003-11-02 23:11:51.000000000 -0500 +++ glibc-2.3.2/sysdeps/generic/libc-start.c 2003-11-02 23:34:42.000000000 -0500 @@ -23,6 +23,10 @@ #include #include +#include +#include +#include + extern void __libc_init_first (int argc, char **argv, char **envp); extern int __libc_multiple_libcs; @@ -123,15 +127,28 @@ LIBC_START_MAIN (int (*main) (int, char # endif _dl_aux_init (auxvec); # endif -# ifdef DL_SYSDEP_OSCHECK if (!__libc_multiple_libcs) { +# ifdef DL_SYSDEP_OSCHECK /* This needs to run to initiliaze _dl_osversion before TLS setup might check it. */ DL_SYSDEP_OSCHECK (__libc_fatal); - } # endif + /* Moved here so that we can frob hwcap early enough. */ +# ifdef DL_OSVERSION_INIT + DL_OSVERSION_INIT; +# endif + +# ifdef DL_PLATFORM_INIT + DL_PLATFORM_INIT; +# endif + + /* Now determine the length of the platform string. */ + if (_dl_platform != NULL) + _dl_platformlen = strlen (_dl_platform); + } + /* Initialize the thread library at least a bit since the libgcc functions are using thread functions if these are available and we need to setup errno. If there is no thread library and we --- glibc-2.3.2/elf/dl-support.c.orig 2003-11-02 22:55:47.000000000 -0500 +++ glibc-2.3.2/elf/dl-support.c 2003-11-02 23:24:40.000000000 -0500 @@ -252,18 +252,6 @@ _dl_non_dynamic_init (void) if (__access ("/etc/suid-debug", F_OK) != 0) unsetenv ("MALLOC_CHECK_"); } - -#ifdef DL_PLATFORM_INIT - DL_PLATFORM_INIT; -#endif - -#ifdef DL_OSVERSION_INIT - DL_OSVERSION_INIT; -#endif - - /* Now determine the length of the platform string. */ - if (_dl_platform != NULL) - _dl_platformlen = strlen (_dl_platform); }