This is the mail archive of the glibc-cvs@sourceware.org mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

GNU C Library master sources branch master updated. glibc-2.17-906-g8ab0740


This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "GNU C Library master sources".

The branch, master has been updated
       via  8ab07407ba4857e0d565288f786a53360b17466b (commit)
      from  c61f8513f7392e512faab89b758093c6e61a890c (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
http://sourceware.org/git/gitweb.cgi?p=glibc.git;a=commitdiff;h=8ab07407ba4857e0d565288f786a53360b17466b

commit 8ab07407ba4857e0d565288f786a53360b17466b
Author: Marcus Shawcroft <marcus.shawcroft@linaro.org>
Date:   Fri Jul 5 17:13:35 2013 +0100

    [AArch64] Use _dl_static_init to set GLR0(dl_pagesize)

diff --git a/ports/ChangeLog.aarch64 b/ports/ChangeLog.aarch64
index 807c410..e10fd8b 100644
--- a/ports/ChangeLog.aarch64
+++ b/ports/ChangeLog.aarch64
@@ -1,3 +1,11 @@
+2013-07-09  Marcus Shawcroft  <marcus.shawcroft@linaro.org>
+
+	* sysdeps/unix/sysv/linux/aarch64/dl-static.c: New file to support
+	variable page size for AArch64.
+	* sysdeps/unix/sysv/linux/aarch64/ldsodefs.h: Likewise.
+	* sysdeps/unix/sysv/linux/aarch64/Makefile: Build dl-static in elf.
+	* sysdeps/unix/sysv/linux/aarch64/Versions: Add _dl_var_init.
+
 2013-07-05  Marcus Shawcroft  <marcus.shawcroft@linaro.org>
 
 	* sysdeps/aarch64/libm-test-ulps: Regenerate.
diff --git a/ports/sysdeps/unix/sysv/linux/aarch64/Makefile b/ports/sysdeps/unix/sysv/linux/aarch64/Makefile
index 97c179a..8a3d76b 100644
--- a/ports/sysdeps/unix/sysv/linux/aarch64/Makefile
+++ b/ports/sysdeps/unix/sysv/linux/aarch64/Makefile
@@ -7,6 +7,12 @@ endif
 ifeq ($(subdir),elf)
 sysdep_routines	     += dl-vdso
 sysdep-rtld-routines += __read_tp
+ifeq ($(build-shared),yes)
+# This is needed for DSO loading from static binaries.
+sysdep-dl-routines += dl-static
+sysdep_routines += dl-static
+sysdep-rtld-routines += dl-static
+endif
 endif
 
 ifeq ($(subdir),misc)
diff --git a/ports/sysdeps/unix/sysv/linux/aarch64/Versions b/ports/sysdeps/unix/sysv/linux/aarch64/Versions
index 627ff53..9bd87fe 100644
--- a/ports/sysdeps/unix/sysv/linux/aarch64/Versions
+++ b/ports/sysdeps/unix/sysv/linux/aarch64/Versions
@@ -1,3 +1,9 @@
+ld {
+  GLIBC_PRIVATE {
+    # used for loading by static libraries
+    _dl_var_init;
+  }
+}
 libc {
   GLIBC_PRIVATE {
     __vdso_clock_gettime;
diff --git a/ports/sysdeps/unix/sysv/linux/aarch64/dl-static.c b/ports/sysdeps/unix/sysv/linux/aarch64/dl-static.c
new file mode 100644
index 0000000..13b48e9
--- /dev/null
+++ b/ports/sysdeps/unix/sysv/linux/aarch64/dl-static.c
@@ -0,0 +1,84 @@
+/* Variable initialization.  AArch64 version.
+   Copyright (C) 2001-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 <ldsodefs.h>
+
+#ifdef SHARED
+
+void
+_dl_var_init (void *array[])
+{
+  /* It has to match "variables" below. */
+  enum
+    {
+      DL_PAGESIZE = 0
+    };
+
+  GLRO(dl_pagesize) = *((size_t *) array[DL_PAGESIZE]);
+}
+
+#else
+
+static void *variables[] =
+{
+  &GLRO(dl_pagesize)
+};
+
+static void
+_dl_unprotect_relro (struct link_map *l)
+{
+  ElfW(Addr) start = ((l->l_addr + l->l_relro_addr)
+		      & ~(GLRO(dl_pagesize) - 1));
+  ElfW(Addr) end = ((l->l_addr + l->l_relro_addr + l->l_relro_size)
+		    & ~(GLRO(dl_pagesize) - 1));
+
+  if (start != end)
+    __mprotect ((void *) start, end - start, PROT_READ | PROT_WRITE);
+}
+
+void
+_dl_static_init (struct link_map *l)
+{
+  struct link_map *rtld_map = l;
+  struct r_scope_elem **scope;
+  const ElfW(Sym) *ref = NULL;
+  lookup_t loadbase;
+  void (*f) (void *[]);
+  size_t i;
+
+  loadbase = _dl_lookup_symbol_x ("_dl_var_init", l, &ref, l->l_local_scope,
+				  NULL, 0, 1, NULL);
+
+  for (scope = l->l_local_scope; *scope != NULL; scope++)
+    for (i = 0; i < (*scope)->r_nlist; i++)
+      if ((*scope)->r_list[i] == loadbase)
+	{
+	  rtld_map = (*scope)->r_list[i];
+	  break;
+	}
+
+  if (ref != NULL)
+    {
+      f = (void (*) (void *[])) DL_SYMBOL_ADDRESS (loadbase, ref);
+      _dl_unprotect_relro (rtld_map);
+      f (variables);
+      _dl_protect_relro (rtld_map);
+    }
+}
+
+#endif
diff --git a/ports/sysdeps/unix/sysv/linux/aarch64/ldsodefs.h b/ports/sysdeps/unix/sysv/linux/aarch64/ldsodefs.h
new file mode 100644
index 0000000..92877e5
--- /dev/null
+++ b/ports/sysdeps/unix/sysv/linux/aarch64/ldsodefs.h
@@ -0,0 +1,32 @@
+/* Run-time dynamic linker data structures for loaded ELF shared objects. Tile.
+   Copyright (C) 2001-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/>.  */
+
+#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 */

-----------------------------------------------------------------------

Summary of changes:
 ports/ChangeLog.aarch64                            |    8 ++++++++
 ports/sysdeps/unix/sysv/linux/aarch64/Makefile     |    6 ++++++
 ports/sysdeps/unix/sysv/linux/aarch64/Versions     |    6 ++++++
 .../unix/sysv/linux/{tile => aarch64}/dl-static.c  |    2 +-
 .../unix/sysv/linux/{tile => aarch64}/ldsodefs.h   |    0
 5 files changed, 21 insertions(+), 1 deletions(-)
 copy ports/sysdeps/unix/sysv/linux/{tile => aarch64}/dl-static.c (97%)
 copy ports/sysdeps/unix/sysv/linux/{tile => aarch64}/ldsodefs.h (100%)


hooks/post-receive
-- 
GNU C Library master sources


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]