From 3d0f5d0c7a2de86575d68618352f7a5dfe7305fd Mon Sep 17 00:00:00 2001 From: "Maciej W. Rozycki" Date: Fri, 28 Jun 2013 17:43:07 +0100 Subject: [PATCH] Add a dlopen/getpagesize static executable test. --- ChangeLog | 8 +++++ dlfcn/Makefile | 10 ++++-- dlfcn/modstatic5.c | 26 ++++++++++++++++ dlfcn/tststatic5.c | 76 ++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 117 insertions(+), 3 deletions(-) create mode 100644 dlfcn/modstatic5.c create mode 100644 dlfcn/tststatic5.c diff --git a/ChangeLog b/ChangeLog index 174b184c37..ec42b6cc75 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,13 @@ 2013-06-28 Maciej W. Rozycki + * 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. diff --git a/dlfcn/Makefile b/dlfcn/Makefile index fca0951a5a..57a727189d 100644 --- a/dlfcn/Makefile +++ b/dlfcn/Makefile @@ -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 index 0000000000..40c541e631 --- /dev/null +++ b/dlfcn/modstatic5.c @@ -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 + . */ + +#include + +int +my_getpagesize (void) +{ + return getpagesize (); +} diff --git a/dlfcn/tststatic5.c b/dlfcn/tststatic5.c new file mode 100644 index 0000000000..3d0ff7f31f --- /dev/null +++ b/dlfcn/tststatic5.c @@ -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 + . */ + +#include +#include +#include +#include + +/* 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"