From 0b3cf801428e0d246e19ef5fbae185b949347aa3 Mon Sep 17 00:00:00 2001 From: Ulrich Drepper Date: Tue, 30 Aug 2005 22:48:53 +0000 Subject: * sysdeps/ieee754/flt-32/e_hypotf.c [!__STDC__]: Fix function name. 2005-08-01 Bob Wilson Richard Sandiford * sysdeps/ieee754/flt-32/e_hypotf.c (__ieee754_hypotf): Add missing exponent bias to the value for 2^126. 2005-08-30 Jakub Jelinek Alan Modra * elf/dl-addr.c (_dl_addr): Use DL_ADDR_SYM_MATCH macro. * sysdeps/generic/ldsodefs.h (DL_ADDR_SYM_MATCH): Define. * sysdeps/unix/sysv/linux/powerpc/powerpc64/ldsodefs.h: New file. --- .../unix/sysv/linux/powerpc/powerpc64/ldsodefs.h | 77 ++++++++++++++++++++++ 1 file changed, 77 insertions(+) create mode 100644 sysdeps/unix/sysv/linux/powerpc/powerpc64/ldsodefs.h (limited to 'sysdeps/unix/sysv/linux/powerpc/powerpc64/ldsodefs.h') diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/ldsodefs.h b/sysdeps/unix/sysv/linux/powerpc/powerpc64/ldsodefs.h new file mode 100644 index 0000000000..1ead3dd63d --- /dev/null +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/ldsodefs.h @@ -0,0 +1,77 @@ +/* Run-time dynamic linker data structures for loaded ELF shared objects. + Copyright (C) 2005 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, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +#ifndef _LDSODEFS_H + +/* Get the real definitions. */ +#include_next + +/* Now define our stuff. */ + +static __always_inline bool +_dl_ppc64_is_opd_sym (const struct link_map *l, const ElfW(Sym) *sym) +{ + return (ELFW(ST_TYPE) (sym->st_info) == STT_FUNC + && l->l_addr + sym->st_value >= (ElfW(Addr)) l->l_ld + && l->l_addr + sym->st_value < l->l_map_end + && sym->st_size != 0); +} + +static __always_inline bool +_dl_ppc64_addr_sym_match (const struct link_map *l, const ElfW(Sym) *sym, + const ElfW(Sym) *matchsym, ElfW(Addr) addr) +{ + ElfW(Addr) value = l->l_addr + sym->st_value; + if (_dl_ppc64_is_opd_sym (l, sym)) + { + if (addr < value || addr >= value + 24) + { + value = *(ElfW(Addr) *) value; + if (addr < value || addr >= value + sym->st_size) + return false; + } + } + else if (sym->st_size == 0) + { + if (addr != value) + return false; + } + else if (addr < value || addr >= value + sym->st_size) + return false; + + if (matchsym == NULL) + return true; + + ElfW(Addr) matchvalue = l->l_addr + matchsym->st_value; + if (_dl_ppc64_is_opd_sym (l, matchsym) + && (addr < matchvalue || addr > matchvalue + 24)) + matchvalue = *(ElfW(Addr) *) matchvalue; + + return matchvalue < value; +} + +/* If this is a function symbol defined past the end of our dynamic + section, then it must be a function descriptor. Allow these symbols + to match their associated function code range as well as the + descriptor addresses. */ +#undef DL_ADDR_SYM_MATCH +#define DL_ADDR_SYM_MATCH(L, SYM, MATCHSYM, ADDR) \ + _dl_ppc64_addr_sym_match (L, SYM, MATCHSYM, ADDR) + +#endif /* ldsodefs.h */ -- cgit 1.4.1