(root)/
glibc-2.38/
elf/
tst-auditmod21a.c
       1  /* Check LD_AUDIT with static TLS.
       2     Copyright (C) 2022-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  #include <ctype.h>
      20  #include <stdlib.h>
      21  #include <link.h>
      22  
      23  #define tls_ie __attribute__ ((tls_model ("initial-exec")))
      24  
      25  __thread int tls_var0 tls_ie;
      26  __thread int tls_var1 tls_ie = 0x10;
      27  
      28  /* Defined at tst-auditmod21b.so  */
      29  extern __thread int tls_var2;
      30  extern __thread int tls_var3;
      31  
      32  static volatile int out;
      33  
      34  static void
      35  call_libc (void)
      36  {
      37    /* isspace accesses the initial-exec glibc TLS variables, which are
      38       setup in glibc initialization.  */
      39    out = isspace (' ');
      40  }
      41  
      42  unsigned int
      43  la_version (unsigned int v)
      44  {
      45    tls_var0 = 0x1;
      46    if (tls_var1 != 0x10)
      47      abort ();
      48    tls_var1 = 0x20;
      49  
      50    tls_var2 = 0x2;
      51    if (tls_var3 != 0x20)
      52      abort ();
      53    tls_var3 = 0x40;
      54  
      55    call_libc ();
      56  
      57    return LAV_CURRENT;
      58  }
      59  
      60  unsigned int
      61  la_objopen (struct link_map* map, Lmid_t lmid, uintptr_t* cookie)
      62  {
      63    call_libc ();
      64    *cookie = (uintptr_t) map;
      65    return 0;
      66  }
      67  
      68  void
      69  la_activity (uintptr_t* cookie, unsigned int flag)
      70  {
      71    if (tls_var0 != 0x1 || tls_var1 != 0x20)
      72      abort ();
      73    call_libc ();
      74  }
      75  
      76  void
      77  la_preinit (uintptr_t* cookie)
      78  {
      79    call_libc ();
      80  }