This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
[PATCH v3] Extra dlopen/getpagesize static executable tests
- From: "Maciej W. Rozycki" <macro at codesourcery dot com>
- To: Roland McGrath <roland at hack dot frob dot com>
- Cc: <libc-alpha at sourceware dot org>
- Date: Thu, 27 Jun 2013 20:44:45 +0100
- Subject: [PATCH v3] Extra dlopen/getpagesize static executable tests
- References: <alpine dot DEB dot 1 dot 10 dot 1301152056590 dot 4834 at tp dot orcam dot me dot uk> <20130116215545 dot 7A37A2C0B0 at topped-with-meat dot com> <alpine dot DEB dot 1 dot 10 dot 1301240655220 dot 4834 at tp dot orcam dot me dot uk> <20130531200059 dot C94C02C077 at topped-with-meat dot com> <alpine dot DEB dot 1 dot 10 dot 1306140202520 dot 16287 at tp dot orcam dot me dot uk> <20130620000549 dot 416D12C111 at topped-with-meat dot com>
On Thu, 20 Jun 2013, Roland McGrath wrote:
> > So here are the extra dlopen/getpagesize tests. They run successfully
> > for the mips-linux target. As with the other dlopen tests I have added
> > extra commentary per your request. Please let me know if you think this
> > change should refer to BZ #15022. OK to apply?
>
> If the test fails before the 15022 fix and passes after it, then it makes
> sense to use the marker.
Mapping with RTLD_GLOBAL relies on the fix to be in place.
> > + /* Try to map a module into the global scope. */
> > + handle = dlopen ("modstatic5.so", RTLD_LAZY | RTLD_GLOBAL);
>
> I don't understand why this is using RTLD_GLOBAL.
> That does not seem to be material to this test.
This is an artefact from the original use of this test. I've switched it
to RTLD_LOCAL now, though frankly I don't think any choice made between
the two really matters for the scope of the test. The use of RTLD_LOCAL
avoids BZ #15022 however.
> > +/* GLRO (dl_pagesize) initialization DSO tests with a static executable.
>
> (Incidentally, we write GLRO(dl_pagesize) with no space. It's a special
> case.) This line and the large comment below are the same for the two
> cases. tststatic5 already tests that. So this must be testing different
> things that need to be tested, or else there is no point in the second test.
> Its comments should say what exactly it is testing.
I have adjusted the comments and mentally noted the special case (hoping
that it sticks). And after a bit of thinking I have concluded tststatic5
doesn't really bring anything new here, so I have discarded it altogether.
Given that tststatic4 does not trip on BZ #15022 anymore, this change no
longer has a reason to refer to it.
OK to apply?
2013-06-27 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.
Maciej
glibc-static-dlopen-getpagesize-test.diff
Index: glibc-fsf-trunk-quilt/dlfcn/Makefile
===================================================================
--- glibc-fsf-trunk-quilt.orig/dlfcn/Makefile 2013-06-27 13:42:23.000000000 +0100
+++ glibc-fsf-trunk-quilt/dlfcn/Makefile 2013-06-27 18:11:40.432830754 +0100
@@ -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)tststa
$(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
Index: glibc-fsf-trunk-quilt/dlfcn/modstatic5.c
===================================================================
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
+++ glibc-fsf-trunk-quilt/dlfcn/modstatic5.c 2013-06-27 17:46:19.222337283 +0100
@@ -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 ();
+}
Index: glibc-fsf-trunk-quilt/dlfcn/tststatic5.c
===================================================================
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
+++ glibc-fsf-trunk-quilt/dlfcn/tststatic5.c 2013-06-27 18:10:36.432350637 +0100
@@ -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"