--- a/sysdeps/unix/sysv/linux/ia64/Makefile +++ a/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 --- a/sysdeps/unix/sysv/linux/Makefile +++ a/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 --- a/sysdeps/unix/sysv/linux/ia64/dl-static.c +++ a/sysdeps/unix/sysv/linux/ia64/dl-static.c @@ -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 - -#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 - -__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 --- a/sysdeps/unix/sysv/linux/dl-static.c +++ a/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 + +#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 + +__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 --- a/sysdeps/unix/sysv/linux/ia64/ldsodefs.h +++ a/sysdeps/unix/sysv/linux/ia64/ldsodefs.h @@ -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 */ --- a/sysdeps/unix/sysv/linux/ldsodefs.h +++ a/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 --- a/sysdeps/unix/sysv/linux/ia64/getpagesize.c +++ a/sysdeps/unix/sysv/linux/ia64/getpagesize.c @@ -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)