From: Mike Frysinger Date: Sun, 22 Aug 2010 15:32:46 +0000 (+0200) Subject: Make sure GLRO(dl_pagesize) is initialized properly on all archs X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=fd5ba40413efc0c95c0754341a76ada944aa1d5f;p=thirdparty%2Fglibc.git Make sure GLRO(dl_pagesize) is initialized properly on all archs After a recent change to __getpagesize(), GLRO(dl_pagesize) is required to be set. But that is only done at app init, and shared libraries dlopened at runtime by static apps dont have their GLRO() state initialized from the linux auxvec. ia64/mips have long had similar behavior with their __getpagesize(), but they have a DL_STATIC_INIT hook to sync some of the static GLRO() fields to the dynamic GLRO() fields. Now that common linux code requires GLRO(dl_pagesize) to be set, common linux code now needs that DL_STATIC_INIT hook. This patch takes the ia64 logic and promotes it to common code. --- diff --git a/ChangeLog b/ChangeLog index 9f0a7a94c31..1bbbcebacbb 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,16 @@ +2010-08-18 Mike Frysinger + + [BZ #11929] + * sysdeps/unix/sysv/linux/ia64/Makefile: Move dl-static addition to + sysdep vars for subdir==elf to ... + * sysdeps/unix/sysv/linux/Makefile: ... here. + * sysdeps/unix/sysv/linux/ia64/dl-static.c: Move file to ... + * sysdeps/unix/sysv/linux/dl-static.c: ... here. + * sysdeps/unix/sysv/linux/ia64/ldsodefs.h: Delete, and move the + DL_STATIC_INIT defines to ... + * sysdeps/unix/sysv/linux/ldsodefs.h: ... here. + * sysdeps/unix/sysv/linux/ia64/getpagesize.c: Delete. + 2006-11-30 Jan Kratochvil [BZ #6693] diff --git a/sysdeps/unix/sysv/linux/Makefile b/sysdeps/unix/sysv/linux/Makefile index 4302bd392ce..37c56a3280d 100644 --- a/sysdeps/unix/sysv/linux/Makefile +++ b/sysdeps/unix/sysv/linux/Makefile @@ -147,7 +147,9 @@ sysdep_routines += xstatconv internal_statvfs internal_statvfs64 \ endif ifeq ($(subdir),elf) -sysdep-rtld-routines += dl-brk dl-sbrk +sysdep-dl-routines += dl-static +sysdep_routines += dl-static +sysdep-rtld-routines += dl-brk dl-sbrk dl-static CPPFLAGS-lddlibc4 += -DNOT_IN_libc endif diff --git a/sysdeps/unix/sysv/linux/ia64/dl-static.c b/sysdeps/unix/sysv/linux/dl-static.c similarity index 93% rename from sysdeps/unix/sysv/linux/ia64/dl-static.c rename to sysdeps/unix/sysv/linux/dl-static.c index 4efc0770328..fa70811230b 100644 --- a/sysdeps/unix/sysv/linux/ia64/dl-static.c +++ b/sysdeps/unix/sysv/linux/dl-static.c @@ -1,5 +1,5 @@ -/* Variable initialization. IA-64 version. - Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc. +/* Variable initialization. + Copyright (C) 2001, 2002, 2003, 2004, 2010 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 diff --git a/sysdeps/unix/sysv/linux/ia64/Makefile b/sysdeps/unix/sysv/linux/ia64/Makefile index d9a35a7c673..3bb1ce08936 100644 --- a/sysdeps/unix/sysv/linux/ia64/Makefile +++ b/sysdeps/unix/sysv/linux/ia64/Makefile @@ -12,12 +12,6 @@ sysdep_headers += sys/io.h sysdep_routines += ioperm clone2 endif -ifeq ($(subdir),elf) -sysdep-dl-routines += dl-static -sysdep_routines += $(sysdep-dl-routines) -sysdep-rtld-routines += $(sysdep-dl-routines) -endif - ifeq ($(subdir),rt) librt-routines += rt-sysdep endif diff --git a/sysdeps/unix/sysv/linux/ia64/getpagesize.c b/sysdeps/unix/sysv/linux/ia64/getpagesize.c deleted file mode 100644 index 1155dfdad1b..00000000000 --- a/sysdeps/unix/sysv/linux/ia64/getpagesize.c +++ /dev/null @@ -1,39 +0,0 @@ -/* Copyright (C) 1999, 2000, 2001, 2002, 2004 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, write to the Free - Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA - 02111-1307 USA. */ - -#include -#include -#include - -#include -#include -#include - -/* Return the system page size. The return value will depend on how - the kernel is configured. A program must use this call to - determine the page size to ensure proper alignment for calls such - as mmap and friends. --davidm 99/11/30 */ - -int -__getpagesize () -{ - assert (GLRO(dl_pagesize) != 0); - return GLRO(dl_pagesize); -} -libc_hidden_def (__getpagesize) -weak_alias (__getpagesize, getpagesize) diff --git a/sysdeps/unix/sysv/linux/ia64/ldsodefs.h b/sysdeps/unix/sysv/linux/ia64/ldsodefs.h deleted file mode 100644 index 31af62491e6..00000000000 --- a/sysdeps/unix/sysv/linux/ia64/ldsodefs.h +++ /dev/null @@ -1,33 +0,0 @@ -/* Run-time dynamic linker data structures for loaded ELF shared objects. IA64. - Copyright (C) 2001 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, write to the Free - Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA - 02111-1307 USA. */ - -#ifndef _LDSODEFS_H - -/* Get the real definitions. */ -#include_next - -/* Now define our stuff. */ - -/* We need special support to initialize DSO loaded for statically linked - binaries. */ -extern void _dl_static_init (struct link_map *map); -#undef DL_STATIC_INIT -#define DL_STATIC_INIT(map) _dl_static_init (map) - -#endif /* ldsodefs.h */ diff --git a/sysdeps/unix/sysv/linux/ldsodefs.h b/sysdeps/unix/sysv/linux/ldsodefs.h index 5d5b1b4c06d..ecb5d4fb581 100644 --- a/sysdeps/unix/sysv/linux/ldsodefs.h +++ b/sysdeps/unix/sysv/linux/ldsodefs.h @@ -36,6 +36,12 @@ extern void _dl_aux_init (ElfW(auxv_t) *av) internal_function; /* Initialization which is normally done by the dynamic linker. */ extern void _dl_non_dynamic_init (void) internal_function; +/* We need special support to initialize DSO loaded for statically linked + binaries. */ +extern void _dl_static_init (struct link_map *map); +#undef DL_STATIC_INIT +#define DL_STATIC_INIT(map) _dl_static_init (map) + /* We can assume that the kernel always provides the AT_UID, AT_EUID, AT_GID, and AT_EGID values in the auxiliary vector from 2.4.0 or so on. */ #if __ASSUME_AT_XID