/* Make sure dlopen/dlclose are not marked as leaf functions.

   Copyright (C) 2013-2014 Free Software Foundation, Inc.
   This file is part of the GNU C Library.
   Contributed by Mike Frysinger <vapier@gentoo.org>

   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, see
   <http://www.gnu.org/licenses/>.  */

/* The bug-dl-leaf.c file will call our lib_main directly.  We do this to
   keep things simple -- no need to use --export-dynamic with the linker
   or build the main ELF as a PIE.

   The lib_main func will modify some of its state while dlopening and
   dlclosing the bug-dl-leaf-lib-cb.so library.  The constructors and
   destructors in that library will call back into this library to also
   muck with state (the check_val_xxx funcs).

   If dlclose/dlopen are marked as "leaf" functions, then with newer
   versions of gcc, the state modification won't work correctly.  */

#include <assert.h>
#include <dlfcn.h>

static int val = 1;
static int called = 0;

void check_val_init (void)
{
  called = 1;
  assert (val == 2);
}

void check_val_fini (void)
{
  called = 2;
  assert (val == 4);
}

int lib_main (void)
{
  int ret;
  void *hdl;

  /* Make sure the constructor sees the updated val.  */
  val = 2;
  hdl = dlopen ("bug-dl-leaf-lib-cb.so", RTLD_GLOBAL | RTLD_LAZY);
  val = 3;
  assert (hdl);
  assert (called == 1);

  /* Make sure the destructor sees the updated val.  */
  val = 4;
  ret = dlclose (hdl);
  val = 5;
  assert (ret == 0);
  assert (called == 2);

  return !val;
}
