| commit 50a2d83c08a94a10f88a1fedeb7a6e3667a6b732 |
| Author: Florian Weimer <fweimer@redhat.com> |
| Date: Fri Apr 24 22:13:03 2020 +0200 |
| |
| elf: Introduce <elf_machine_sym_no_match.h> |
| |
| MIPS needs to ignore certain existing symbols during symbol lookup. |
| The old scheme uses the ELF_MACHINE_SYM_NO_MATCH macro, with an |
| inline function, within its own header, with a sysdeps override for |
| MIPS. This allows re-use of the function from another file (without |
| having to include <dl-machine.h> or providing the default definition |
| for ELF_MACHINE_SYM_NO_MATCH). |
| |
| Reviewed-by: Carlos O'Donell <carlos@redhat.com> |
| |
| diff --git a/elf/dl-lookup.c b/elf/dl-lookup.c |
| index e4c479de9a1fd6ec..47acd134600b44b5 100644 |
| |
| |
| @@ -28,18 +28,12 @@ |
| #include <libc-lock.h> |
| #include <tls.h> |
| #include <atomic.h> |
| +#include <elf_machine_sym_no_match.h> |
| |
| #include <assert.h> |
| |
| -/* Return nonzero if check_match should consider SYM to fail to match a |
| - symbol reference for some machine-specific reason. */ |
| -#ifndef ELF_MACHINE_SYM_NO_MATCH |
| -# define ELF_MACHINE_SYM_NO_MATCH(sym) 0 |
| -#endif |
| - |
| #define VERSTAG(tag) (DT_NUM + DT_THISPROCNUM + DT_VERSIONTAGIDX (tag)) |
| |
| - |
| struct sym_val |
| { |
| const ElfW(Sym) *s; |
| @@ -78,7 +72,7 @@ check_match (const char *const undef_name, |
| if (__glibc_unlikely ((sym->st_value == 0 /* No value. */ |
| && sym->st_shndx != SHN_ABS |
| && stt != STT_TLS) |
| - || ELF_MACHINE_SYM_NO_MATCH (sym) |
| + || elf_machine_sym_no_match (sym) |
| || (type_class & (sym->st_shndx == SHN_UNDEF)))) |
| return NULL; |
| |
| diff --git a/sysdeps/generic/elf_machine_sym_no_match.h b/sysdeps/generic/elf_machine_sym_no_match.h |
| new file mode 100644 |
| index 0000000000000000..27155de4c0358460 |
| |
| |
| @@ -0,0 +1,34 @@ |
| +/* Function to ignore certain symbol matches for machine-specific reasons. |
| + Copyright (C) 2020 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 |
| + <https://www.gnu.org/licenses/>. */ |
| + |
| +#ifndef _ELF_MACHINE_SYM_NO_MATCH_H |
| +#define _ELF_MACHINE_SYM_NO_MATCH_H |
| + |
| +#include <link.h> |
| +#include <stdbool.h> |
| + |
| +/* This can be customized to ignore certain symbols during lookup in |
| + case there are machine-specific rules to disregard some |
| + symbols. */ |
| +static inline bool |
| +elf_machine_sym_no_match (const ElfW(Sym) *sym) |
| +{ |
| + return false; |
| +} |
| + |
| +#endif /* _ELF_MACHINE_SYM_NO_MATCH_H */ |
| diff --git a/sysdeps/mips/dl-machine.h b/sysdeps/mips/dl-machine.h |
| index 91fc640388a735c7..b41e10647d81843b 100644 |
| |
| |
| @@ -467,21 +467,6 @@ elf_machine_plt_value (struct link_map *map, const ElfW(Rel) *reloc, |
| return value; |
| } |
| |
| -/* The semantics of zero/non-zero values of undefined symbols differs |
| - depending on whether the non-PIC ABI is in use. Under the non-PIC |
| - ABI, a non-zero value indicates that there is an address reference |
| - to the symbol and thus it must always be resolved (except when |
| - resolving a jump slot relocation) to the PLT entry whose address is |
| - provided as the symbol's value; a zero value indicates that this |
| - canonical-address behaviour is not required. Yet under the classic |
| - MIPS psABI, a zero value indicates that there is an address |
| - reference to the function and the dynamic linker must resolve the |
| - symbol immediately upon loading. To avoid conflict, symbols for |
| - which the dynamic linker must assume the non-PIC ABI semantics are |
| - marked with the STO_MIPS_PLT flag. */ |
| -#define ELF_MACHINE_SYM_NO_MATCH(sym) \ |
| - ((sym)->st_shndx == SHN_UNDEF && !((sym)->st_other & STO_MIPS_PLT)) |
| - |
| #endif /* !dl_machine_h */ |
| |
| #ifdef RESOLVE_MAP |
| diff --git a/sysdeps/mips/elf_machine_sym_no_match.h b/sysdeps/mips/elf_machine_sym_no_match.h |
| new file mode 100644 |
| index 0000000000000000..9d09e5fa2db1ff6c |
| |
| |
| @@ -0,0 +1,43 @@ |
| +/* MIPS-specific handling of undefined symbols. |
| + Copyright (C) 2008-2020 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 |
| + <https://www.gnu.org/licenses/>. */ |
| + |
| +#ifndef _ELF_MACHINE_SYM_NO_MATCH_H |
| +#define _ELF_MACHINE_SYM_NO_MATCH_H |
| + |
| +#include <link.h> |
| +#include <stdbool.h> |
| + |
| +/* The semantics of zero/non-zero values of undefined symbols differs |
| + depending on whether the non-PIC ABI is in use. Under the non-PIC |
| + ABI, a non-zero value indicates that there is an address reference |
| + to the symbol and thus it must always be resolved (except when |
| + resolving a jump slot relocation) to the PLT entry whose address is |
| + provided as the symbol's value; a zero value indicates that this |
| + canonical-address behaviour is not required. Yet under the classic |
| + MIPS psABI, a zero value indicates that there is an address |
| + reference to the function and the dynamic linker must resolve the |
| + symbol immediately upon loading. To avoid conflict, symbols for |
| + which the dynamic linker must assume the non-PIC ABI semantics are |
| + marked with the STO_MIPS_PLT flag. */ |
| +static inline bool |
| +elf_machine_sym_no_match (const ElfW(Sym) *sym) |
| +{ |
| + return sym->st_shndx == SHN_UNDEF && !(sym->st_other & STO_MIPS_PLT); |
| +} |
| + |
| +#endif /* _ELF_MACHINE_SYM_NO_MATCH_H */ |