Blame nptl/tst-audit-threads-mod1.c

Packit Service e58aae
/* Dummy audit library for test-audit-threads.
Packit Service e58aae
Packit Service e58aae
   Copyright (C) 2018 Free Software Foundation, Inc.
Packit Service e58aae
   This file is part of the GNU C Library.
Packit Service e58aae
Packit Service e58aae
   The GNU C Library is free software; you can redistribute it and/or
Packit Service e58aae
   modify it under the terms of the GNU Lesser General Public
Packit Service e58aae
   License as published by the Free Software Foundation; either
Packit Service e58aae
   version 2.1 of the License, or (at your option) any later version.
Packit Service e58aae
Packit Service e58aae
   The GNU C Library is distributed in the hope that it will be useful,
Packit Service e58aae
   but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service e58aae
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit Service e58aae
   Lesser General Public License for more details.
Packit Service e58aae
Packit Service e58aae
   You should have received a copy of the GNU Lesser General Public
Packit Service e58aae
   License along with the GNU C Library; if not, see
Packit Service e58aae
   <http://www.gnu.org/licenses/>.  */
Packit Service e58aae
Packit Service e58aae
#include <elf.h>
Packit Service e58aae
#include <link.h>
Packit Service e58aae
#include <stdio.h>
Packit Service e58aae
#include <assert.h>
Packit Service e58aae
#include <string.h>
Packit Service e58aae
Packit Service e58aae
/* We must use a dummy LD_AUDIT module to force the dynamic loader to
Packit Service e58aae
   *not* update the real PLT, and instead use a cached value for the
Packit Service e58aae
   lazy resolution result.  It is the update of that cached value that
Packit Service e58aae
   we are testing for correctness by doing this.  */
Packit Service e58aae
Packit Service e58aae
/* Library to be audited.  */
Packit Service e58aae
#define LIB "tst-audit-threads-mod2.so"
Packit Service e58aae
/* CALLNUM is the number of retNum functions.  */
Packit Service e58aae
#define CALLNUM 7999
Packit Service e58aae
Packit Service e58aae
#define CONCATX(a, b) __CONCAT (a, b)
Packit Service e58aae
Packit Service e58aae
static int previous = 0;
Packit Service e58aae
Packit Service e58aae
unsigned int
Packit Service e58aae
la_version (unsigned int ver)
Packit Service e58aae
{
Packit Service e58aae
  return 1;
Packit Service e58aae
}
Packit Service e58aae
Packit Service e58aae
unsigned int
Packit Service e58aae
la_objopen (struct link_map *map, Lmid_t lmid, uintptr_t *cookie)
Packit Service e58aae
{
Packit Service e58aae
  return LA_FLG_BINDTO | LA_FLG_BINDFROM;
Packit Service e58aae
}
Packit Service e58aae
Packit Service e58aae
uintptr_t
Packit Service e58aae
CONCATX(la_symbind, __ELF_NATIVE_CLASS) (ElfW(Sym) *sym,
Packit Service e58aae
					unsigned int ndx,
Packit Service e58aae
					uintptr_t *refcook,
Packit Service e58aae
					uintptr_t *defcook,
Packit Service e58aae
					unsigned int *flags,
Packit Service e58aae
					const char *symname)
Packit Service e58aae
{
Packit Service e58aae
  const char * retnum = "retNum";
Packit Service e58aae
  char * num = strstr (symname, retnum);
Packit Service e58aae
  int n;
Packit Service e58aae
  /* Validate if the symbols are getting called in the correct order.
Packit Service e58aae
     This code is here to verify binutils does not optimize out the PLT
Packit Service e58aae
     entries that require the symbol binding.  */
Packit Service e58aae
  if (num != NULL)
Packit Service e58aae
    {
Packit Service e58aae
      n = atoi (num);
Packit Service e58aae
      assert (n >= previous);
Packit Service e58aae
      assert (n <= CALLNUM);
Packit Service e58aae
      previous = n;
Packit Service e58aae
    }
Packit Service e58aae
  return sym->st_value;
Packit Service e58aae
}