(root)/
glibc-2.38/
sysdeps/
unix/
sysv/
linux/
dl-vdso.h
       1  /* ELF symbol resolve functions for VDSO objects.
       2     Copyright (C) 2005-2023 Free Software Foundation, Inc.
       3     This file is part of the GNU C Library.
       4  
       5     The GNU C Library is free software; you can redistribute it and/or
       6     modify it under the terms of the GNU Lesser General Public
       7     License as published by the Free Software Foundation; either
       8     version 2.1 of the License, or (at your option) any later version.
       9  
      10     The GNU C Library is distributed in the hope that it will be useful,
      11     but WITHOUT ANY WARRANTY; without even the implied warranty of
      12     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
      13     Lesser General Public License for more details.
      14  
      15     You should have received a copy of the GNU Lesser General Public
      16     License along with the GNU C Library; if not, see
      17     <https://www.gnu.org/licenses/>.  */
      18  
      19  #ifndef _DL_VDSO_H
      20  #define _DL_VDSO_H	1
      21  
      22  #include <ldsodefs.h>
      23  #include <dl-hash.h>
      24  
      25  /* If the architecture support vDSO it should define which is the expected
      26     kernel version and hash value through both VDSO_NAME and VDSO_HASH
      27     (usually defined at architecture sysdep.h).  */
      28  
      29  #ifndef VDSO_NAME
      30  # define VDSO_NAME "LINUX_0.0"
      31  #endif
      32  #ifndef VDSO_HASH
      33  # define VDSO_HASH 0
      34  #endif
      35  
      36  /* Functions for resolving symbols in the VDSO link map.  */
      37  static inline void *
      38  dl_vdso_vsym (const char *name)
      39  {
      40    struct link_map *map = GLRO (dl_sysinfo_map);
      41    if (map == NULL)
      42      return NULL;
      43  
      44    /* Use a WEAK REF so we don't error out if the symbol is not found.  */
      45    ElfW (Sym) wsym = { 0 };
      46    wsym.st_info = (unsigned char) ELFW (ST_INFO (STB_WEAK, STT_NOTYPE));
      47  
      48    const struct r_found_version rfv = { VDSO_NAME, VDSO_HASH, 1, NULL };
      49  
      50    /* Search the scope of the vdso map.  */
      51    const ElfW (Sym) *ref = &wsym;
      52    lookup_t result = GLRO (dl_lookup_symbol_x) (name, map, &ref,
      53  					       map->l_local_scope,
      54  					       &rfv, 0, 0, NULL);
      55    return ref != NULL ? DL_SYMBOL_ADDRESS (result, ref) : NULL;
      56  }
      57  
      58  #endif /* dl-vdso.h */