]> git.pld-linux.org Git - packages/glibc.git/commitdiff
- rel 3
authorJan Rękorajski <baggins@pld-linux.org>
Thu, 19 Aug 2010 05:52:19 +0000 (05:52 +0000)
committercvs2git <feedback@pld-linux.org>
Sun, 24 Jun 2012 12:13:13 +0000 (12:13 +0000)
- proper fix for getpagesize problems with statically linked programs
  (all static programs need to be rebuilt with new glibc)

Changed files:
    glibc-getpagesize-revert.patch -> 1.2
    glibc-static-glro-init.patch -> 1.1
    glibc.spec -> 1.878

glibc-getpagesize-revert.patch [deleted file]
glibc-static-glro-init.patch [new file with mode: 0644]
glibc.spec

diff --git a/glibc-getpagesize-revert.patch b/glibc-getpagesize-revert.patch
deleted file mode 100644 (file)
index d99eed6..0000000
+++ /dev/null
@@ -1,54 +0,0 @@
-Date: Wed, 18 Aug 2010 01:31:18 -0400
-Subject: Re: vi and glibc 2.12: Assertion `_rtld_global_ro._dl_pagesize != 0
-From: Mike Frysinger <vapier at gentoo dot org>
-To: Allan McRae <allan at archlinux dot org>
-Cc: =?ISO-8859-2?Q?Pawe=B3_Sikora?= <pluto at agmk dot net>, 
-       libc-alpha at sourceware dot org
-
-On Tue, Aug 17, 2010 at 10:36 PM, Mike Frysinger wrote:
-> i'm certainly not familiar with glibc's ldso implementation due to
-> it's crazy large & complicated code base, but i imagine this could be
-> resolved best by having the ldso declare an initializer that calls the
-> same functions as the ldso does when bootstrapping a normal
-> application (_dl_sysdep_start/etc...). =A0this is because the nss libs
-> are dlopened like any other ELF, and it tails into libc.so which tails
-> into the ldso. =A0there is no special code that i can see that goes
-> "this is the ldso, do xxx specially" which makes perfect sense. =A0only
-> outstanding issue there would be whether the ldso will process its own
-> initializers when bootstrapping a standard application.
->
-> we could back out the assert in __getpagesize(), but that would only
-> "fix" things until the next time someone adds code which relies on
-> initialized GLRO() state.
-
-after some experimenting, i guess the init method isnt feasible.  as
-the GLRO() name indicates, the struct is backed by read-only mappings,
-and the ELF processing has already set up all the mappings with proper
-permissions per the program headers by the time it calls any
-initializers for that ELF.  temporarily remapping itself isnt feasible
-as some kernels prevent re-enabling write access to a read/execute
-only mapping.
-
-the ldso doesnt have any problems with this since it initializes its
-internal state before setting its own mappings to read-only.
-
-which leaves us with the __getpagesize() function and simply reverting
-commit 8f4a5048eea6536ee85c0f2670adbb97d71e427d.  unless anyone else
-has an alternative, that's what i'm going to roll with in Gentoo.
-there should be no need to recompile any static apps, just glibc
-itself, since the issue is coming from libc.so/ldso itself being
-dlopened.
-
---- a/sysdeps/unix/sysv/linux/getpagesize.c
-+++ b/sysdeps/unix/sysv/linux/getpagesize.c
-@@ -28,7 +28,7 @@
- int
- __getpagesize ()
- {
--#ifdef __ASSUME_AT_PAGESIZE
-+#if 0
-   assert (GLRO(dl_pagesize) != 0);
-   return GLRO(dl_pagesize);
- #else
--mike
-
diff --git a/glibc-static-glro-init.patch b/glibc-static-glro-init.patch
new file mode 100644 (file)
index 0000000..623efac
--- /dev/null
@@ -0,0 +1,295 @@
+2010-08-18  Mike Frysinger  <vapier@gentoo.org>
+
+       * 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.
+
+diff --git a/sysdeps/unix/sysv/linux/ia64/Makefile b/sysdeps/unix/sysv/linux/ia64/Makefile
+index d9a35a7..3bb1ce0 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/Makefile b/sysdeps/unix/sysv/linux/Makefile
+index 4302bd3..37c56a3 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/ia64/dl-static.c
+deleted file mode 100644
+index 4efc077..0000000
+--- a/sysdeps/unix/sysv/linux/ia64/dl-static.c
++++ /dev/null
+@@ -1,69 +0,0 @@
+-/* Variable initialization.  IA-64 version.
+-   Copyright (C) 2001, 2002, 2003, 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 <ldsodefs.h>
+-
+-#ifdef SHARED
+-
+-void
+-_dl_var_init (void *array[])
+-{
+-  /* It has to match "variables" below. */
+-  enum
+-    {
+-      DL_PAGESIZE = 0,
+-      DL_CLKTCK
+-    };
+-
+-  GLRO(dl_pagesize) = *((size_t *) array[DL_PAGESIZE]);
+-  GLRO(dl_clktck) = *((int *) array[DL_CLKTCK]);
+-}
+-
+-#else
+-#include <bits/libc-lock.h>
+-
+-__libc_lock_define_initialized_recursive (static, _dl_static_lock)
+-
+-static void *variables[] =
+-{
+-  &GLRO(dl_pagesize),
+-  &GLRO(dl_clktck)
+-};
+-
+-void
+-_dl_static_init (struct link_map *map)
+-{
+-  const ElfW(Sym) *ref = NULL;
+-  lookup_t loadbase;
+-  void (*f) (void *[]);
+-
+-  __libc_lock_lock_recursive (_dl_static_lock);
+-
+-  loadbase = _dl_lookup_symbol_x ("_dl_var_init", map, &ref,
+-                                map->l_local_scope, NULL, 0, 1, NULL);
+-  if (ref != NULL)
+-    {
+-      f = (void (*) (void *[])) DL_SYMBOL_ADDRESS (loadbase, ref);
+-      f (variables);
+-    }
+-
+-  __libc_lock_unlock_recursive (_dl_static_lock);
+-}
+-
+-#endif
+diff --git a/sysdeps/unix/sysv/linux/dl-static.c b/sysdeps/unix/sysv/linux/dl-static.c
+new file mode 100644
+index 0000000..fa70811
+--- /dev/null
++++ b/sysdeps/unix/sysv/linux/dl-static.c
+@@ -0,0 +1,69 @@
++/* 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
++   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 <ldsodefs.h>
++
++#ifdef SHARED
++
++void
++_dl_var_init (void *array[])
++{
++  /* It has to match "variables" below. */
++  enum
++    {
++      DL_PAGESIZE = 0,
++      DL_CLKTCK
++    };
++
++  GLRO(dl_pagesize) = *((size_t *) array[DL_PAGESIZE]);
++  GLRO(dl_clktck) = *((int *) array[DL_CLKTCK]);
++}
++
++#else
++#include <bits/libc-lock.h>
++
++__libc_lock_define_initialized_recursive (static, _dl_static_lock)
++
++static void *variables[] =
++{
++  &GLRO(dl_pagesize),
++  &GLRO(dl_clktck)
++};
++
++void
++_dl_static_init (struct link_map *map)
++{
++  const ElfW(Sym) *ref = NULL;
++  lookup_t loadbase;
++  void (*f) (void *[]);
++
++  __libc_lock_lock_recursive (_dl_static_lock);
++
++  loadbase = _dl_lookup_symbol_x ("_dl_var_init", map, &ref,
++                                map->l_local_scope, NULL, 0, 1, NULL);
++  if (ref != NULL)
++    {
++      f = (void (*) (void *[])) DL_SYMBOL_ADDRESS (loadbase, ref);
++      f (variables);
++    }
++
++  __libc_lock_unlock_recursive (_dl_static_lock);
++}
++
++#endif
+diff --git a/sysdeps/unix/sysv/linux/ia64/ldsodefs.h b/sysdeps/unix/sysv/linux/ia64/ldsodefs.h
+deleted file mode 100644
+index 31af624..0000000
+--- 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 <ldsodefs.h>
+-
+-/* 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 5d5b1b4..ecb5d4f 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
+diff --git a/sysdeps/unix/sysv/linux/ia64/getpagesize.c b/sysdeps/unix/sysv/linux/ia64/getpagesize.c
+deleted file mode 100644
+index 1155dfd..0000000
+--- 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 <assert.h>
+-#include <unistd.h>
+-#include <sys/param.h>
+-
+-#include <ldsodefs.h>
+-#include <sysdep.h>
+-#include <sys/syscall.h>
+-
+-/* 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)
index cddfd24fbff4274a69865d6c9ce5c2025b745c3d..a4a01dc130f44f798fb275b3948ac8566b47b147 100644 (file)
@@ -34,7 +34,7 @@ Summary(tr.UTF-8):    GNU libc
 Summary(uk.UTF-8):     GNU libc версії
 Name:          glibc
 Version:       2.12.1
-Release:       2
+Release:       3
 Epoch:         6
 License:       LGPL v2.1+
 Group:         Libraries
@@ -75,7 +75,7 @@ Patch25:      %{name}-cv_gnu89_inline.patch
 Patch26:       %{name}-posix-sh.patch
 Patch27:       %{name}-i686.patch
 Patch29:       %{name}-arm-alignment-fix.patch
-Patch30:       %{name}-getpagesize-revert.patch
+Patch30:       %{name}-static-glro-init.patch
 URL:           http://www.gnu.org/software/libc/
 %{?with_selinux:BuildRequires: audit-libs-devel}
 BuildRequires: autoconf
This page took 0.0488960000000001 seconds and 4 git commands to generate.