]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
Add a dlopen/getpagesize static executable test.
authorMaciej W. Rozycki <macro@codesourcery.com>
Fri, 28 Jun 2013 16:43:07 +0000 (17:43 +0100)
committerMaciej W. Rozycki <macro@codesourcery.com>
Fri, 28 Jun 2013 16:43:07 +0000 (17:43 +0100)
ChangeLog
dlfcn/Makefile
dlfcn/modstatic5.c [new file with mode: 0644]
dlfcn/tststatic5.c [new file with mode: 0644]

index 174b184c37d2bea436c63377454373136d7ba897..ec42b6cc7543b9238d1d7c6da9b5248901b4290f 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,13 @@
 2013-06-28  Maciej W. Rozycki  <macro@codesourcery.com>
 
+       * dlfcn/modstatic5.c: New file.
+       * dlfcn/tststatic5.c: New file.
+       * dlfcn/Makefile (tests): Add tststatic5.
+       (tests-static): Likewise.
+       (modules-names): Add modstatic5.
+       (tststatic5-ENV): New variable.
+       ($(objpfx)tststatic5, $(objpfx)tststatic5.out): New dependencies.
+
        [BZ #15022]
        * elf/dl-support.c (_dl_main_map): New variable.
        (_dl_ns): Use it to initialize [LM_ID_BASE] element.
index fca0951a5a546bc51d5eb988c83700682f99a88b..57a727189de34e25290117bbc504af6f738ffecf 100644 (file)
@@ -47,13 +47,14 @@ glreflib2.so-no-z-defs = yes
 errmsg1mod.so-no-z-defs = yes
 
 ifeq (yes,$(build-shared))
-tests += tststatic tststatic2 tststatic3 tststatic4
-tests-static += tststatic tststatic2 tststatic3 tststatic4
-modules-names += modstatic modstatic2 modstatic3
+tests += tststatic tststatic2 tststatic3 tststatic4 tststatic5
+tests-static += tststatic tststatic2 tststatic3 tststatic4 tststatic5
+modules-names += modstatic modstatic2 modstatic3 modstatic5
 tststatic-ENV = LD_LIBRARY_PATH=$(objpfx):$(common-objpfx):$(common-objpfx)elf
 tststatic2-ENV = $(tststatic-ENV)
 tststatic3-ENV = $(tststatic-ENV)
 tststatic4-ENV = $(tststatic-ENV)
+tststatic5-ENV = $(tststatic-ENV)
 endif
 
 extra-test-objs += $(modules-names:=.os)
@@ -112,6 +113,9 @@ $(objpfx)tststatic3.out: $(objpfx)tststatic3 $(objpfx)modstatic3.so
 $(objpfx)tststatic4: $(objpfx)libdl.a
 $(objpfx)tststatic4.out: $(objpfx)tststatic4 $(objpfx)modstatic3.so
 
+$(objpfx)tststatic5: $(objpfx)libdl.a
+$(objpfx)tststatic5.out: $(objpfx)tststatic5 $(objpfx)modstatic5.so
+
 $(objpfx)bug-dlopen1: $(libdl)
 
 $(objpfx)bug-dlsym1: $(libdl) $(objpfx)bug-dlsym1-lib2.so
diff --git a/dlfcn/modstatic5.c b/dlfcn/modstatic5.c
new file mode 100644 (file)
index 0000000..40c541e
--- /dev/null
@@ -0,0 +1,26 @@
+/* DSO used for GLRO(dl_pagesize) initialization testing with a static
+   executable.
+   Copyright (C) 2013 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   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/>.  */
+
+#include <unistd.h>
+
+int
+my_getpagesize (void)
+{
+  return getpagesize ();
+}
diff --git a/dlfcn/tststatic5.c b/dlfcn/tststatic5.c
new file mode 100644 (file)
index 0000000..3d0ff7f
--- /dev/null
@@ -0,0 +1,76 @@
+/* GLRO(dl_pagesize) initialization DSO test with a static executable.
+   Copyright (C) 2013 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   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/>.  */
+
+#include <dlfcn.h>
+#include <stddef.h>
+#include <stdio.h>
+#include <unistd.h>
+
+/* Check that the same page size is reported both directly and by a DSO
+   mapped from a static executable.
+
+   On targets that support different page sizes, the kernel communicates
+   the size currently in use via the auxiliary vector.  This vector is
+   available to initial startup, but not any DSOs loaded later on.  As
+   static executables do not export their symbols a DSO cannot access
+   the value obtained by initial startup and the value therefore has to
+   be passed on to the DSO and stored within its data area explicitly.
+   This is performed by a call to DL_STATIC_INIT that is defined in a
+   target-dependent way, and that on variable page size targets stores
+   it in the GLRO(dl_pagesize) variable of the DSO's dynamic linker.  */
+static int
+do_test (void)
+{
+  int pagesize = getpagesize ();
+  int (*my_getpagesize) (void);
+  int my_pagesize;
+  void *handle;
+
+  /* Try to map a module.  */
+  handle = dlopen ("modstatic5.so", RTLD_LAZY | RTLD_LOCAL);
+  if (handle == NULL)
+    {
+      printf ("dlopen (modstatic5.so): %s\n", dlerror ());
+      return 1;
+    }
+
+  /* Get at its symbol.  */
+  my_getpagesize = dlsym (handle, "my_getpagesize");
+  if (my_getpagesize == NULL)
+    {
+      printf ("dlsym (my_getpagesize): %s\n", dlerror ());
+      return 1;
+    }
+
+  /* Make sure the page size reported is the same either way.  */
+  my_pagesize = my_getpagesize ();
+  if (my_pagesize != pagesize)
+    {
+      printf ("my_getpagesize: got %i, expected %i\n", my_pagesize, pagesize);
+      return 1;
+    }
+
+  /* All done, clean up.  */
+  my_getpagesize = NULL;
+  dlclose (handle);
+
+  return 0;
+}
+
+#define TEST_FUNCTION do_test ()
+#include "../test-skeleton.c"