From 45e2483a6cd920b38d287c51c5363f03a34f92da Mon Sep 17 00:00:00 2001 From: Sergey Bugaev Date: Sat, 17 Jun 2023 19:40:26 +0300 Subject: x86: Make dl-cache.h and readelflib.c not Linux-specific These files could be useful to any port that wants to use ld.so.cache. Signed-off-by: Sergey Bugaev Reviewed-by: Adhemerval Zanella --- sysdeps/unix/sysv/linux/x86/readelflib.c | 90 ------------------------------- sysdeps/unix/sysv/linux/x86_64/dl-cache.h | 51 ------------------ sysdeps/x86/readelflib.c | 90 +++++++++++++++++++++++++++++++ sysdeps/x86_64/dl-cache.h | 51 ++++++++++++++++++ 4 files changed, 141 insertions(+), 141 deletions(-) delete mode 100644 sysdeps/unix/sysv/linux/x86/readelflib.c delete mode 100644 sysdeps/unix/sysv/linux/x86_64/dl-cache.h create mode 100644 sysdeps/x86/readelflib.c create mode 100644 sysdeps/x86_64/dl-cache.h diff --git a/sysdeps/unix/sysv/linux/x86/readelflib.c b/sysdeps/unix/sysv/linux/x86/readelflib.c deleted file mode 100644 index 3b8a228162..0000000000 --- a/sysdeps/unix/sysv/linux/x86/readelflib.c +++ /dev/null @@ -1,90 +0,0 @@ -/* Copyright (C) 1999-2023 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - . */ - -int process_elf32_file (const char *file_name, const char *lib, - int *flag, unsigned int *isa_level, char **soname, - void *file_contents, size_t file_length); -int process_elf64_file (const char *file_name, const char *lib, - int *flag, unsigned int *isa_level, 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, - unsigned int *isa_level, char **soname, void *file_contents, - size_t file_length) -{ - ElfW(Ehdr) *elf_header = (ElfW(Ehdr) *) file_contents; - int ret, file_flag = 0; - - switch (elf_header->e_machine) - { - case EM_X86_64: - if (elf_header->e_ident[EI_CLASS] == ELFCLASS64) - /* X86-64 64bit libraries are always libc.so.6+. */ - file_flag = FLAG_X8664_LIB64|FLAG_ELF_LIBC6; - else - /* X32 libraries are always libc.so.6+. */ - file_flag = FLAG_X8664_LIBX32|FLAG_ELF_LIBC6; - break; -#ifndef __x86_64__ - case EM_IA_64: - if (elf_header->e_ident[EI_CLASS] == ELFCLASS64) - { - /* IA64 64bit libraries are always libc.so.6+. */ - file_flag = FLAG_IA64_LIB64|FLAG_ELF_LIBC6; - break; - } - goto failed; -#endif - case EM_386: - if (elf_header->e_ident[EI_CLASS] == ELFCLASS32) - break; - /* Fall through. */ - default: -#ifndef __x86_64__ -failed: -#endif - error (0, 0, _("%s is for unknown machine %d.\n"), - file_name, elf_header->e_machine); - return 1; - } - - if (elf_header->e_ident[EI_CLASS] == ELFCLASS32) - ret = process_elf32_file (file_name, lib, flag, isa_level, soname, - file_contents, file_length); - else - ret = process_elf64_file (file_name, lib, flag, isa_level, soname, - file_contents, file_length); - - if (!ret && file_flag) - *flag = file_flag; - - return ret; -} - -#undef __ELF_NATIVE_CLASS -#undef process_elf_file -#define process_elf_file process_elf32_file -#define __ELF_NATIVE_CLASS 32 -#include "elf/readelflib.c" - -#undef __ELF_NATIVE_CLASS -#undef process_elf_file -#define process_elf_file process_elf64_file -#define __ELF_NATIVE_CLASS 64 -#include "elf/readelflib.c" diff --git a/sysdeps/unix/sysv/linux/x86_64/dl-cache.h b/sysdeps/unix/sysv/linux/x86_64/dl-cache.h deleted file mode 100644 index 82fed7bed4..0000000000 --- a/sysdeps/unix/sysv/linux/x86_64/dl-cache.h +++ /dev/null @@ -1,51 +0,0 @@ -/* Support for reading /etc/ld.so.cache files written by Linux ldconfig. - Copyright (C) 1999-2023 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - . */ - -#define _DL_CACHE_DEFAULT_ID 0x303 - -#define _dl_cache_check_flags(flags) \ - ((flags) == _DL_CACHE_DEFAULT_ID) - -#define add_system_dir(dir) \ - do \ - { \ - size_t len = strlen (dir); \ - char path[len + 4]; \ - memcpy (path, dir, len + 1); \ - if (len >= 6 && ! memcmp (path + len - 6, "/lib64", 6)) \ - { \ - len -= 2; \ - path[len] = '\0'; \ - } \ - else if (len >= 7 \ - && ! memcmp (path + len - 7, "/libx32", 7)) \ - { \ - len -= 3; \ - path[len] = '\0'; \ - } \ - add_dir (path); \ - if (len >= 4 && ! memcmp (path + len - 4, "/lib", 4)) \ - { \ - memcpy (path + len, "64", 3); \ - add_dir (path); \ - memcpy (path + len, "x32", 4); \ - add_dir (path); \ - } \ - } while (0) - -#include diff --git a/sysdeps/x86/readelflib.c b/sysdeps/x86/readelflib.c new file mode 100644 index 0000000000..3b8a228162 --- /dev/null +++ b/sysdeps/x86/readelflib.c @@ -0,0 +1,90 @@ +/* Copyright (C) 1999-2023 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +int process_elf32_file (const char *file_name, const char *lib, + int *flag, unsigned int *isa_level, char **soname, + void *file_contents, size_t file_length); +int process_elf64_file (const char *file_name, const char *lib, + int *flag, unsigned int *isa_level, 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, + unsigned int *isa_level, char **soname, void *file_contents, + size_t file_length) +{ + ElfW(Ehdr) *elf_header = (ElfW(Ehdr) *) file_contents; + int ret, file_flag = 0; + + switch (elf_header->e_machine) + { + case EM_X86_64: + if (elf_header->e_ident[EI_CLASS] == ELFCLASS64) + /* X86-64 64bit libraries are always libc.so.6+. */ + file_flag = FLAG_X8664_LIB64|FLAG_ELF_LIBC6; + else + /* X32 libraries are always libc.so.6+. */ + file_flag = FLAG_X8664_LIBX32|FLAG_ELF_LIBC6; + break; +#ifndef __x86_64__ + case EM_IA_64: + if (elf_header->e_ident[EI_CLASS] == ELFCLASS64) + { + /* IA64 64bit libraries are always libc.so.6+. */ + file_flag = FLAG_IA64_LIB64|FLAG_ELF_LIBC6; + break; + } + goto failed; +#endif + case EM_386: + if (elf_header->e_ident[EI_CLASS] == ELFCLASS32) + break; + /* Fall through. */ + default: +#ifndef __x86_64__ +failed: +#endif + error (0, 0, _("%s is for unknown machine %d.\n"), + file_name, elf_header->e_machine); + return 1; + } + + if (elf_header->e_ident[EI_CLASS] == ELFCLASS32) + ret = process_elf32_file (file_name, lib, flag, isa_level, soname, + file_contents, file_length); + else + ret = process_elf64_file (file_name, lib, flag, isa_level, soname, + file_contents, file_length); + + if (!ret && file_flag) + *flag = file_flag; + + return ret; +} + +#undef __ELF_NATIVE_CLASS +#undef process_elf_file +#define process_elf_file process_elf32_file +#define __ELF_NATIVE_CLASS 32 +#include "elf/readelflib.c" + +#undef __ELF_NATIVE_CLASS +#undef process_elf_file +#define process_elf_file process_elf64_file +#define __ELF_NATIVE_CLASS 64 +#include "elf/readelflib.c" diff --git a/sysdeps/x86_64/dl-cache.h b/sysdeps/x86_64/dl-cache.h new file mode 100644 index 0000000000..82fed7bed4 --- /dev/null +++ b/sysdeps/x86_64/dl-cache.h @@ -0,0 +1,51 @@ +/* Support for reading /etc/ld.so.cache files written by Linux ldconfig. + Copyright (C) 1999-2023 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +#define _DL_CACHE_DEFAULT_ID 0x303 + +#define _dl_cache_check_flags(flags) \ + ((flags) == _DL_CACHE_DEFAULT_ID) + +#define add_system_dir(dir) \ + do \ + { \ + size_t len = strlen (dir); \ + char path[len + 4]; \ + memcpy (path, dir, len + 1); \ + if (len >= 6 && ! memcmp (path + len - 6, "/lib64", 6)) \ + { \ + len -= 2; \ + path[len] = '\0'; \ + } \ + else if (len >= 7 \ + && ! memcmp (path + len - 7, "/libx32", 7)) \ + { \ + len -= 3; \ + path[len] = '\0'; \ + } \ + add_dir (path); \ + if (len >= 4 && ! memcmp (path + len - 4, "/lib", 4)) \ + { \ + memcpy (path + len, "64", 3); \ + add_dir (path); \ + memcpy (path + len, "x32", 4); \ + add_dir (path); \ + } \ + } while (0) + +#include -- cgit v1.2.3