diff options
Diffstat (limited to 'sysdeps/unix/sysv/linux/i386')
-rw-r--r-- | sysdeps/unix/sysv/linux/i386/dl-librecon.h | 23 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/i386/readelflib.c | 19 |
2 files changed, 33 insertions, 9 deletions
diff --git a/sysdeps/unix/sysv/linux/i386/dl-librecon.h b/sysdeps/unix/sysv/linux/i386/dl-librecon.h index 7d486c5d91..26311b32e4 100644 --- a/sysdeps/unix/sysv/linux/i386/dl-librecon.h +++ b/sysdeps/unix/sysv/linux/i386/dl-librecon.h @@ -48,6 +48,29 @@ /* Recognizing extra environment variables. */ #define EXTRA_LD_ENVVARS \ + case 13: \ + if (memcmp (&envline[3], "ASSUME_KERNEL", 13) == 0) \ + { \ + unsigned long int i, j, osversion = 0; \ + char *p = &envline[17], *q; \ + \ + for (i = 0; i < 3; i++, p = q + 1) \ + { \ + j = __strtoul_internal (p, &q, 0, 0); \ + if (j >= 255 || p == q || (i < 2 && *q && *q != '.')) \ + { \ + osversion = 0; \ + break; \ + } \ + osversion |= j << (16 - 8 * i); \ + if (!*q) \ + break; \ + } \ + if (osversion) \ + _dl_osversion = osversion; \ + break; \ + } \ + \ case 15: \ if (memcmp (&envline[3], "LIBRARY_VERSION", 15) == 0) \ { \ diff --git a/sysdeps/unix/sysv/linux/i386/readelflib.c b/sysdeps/unix/sysv/linux/i386/readelflib.c index f8868bb083..cc219d2c3f 100644 --- a/sysdeps/unix/sysv/linux/i386/readelflib.c +++ b/sysdeps/unix/sysv/linux/i386/readelflib.c @@ -20,23 +20,24 @@ int process_elf32_file (const char *file_name, const char *lib, int *flag, - char **soname, void *file_contents, - size_t file_length); + unsigned int *osversion, char **soname, + void *file_contents, size_t file_length); int process_elf64_file (const char *file_name, const char *lib, int *flag, - char **soname, void *file_contents, - size_t file_length); + unsigned int *osversion, char **soname, + void *file_contents, size_t file_length); /* Returns 0 if everything is ok, != 0 in case of error. */ int process_elf_file (const char *file_name, const char *lib, int *flag, - char **soname, void *file_contents, size_t file_length) + unsigned int *osversion, char **soname, void *file_contents, + size_t file_length) { ElfW(Ehdr) *elf_header = (ElfW(Ehdr) *) file_contents; int ret; if (elf_header->e_ident [EI_CLASS] == ELFCLASS32) - return process_elf32_file (file_name, lib, flag, soname, file_contents, - file_length); + return process_elf32_file (file_name, lib, flag, osversion, soname, + file_contents, file_length); else { switch (elf_header->e_machine) @@ -50,8 +51,8 @@ process_elf_file (const char *file_name, const char *lib, int *flag, return 1; } - ret = process_elf64_file (file_name, lib, flag, soname, file_contents, - file_length); + ret = process_elf64_file (file_name, lib, flag, osversion, soname, + file_contents, file_length); /* IA64/X86-64 64bit libraries are always libc.so.6+. */ if (!ret) switch (elf_header->e_machine) |