Blame dlfcn/tststatic5.c

Packit Service 82fcde
/* GLRO(dl_pagesize) initialization DSO test with a static executable.
Packit Service 82fcde
   Copyright (C) 2013-2018 Free Software Foundation, Inc.
Packit Service 82fcde
   This file is part of the GNU C Library.
Packit Service 82fcde
Packit Service 82fcde
   The GNU C Library is free software; you can redistribute it and/or
Packit Service 82fcde
   modify it under the terms of the GNU Lesser General Public
Packit Service 82fcde
   License as published by the Free Software Foundation; either
Packit Service 82fcde
   version 2.1 of the License, or (at your option) any later version.
Packit Service 82fcde
Packit Service 82fcde
   The GNU C Library is distributed in the hope that it will be useful,
Packit Service 82fcde
   but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service 82fcde
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit Service 82fcde
   Lesser General Public License for more details.
Packit Service 82fcde
Packit Service 82fcde
   You should have received a copy of the GNU Lesser General Public
Packit Service 82fcde
   License along with the GNU C Library; if not, see
Packit Service 82fcde
   <http://www.gnu.org/licenses/>.  */
Packit Service 82fcde
Packit Service 82fcde
#include <dlfcn.h>
Packit Service 82fcde
#include <stddef.h>
Packit Service 82fcde
#include <stdio.h>
Packit Service 82fcde
#include <unistd.h>
Packit Service 82fcde
Packit Service 82fcde
/* Check that the same page size is reported both directly and by a DSO
Packit Service 82fcde
   mapped from a static executable.
Packit Service 82fcde
Packit Service 82fcde
   On targets that support different page sizes, the kernel communicates
Packit Service 82fcde
   the size currently in use via the auxiliary vector.  This vector is
Packit Service 82fcde
   available to initial startup, but not any DSOs loaded later on.  As
Packit Service 82fcde
   static executables do not export their symbols a DSO cannot access
Packit Service 82fcde
   the value obtained by initial startup and the value therefore has to
Packit Service 82fcde
   be passed on to the DSO and stored within its data area explicitly.
Packit Service 82fcde
   This is performed by a call to DL_STATIC_INIT that is defined in a
Packit Service 82fcde
   target-dependent way, and that on variable page size targets stores
Packit Service 82fcde
   it in the GLRO(dl_pagesize) variable of the DSO's dynamic linker.  */
Packit Service 82fcde
static int
Packit Service 82fcde
do_test (void)
Packit Service 82fcde
{
Packit Service 82fcde
  int pagesize = getpagesize ();
Packit Service 82fcde
  int (*my_getpagesize) (void);
Packit Service 82fcde
  int my_pagesize;
Packit Service 82fcde
  void *handle;
Packit Service 82fcde
Packit Service 82fcde
  /* Try to map a module.  */
Packit Service 82fcde
  handle = dlopen ("modstatic5.so", RTLD_LAZY | RTLD_LOCAL);
Packit Service 82fcde
  if (handle == NULL)
Packit Service 82fcde
    {
Packit Service 82fcde
      printf ("dlopen (modstatic5.so): %s\n", dlerror ());
Packit Service 82fcde
      return 1;
Packit Service 82fcde
    }
Packit Service 82fcde
Packit Service 82fcde
  /* Get at its symbol.  */
Packit Service 82fcde
  my_getpagesize = dlsym (handle, "my_getpagesize");
Packit Service 82fcde
  if (my_getpagesize == NULL)
Packit Service 82fcde
    {
Packit Service 82fcde
      printf ("dlsym (my_getpagesize): %s\n", dlerror ());
Packit Service 82fcde
      return 1;
Packit Service 82fcde
    }
Packit Service 82fcde
Packit Service 82fcde
  /* Make sure the page size reported is the same either way.  */
Packit Service 82fcde
  my_pagesize = my_getpagesize ();
Packit Service 82fcde
  if (my_pagesize != pagesize)
Packit Service 82fcde
    {
Packit Service 82fcde
      printf ("my_getpagesize: got %i, expected %i\n", my_pagesize, pagesize);
Packit Service 82fcde
      return 1;
Packit Service 82fcde
    }
Packit Service 82fcde
Packit Service 82fcde
  /* All done, clean up.  */
Packit Service 82fcde
  my_getpagesize = NULL;
Packit Service 82fcde
  dlclose (handle);
Packit Service 82fcde
Packit Service 82fcde
  return 0;
Packit Service 82fcde
}
Packit Service 82fcde
Packit Service 82fcde
#define TEST_FUNCTION do_test ()
Packit Service 82fcde
#include "../test-skeleton.c"